diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 07c55bf..b0d971c 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -354,7 +354,16 @@ class VM } void restoreData(wstring label) { - currentData.index = currentData.table.label[label]; + if (label in currentData.table.label) + currentData.index = currentData.table.label[label]; + else if (label in currentSlot.globalData.table.label) + { + currentData.index = currentSlot.globalData.table.label[label]; + } + else + { + throw new UndefinedLabel(); + } } int olddti; void pushDataIndex() @@ -549,6 +558,7 @@ class VM { vm.setCurrentSlot(func.slot.index); } + vm.currentData.table = func.scope_.data; } } enum CodeType @@ -1591,6 +1601,14 @@ class ReturnFunction : Code else { vm.currentFunction = cfunc.func; + if (vm.currentFunction) + { + vm.currentData.table = vm.currentFunction.scope_.data; + } + else + { + vm.currentData.table = vm.currentSlot.globalData.table; + } } vm.stacki -= func.argCount; if(func.returnExpr) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 84e84d5..3e4a8e0 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -82,7 +82,7 @@ class BuiltinFunctions va = f; } //一応可変長は最後 - if(va && (va.outoptional != 0 && va.outoptional <= outargc && va.results.length >= outargc) || va.results.length == outargc) return va; + if(va && ((va.outoptional != 0 && va.outoptional <= outargc && va.results.length >= outargc) || va.results.length == outargc)) return va; writeln("====function overloads==="); writefln("func = %s argc = %d outargc = %d", func[0].name, argc, outargc); foreach(f; func)