From 96cc912c45623abf8a8a37d7c1d6103e5fe58bd5 Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 30 Jan 2004 07:44:06 +0000 Subject: [PATCH] 2004/01/07 20:37:33 darcs-hash:20040130074406-aa32f-c56b3f845ff780f2ed7d209f9e1d5315f9448047.gz --- src/org/xwt/js/JS.java | 6 +- src/org/xwt/js/JSArray.java | 133 ++++++++++++++++++++++++++++------------ src/org/xwt/js/JSExn.java | 10 ++- src/org/xwt/js/JSFunction.java | 1 + src/org/xwt/js/JSRegexp.java | 8 +-- src/org/xwt/js/JSScope.java | 6 ++ src/org/xwt/js/Parser.java | 8 ++- src/org/xwt/js/Trap.java | 8 +-- src/org/xwt/util/XML.java | 2 +- 9 files changed, 131 insertions(+), 51 deletions(-) diff --git a/src/org/xwt/js/JS.java b/src/org/xwt/js/JS.java index c6d5dd6..a4b1650 100644 --- a/src/org/xwt/js/JS.java +++ b/src/org/xwt/js/JS.java @@ -14,6 +14,10 @@ public class JS extends org.xwt.util.BalancedTree { /** log a message with the current JavaScript sourceName/line */ public static void log(Object o, Object message) { log(message); } public static void log(Object message) { Log.echo(JS.getSourceName() + ":" + JS.getLine(), message); } + public static void log(JSExn e) { + Log.echo(e,"JS Exception: " + e.getObject() + "\n" + e.backtrace()); + Log.echo(e,e); + } public static int getLine() { Interpreter c = Interpreter.current(); @@ -156,7 +160,7 @@ public class JS extends org.xwt.util.BalancedTree { /** override and return true to allow placing traps on this object. * if isRead true, this is a read trap, otherwise write trap **/ - protected boolean isTrappable(Object name, boolean isRead) { return false; } + protected boolean isTrappable(Object name, boolean isRead) { return true; } /** performs a put, triggering traps if present; traps are run in an unpauseable interpreter */ public void putAndTriggerTraps(Object key, Object value) throws JSExn { diff --git a/src/org/xwt/js/JSArray.java b/src/org/xwt/js/JSArray.java index 2f5f04d..a5798bf 100644 --- a/src/org/xwt/js/JSArray.java +++ b/src/org/xwt/js/JSArray.java @@ -2,14 +2,15 @@ package org.xwt.js; import org.xwt.util.*; -import java.io.*; import java.util.*; /** A JavaScript JSArray */ public class JSArray extends JS { - private Vec vec = new Vec(); + private static final Object NULL = new Object(); + public JSArray() { } - public JSArray(int size) { vec.setSize(size); } + public JSArray(int size) { setSize(size); } + private static int intVal(Object o) { if (o instanceof Number) { int intVal = ((Number)o).intValue(); @@ -24,14 +25,16 @@ public class JSArray extends JS { public Object callMethod(Object method, Object a0, Object a1, Object a2, Object[] rest, int nargs) throws JSExn { //#switch(method) - case "pop": return vec.pop(); + case "pop": { + int oldSize = size(); + if(oldSize == 0) return null; + return removeElementAt(oldSize-1); + } case "reverse": return reverse(); case "toString": return join(","); case "shift": if(length() == 0) return null; - Object o = vec.elementAt(0); - vec.removeElementAt(0); - return o; + return removeElementAt(0); case "join": return join(nargs == 0 ? "," : JS.toString(a0)); case "sort": @@ -40,12 +43,14 @@ public class JSArray extends JS { int start = toInt(nargs < 1 ? null : a0); int end = nargs < 2 ? length() : toInt(a1); return slice(start, end); - case "push": - for(int i=0; i= size()) return null; + return elementAt(i); } //#switch(key) case "pop": return METHOD; @@ -75,42 +76,73 @@ public class JSArray extends JS { case "push": return METHOD; case "unshift": return METHOD; case "splice": return METHOD; - case "length": return N(vec.size()); + case "length": return N(size()); //#end return super.get(key); } public void put(Object key, Object val) throws JSExn { - if (key.equals("length")) vec.setSize(toNumber(val).intValue()); + if (key.equals("length")) setSize(toInt(val)); int i = intVal(key); - if (i == Integer.MIN_VALUE) super.put(key, val); + if (i == Integer.MIN_VALUE) + super.put(key, val); else { - if (i >= vec.size()) vec.setSize(i+1); - vec.setElementAt(val, i); + int oldSize = size(); + if(i < oldSize) { + setElementAt(val,i); + } else { + if(i > oldSize) setSize(i); + insertElementAt(val,i); + } } } public Enumeration keys() { return new Enumeration() { int cur = 0; - public boolean hasMoreElements() { return cur >= vec.size(); } + public boolean hasMoreElements() { return cur >= size(); } public Object nextElement() { - if (cur >= vec.size()) throw new NoSuchElementException(); + if (cur >= size()) throw new NoSuchElementException(); return new Integer(cur++); } }; } - public void setSize(int i) { vec.setSize(i); } - public int length() { return vec.size(); } - public Object elementAt(int i) { return vec.elementAt(i); } - public void addElement(Object o) { vec.addElement(o); } - public void setElementAt(Object o, int i) { vec.setElementAt(o, i); } - public int size() { return vec.size(); } + public final void setSize(int newSize) { + // FEATURE: This could be done a lot more efficiently in BalancedTree + int oldSize = size(); + for(int i=oldSize;i=newSize;i--) removeElementAt(i); + } + + public final int length() { return size(); } + public final Object elementAt(int i) { + if(i < 0 || i >= size()) throw new ArrayIndexOutOfBoundsException(i); + Object o = getNode(i); + return o == NULL ? null : o; + } + public final void addElement(Object o) { + insertNode(size(),o==null ? NULL : o); + } + public final void setElementAt(Object o, int i) { + if(i < 0 || i >= size()) throw new ArrayIndexOutOfBoundsException(i); + replaceNode(i,o==null ? NULL : o); + } + public final void insertElementAt(Object o, int i) { + if(i < 0 || i > size()) throw new ArrayIndexOutOfBoundsException(i); + insertNode(i,o==null ? NULL : o); + } + public final Object removeElementAt(int i) { + if(i < 0 || i >= size()) throw new ArrayIndexOutOfBoundsException(i); + Object o = deleteNode(i); + return o == NULL ? null : o; + } + + public final int size() { return treeSize(); } public String typeName() { return "array"; } private Object join(String sep) { - int length = vec.size(); + int length = size(); if(length == 0) return ""; StringBuffer sb = new StringBuffer(64); int i=0; @@ -123,12 +155,13 @@ public class JSArray extends JS { return sb.toString(); } + // FEATURE: Implement this more efficiently private Object reverse() { - Vec oldVec = vec; - int size = oldVec.size(); + int size = size(); if(size < 2) return this; - vec = new Vec(size); - for(int i=size-1;i>=0;i--) vec.addElement(oldVec.elementAt(i)); + Vec vec = toVec(); + clear(); + for(int i=size-1,j=0;i>=0;i--,j++) insertElementAt(vec.elementAt(i),j); return this; } @@ -152,6 +185,7 @@ public class JSArray extends JS { } }; private Object sort(Object tmp) throws JSExn { + Vec vec = toVec(); if(tmp instanceof JS) { final JSArray funcArgs = new JSArray(2); final JS jsFunc = (JS) tmp; @@ -170,6 +204,7 @@ public class JSArray extends JS { } else { vec.sort(defaultSort); } + setFromVec(vec); return this; } @@ -203,5 +238,25 @@ public class JSArray extends JS { return ret; } - public String coerceToString() { return JS.toString(join(",")); } + protected Vec toVec() { + int count = size(); + Vec vec = new Vec(); + vec.setSize(count); + for(int i=0;i= 0 && col >= 0 ? " at " + line + ":" + col: ""); } } -- 1.7.10.4