From d240a0b0d69b551188f0a03f096836659f304caf Mon Sep 17 00:00:00 2001 From: otya128 Date: Wed, 28 Dec 2016 17:43:53 +0900 Subject: [PATCH] Add GosubUndefinedLabel --- SMILEBASIC/VM.d | 12 ++++++++++++ SMILEBASIC/compiler.d | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 9fe1c19..4e9d2dc 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -2387,3 +2387,15 @@ class Use : Code } } +class GosubUndefinedLabel : Code +{ + wstring label; + this(wstring label) + { + this.label = label; + } + override void execute(VM vm) + { + throw new UndefinedLabel(label); + } +} diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 5cbb315..f0b7c4a 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -1259,13 +1259,22 @@ class Compiler if(c.type == CodeType.GosubS) { auto label = cast(GosubS)c; + int addr; if(label.sc.func) { - code[i] = new GosubAddr(label.sc.func.label[label.label]); + addr = label.sc.func.label.get(label.label, int.min); } else { - code[i] = new GosubAddr(globalLabel[label.label]); + addr = globalLabel.get(label.label, int.min); + } + if (addr == int.min) + { + code[i] = new GosubUndefinedLabel(label.label); + } + else + { + code[i] = new GosubAddr(addr); } } if(c.type == CodeType.OnS) @@ -1276,7 +1285,7 @@ class Compiler { if(label.sc.func) { - addresses[index] =label.sc.func.label.get(l, int.min); + addresses[index] = label.sc.func.label.get(l, int.min); } else {