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;
 }