fix: do variable inits properly
This commit is contained in:
parent
7f6df49fc5
commit
39eb6ffac5
@ -38,7 +38,7 @@ public abstract class FunctionNode extends Node {
|
||||
var index = scope.define(param.name);
|
||||
|
||||
target.add(Instruction.loadArg(i++));
|
||||
target.add(index.index().toInit());
|
||||
target.add(index.index().toSet(false));
|
||||
}
|
||||
|
||||
// if (selfName != null && !scope.has(selfName, false)) {
|
||||
|
@ -27,7 +27,7 @@ public class VariableDeclareNode extends Node {
|
||||
for (var entry : values) {
|
||||
if (entry.value != null) {
|
||||
entry.value.compile(target, true);
|
||||
target.add(VariableNode.toInit(target, loc(), entry.var.name));
|
||||
target.add(VariableNode.toSet(target, loc(), entry.var.name, false, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ public class ForInNode extends Node {
|
||||
int mid = target.temp();
|
||||
|
||||
target.add(Instruction.loadMember("value")).setLocation(binding.loc());
|
||||
target.add(VariableNode.toInit(target, loc(), binding.name));
|
||||
target.add(VariableNode.toSet(target, loc(), binding.name, false, true));
|
||||
|
||||
target.setLocationAndDebug(object.loc(), BreakpointType.STEP_OVER);
|
||||
|
||||
|
@ -43,7 +43,7 @@ public class TryNode extends Node {
|
||||
if (captureName != null) {
|
||||
var catchVar = target.scope.defineCatch(captureName);
|
||||
target.add(Instruction.loadError());
|
||||
target.add(catchVar.index().toInit());
|
||||
target.add(catchVar.index().toSet(false));
|
||||
catchBody.compile(target, false);
|
||||
target.scope.undefineCatch();
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ public class VariableNode extends Node implements ChangeTarget {
|
||||
}
|
||||
|
||||
@Override public void afterAssign(CompileResult target, boolean pollute) {
|
||||
target.add(VariableNode.toSet(target, loc(), name, pollute));
|
||||
target.add(VariableNode.toSet(target, loc(), name, pollute, false));
|
||||
}
|
||||
|
||||
@Override public void compile(CompileResult target, boolean pollute) {
|
||||
@ -40,17 +40,11 @@ public class VariableNode extends Node implements ChangeTarget {
|
||||
return toGet(target, loc, name, true, false);
|
||||
}
|
||||
|
||||
public static Instruction toInit(CompileResult target, Location loc, String name) {
|
||||
var i = target.scope.get(name, false);
|
||||
|
||||
if (i != null) return i.index().toInit();
|
||||
else return Instruction.globSet(name, false, true);
|
||||
}
|
||||
public static Instruction toSet(CompileResult target, Location loc, String name, boolean keep) {
|
||||
public static Instruction toSet(CompileResult target, Location loc, String name, boolean keep, boolean init) {
|
||||
var i = target.scope.get(name, false);
|
||||
|
||||
if (i != null) return i.index().toSet(keep);
|
||||
else return Instruction.globSet(name, keep, false);
|
||||
else return Instruction.globSet(name, keep, init);
|
||||
}
|
||||
|
||||
public VariableNode(Location loc, String name) {
|
||||
|
@ -18,11 +18,11 @@ public class VariableAssignNode extends Node {
|
||||
target.add(VariableNode.toGet(target, loc(), name));
|
||||
FunctionNode.compileWithName(value, target, true, name);
|
||||
target.add(Instruction.operation(operation));
|
||||
target.add(VariableNode.toSet(target, loc(), name, pollute));
|
||||
target.add(VariableNode.toSet(target, loc(), name, pollute, false));
|
||||
}
|
||||
else {
|
||||
FunctionNode.compileWithName(value, target, true, name);
|
||||
target.add(VariableNode.toSet(target, loc(), name, pollute));
|
||||
target.add(VariableNode.toSet(target, loc(), name, pollute, false));
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user