public static Number toNumber(Object o) {
if (o == null) return new Long(0);
if (o instanceof Number) return ((Number)o);
- // FIXME: There are about 3 pages of rules in ecma262 about string to number conversions
- // We aren't even close to following all those rules
+
+ // NOTE: There are about 3 pages of rules in ecma262 about string to number conversions
+ // We aren't even close to following all those rules. We probably never will be.
if (o instanceof String) try { return new Double((String)o); } catch (NumberFormatException e) { return new Double(Double.NaN); }
if (o instanceof Boolean) return ((Boolean)o).booleanValue() ? new Long(1) : new Long(0);
if (o instanceof JS) return ((JS)o).coerceToNumber();
/** A sensible implementation of the abstract methods in the JS class */
public static class Obj extends JS {
- private Hash entries = new Hash();
+ private Hash entries = null;
private boolean sealed = false;
public Obj() { this(false); }
public Obj(boolean sealed) { this.sealed = sealed; }
- /** a sealed object cannot have its properties modified */
- public void setSeal(boolean sealed) { this.sealed = sealed; }
- public void put(Object key, Object val) { if (!sealed) entries.put(key, val); }
- public Object[] keys() { return(entries.keys()); }
- public Object get(Object key) {
- if(callMethod((String)key,null,true) == Boolean.TRUE)
- return new Internal.CallableStub(this,key);
- return entries.get(key);
+ public void setSeal(boolean sealed) { this.sealed = sealed; } ///< a sealed object cannot have its properties modified
+ public void put(Object key, Object val) { put(key, null, val); }
+ protected void put(Object key, Object key2, Object val) {
+ if (sealed) return;
+ if (entries == null) entries = new Hash();
+ entries.put(key, key2, val); }
+ public Object[] keys() { return entries == null ? new Object[0] : entries.keys(); }
+ public Object get(Object key) { return get(key, null); }
+ protected Object get(Object key, Object key2) {
+ if (entries == null) return null;
+ if(key2 == null && callMethod((String)key, null, true) == Boolean.TRUE)
+ return new Internal.CallableStub(this, key);
+ return entries.get(key, key2);
}
}
/** a Callable which was compiled from JavaScript code */
public static class CompiledFunction extends CompiledFunctionImpl {
+ public int getNumFormalArgs() { return numFormalArgs; }
CompiledFunction(String sourceName, int firstLine, Reader sourceCode, Scope scope) throws IOException {
super(sourceName, firstLine, sourceCode, scope);
}