diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 55e6553..2a818f0 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -710,6 +710,7 @@ class ReturnFunction : Code Value bp, pc; vm.pop(pc); vm.pop(bp); + vm.stacki -= func.argCount; if(func.returnExpr) { vm.push(retexpr); @@ -739,9 +740,10 @@ class CallFunctionCode : Code throw new IllegalFunctionCall(); } //TODO:args + auto bp = vm.stacki; vm.push(Value(vm.bp)); vm.push(Value(vm.pc)); - vm.bp = vm.stacki - 2; + vm.bp = bp; vm.pc = func.address - 1; } } diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 7d029f7..72417b9 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -71,7 +71,7 @@ class Function int var = this.variable.get(name, 0); if(var == 0) { - this.variable[name] = var = ++variableIndex; + this.variable[name] = var = --argumentIndex; } else { diff --git a/SMILEBASIC/main.d b/SMILEBASIC/main.d index a67ed1f..741288a 100644 --- a/SMILEBASIC/main.d +++ b/SMILEBASIC/main.d @@ -60,6 +60,7 @@ V[0,1]=12 ?1/2 GOSUB @A ?A() +?B(1,2,3) END @A ?\"SUBROUTINE TEST\" @@ -70,7 +71,7 @@ DEF A() END DEF B(A,B[],C) ?\"FUNCTION B\" - RETURN 0 + RETURN -1 END "); version(none) auto parser = new Parser(readText("FIZZBUZZ.TXT").to!wstring);