From 609bc0bcd507abe06d5274ac1773aa306ab48e46 Mon Sep 17 00:00:00 2001 From: otya128 Date: Thu, 8 Dec 2016 22:32:51 +0900 Subject: [PATCH] Add VAR(expr)=expr --- SMILEBASIC/VM.d | 64 +++++++++++++++++++++++++++++++++++++++++++ SMILEBASIC/compiler.d | 14 ++++++++++ SMILEBASIC/node.d | 2 +- 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index a76f48a..e78e4a0 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -1943,3 +1943,67 @@ class SwapCode : Code *dp1 = num2; } } + +class PushVarRefExpression : Code +{ + Scope sc; + this(Scope sc) + { + this.sc = sc; + } + override void execute(VM vm) + { + Value valv; + vm.pop(valv); + auto name = valv.castString; + + VMVariable vmv = VMVariable(int.min); + if (sc.func) + { + vmv = sc.func.variable.get(name, vmv); + if (vmv.index != int.min) + { + vm.push(Value(&vm.stack[vm.bp + vmv.index])); + return; + } + } + vmv = vm.currentSlot.globalTable.get(name, vmv); + if (vmv.index == int.min) + { + throw new UndefinedVariable(); + } + vm.push(Value(&vm.currentSlot.global[vmv.index])); + } +} + +class PushVarExpression : Code +{ + Scope sc; + this(Scope sc) + { + this.sc = sc; + } + override void execute(VM vm) + { + Value valv; + vm.pop(valv); + auto name = valv.castString; + + VMVariable vmv = VMVariable(int.min); + if (sc.func) + { + vmv = sc.func.variable.get(name, vmv); + if (vmv.index != int.min) + { + vm.push(vm.stack[vm.bp + vmv.index]); + return; + } + } + vmv = vm.currentSlot.globalTable.get(name, vmv); + if (vmv.index == int.min) + { + throw new UndefinedVariable(); + } + vm.push(vm.currentSlot.global[vmv.index]); + } +} diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 3527b6a..8ce3863 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -578,6 +578,13 @@ class Compiler } } break; + case NodeType.VarRef: + { + auto varref = cast(VarRef)exp; + compileExpression(varref.expression, sc); + genCode(new PushVarExpression(sc)); + } + break; default: stderr.writeln("Compile:NotImpl ", exp.type); break; @@ -628,6 +635,13 @@ class Compiler } } break; + case NodeType.VarRef: + { + auto varref = cast(VarRef)exp; + compileExpression(varref.expression, sc); + genCode(new PushVarRefExpression(sc)); + } + break; default: stderr.writeln("Compile:NotImpl ", exp.type); break; diff --git a/SMILEBASIC/node.d b/SMILEBASIC/node.d index 4ceac52..84f628c 100644 --- a/SMILEBASIC/node.d +++ b/SMILEBASIC/node.d @@ -628,6 +628,6 @@ class VarRef : Expression { super.location = loc; this.type = NodeType.VarRef; - this.expression = expression; + this.expression = expr; } }