From 2778e0a3fd41755241f4f6d66d770f182a6eccf8 Mon Sep 17 00:00:00 2001 From: MathWizz <mathwizz94@gmail.com> Date: Sat, 2 Nov 2013 00:38:29 -0500 Subject: [PATCH 1/3] Corrected casting numbers and fixed blocks under ifs not running --- js/Interpreter.js | 63 +++++++++++++++++++++--------- js/primitives/LooksPrims.js | 16 ++++---- js/primitives/MotionAndPenPrims.js | 44 ++++++++++----------- js/primitives/Primitives.js | 40 +++++++++---------- js/primitives/SoundPrims.js | 14 +++---- js/primitives/VarListPrims.js | 12 +++--- 6 files changed, 107 insertions(+), 82 deletions(-) diff --git a/js/Interpreter.js b/js/Interpreter.js index d6d013d..0d518e8 100644 --- a/js/Interpreter.js +++ b/js/Interpreter.js @@ -139,13 +139,23 @@ Interpreter.prototype.stepActiveThread = function() { b.primFcn(b); if (this.yield) { this.activeThread.nextBlock = b; return; } b = this.activeThread.nextBlock; // refresh local variable b in case primitive did some control flow - while (b == null) { + while (!b) { // end of a substack; pop the owning control flow block from stack // Note: This is a loop to handle nested control flow blocks. - b = this.activeThread.stack.pop(); - if ((b == null) || (b.isLoop)) { - this.activeThread.nextBlock = b; - return; // yield at the end of a loop or when stack is empty + + // yield at the end of a loop or when stack is empty + if (this.activeThread.stack.length === 0) { + this.activeThread.nextBlock = null; + return; + } else { + b = this.activeThread.stack.pop(); + debugger; + if (b.isLoop) { + this.activeThread.nextBlock = b; // preserve where it left off + return; + } else { + b = b.nextBlock; // skip and continue for non looping blocks + } } } } @@ -194,7 +204,26 @@ Interpreter.prototype.arg = function(block, index) { } return arg; } - + +Interpreter.prototype.numarg = function(block, index) { + var arg = parseFloat(this.arg(block, index)); + if (arg !== arg) { + return 0; + } + return arg; +} + +Interpreter.prototype.boolarg = function(block, index) { + var arg = this.arg(block, index); + if (typeof arg === 'boolean') { + return arg; + } else if (typeof arg === 'string') { + return arg === '' || arg === '0' || arg.toLowerCase() === 'false'; + } + return arg; +} + + Interpreter.prototype.targetSprite = function() { return this.activeThread.target; } @@ -231,14 +260,14 @@ Interpreter.prototype.initPrims = function() { this.primitiveTable['whenGreenFlag'] = this.primNoop; this.primitiveTable['whenKeyPressed'] = this.primNoop; this.primitiveTable['whenClicked'] = this.primNoop; - this.primitiveTable['if'] = function(b) { if (interp.arg(b, 0)) interp.startSubstack(b) }; + this.primitiveTable['if'] = function(b) { if (interp.boolarg(b, 0)) interp.startSubstack(b) }; this.primitiveTable['doForever'] = function(b) { interp.startSubstack(b, true) }; - this.primitiveTable['doForeverIf'] = function(b) { if (interp.arg(b, 0)) interp.startSubstack(b, true); else interp.yield = true; }; - this.primitiveTable['doIf'] = function(b) { if (interp.arg(b, 0)) interp.startSubstack(b); }; + this.primitiveTable['doForeverIf'] = function(b) { if (interp.boolarg(b, 0)) interp.startSubstack(b, true); else interp.yield = true; }; + this.primitiveTable['doIf'] = function(b) { if (interp.boolarg(b, 0)) interp.startSubstack(b); }; this.primitiveTable['doRepeat'] = this.primRepeat; - this.primitiveTable['doIfElse'] = function(b) { if (interp.arg(b, 0)) interp.startSubstack(b); else interp.startSubstack(b, false, true); }; - this.primitiveTable['doWaitUntil'] = function(b) { if (!interp.arg(b, 0)) interp.yield = true }; - this.primitiveTable['doUntil'] = function(b) { if (!interp.arg(b, 0)) interp.startSubstack(b, true) }; + this.primitiveTable['doIfElse'] = function(b) { if (interp.boolarg(b, 0)) interp.startSubstack(b); else interp.startSubstack(b, false, true); }; + this.primitiveTable['doWaitUntil'] = function(b) { if (!interp.boolarg(b, 0)) interp.yield = true }; + this.primitiveTable['doUntil'] = function(b) { if (!interp.boolarg(b, 0)) interp.startSubstack(b, true) }; this.primitiveTable['doReturn'] = function(b) { interp.activeThread = new Thread(null); }; this.primitiveTable['stopAll'] = function(b) { interp.activeThread = new Thread(null); interp.threads = []; } this.primitiveTable['whenIReceive'] = this.primNoop; @@ -264,13 +293,13 @@ Interpreter.prototype.lookupPrim = function(op) { Interpreter.prototype.primNoop = function(b) { console.log(b.op); } Interpreter.prototype.primWait = function(b) { - if (interp.activeThread.firstTime) interp.startTimer(interp.arg(b, 0)); + if (interp.activeThread.firstTime) interp.startTimer(interp.numarg(b, 0)); else interp.checkTimer(); } Interpreter.prototype.primRepeat = function(b) { if (b.tmp == -1) { - b.tmp = Math.max(interp.arg(b, 0), 0); // Initialize repeat count on this block + b.tmp = Math.max(interp.numarg(b, 0), 0); // Initialize repeat count on this block } if (b.tmp > 0) { b.tmp -= 1; // decrement count @@ -323,10 +352,8 @@ Interpreter.prototype.isRunning = function(b) { Interpreter.prototype.startSubstack = function(b, isLoop, secondSubstack) { // Start the substack of a control structure command such as if or forever. - if (isLoop) { - b.isLoop = true; - this.activeThread.stack.push(b); // remember the block that started the substack - } + b.isLoop = !!isLoop; + this.activeThread.stack.push(b); // remember the block that started the substack if(!secondSubstack) { this.activeThread.nextBlock = b.substack; } else { diff --git a/js/primitives/LooksPrims.js b/js/primitives/LooksPrims.js index 2556d65..0f60e3f 100644 --- a/js/primitives/LooksPrims.js +++ b/js/primitives/LooksPrims.js @@ -79,8 +79,8 @@ LooksPrims.prototype.primShowCostume = function(b) { if (i >= 0) { s.showCostume(i); } else { - var n = Number(arg); - if (!isNaN(n)) { + var n = parseInt(arg, 10); + if (n === n) { // if n is not NaN s.showCostume(n - 1); } else { return; // arg did not match a costume name nor is a valid number @@ -104,8 +104,8 @@ LooksPrims.prototype.primStartScene = function(b) { if (i >= 0) { s.showCostume(i); } else { - var n = Number(arg); - if (!isNaN(n)) { + var n = parseInt(arg, 10); + if (n === n) { // fast !isNaN check s.showCostume(n - 1); } else { return; // arg did not match a costume name nor is a valid number @@ -123,14 +123,14 @@ LooksPrims.prototype.primCostumeNum = function(b) { LooksPrims.prototype.primChangeSize = function(b) { var s = interp.targetSprite(); if (s == null) return; - s.setSize(s.getSize() + interp.arg(b, 0)); + s.setSize(s.getSize() + interp.numarg(b, 0)); if (s.visible) interp.redraw(); } LooksPrims.prototype.primSetSize = function(b) { var s = interp.targetSprite(); if (s == null) return; - s.setSize(interp.arg(b, 0)); + s.setSize(interp.numarg(b, 0)); if (s.visible) interp.redraw(); } @@ -148,7 +148,7 @@ LooksPrims.prototype.primGoFront = function(b) { LooksPrims.prototype.primGoBack = function(b) { var s = interp.targetSprite(); - runtime.reassignZ(s, interp.arg(b, 0)); + runtime.reassignZ(s, interp.numarg(b, 0)); if(s.visible) interp.redraw(); } @@ -168,7 +168,7 @@ var showBubbleAndWait = function(b, type) { if (s == null) return; if (interp.activeThread.firstTime) { var text = interp.arg(b, 0); - var secs = interp.arg(b, 1); + var secs = interp.numarg(b, 1); s.showBubble(text, type); if (s.visible) interp.redraw(); interp.startTimer(secs); diff --git a/js/primitives/MotionAndPenPrims.js b/js/primitives/MotionAndPenPrims.js index ed57095..378e618 100644 --- a/js/primitives/MotionAndPenPrims.js +++ b/js/primitives/MotionAndPenPrims.js @@ -57,7 +57,7 @@ MotionAndPenPrims.prototype.addPrimsTo = function(primTable) { MotionAndPenPrims.prototype.primMove = function(b) { var s = interp.targetSprite(); var radians = ((Math.PI * (90 - s.direction)) / 180); - var d = interp.arg(b, 0); + var d = interp.numarg(b, 0); moveSpriteTo(s, s.scratchX + (d * Math.cos(radians)), s.scratchY + (d * Math.sin(radians))); @@ -66,28 +66,28 @@ MotionAndPenPrims.prototype.primMove = function(b) { MotionAndPenPrims.prototype.primTurnLeft = function(b) { var s = interp.targetSprite(); - var d = s.direction - interp.arg(b, 0); + var d = s.direction - interp.numarg(b, 0); s.setDirection(d); if(s.visible) interp.redraw(); } MotionAndPenPrims.prototype.primTurnRight = function(b) { var s = interp.targetSprite(); - var d = s.direction + interp.arg(b, 0); + var d = s.direction + interp.numarg(b, 0); s.setDirection(d); if(s.visible) interp.redraw(); } MotionAndPenPrims.prototype.primSetDirection = function(b) { var s = interp.targetSprite(); - s.setDirection(interp.arg(b, 0)); + s.setDirection(interp.numarg(b, 0)); if(s.visible) interp.redraw(); } MotionAndPenPrims.prototype.primPointTowards = function(b) { var s = interp.targetSprite(); - var p = mouseOrSpritePosition(interp.arg(b, 0)); - if ((s == null) || (p == null)) return; + var p = mouseOrSpritePosition(interp.numarg(b, 0)); + if (s == null) return; var dx = p.x - s.scratchX; var dy = p.y - s.scratchY; var angle = 90 - ((Math.atan2(dy, dx) * 180) / Math.PI); @@ -97,7 +97,7 @@ MotionAndPenPrims.prototype.primPointTowards = function(b) { MotionAndPenPrims.prototype.primGoTo = function(b) { var s = interp.targetSprite(); - if (s != null) moveSpriteTo(s, interp.arg(b, 0), interp.arg(b, 1)); + if (s != null) moveSpriteTo(s, interp.numarg(b, 0), interp.numarg(b, 1)); } MotionAndPenPrims.prototype.primGoToSpriteOrMouse = function(b) { @@ -111,9 +111,9 @@ MotionAndPenPrims.prototype.primGlide = function(b) { var s = interp.targetSprite(); if (s == null) return; if (interp.activeThread.firstTime) { - var secs = interp.arg(b, 0); - var destX = interp.arg(b, 1); - var destY = interp.arg(b, 2); + var secs = interp.numarg(b, 0); + var destX = interp.numarg(b, 1); + var destY = interp.numarg(b, 2); if (secs <= 0) { moveSpriteTo(s, destX, destY); return; @@ -140,22 +140,22 @@ MotionAndPenPrims.prototype.primGlide = function(b) { MotionAndPenPrims.prototype.primChangeX = function(b) { var s = interp.targetSprite(); - if (s != null) moveSpriteTo(s, s.scratchX + interp.arg(b, 0), s.scratchY); + if (s != null) moveSpriteTo(s, s.scratchX + interp.numarg(b, 0), s.scratchY); } MotionAndPenPrims.prototype.primSetX = function(b) { var s = interp.targetSprite(); - if (s != null) moveSpriteTo(s, interp.arg(b, 0), s.scratchY); + if (s != null) moveSpriteTo(s, interp.numarg(b, 0), s.scratchY); } MotionAndPenPrims.prototype.primChangeY = function(b) { var s = interp.targetSprite(); - if (s != null) moveSpriteTo(s, s.scratchX, s.scratchY + interp.arg(b, 0)); + if (s != null) moveSpriteTo(s, s.scratchX, s.scratchY + interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primSetY = function(b) { var s = interp.targetSprite(); - if (s != null) moveSpriteTo(s, s.scratchX, interp.arg(b, 0)); + if (s != null) moveSpriteTo(s, s.scratchX, interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primBounceOffEdge = function(b) { @@ -211,38 +211,38 @@ MotionAndPenPrims.prototype.primPenUp = function(b) { MotionAndPenPrims.prototype.primSetPenColor = function(b) { var s = interp.targetSprite(); - if (s != null) s.setPenColor(interp.arg(b, 0)); + if (s != null) s.setPenColor(interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primSetPenHue = function(b) { var s = interp.targetSprite(); - if (s != null) s.setPenHue(interp.arg(b, 0)); + if (s != null) s.setPenHue(interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primChangePenHue = function(b) { var s = interp.targetSprite(); - if (s != null) s.setPenHue(s.penHue + interp.arg(b, 0)); + if (s != null) s.setPenHue(s.penHue + interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primSetPenShade = function(b) { var s = interp.targetSprite(); - if (s != null) s.setPenShade(interp.arg(b, 0)); + if (s != null) s.setPenShade(interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primChangePenShade = function(b) { var s = interp.targetSprite(); - if (s != null) s.setPenShade(s.penShade + interp.arg(b, 0)); + if (s != null) s.setPenShade(s.penShade + interp.numarg(b, 0)); } MotionAndPenPrims.prototype.primSetPenSize = function(b) { var s = interp.targetSprite(); - var w = Math.max(0, Math.min(interp.arg(b, 0), 100)); + var w = Math.max(0, Math.min(interp.numarg(b, 0), 100)); if (s != null) s.penWidth = w; } MotionAndPenPrims.prototype.primChangePenSize = function(b) { var s = interp.targetSprite(); - var w = Math.max(0, Math.min(s.penWidth + interp.arg(b, 0), 100)); + var w = Math.max(0, Math.min(s.penWidth + interp.numarg(b, 0), 100)); if (s != null) s.penWidth = w; } @@ -253,7 +253,7 @@ MotionAndPenPrims.prototype.primStamp = function(b) { MotionAndPenPrims.prototype.primStampTransparent = function(b) { var s = interp.targetSprite(); - var transparency = Math.max(0, Math.min(interp.arg(b, 0), 100)); + var transparency = Math.max(0, Math.min(interp.numarg(b, 0), 100)); var alpha = 100 - transparency; s.stamp(runtime.stage.lineCache, alpha); } diff --git a/js/primitives/Primitives.js b/js/primitives/Primitives.js index e869586..fde62e5 100644 --- a/js/primitives/Primitives.js +++ b/js/primitives/Primitives.js @@ -26,23 +26,23 @@ var Primitives = function() {} Primitives.prototype.addPrimsTo = function(primTable) { // Math primitives - primTable["+"] = function(b) { return interp.arg(b, 0) + interp.arg(b, 1) }; - primTable["-"] = function(b) { return interp.arg(b, 0) - interp.arg(b, 1) }; - primTable["*"] = function(b) { return interp.arg(b, 0) * interp.arg(b, 1) }; - primTable["/"] = function(b) { return interp.arg(b, 0) / interp.arg(b, 1) }; - primTable["%"] = function(b) { return interp.arg(b, 0) % interp.arg(b, 1) }; + primTable["+"] = function(b) { return interp.numarg(b, 0) + interp.numarg(b, 1) }; + primTable["-"] = function(b) { return interp.numarg(b, 0) - interp.numarg(b, 1) }; + primTable["*"] = function(b) { return interp.numarg(b, 0) * interp.numarg(b, 1) }; + primTable["/"] = function(b) { return interp.numarg(b, 0) / interp.numarg(b, 1) }; + primTable["%"] = function(b) { return interp.numarg(b, 0) % interp.numarg(b, 1) }; primTable["randomFrom:to:"] = this.primRandom; - primTable["<"] = function(b) { return (interp.arg(b, 0) < interp.arg(b, 1)) }; + primTable["<"] = function(b) { return (interp.numarg(b, 0) < interp.numarg(b, 1)) }; primTable["="] = function(b) { return (interp.arg(b, 0) == interp.arg(b, 1)) }; - primTable[">"] = function(b) { return (interp.arg(b, 0) > interp.arg(b, 1)) }; - primTable["&"] = function(b) { return interp.arg(b, 0) && interp.arg(b, 1) }; - primTable["|"] = function(b) { return interp.arg(b, 0) || interp.arg(b, 1) }; - primTable["not"] = function(b) { return !interp.arg(b, 0) }; - primTable["abs"] = function(b) { return Math.abs(interp.arg(b, 0)) }; - primTable["sqrt"] = function(b) { return Math.sqrt(interp.arg(b, 0)) }; + primTable[">"] = function(b) { return (interp.numarg(b, 0) > interp.numarg(b, 1)) }; + primTable["&"] = function(b) { return interp.boolarg(b, 0) && interp.boolarg(b, 1) }; + primTable["|"] = function(b) { return interp.boolarg(b, 0) || interp.boolarg(b, 1) }; + primTable["not"] = function(b) { return !interp.boolarg(b, 0) }; + primTable["abs"] = function(b) { return Math.abs(interp.numarg(b, 0)) }; + primTable["sqrt"] = function(b) { return Math.sqrt(interp.numarg(b, 0)) }; primTable["\\\\"] = this.primModulo; - primTable["rounded"] = function(b) { return Math.round(interp.arg(b, 0)) }; + primTable["rounded"] = function(b) { return Math.round(interp.numarg(b, 0)) }; primTable["computeFunction:of:"] = this.primMathFunction; // String primitives @@ -58,8 +58,8 @@ Primitives.prototype.addPrimsTo = function(primTable) { } Primitives.prototype.primRandom = function(b) { - var n1 = interp.arg(b, 0); - var n2 = interp.arg(b, 1); + var n1 = interp.numarg(b, 0); + var n2 = interp.numarg(b, 1); var low = (n1 <= n2) ? n1 : n2; var hi = (n1 <= n2) ? n2 : n1; if(low == hi) return low; @@ -72,21 +72,21 @@ Primitives.prototype.primRandom = function(b) { Primitives.prototype.primLetterOf = function(b) { var s = interp.arg(b, 1); - var i = interp.arg(b, 0) - 1; + var i = interp.numarg(b, 0) - 1; if ((i < 0) || (i >= s.length)) return ""; return s.charAt(i); } Primitives.prototype.primModulo = function(b) { - var modulus = interp.arg(b, 1); - var n = interp.arg(b, 0) % modulus; + var modulus = interp.numarg(b, 1); + var n = interp.numarg(b, 0) % modulus; if (n < 0) n += modulus; return n; } Primitives.prototype.primMathFunction = function(b) { - var op = interp.arg(b, 0); - var n = interp.arg(b, 1); + var op = interp.numarg(b, 0); + var n = interp.numarg(b, 1); switch(op) { case "abs": return Math.abs(n); case "sqrt": return Math.sqrt(n); diff --git a/js/primitives/SoundPrims.js b/js/primitives/SoundPrims.js index 0afb178..6dbf594 100644 --- a/js/primitives/SoundPrims.js +++ b/js/primitives/SoundPrims.js @@ -155,8 +155,8 @@ SoundPrims.prototype.primPlayNote = function(b) { var s = interp.targetSprite(); if (s == null) return; if (interp.activeThread.firstTime) { - var key = interp.arg(b, 0); - var secs = beatsToSeconds(interp.arg(b, 1)); + var key = interp.numarg(b, 0); + var secs = beatsToSeconds(interp.numarg(b, 1)); playNote(s.instrument, key, secs, s); interp.startTimer(secs); } else { @@ -168,8 +168,8 @@ SoundPrims.prototype.primPlayDrum = function(b) { var s = interp.targetSprite(); if (s == null) return; if (interp.activeThread.firstTime) { - var drum = Math.round(interp.arg(b, 0)); - var secs = beatsToSeconds(interp.arg(b, 1)); + var drum = Math.round(interp.numarg(b, 0)); + var secs = beatsToSeconds(interp.numarg(b, 1)); playDrum(drum, secs, s); interp.startTimer(secs); } else { @@ -181,7 +181,7 @@ SoundPrims.prototype.primPlayRest = function(b) { var s = interp.targetSprite(); if (s == null) return; if (interp.activeThread.firstTime) { - var secs = beatsToSeconds(interp.arg(b, 0)); + var secs = beatsToSeconds(interp.numarg(b, 0)); interp.startTimer(secs); } else { interp.checkTimer(); @@ -199,12 +199,12 @@ SoundPrims.prototype.primStopAllSounds = function(b) { SoundPrims.prototype.primChangeVolume = function(b) { var s = interp.targetSprite(); - if (s != null) s.volume += interp.arg(b, 0); + if (s != null) s.volume += interp.numarg(b, 0); } SoundPrims.prototype.primSetVolume = function(b) { var s = interp.targetSprite(); - if (s != null) s.volume = interp.arg(b, 0); + if (s != null) s.volume = interp.numarg(b, 0); } SoundPrims.prototype.primVolume = function(b) { diff --git a/js/primitives/VarListPrims.js b/js/primitives/VarListPrims.js index 209dd30..effff57 100644 --- a/js/primitives/VarListPrims.js +++ b/js/primitives/VarListPrims.js @@ -63,11 +63,9 @@ VarListPrims.prototype.primChangeVar = function(b) { if (s == null) return; var targetVar = interp.arg(b, 0); if (targetVar in s.variables) { - s.variables[targetVar] = parseFloat(s.variables[targetVar]); - s.variables[targetVar] += interp.arg(b, 1); + s.variables[targetVar] = parseFloat(s.variables[targetVar]) + interp.numarg(b, 1); } else if (targetVar in runtime.stage.variables) { - runtime.stage.variables[targetVar] = parseFloat(runtime.stage.variables[targetVar]); - runtime.stage.variables[targetVar] += interp.arg(b, 1); + runtime.stage.variables[targetVar] = parseFloat(runtime.stage.variables[targetVar]) + interp.numarg(b, 1); } } @@ -123,7 +121,7 @@ VarListPrims.prototype.primListDeleteLine = function(b) { var line = interp.arg(b, 0); if (line == 'all' || list.length == 0) list.length = 0; else if (line == 'last') list.splice(list.length - 1, 1); - else if (parseInt(line) - 1 in list) list.splice(parseInt(line) - 1, 1); + else if (parseInt(line, 10) - 1 in list) list.splice(parseInt(line, 10) - 1, 1); } VarListPrims.prototype.primListInsertAt = function(b) { @@ -134,7 +132,7 @@ VarListPrims.prototype.primListInsertAt = function(b) { var position = interp.arg(b, 1); if (position == 'last') position = list.length; else if (position == 'random') position = Math.round(Math.random() * list.length); - else position = parseInt(position) - 1; + else position = parseInt(position, 10) - 1; if (position > list.length) return; list.splice(position, 0, newItem); @@ -148,7 +146,7 @@ VarListPrims.prototype.primListSetLine = function(b) { if (position == 'last') position = list.length - 1; else if (position == 'random') position = Math.floor(Math.random() * list.length); - else position = parseInt(position) - 1; + else position = parseInt(position, 10) - 1; if (position > list.length - 1) return; list[position] = newItem; From 68bbfc962ab42a563d67cd185cb849d44fb8c731 Mon Sep 17 00:00:00 2001 From: MathWizz <mathwizz94@gmail.com> Date: Sat, 2 Nov 2013 01:58:01 -0500 Subject: [PATCH 2/3] Removed debugger statement --- js/Interpreter.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/Interpreter.js b/js/Interpreter.js index 0d518e8..67478d5 100644 --- a/js/Interpreter.js +++ b/js/Interpreter.js @@ -149,7 +149,6 @@ Interpreter.prototype.stepActiveThread = function() { return; } else { b = this.activeThread.stack.pop(); - debugger; if (b.isLoop) { this.activeThread.nextBlock = b; // preserve where it left off return; From 2bc7a4afc024f368d66991aeadce25988f78184c Mon Sep 17 00:00:00 2001 From: MathWizz <mathwizz94@gmail.com> Date: Mon, 4 Nov 2013 12:35:43 -0600 Subject: [PATCH 3/3] Fixed Interpreter.boolarg incorrectly checking strings --- js/Interpreter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/Interpreter.js b/js/Interpreter.js index 67478d5..7974406 100644 --- a/js/Interpreter.js +++ b/js/Interpreter.js @@ -217,7 +217,7 @@ Interpreter.prototype.boolarg = function(block, index) { if (typeof arg === 'boolean') { return arg; } else if (typeof arg === 'string') { - return arg === '' || arg === '0' || arg.toLowerCase() === 'false'; + return !(arg === '' || arg === '0' || arg.toLowerCase() === 'false'); } return arg; }