From fe9d3ed065679d39844a141458e2a4133835e29b Mon Sep 17 00:00:00 2001 From: otya128 Date: Sat, 31 Dec 2016 09:48:49 +0900 Subject: [PATCH] Implement || --- SMILEBASIC/VM.d | 23 +++++++++++++++++++++++ SMILEBASIC/compiler.d | 10 ++++++++++ 2 files changed, 33 insertions(+) diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 4e49c3e..c6642df 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -2583,6 +2583,29 @@ class LogicalAnd : Code } } } + +class LogicalOr : Code +{ + int addr; + override void execute(VM vm) + { + if (vm.stacki == 0) + { + throw new StackUnderFlow(); + } + //FALSE->POP + //TRUE->JUMP + if (vm.stack[vm.stacki - 1].boolValue) + { + vm.pc = addr - 1; + } + else + { + vm.decSP; + } + } +} + class ConvertBool : Code { //0 => 0(int) diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 1fd27c4..0c9cd88 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -512,6 +512,16 @@ class Compiler jmp.addr = cast(int)code.length; break; } + if (binop.operator == TokenType.LogicalOr) + { + compileExpression(binop.item1, sc); + auto jmp = new LogicalOr(); + genCode(jmp); + compileExpression(binop.item2, sc); + jmp.addr = cast(int)code.length; + genCode(new ConvertBool()); + break; + } compileExpression(binop.item1, sc); compileExpression(binop.item2, sc); if(binop.operator == TokenType.LBracket)