2003/07/07 01:47:36
[org.ibex.core.git] / src / org / xwt / js / CompiledFunctionImpl.java
index e8fa95f..217a613 100644 (file)
@@ -81,8 +81,10 @@ class CompiledFunctionImpl extends JSCallable implements ByteCodes, Tokens {
     // Adding and Altering Bytecodes ///////////////////////////////////////////////////
 
     int get(int pos) { return op[pos]; }
+    Object getArg(int pos) { return arg[pos]; }
     void set(int pos, int op_, Object arg_) { op[pos] = op_; arg[pos] = arg_; }
     void set(int pos, Object arg_) { arg[pos] = arg_; }
+    int pop() { size--; arg[size] = null; return op[size]; }
     void paste(CompiledFunctionImpl other) { for(int i=0; i<other.size; i++) add(other.line[i], other.op[i], other.arg[i]); }
     CompiledFunctionImpl add(int line, int op_) { return add(line, op_, null); }
     CompiledFunctionImpl add(int line, int op_, Object arg_) {
@@ -126,7 +128,7 @@ class CompiledFunctionImpl extends JSCallable implements ByteCodes, Tokens {
             case LITERAL: t.push(arg[pc]); break;
             case OBJECT: t.push(new JS.Obj()); break;
             case ARRAY: t.push(new JS.Array(JS.toNumber(arg[pc]).intValue())); break;
-            case DECLARE: s.declare((String)t.pop()); break;
+            case DECLARE: s.declare((String)(arg[pc]==null ? t.peek() : arg[pc])); if(arg[pc] != null) t.push(arg[pc]); break;
             case TOPSCOPE: t.push(s); break;
             case JT: if (JS.toBoolean(t.pop())) pc += JS.toNumber(arg[pc]).intValue() - 1; break;
             case JF: if (!JS.toBoolean(t.pop())) pc += JS.toNumber(arg[pc]).intValue() - 1; break;
@@ -249,7 +251,7 @@ class CompiledFunctionImpl extends JSCallable implements ByteCodes, Tokens {
             case GET_PRESERVE: {
                 Object o, v;
                 if (op[pc] == GET) {
-                    v = t.pop();
+                    v = arg[pc] == null ? t.pop() : arg[pc];
                     o = t.pop();
                 } else {
                     v = t.pop();