fix: 修复闭包值传递链路
This commit is contained in:
@@ -700,10 +700,15 @@ impl Compiler {
|
||||
match expr {
|
||||
Expression::Identifier(ident) => {
|
||||
let name = ident.name.as_str();
|
||||
// Only skip if name is in the nested function's OWN scopes (not inherited scopes[0])
|
||||
let is_local = nested_symbols.scopes.iter().skip(1).any(|s| s.bindings.contains_key(name));
|
||||
if is_local {
|
||||
return;
|
||||
if nested_symbols.lookup_any_binding(name).is_some() {
|
||||
// Check if this is a parent function-scope binding (real upvalue)
|
||||
let is_parent_func_var = parent_ctx.scopes.symbols.scopes.iter()
|
||||
.skip(1)
|
||||
.any(|s| s.bindings.contains_key(name));
|
||||
if !is_parent_func_var {
|
||||
return; // true local or global, not upvalue
|
||||
}
|
||||
// falls through to capture
|
||||
}
|
||||
if let Some((binding, _)) = parent_ctx.scopes.symbols.lookup_any_binding(name) {
|
||||
if seen.contains_key(name) {
|
||||
@@ -721,8 +726,11 @@ impl Compiler {
|
||||
Expression::AssignmentExpression(ae) => {
|
||||
if let oxide_parser::AssignmentTarget::AssignmentTargetIdentifier(ati) = &ae.left {
|
||||
let name = ati.name.as_str();
|
||||
let is_local = nested_symbols.scopes.iter().skip(1).any(|s| s.bindings.contains_key(name));
|
||||
if !is_local {
|
||||
let in_nested = nested_symbols.lookup_any_binding(name).is_some();
|
||||
let is_parent_func_var = parent_ctx.scopes.symbols.scopes.iter()
|
||||
.skip(1)
|
||||
.any(|s| s.bindings.contains_key(name));
|
||||
if !in_nested || is_parent_func_var {
|
||||
if let Some((binding, _)) = parent_ctx.scopes.symbols.lookup_any_binding(name) {
|
||||
if !seen.contains_key(name) {
|
||||
let cell_idx = captures.len() as u8;
|
||||
@@ -748,8 +756,11 @@ impl Compiler {
|
||||
Expression::UpdateExpression(ue) => {
|
||||
if let oxide_parser::SimpleAssignmentTarget::AssignmentTargetIdentifier(ati) = &ue.argument {
|
||||
let name = ati.name.as_str();
|
||||
let is_local = nested_symbols.scopes.iter().skip(1).any(|s| s.bindings.contains_key(name));
|
||||
if !is_local {
|
||||
let in_nested = nested_symbols.lookup_any_binding(name).is_some();
|
||||
let is_parent_func_var = parent_ctx.scopes.symbols.scopes.iter()
|
||||
.skip(1)
|
||||
.any(|s| s.bindings.contains_key(name));
|
||||
if !in_nested || is_parent_func_var {
|
||||
if let Some((binding, _)) = parent_ctx.scopes.symbols.lookup_any_binding(name) {
|
||||
if !seen.contains_key(name) {
|
||||
let cell_idx = captures.len() as u8;
|
||||
|
||||
Reference in New Issue
Block a user