feat(joinir): extend balanced depth-scan policy to object family
This commit is contained in:
@ -36,6 +36,13 @@ pub(crate) fn classify_balanced_depth_scan_array_end(
|
|||||||
classify_balanced_depth_scan(condition, body, "[", "]")
|
classify_balanced_depth_scan(condition, body, "[", "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn classify_balanced_depth_scan_object_end(
|
||||||
|
condition: &ASTNode,
|
||||||
|
body: &[ASTNode],
|
||||||
|
) -> PolicyDecision<BalancedDepthScanPolicyResult> {
|
||||||
|
classify_balanced_depth_scan(condition, body, "{", "}")
|
||||||
|
}
|
||||||
|
|
||||||
fn classify_balanced_depth_scan(
|
fn classify_balanced_depth_scan(
|
||||||
condition: &ASTNode,
|
condition: &ASTNode,
|
||||||
body: &[ASTNode],
|
body: &[ASTNode],
|
||||||
|
|||||||
@ -6,7 +6,10 @@
|
|||||||
|
|
||||||
use crate::ast::ASTNode;
|
use crate::ast::ASTNode;
|
||||||
|
|
||||||
use super::balanced_depth_scan_policy::{classify_balanced_depth_scan_array_end, BalancedDepthScanPolicyResult};
|
use super::balanced_depth_scan_policy::{
|
||||||
|
classify_balanced_depth_scan_array_end, classify_balanced_depth_scan_object_end,
|
||||||
|
BalancedDepthScanPolicyResult,
|
||||||
|
};
|
||||||
use super::PolicyDecision;
|
use super::PolicyDecision;
|
||||||
|
|
||||||
pub(crate) struct BalancedDepthScanPolicyBox;
|
pub(crate) struct BalancedDepthScanPolicyBox;
|
||||||
@ -16,7 +19,25 @@ impl BalancedDepthScanPolicyBox {
|
|||||||
condition: &ASTNode,
|
condition: &ASTNode,
|
||||||
body: &[ASTNode],
|
body: &[ASTNode],
|
||||||
) -> PolicyDecision<BalancedDepthScanPolicyResult> {
|
) -> PolicyDecision<BalancedDepthScanPolicyResult> {
|
||||||
let decision = classify_balanced_depth_scan_array_end(condition, body);
|
// Try known balanced families. Order is SSOT.
|
||||||
|
// - array: `[` ... `]`
|
||||||
|
// - object: `{` ... `}`
|
||||||
|
//
|
||||||
|
// IMPORTANT: `Reject` means "close-but-unsupported" for that family, not "not this family".
|
||||||
|
// We only return `Reject` if no other family matches.
|
||||||
|
let array = classify_balanced_depth_scan_array_end(condition, body);
|
||||||
|
let decision = match array {
|
||||||
|
PolicyDecision::Use(_) => array,
|
||||||
|
PolicyDecision::Reject(_) => {
|
||||||
|
let object = classify_balanced_depth_scan_object_end(condition, body);
|
||||||
|
match object {
|
||||||
|
PolicyDecision::Use(_) => object,
|
||||||
|
PolicyDecision::Reject(_) => array,
|
||||||
|
PolicyDecision::None => array,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PolicyDecision::None => classify_balanced_depth_scan_object_end(condition, body),
|
||||||
|
};
|
||||||
|
|
||||||
if crate::config::env::joinir_dev_enabled() {
|
if crate::config::env::joinir_dev_enabled() {
|
||||||
use crate::mir::builder::control_flow::joinir::trace;
|
use crate::mir::builder::control_flow::joinir::trace;
|
||||||
@ -31,4 +52,3 @@ impl BalancedDepthScanPolicyBox {
|
|||||||
decision
|
decision
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user