From 1bbcc3d50c15f73ab31c296fe33ae5bca70171bd Mon Sep 17 00:00:00 2001 From: otya128 Date: Sat, 3 Sep 2016 16:24:59 +0900 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E5=80=A4=E6=BC=94=E7=AE=97=E3=82=92?= =?UTF-8?q?=E3=82=88=E3=82=8A=E5=BF=A0=E5=AE=9F=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SMILEBASIC/TEST.txt | 4 ++ SMILEBASIC/VM.d | 75 +++++++++++++++++++++++++++++++++-- SMILEBASIC/builtinfunctions.d | 17 ++++++++ 3 files changed, 93 insertions(+), 3 deletions(-) diff --git a/SMILEBASIC/TEST.txt b/SMILEBASIC/TEST.txt index b3ded55..457831d 100644 --- a/SMILEBASIC/TEST.txt +++ b/SMILEBASIC/TEST.txt @@ -8,6 +8,10 @@ DEF MAXMINTEST NEXT ASSERT__ MAX(A)==5,"MAX" ASSERT__ MIN(A)==1,"MIN" + ASSERT__ MAX(2,0)*&H7FFFFFFF==-2,"MAX" + ASSERT__ MAX(2,0,0)*&H7FFFFFFF==4294967294,"MAX" + ASSERT__ MIN(2,4)*&H7FFFFFFF==-2,"MIN" + ASSERT__ MAX(2,4,4)*&H7FFFFFFF==4294967294,"MIN" END MAXMINTEST diff --git a/SMILEBASIC/VM.d b/SMILEBASIC/VM.d index 0802dae..a0ab458 100644 --- a/SMILEBASIC/VM.d +++ b/SMILEBASIC/VM.d @@ -601,16 +601,85 @@ class Operate : Code } } } + int li = l.integerValue; + if (l.isInteger && r.isInteger) + { + switch(operator) + { + case TokenType.Plus: + vm.push(Value(li + ri)); + return; + case TokenType.Minus: + vm.push(Value(li - ri)); + return; + case TokenType.Mul: + vm.push(Value(li * ri)); + return; + case TokenType.Div: + vm.push(Value(li / ri)); + return; + case TokenType.IntDiv: + //TODO:範囲外だとOverflow + vm.push(Value(cast(int)(li / ri))); + return; + case TokenType.Mod: + vm.push(Value(li % ri)); + return; + case TokenType.And: + vm.push(Value(li & ri)); + return; + case TokenType.Or: + vm.push(Value(li | ri)); + return; + case TokenType.LogicalAnd: + vm.push(Value(li && ri)); + return; + case TokenType.LogicalOr: + vm.push(Value(li || ri)); + return; + case TokenType.Xor: + vm.push(Value(li ^ ri)); + return; + case TokenType.Equal: + vm.push(Value(li == ri)); + return; + case TokenType.NotEqual: + vm.push(Value(li != ri)); + return; + case TokenType.Less: + vm.push(Value(li < ri)); + return; + case TokenType.LessEqual: + vm.push(Value(li <= ri)); + return; + case TokenType.Greater: + vm.push(Value(li > ri)); + return; + case TokenType.GreaterEqual: + vm.push(Value(li >= ri)); + return; + case TokenType.LeftShift: + vm.push(Value(li << ri)); + return; + case TokenType.RightShift: + vm.push(Value(li >> ri)); + return; + default: + } + } + if (!l.isNumber || !r.isNumber) throw new TypeMismatch(); - - int li = l.integerValue; - double ld = l.integerValue; + double ld; if(l.type == ValueType.Double) { li = cast(int)l.doubleValue; ld = l.doubleValue; } + else + { + ld = l.integerValue; + } //とりあえずInteger switch(operator) { diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 0d2f6df..0a592e8 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -1875,6 +1875,23 @@ class BuiltinFunction } return minPos!"a.castDouble < b.castDouble"(args)[0].castDouble; } + //MAX(2,0)*&H7FFFFFFFF!=MAX(2,0,0)*&H7FFFFFFFF + static Value MAX(Value a1, Value a2) + { + if (a1.type == ValueType.Integer && a2.type == ValueType.Integer) + { + return Value(a1.integerValue > a2.integerValue ? a1.integerValue : a2.integerValue); + } + return Value(a1.castDouble > a2.castDouble ? a1.castDouble : a2.castDouble); + } + static Value MIN(Value a1, Value a2) + { + if (a1.type == ValueType.Integer && a2.type == ValueType.Integer) + { + return Value(a1.integerValue < a2.integerValue ? a1.integerValue : a2.integerValue); + } + return Value(a1.castDouble < a2.castDouble ? a1.castDouble : a2.castDouble); + } //alias void function(PetitComputer, Value[], Value[]) BuiltinFunc; static BuiltinFunctions[wstring] builtinFunctions; static wstring getBasicName(BFD)(const wstring def)