From 7113d47d1ef227732b610026bee8c22b9ada3525 Mon Sep 17 00:00:00 2001 From: crawshaw Date: Thu, 6 Jan 2005 17:05:14 +0000 Subject: [PATCH] minor bug fixes from moving interfaces darcs-hash:20050106170514-2eb37-845c276f03f9f1425a1301d61acfc6963aa03cdd.gz --- src/org/ibex/js/Interpreter.java | 20 ++++++++++---------- src/org/ibex/js/JS.java | 16 +++++++--------- src/org/ibex/js/JSDate.java | 6 ++---- src/org/ibex/js/JSMath.java | 6 ++++-- src/org/ibex/js/JSPrimitive.java | 32 ++++++++++++++++---------------- src/org/ibex/js/JSRegexp.java | 24 ++++++++++++------------ src/org/ibex/js/PropertyFile.java | 2 +- src/org/ibex/js/Test.java | 8 ++++---- 8 files changed, 56 insertions(+), 58 deletions(-) diff --git a/src/org/ibex/js/Interpreter.java b/src/org/ibex/js/Interpreter.java index 9899a14..80de88d 100644 --- a/src/org/ibex/js/Interpreter.java +++ b/src/org/ibex/js/Interpreter.java @@ -109,8 +109,8 @@ class Interpreter implements ByteCodes, Tokens, Pausable { case OBJECT: stack.push(new JS.Obj()); break; case ARRAY: stack.push(new JSArray(Script.toInt((JS)arg))); break; //case DECLARE: scope.declare((JS)(arg==null ? stack.peek() : arg)); if(arg != null) stack.push((JS)arg); break; - case JT: if (Script.toBoolean(stack.pop())) pc += Script.toInt((JS)arg) - 1; break; - case JF: if (!Script.toBoolean(stack.pop())) pc += Script.toInt((JS)arg) - 1; break; + case JT: if (Script.toBoolean((JS)stack.pop())) pc += Script.toInt((JS)arg) - 1; break; + case JF: if (!Script.toBoolean((JS)stack.pop())) pc += Script.toInt((JS)arg) - 1; break; case JMP: pc += Script.toInt((JS)arg) - 1; break; case POP: stack.pop(); break; case SWAP: stack.swap(); break; @@ -123,10 +123,10 @@ class Interpreter implements ByteCodes, Tokens, Pausable { case OLDSCOPE: scope = scope.parent; break; case GLOBALSCOPE: stack.push(scope.getGlobal()); break; case SCOPEGET: stack.push(scope.get((JS)arg)); break; - case SCOPEPUT: scope.put((JS)arg,stack.peek()); break; - case ASSERT: if (!Script.toBoolean(stack.pop())) throw je("ibex.assertion.failed"); break; - case BITNOT: stack.push(Script.N(~Script.toLong(stack.pop()))); break; - case BANG: stack.push(Script.B(!Script.toBoolean(stack.pop()))); break; + case SCOPEPUT: scope.put((JS)arg, (JS)stack.peek()); break; + case ASSERT: if (!Script.toBoolean((JS)stack.pop())) throw je("ibex.assertion.failed"); break; + case BITNOT: stack.push(Script.N(~Script.toLong((JS)stack.pop()))); break; + case BANG: stack.push(Script.B(!Script.toBoolean((JS)stack.pop()))); break; case NEWFUNCTION: stack.push(((JSFunction)arg)._cloneWithNewParentScope(scope)); break; case LABEL: break; @@ -168,7 +168,7 @@ class Interpreter implements ByteCodes, Tokens, Pausable { int loopInstructionLocation = ((LoopMarker)o).location; int endOfLoop = Script.toInt((JS)f.arg[loopInstructionLocation]) + loopInstructionLocation; scope = ((LoopMarker)o).scope; - if (op == CONTINUE) { stack.push(o); stack.push(JS.F); } + if (op == CONTINUE) { stack.push(o); stack.push(Script.F); } pc = op == BREAK ? endOfLoop - 1 : loopInstructionLocation; continue OUTER; } @@ -237,7 +237,7 @@ class Interpreter implements ByteCodes, Tokens, Pausable { case CASCADE: { boolean write = Script.toBoolean((JS)arg); - JS val = write ? stack.pop() : null; + JS val = write ? (JS)stack.pop() : null; CallMarker o = stack.findCall(); if(!(o instanceof TrapMarker)) throw new JSExn("tried to CASCADE while not in a trap"); TrapMarker tm = (TrapMarker) o; @@ -494,7 +494,7 @@ class Interpreter implements ByteCodes, Tokens, Pausable { boolean ret; if(left == null && right == null) ret = true; else if(left == null || right == null) ret = false; - else ret = left.jsequals(right); + else ret = left.equals(right); stack.push(Script.B(op == EQ ? ret : !ret)); break; } @@ -671,7 +671,7 @@ class Interpreter implements ByteCodes, Tokens, Pausable { if(cm.f == null) break; String s = cm.f.sourceName + ":" + cm.f.line[cm.pc-1]; if(cm instanceof Interpreter.TrapMarker) - s += " (trap on " + Script.str(((Interpreter.TrapMarker)cm).t.key) + ")"; + s += " (trap on " + Script.str(((Interpreter.TrapMarker)cm).t.key()) + ")"; e.addBacktrace(s); } } diff --git a/src/org/ibex/js/JS.java b/src/org/ibex/js/JS.java index 6d17d31..6b40fe8 100644 --- a/src/org/ibex/js/JS.java +++ b/src/org/ibex/js/JS.java @@ -251,15 +251,13 @@ public interface JS extends Pausable { return (JS)new Interpreter(t, val, true).run(null); } - /** returns a callback which will restart the context; expects a value to be pushed onto the stack when unpaused */ - public static UnpauseCallback pause() throws NotPauseableException { - Interpreter i = Interpreter.current(); - if (i.pausecount == -1) throw new NotPauseableException(); - boolean get; - switch(i.f.op[i.pc]) { - case Tokens.RETURN: case ByteCodes.PUT: get = false; break; - case ByteCodes.GET: case ByteCodes.CALL: get = true; break; - default: throw new Error("should never happen"); + public void addTrap(JS key, JS f) throws JSExn { + if (f.getFormalArgs() == null || f.getFormalArgs().length > 1) throw new JSExn( + "traps must take either one argument (write) or no arguments (read)"); + int i = indexOf(key); if (i < 0) i = put(i, key); + for (Trap t = (Trap)entries[i + 2]; t != null; t = t.next()) + if (t.function().equals(f)) return; + entries[i + 2] = new TrapHolder(this, key, f, (Trap)entries[i + 2]); } public void delTrap(JS key, JS f) throws JSExn { diff --git a/src/org/ibex/js/JSDate.java b/src/org/ibex/js/JSDate.java index b90da68..5e5eaaf 100644 --- a/src/org/ibex/js/JSDate.java +++ b/src/org/ibex/js/JSDate.java @@ -100,8 +100,6 @@ public class JSDate extends JS.Immutable { // fall through } default: { - JS[] args = new JS[nargs]; - for(int i=0; i= 1 ? Script.toInt(arg0) : 0; - int b = alength >= 2 ? Script.toInt(arg1) : slength; + int a = args.length >= 1 ? Script.toInt(args[0]) : 0; + int b = args.length >= 2 ? Script.toInt(args[1]) : slength; if (a > slength) a = slength; if (b > slength) b = slength; if (a < 0) a = 0; @@ -30,8 +30,8 @@ class JSPrimitive extends JS.Immutable { return Script.S(s.substring(a,b)); } case "substr": { - int start = alength >= 1 ? Script.toInt(arg0) : 0; - int len = alength >= 2 ? Script.toInt(arg1) : Integer.MAX_VALUE; + int start = args.length >= 1 ? Script.toInt(args[0]) : 0; + int len = args.length >= 2 ? Script.toInt(args[1]) : Integer.MAX_VALUE; if (start < 0) start = slength + start; if (start < 0) start = 0; if (len < 0) len = 0; @@ -40,12 +40,12 @@ class JSPrimitive extends JS.Immutable { return Script.S(s.substring(start,start+len)); } case "charAt": { - int p = alength >= 1 ? Script.toInt(arg0) : 0; + int p = args.length >= 1 ? Script.toInt(args[0]) : 0; if (p < 0 || p >= slength) return Script.S(""); return Script.S(s.substring(p,p+1)); } case "charCodeAt": { - int p = alength >= 1 ? Script.toInt(arg0) : 0; + int p = args.length >= 1 ? Script.toInt(args[0]) : 0; if (p < 0 || p >= slength) return Script.N(Double.NaN); return Script.N(s.charAt(p)); } @@ -55,26 +55,26 @@ class JSPrimitive extends JS.Immutable { return Script.S(sb.toString()); } case "indexOf": { - String search = alength >= 1 ? Script.toString(arg0) : "null"; - int start = alength >= 2 ? Script.toInt(arg1) : 0; + String search = args.length >= 1 ? Script.toString(args[0]) : "null"; + int start = args.length >= 2 ? Script.toInt(args[1]) : 0; // Java's indexOf handles an out of bounds start index, it'll return -1 return Script.N(s.indexOf(search,start)); } case "lastIndexOf": { - String search = alength >= 1 ? Script.toString(arg0) : "null"; - int start = alength >= 2 ? Script.toInt(arg1) : 0; + String search = args.length >= 1 ? Script.toString(args[0]) : "null"; + int start = args.length >= 2 ? Script.toInt(args[1]) : 0; // Java's indexOf handles an out of bounds start index, it'll return -1 return Script.N(s.lastIndexOf(search,start)); } - case "match": return JSRegexp.stringMatch(this,arg0); - case "replace": return JSRegexp.stringReplace(this,arg0,arg1); - case "search": return JSRegexp.stringSearch(this,arg0); - case "split": return JSRegexp.stringSplit(this,arg0,arg1,alength); + case "match": return JSRegexp.stringMatch(this,args[0]); + case "replace": return JSRegexp.stringReplace(this,args[0],args[1]); + case "search": return JSRegexp.stringSearch(this,args[0]); + case "split": return JSRegexp.stringSplit(this,args[0],args[1],args.length); case "toLowerCase": return Script.S(s.toLowerCase()); case "toUpperCase": return Script.S(s.toUpperCase()); case "slice": { - int a = alength >= 1 ? Script.toInt(arg0) : 0; - int b = alength >= 2 ? Script.toInt(arg1) : slength; + int a = args.length >= 1 ? Script.toInt(args[0]) : 0; + int b = args.length >= 2 ? Script.toInt(args[1]) : slength; if (a < 0) a = slength + a; if (b < 0) b = slength + b; if (a < 0) a = 0; diff --git a/src/org/ibex/js/JSRegexp.java b/src/org/ibex/js/JSRegexp.java index 40afb01..3353b1d 100644 --- a/src/org/ibex/js/JSRegexp.java +++ b/src/org/ibex/js/JSRegexp.java @@ -48,7 +48,7 @@ public class JSRegexp extends JS.Immutable { case 1: { //#switch(Script.str(method)) case "exec": { - String s = Script.toString(a0); + String s = Script.toString(args[0]); int start = global ? lastIndex : 0; if(start < 0 || start >= s.length()) { lastIndex = 0; return null; } GnuRegexp.REMatch match = re.getMatch(s,start); @@ -56,13 +56,13 @@ public class JSRegexp extends JS.Immutable { return match == null ? null : matchToExecResult(match,re,s); } case "test": { - String s = Script.toString(a0); - if (!global) return B(re.getMatch(s) != null); + String s = Script.toString(args[0]); + if (!global) return Script.B(re.getMatch(s) != null); int start = global ? lastIndex : 0; if(start < 0 || start >= s.length()) { lastIndex = 0; return null; } GnuRegexp.REMatch match = re.getMatch(s,start); lastIndex = match != null ? s.length() : match.getEndIndex(); - return B(match != null); + return Script.B(match != null); } case "toString": return Script.S(args[0].coerceToString()); //#end @@ -299,7 +299,7 @@ public class JSRegexp extends JS.Immutable { if(sep != null && sep.length()==0) { int len = s.length(); for(int i=0;i