fix: some improvements of compiled bytecode

This commit is contained in:
TopchetoEU 2023-11-25 18:38:43 +02:00
parent 829bea755d
commit f5a0b6eaf7
Signed by: topchetoeu
GPG Key ID: 6531B8583E5F6ED4
2 changed files with 16 additions and 13 deletions

View File

@ -33,8 +33,8 @@ public class SwitchStatement extends Statement {
@Override @Override
public void compile(CompileTarget target, ScopeRecord scope, boolean pollute) { public void compile(CompileTarget target, ScopeRecord scope, boolean pollute) {
var caseMap = new HashMap<Integer, Integer>(); var caseToStatement = new HashMap<Integer, Integer>();
var stmIndexMap = new HashMap<Integer, Integer>(); var statementToIndex = new HashMap<Integer, Integer>();
value.compile(target, scope, true); value.compile(target, scope, true);
@ -42,7 +42,7 @@ public class SwitchStatement extends Statement {
target.add(Instruction.dup().locate(loc())); target.add(Instruction.dup().locate(loc()));
ccase.value.compile(target, scope, true); ccase.value.compile(target, scope, true);
target.add(Instruction.operation(Operation.EQUALS).locate(loc())); target.add(Instruction.operation(Operation.EQUALS).locate(loc()));
caseMap.put(target.size(), ccase.statementI); caseToStatement.put(target.size(), ccase.statementI);
target.add(Instruction.nop().locate(ccase.value.loc())); target.add(Instruction.nop().locate(ccase.value.loc()));
} }
@ -51,28 +51,31 @@ public class SwitchStatement extends Statement {
target.add(Instruction.nop()); target.add(Instruction.nop());
for (var stm : body) { for (var stm : body) {
stmIndexMap.put(stmIndexMap.size(), target.size()); statementToIndex.put(statementToIndex.size(), target.size());
stm.compileWithDebug(target, scope, false); stm.compileWithDebug(target, scope, false);
} }
if (defaultI < 0 || defaultI >= body.length) target.set(start, Instruction.jmp(target.size() - start).locate(loc())); int end = target.size();
else target.set(start, Instruction.jmp(stmIndexMap.get(defaultI) - start)).locate(loc()); target.add(Instruction.discard().locate(loc()));
if (pollute) target.add(Instruction.loadValue(null));
for (int i = start; i < target.size(); i++) { if (defaultI < 0 || defaultI >= body.length) target.set(start, Instruction.jmp(end - start).locate(loc()));
else target.set(start, Instruction.jmp(statementToIndex.get(defaultI) - start)).locate(loc());
for (int i = start; i < end; i++) {
var instr = target.get(i); var instr = target.get(i);
if (instr.type == Type.NOP && instr.is(0, "break") && instr.get(1) == null) { if (instr.type == Type.NOP && instr.is(0, "break") && instr.get(1) == null) {
target.set(i, Instruction.jmp(target.size() - i).locate(instr.location)); target.set(i, Instruction.jmp(end - i).locate(instr.location));
} }
} }
for (var el : caseMap.entrySet()) { for (var el : caseToStatement.entrySet()) {
var loc = target.get(el.getKey()).location; var loc = target.get(el.getKey()).location;
var i = stmIndexMap.get(el.getValue()); var i = statementToIndex.get(el.getValue());
if (i == null) i = target.size(); if (i == null) i = end;
target.set(el.getKey(), Instruction.jmpIf(i - el.getKey()).locate(loc)); target.set(el.getKey(), Instruction.jmpIf(i - el.getKey()).locate(loc));
target.setDebug(el.getKey()); target.setDebug(el.getKey());
} }
target.add(Instruction.discard().locate(loc()));
} }
public SwitchStatement(Location loc, Statement value, int defaultI, SwitchCase[] cases, Statement[] body) { public SwitchStatement(Location loc, Statement value, int defaultI, SwitchCase[] cases, Statement[] body) {

View File

@ -13,7 +13,7 @@ public class CommaStatement extends Statement {
@Override @Override
public void compile(CompileTarget target, ScopeRecord scope, boolean pollute) { public void compile(CompileTarget target, ScopeRecord scope, boolean pollute) {
for (var i = 0; i < values.length; i++) { for (var i = 0; i < values.length; i++) {
values[i].compile(target, scope, i == values.length - 1 && pollute); values[i].compileWithDebug(target, scope, i == values.length - 1 && pollute);
} }
} }