From ccacfb410e657b2c23dc9eb5ebc5aaef7c03d1bb Mon Sep 17 00:00:00 2001 From: "duncan.macgregor" Date: Wed, 31 Dec 2025 18:22:51 +0000 Subject: [PATCH 001/147] Make `Scriptable` and `VarScope` separate descendants of `PropHolder`. --- .../mozilla/javascript/EqualObjectGraphs.java | 43 ++++++++-- .../mozilla/javascript/ImporterTopLevel.java | 1 + .../org/mozilla/javascript/Interpreter.java | 46 +++++------ .../java/org/mozilla/javascript/JSScript.java | 3 - .../org/mozilla/javascript/PropHolder.java | 11 +++ .../org/mozilla/javascript/ScopeObject.java | 56 +++++-------- .../org/mozilla/javascript/ScopeWrapper.java | 6 +- .../java/org/mozilla/javascript/Script.java | 2 +- .../org/mozilla/javascript/Scriptable.java | 1 + .../mozilla/javascript/ScriptableObject.java | 80 +++++++++++-------- .../org/mozilla/javascript/SlotMapOwner.java | 57 ++++++++++++- .../java/org/mozilla/javascript/TopLevel.java | 20 +++-- .../java/org/mozilla/javascript/VarScope.java | 40 +++------- .../org/mozilla/javascript/WithScope.java | 24 +++--- .../mozilla/javascript/lc/type/TypeInfo.java | 3 + .../mozilla/javascript/testutils/Utils.java | 13 +-- 16 files changed, 237 insertions(+), 169 deletions(-) diff --git a/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java b/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java index 39000f9612a..8ac9b78526a 100644 --- a/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java +++ b/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java @@ -150,6 +150,8 @@ private boolean equalGraphsNoMemo(Object o1, Object o2) { && equalJSFunctions((ScriptOrFn) o1, (ScriptOrFn) o2); } else if (o1 instanceof Scriptable) { return o2 instanceof Scriptable && equalScriptables((Scriptable) o1, (Scriptable) o2); + } else if (o1 instanceof VarScope) { + return o2 instanceof VarScope && equalScopes((VarScope) o1, (VarScope) o2); } else if (o1 instanceof SymbolKey) { return o2 instanceof SymbolKey && equalGraphs(((SymbolKey) o1).getName(), ((SymbolKey) o2).getName()); @@ -173,6 +175,25 @@ private boolean equalGraphsNoMemo(Object o1, Object o2) { return o1.equals(o2); } + private boolean equalScopes(final VarScope s1, final VarScope s2) { + final Object[] ids1 = getSortedIds(s1); + final Object[] ids2 = getSortedIds(s2); + if (!equalObjectArrays(ids1, ids2)) { + return false; + } + final int l = ids1.length; + for (int i = 0; i < l; ++i) { + if (!equalGraphs(getValue(s1, ids1[i]), getValue(s2, ids2[i]))) { + return false; + } + } + if (!equalGraphs(s1.getParentScope(), s2.getParentScope())) { + return false; + } + + return true; + } + private boolean equalScriptables(final Scriptable s1, final Scriptable s2) { final Object[] ids1 = getSortedIds(s1); final Object[] ids2 = getSortedIds(s2); @@ -285,7 +306,7 @@ private static boolean equalJSFunctions(final ScriptOrFn f1, final ScriptOrFn } // Sort IDs deterministically - private static Object[] getSortedIds(final Scriptable s) { + private static > Object[] getSortedIds(final PropHolder s) { final Object[] ids = getIds(s); Arrays.sort( ids, @@ -320,11 +341,11 @@ private static Object[] getSortedIds(final Scriptable s) { return ids; } - private static Object[] getIds(final Scriptable s) { - if (s instanceof ScriptableObject) { + private static > Object[] getIds(final PropHolder s) { + if (s instanceof SlotMapOwner) { // Grabs symbols too - try (var map = ((ScriptableObject) s).startCompoundOp(false)) { - return ((ScriptableObject) s).getIds(map, true, true); + try (var map = ((SlotMapOwner) s).startCompoundOp(false)) { + return ((SlotMapOwner) s).getIds(map, true, true); } } else if (s instanceof DebuggableObject) { return ((DebuggableObject) s).getAllIds(); @@ -344,4 +365,16 @@ private static Object getValue(final Scriptable s, final Object id) { throw new ClassCastException(); } } + + private static Object getValue(final VarScope s, final Object id) { + if (id instanceof Symbol) { + return s.get((Symbol) id, s); + } else if (id instanceof Integer) { + return s.get((int) id, s); + } else if (id instanceof String) { + return s.get((String) id, s); + } else { + throw new ClassCastException(); + } + } } diff --git a/rhino/src/main/java/org/mozilla/javascript/ImporterTopLevel.java b/rhino/src/main/java/org/mozilla/javascript/ImporterTopLevel.java index 06743ae8775..bdb9a54fda4 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ImporterTopLevel.java +++ b/rhino/src/main/java/org/mozilla/javascript/ImporterTopLevel.java @@ -9,6 +9,7 @@ package org.mozilla.javascript; import static org.mozilla.javascript.ClassDescriptor.Destination.PROTO; +import static org.mozilla.javascript.UniqueTag.NOT_FOUND; import java.util.ArrayList; diff --git a/rhino/src/main/java/org/mozilla/javascript/Interpreter.java b/rhino/src/main/java/org/mozilla/javascript/Interpreter.java index 862c7e96ef9..dfb1f6296d4 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Interpreter.java +++ b/rhino/src/main/java/org/mozilla/javascript/Interpreter.java @@ -9,6 +9,7 @@ import static org.mozilla.javascript.ScriptableObject.PERMANENT; import static org.mozilla.javascript.ScriptableObject.READONLY; import static org.mozilla.javascript.UniqueTag.DOUBLE_MARK; +import static org.mozilla.javascript.UniqueTag.NOT_FOUND; import java.io.PrintStream; import java.io.Serializable; @@ -541,24 +542,22 @@ public void delete(String name) {} public void delete(int index) {} @Override - public Object get(String name, Scriptable start) { + public void delete(Symbol key) {} + + @Override + public Object get(String name, VarScope start) { int offset = getOffsets().getOrDefault(name, -1); return offset >= 0 ? frame.getFromVars(offset) : NOT_FOUND; } @Override - public Object get(int index, Scriptable start) { + public Object get(int index, VarScope start) { return NOT_FOUND; } @Override - public String getClassName() { - return "debugscope"; - } - - @Override - public Object getDefaultValue(Class hint) { - return null; + public Object get(Symbol key, VarScope start) { + return NOT_FOUND; } @Override @@ -572,27 +571,22 @@ public VarScope getParentScope() { } @Override - public Scriptable getPrototype() { - return null; - } - - @Override - public boolean has(String name, Scriptable start) { + public boolean has(String name, VarScope start) { return getOffsets().containsKey(name); } @Override - public boolean has(int index, Scriptable start) { + public boolean has(int index, VarScope start) { return false; } @Override - public boolean hasInstance(Scriptable instance) { + public boolean has(Symbol key, VarScope start) { return false; } @Override - public void put(String name, Scriptable start, Object value) { + public void put(String name, VarScope start, Object value) { int offset = getOffsets().getOrDefault(name, -1); if (offset >= 0) { frame.setInVars(offset, value); @@ -600,22 +594,17 @@ public void put(String name, Scriptable start, Object value) { } @Override - public void put(int index, Scriptable start, Object value) { - // Do nothing. - } - - @Override - public void setParentScope(VarScope parent) { + public void put(int index, VarScope start, Object value) { // Do nothing. } @Override - public void setPrototype(Scriptable prototype) { + public void put(Symbol key, VarScope start, Object value) { // Do nothing. } @Override - public void defineConst(String name, Scriptable start) { + public void defineConst(String name, VarScope start) { // TODO Auto-generated method stub } @@ -632,7 +621,7 @@ public boolean isConst(String name) { } @Override - public void putConst(String name, Scriptable start, Object value) { + public void putConst(String name, VarScope start, Object value) { // TODO Auto-generated method stub } @@ -1244,7 +1233,7 @@ static class GeneratorState { } public static Object resumeGenerator( - Context cx, Scriptable scope, int operation, Object savedState, Object value) { + Context cx, VarScope scope, int operation, Object savedState, Object value) { CallFrame frame = (CallFrame) savedState; CallFrame activeFrame = frame.shallowCloneFrozen((CallFrame) cx.lastInterpreterFrame); try { @@ -2898,6 +2887,7 @@ NewState execute(Context cx, CallFrame frame, InterpreterState state, int op) { private static class DoSetConst extends InstructionClass { @Override + @SuppressWarnings("unchecked") NewState execute(Context cx, CallFrame frame, InterpreterState state, int op) { final Object[] stack = frame.stack; final double[] sDbl = frame.sDbl; diff --git a/rhino/src/main/java/org/mozilla/javascript/JSScript.java b/rhino/src/main/java/org/mozilla/javascript/JSScript.java index 9771e4da617..187c39c181e 100644 --- a/rhino/src/main/java/org/mozilla/javascript/JSScript.java +++ b/rhino/src/main/java/org/mozilla/javascript/JSScript.java @@ -31,9 +31,6 @@ JSCode getCode() { @Override public Object exec(Context cx, VarScope scope, Scriptable thisObj) { Object ret; - if (thisObj instanceof TopLevel) { - thisObj = ((TopLevel) thisObj).getGlobalThis(); - } if (!ScriptRuntime.hasTopCall(cx)) { // It will go through "call" path. but they are equivalent ret = ScriptRuntime.doTopCall(this, cx, scope, thisObj, descriptor.isStrict()); diff --git a/rhino/src/main/java/org/mozilla/javascript/PropHolder.java b/rhino/src/main/java/org/mozilla/javascript/PropHolder.java index 2bf940172bc..37721ec469e 100644 --- a/rhino/src/main/java/org/mozilla/javascript/PropHolder.java +++ b/rhino/src/main/java/org/mozilla/javascript/PropHolder.java @@ -46,4 +46,15 @@ public interface PropHolder> { * @return the parent scope */ public T getAncestor(); + + /** + * Get an array of property ids. + * + *

Not all property ids need be returned. Those properties whose ids are not returned are + * considered non-enumerable. + * + * @return an array of Objects. Each entry in the array is either a java.lang.String or a + * java.lang.Number + */ + public Object[] getIds(); } diff --git a/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java b/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java index 9df71a5f9e8..ea48d09cf56 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java @@ -9,7 +9,7 @@ import java.io.ObjectOutputStream; import java.io.Serializable; -public class ScopeObject extends SlotMapOwner implements VarScope, Serializable { +public class ScopeObject extends SlotMapOwner implements VarScope, Serializable { private static final long serialVersionUID = -7471457301304454454L; private final VarScope parentScope; @@ -41,7 +41,7 @@ public ScopeObject getThis() { * @param value value to set the property to */ @Override - public void put(String name, Scriptable start, Object value) { + public void put(String name, VarScope start, Object value) { if (putOwnProperty(name, start, value, Context.isCurrentContextStrict())) return; if (start == this) throw Kit.codeBug(); @@ -55,7 +55,7 @@ public void put(String name, Scriptable start, Object value) { * * @param isThrow if true, throw an exception as if in strict mode */ - protected boolean putOwnProperty(String name, Scriptable start, Object value, boolean isThrow) { + protected boolean putOwnProperty(String name, VarScope start, Object value, boolean isThrow) { return putImpl(name, 0, start, value, isThrow); } @@ -68,7 +68,7 @@ protected boolean putOwnProperty(String name, Scriptable start, Object value, bo */ @SuppressWarnings("resource") @Override - public void put(int index, Scriptable start, Object value) { + public void put(int index, VarScope start, Object value) { if (putOwnProperty(index, start, value, Context.isCurrentContextStrict())) return; if (start == this) throw Kit.codeBug(); @@ -82,13 +82,13 @@ public void put(int index, Scriptable start, Object value) { * * @param isThrow if true, throw an exception as if in strict mode */ - protected boolean putOwnProperty(int index, Scriptable start, Object value, boolean isThrow) { + protected boolean putOwnProperty(int index, VarScope start, Object value, boolean isThrow) { return putImpl(null, index, start, value, isThrow); } /** Implementation of put required by SymbolScriptable objects. */ @Override - public void put(Symbol key, Scriptable start, Object value) { + public void put(Symbol key, VarScope start, Object value) { if (putOwnProperty(key, start, value, Context.isCurrentContextStrict())) return; if (start == this) throw Kit.codeBug(); @@ -102,7 +102,7 @@ public void put(Symbol key, Scriptable start, Object value) { * * @param isThrow if true, throw an exception as if in strict mode */ - protected boolean putOwnProperty(Symbol key, Scriptable start, Object value, boolean isThrow) { + protected boolean putOwnProperty(Symbol key, VarScope start, Object value, boolean isThrow) { return putImpl(key, 0, start, value, isThrow); } @@ -115,9 +115,8 @@ protected boolean putOwnProperty(Symbol key, Scriptable start, Object value, boo * @return false if this != start and no slot was found. true if this == start or this != start * and a READONLY slot was found. */ - private boolean putImpl( - Object key, int index, Scriptable start, Object value, boolean isThrow) { - Slot slot; + private boolean putImpl(Object key, int index, VarScope start, Object value, boolean isThrow) { + Slot slot; if (this != start) { slot = getMap().query(key, index); if (slot == null) { @@ -137,7 +136,7 @@ private boolean putImpl( * @return true if and only if the property was found in the object */ @Override - public boolean has(String name, Scriptable start) { + public boolean has(String name, VarScope start) { return null != getMap().query(name, 0); } @@ -149,13 +148,13 @@ public boolean has(String name, Scriptable start) { * @return true if and only if the property was found in the object */ @Override - public boolean has(int index, Scriptable start) { + public boolean has(int index, VarScope start) { return null != getMap().query(null, index); } /** A version of "has" that supports symbols. */ @Override - public boolean has(Symbol key, Scriptable start) { + public boolean has(Symbol key, VarScope start) { return null != getMap().query(key, 0); } @@ -169,7 +168,7 @@ public boolean has(Symbol key, Scriptable start) { * @return the value of the property (may be null), or NOT_FOUND */ @Override - public Object get(String name, Scriptable start) { + public Object get(String name, VarScope start) { var slot = getMap().query(name, 0); if (slot == null) { return Scriptable.NOT_FOUND; @@ -185,7 +184,7 @@ public Object get(String name, Scriptable start) { * @return the value of the property (may be null), or NOT_FOUND */ @Override - public Object get(int index, Scriptable start) { + public Object get(int index, VarScope start) { var slot = getMap().query(null, index); if (slot == null) { return Scriptable.NOT_FOUND; @@ -195,7 +194,7 @@ public Object get(int index, Scriptable start) { /** Another version of Get that supports Symbol keyed properties. */ @Override - public Object get(Symbol key, Scriptable start) { + public Object get(Symbol key, VarScope start) { var slot = getMap().query(key, 0); if (slot == null) { return Scriptable.NOT_FOUND; @@ -218,11 +217,6 @@ public void delete(Symbol key) { getMap().compute(this, key, 0, ScriptableObject::checkSlotRemoval); } - @Override - public Object[] getIds() { - return new Object[0]; - } - /** * Define a JavaScript property. * @@ -296,28 +290,20 @@ public void setAttributes(Symbol key, int attributes) { * @param value value to set the property to */ @Override - public void putConst(String name, Scriptable start, Object value) { + public void putConst(String name, VarScope start, Object value) { if (putConstImpl(name, 0, start, value, ScriptableObject.READONLY)) return; if (start == this) throw Kit.codeBug(); - if (start instanceof ConstProperties) { - @SuppressWarnings("unchecked") - var cstart = ((ConstProperties) start); - cstart.putConst(name, start, value); - } else start.put(name, start, value); + start.putConst(name, start, value); } @Override - public void defineConst(String name, Scriptable start) { + public void defineConst(String name, VarScope start) { if (putConstImpl(name, 0, start, Undefined.instance, ScriptableObject.UNINITIALIZED_CONST)) return; if (start == this) throw Kit.codeBug(); - if (start instanceof ConstProperties) { - @SuppressWarnings("unchecked") - var cstart = ((ConstProperties) start); - cstart.defineConst(name, start); - } + start.defineConst(name, start); } /** @@ -346,9 +332,9 @@ public boolean isConst(String name) { * and a READONLY slot was found. */ private boolean putConstImpl( - String name, int index, Scriptable start, Object value, int constFlag) { + String name, int index, VarScope start, Object value, int constFlag) { assert (constFlag != ScriptableObject.EMPTY); - Slot slot; + Slot slot; if (this != start) { slot = getMap().query(name, index); if (slot == null) { diff --git a/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java b/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java index 955aae92cfd..90e2616b2de 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java @@ -3,9 +3,9 @@ public class ScopeWrapper extends ScriptableObject { private static final long serialVersionUID = -7471457301304454454L; - private final Scriptable scope; + private final VarScope scope; - public ScopeWrapper(Scriptable scope) { + public ScopeWrapper(VarScope scope) { this.scope = scope; } @@ -39,7 +39,7 @@ public String getClassName() { return "scope"; } - public Scriptable getScope() { + public VarScope getScope() { return scope; } } diff --git a/rhino/src/main/java/org/mozilla/javascript/Script.java b/rhino/src/main/java/org/mozilla/javascript/Script.java index 49e9ea25c7a..380bcd7c42b 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Script.java +++ b/rhino/src/main/java/org/mozilla/javascript/Script.java @@ -24,7 +24,7 @@ public interface Script { // Maintained for backward compatibility of already-compiled classes @Deprecated(since = "1.8.1") default Object exec(Context cx, VarScope scope) { - return exec(cx, scope, scope); + return exec(cx, scope, Undefined.SCRIPTABLE_UNDEFINED); } /** diff --git a/rhino/src/main/java/org/mozilla/javascript/Scriptable.java b/rhino/src/main/java/org/mozilla/javascript/Scriptable.java index abe6f5e8f10..19d47767203 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Scriptable.java +++ b/rhino/src/main/java/org/mozilla/javascript/Scriptable.java @@ -288,6 +288,7 @@ default Scriptable getAncestor() { * @return an array of Objects. Each entry in the array is either a java.lang.String or a * java.lang.Number */ + @Override public Object[] getIds(); /** diff --git a/rhino/src/main/java/org/mozilla/javascript/ScriptableObject.java b/rhino/src/main/java/org/mozilla/javascript/ScriptableObject.java index 436de5e1544..ef4bc22c3fa 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScriptableObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScriptableObject.java @@ -605,22 +605,6 @@ public void setParentScope(VarScope m) { parentScopeObject = m; } - /** - * Returns an array of ids for the properties of the object. - * - *

Any properties with the attribute DONTENUM are not listed. - * - * @return an array of java.lang.Objects with an entry for every listed property. Properties - * accessed via an integer index will have a corresponding Integer entry in the returned - * array. Properties accessed by a String will have a String entry in the returned array. - */ - @Override - public Object[] getIds() { - try (var map = startCompoundOp(false)) { - return getIds(map, false, false); - } - } - /** * Returns an array of ids of all non-Symbol properties of the object. * @@ -1206,13 +1190,14 @@ public static > void defineProperty( so.defineProperty(propertyName, value, attributes); } - public static void defineProperty( - Scriptable destination, SymbolKey propertyName, Object value, int attributes) { - if (!(destination instanceof ScriptableObject)) { - ((SymbolScriptable) destination).put(propertyName, destination, value); + public static > void defineProperty( + T destination, SymbolKey propertyName, Object value, int attributes) { + if (!(destination instanceof SlotMapOwner)) { + destination.put(propertyName, destination, value); return; } - ScriptableObject so = (ScriptableObject) destination; + @SuppressWarnings("unchecked") + SlotMapOwner so = (SlotMapOwner) destination; so.defineProperty(propertyName, value, attributes); } @@ -1270,10 +1255,11 @@ public void defineBuiltinProperty( * @param destination ScriptableObject to define the property on * @param propertyName the name of the property to define. */ - public static void defineConstProperty(Scriptable destination, String propertyName) { + public static > void defineConstProperty( + T destination, String propertyName) { if (destination instanceof ConstProperties) { @SuppressWarnings("unchecked") - var cp = (ConstProperties) destination; + var cp = (ConstProperties) destination; cp.defineConst(propertyName, destination); } else defineProperty(destination, propertyName, Undefined.instance, CONST); } @@ -2323,7 +2309,11 @@ protected static void checkNotSealed(ScriptableObject obj, Object key, int index * @since 1.5R2 */ public static Object getProperty(Scriptable obj, String name) { - return getPropWalkingPrototypeChain(obj, name, obj); + return getPropWalkingPrototypeChain((Scriptable) obj, name, (Scriptable) obj); + } + + public static Object getProperty(VarScope obj, String name) { + return obj.get(name, obj); } /** @@ -2463,6 +2453,10 @@ public static boolean hasProperty(Scriptable obj, String name) { return null != getBase(obj, name); } + public static boolean hasProperty(VarScope obj, String name) { + return null != getBase(obj, name); + } + /** * If hasProperty(obj, name) would return true, then if the property that was found is * compatible with the new property, this method just returns. If the property is not @@ -2474,14 +2468,22 @@ public static boolean hasProperty(Scriptable obj, String name) { public static void redefineProperty(Scriptable obj, String name, boolean isConst) { Scriptable base = getBase(obj, name); if (base == null) return; - if (base instanceof ConstProperties) { - ConstProperties cp = (ConstProperties) base; + if (base instanceof ConstProperties) { + @SuppressWarnings("unchecked") + var cp = (ConstProperties) base; if (cp.isConst(name)) throw ScriptRuntime.typeErrorById("msg.const.redecl", name); } if (isConst) throw ScriptRuntime.typeErrorById("msg.var.redecl", name); } + public static void redefineProperty(VarScope obj, String name, boolean isConst) { + VarScope base = getBase(obj, name); + if (base == null) return; + if (base.isConst(name)) throw ScriptRuntime.typeErrorById("msg.const.redecl", name); + if (isConst) throw ScriptRuntime.typeErrorById("msg.var.redecl", name); + } + /** * Returns whether an indexed property is defined in an object or any object in its prototype * chain. @@ -2522,6 +2524,10 @@ public static void putProperty(Scriptable obj, String name, Object value) { base.put(name, obj, value); } + public static void putProperty(VarScope obj, String name, Object value) { + obj.put(name, obj, value); + } + /** Variant of putProperty to handle super.name = value */ public static void putSuperProperty( Scriptable superObj, Scriptable thisObj, String name, Object value) { @@ -2571,6 +2577,10 @@ public static void putConstProperty(Scriptable obj, String name, Object value) { } } + public static void putConstProperty(VarScope obj, String name, Object value) { + obj.putConst(name, obj, value); + } + /** * Puts an indexed property in an object or in an object in its prototype chain. * @@ -2730,18 +2740,21 @@ public static Object callMethod(Context cx, Scriptable obj, String methodName, O } static Scriptable getBase(Scriptable start, String name) { - Scriptable obj = start; + Scriptable obj = (Scriptable) start; + Scriptable startObj = obj; do { - if (obj.has(name, start)) break; - if (obj instanceof VarScope) { - obj = null; - } else { - obj = obj.getPrototype(); + if (obj.has(name, startObj)) { + break; } + obj = obj.getPrototype(); } while (obj != null); return obj; } + static VarScope getBase(VarScope start, String name) { + return start.has(name, start) ? start : null; + } + static Scriptable getBase(Scriptable start, int index) { Scriptable obj = start; do { @@ -2869,6 +2882,7 @@ private boolean putConstImpl( return slot.setValue(value, this, start); } + @Override Object[] getIds( CompoundOperationMap map, boolean getNonEnumerable, boolean getSymbols) { Object[] a; @@ -3023,7 +3037,7 @@ public Object get(Object key) { } } - private static final Comparator KEY_COMPARATOR = new KeyComparator(); + static final Comparator KEY_COMPARATOR = new KeyComparator(); /** * This comparator sorts property fields in spec-compliant order. Numeric ids first, in numeric diff --git a/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java b/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java index e6a718254ab..89e6122eec5 100644 --- a/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java +++ b/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java @@ -1,10 +1,13 @@ package org.mozilla.javascript; +import static org.mozilla.javascript.ScriptableObject.DONTENUM; + import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -558,7 +561,8 @@ public final synchronized Object associateValue(Object key, Object value) { return Kit.initHash(h, key, value); } - void addLazilyInitializedValue(String name, int index, LazilyLoadedCtor init, int attributes) { + void addLazilyInitializedValue( + String name, int index, LazilyLoadedCtor init, int attributes) { if (name != null && index != 0) throw new IllegalArgumentException(name); checkNotSealed(name, index); var lslot = getMap().compute(this, name, index, ScriptableObject::ensureLazySlot); @@ -566,7 +570,8 @@ void addLazilyInitializedValue(String name, int index, LazilyLoadedCtor init, in lslot.value = init; } - void addLazilyInitializedValue(Symbol key, int index, LazilyLoadedCtor init, int attributes) { + void addLazilyInitializedValue( + Symbol key, int index, LazilyLoadedCtor init, int attributes) { if (key != null && index != 0) throw new IllegalArgumentException(key.toString()); checkNotSealed(key, index); LazyLoadSlot lslot = getMap().compute(this, key, index, ScriptableObject::ensureLazySlot); @@ -793,6 +798,54 @@ public void defineProperty(Symbol key, Object value, int attributes) { setAttributes(key, attributes); } + /** + * Returns an array of ids for the properties of the object. + * + *

Any properties with the attribute DONTENUM are not listed. + * + * @return an array of java.lang.Objects with an entry for every listed property. Properties + * accessed via an integer index will have a corresponding Integer entry in the returned + * array. Properties accessed by a String will have a String entry in the returned array. + */ + @Override + public Object[] getIds() { + try (var map = startCompoundOp(false)) { + return getIds(map, false, false); + } + } + + Object[] getIds(CompoundOperationMap map, boolean getNonEnumerable, boolean getSymbols) { + if (map.isEmpty()) { + return ScriptRuntime.emptyArgs; + } + + int c = 0; + Object[] a = new Object[map.dirtySize()]; + + for (var slot : map) { + if ((getNonEnumerable || (slot.getAttributes() & DONTENUM) == 0) + && (getSymbols || !(slot.name instanceof Symbol))) { + a[c++] = slot.name != null ? slot.name : Integer.valueOf(slot.indexOrHash); + } + } + + Object[] result; + if (c == a.length) { + result = a; + } else { + result = new Object[c]; + System.arraycopy(a, 0, result, 0, c); + } + + Context cx = Context.getCurrentContext(); + if ((cx != null) && cx.hasFeature(Context.FEATURE_ENUMERATE_IDS_FIRST)) { + // Move all the numeric IDs to the front in numeric order + Arrays.sort(result, ScriptableObject.KEY_COMPARATOR); + } + + return result; + } + public abstract T getThis(); private volatile Map associatedValues; diff --git a/rhino/src/main/java/org/mozilla/javascript/TopLevel.java b/rhino/src/main/java/org/mozilla/javascript/TopLevel.java index 7b494281aeb..2754962cef7 100644 --- a/rhino/src/main/java/org/mozilla/javascript/TopLevel.java +++ b/rhino/src/main/java/org/mozilla/javascript/TopLevel.java @@ -6,6 +6,8 @@ package org.mozilla.javascript; +import static org.mozilla.javascript.UniqueTag.NOT_FOUND; + import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -170,11 +172,6 @@ public static TopLevel createIsolateCustomPrototypeChain( return isolate; } - @Override - public String getClassName() { - return "topLevel"; - } - /** * Cache the built-in ECMAScript objects to protect them against modifications by the script. * This method is called automatically by {@link ScriptRuntime#initStandardObjects @@ -347,7 +344,7 @@ public ScriptableObject getGlobalThis() { } @Override - public Object get(String name, Scriptable start) { + public Object get(String name, VarScope start) { var res = super.get(name, start); if (res != NOT_FOUND) { return res; @@ -356,12 +353,12 @@ public Object get(String name, Scriptable start) { } @Override - public void put(String name, Scriptable start, Object value) { + public void put(String name, VarScope start, Object value) { ScriptableObject.putProperty(globalThis, name, value); } @Override - public boolean has(String name, Scriptable start) { + public boolean has(String name, VarScope start) { return super.has(name, start) || ScriptableObject.hasProperty(globalThis, name); } @@ -382,7 +379,8 @@ public void defineProperty(String propertyName, Object value, int attributes) { } @Override - void addLazilyInitializedValue(String name, int index, LazilyLoadedCtor init, int attributes) { + void addLazilyInitializedValue( + String name, int index, LazilyLoadedCtor init, int attributes) { globalThis.addLazilyInitializedValue(name, index, init, attributes); } @@ -420,12 +418,12 @@ public boolean isConst(String name) { } @Override - public void putConst(String name, Scriptable start, Object value) { + public void putConst(String name, VarScope start, Object value) { globalThis.putConst(name, globalThis, value); } @Override - public void defineConst(String name, Scriptable start) { + public void defineConst(String name, VarScope start) { globalThis.defineConst(name, globalThis); } diff --git a/rhino/src/main/java/org/mozilla/javascript/VarScope.java b/rhino/src/main/java/org/mozilla/javascript/VarScope.java index eb5ce0d4723..a2f86d0c5e5 100644 --- a/rhino/src/main/java/org/mozilla/javascript/VarScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/VarScope.java @@ -12,38 +12,16 @@ * Interface that represents an the bindings of an ECMAScript environment record. Unlike {@link * Scriptable} scopes do not have prototypes. */ -public interface VarScope extends Scriptable, ConstProperties { +public interface VarScope extends PropHolder, ConstProperties { + /** + * Get the parent scope of this scope. + * + * @return the parent scope + */ + public VarScope getParentScope(); @Override - default String getClassName() { - Kit.codeBug("Attempt to get classname of scope."); - return null; - } - - @Override - default Object getDefaultValue(Class hint) { - Kit.codeBug("Attempt to get default value of scope."); - return null; - } - - @Override - default boolean hasInstance(Scriptable instance) { - Kit.codeBug("Attempt to do hasInstance of scope."); - return false; - } - - @Override - default void setParentScope(VarScope parent) { - Kit.codeBug("Attempt to change parent of scope."); - } - - @Override - default void setPrototype(Scriptable prototype) { - Kit.codeBug("Attempt to set prototype of scope."); - } - - @Override - default Scriptable getPrototype() { - return null; + default VarScope getAncestor() { + return getParentScope(); } } diff --git a/rhino/src/main/java/org/mozilla/javascript/WithScope.java b/rhino/src/main/java/org/mozilla/javascript/WithScope.java index 55d2cb187ff..35b87ece139 100644 --- a/rhino/src/main/java/org/mozilla/javascript/WithScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/WithScope.java @@ -1,5 +1,7 @@ package org.mozilla.javascript; +import static org.mozilla.javascript.Scriptable.NOT_FOUND; + public class WithScope implements VarScope { private static final long serialVersionUID = -7471457301304454454L; @@ -28,33 +30,33 @@ public void delete(int index) {} public void delete(Symbol arg0) {} @Override - public Object get(int index, Scriptable start) { + public Object get(int index, VarScope start) { return NOT_FOUND; } @Override - public Object get(Symbol arg0, Scriptable arg1) { + public Object get(Symbol arg0, VarScope arg1) { return NOT_FOUND; } @Override - public boolean has(int index, Scriptable start) { + public boolean has(int index, VarScope start) { return false; } @Override - public boolean has(Symbol arg0, Scriptable arg1) { + public boolean has(Symbol arg0, VarScope arg1) { return false; } @Override - public void put(int index, Scriptable start, Object value) {} + public void put(int index, VarScope start, Object value) {} @Override - public void put(Symbol arg0, Scriptable arg1, Object arg2) {} + public void put(Symbol arg0, VarScope arg1, Object arg2) {} @Override - public void defineConst(String name, Scriptable start) { + public void defineConst(String name, VarScope start) { Kit.codeBug("Attempt to define a const on a `with` scope."); } @@ -64,22 +66,22 @@ public boolean isConst(String name) { } @Override - public void putConst(String name, Scriptable start, Object value) { + public void putConst(String name, VarScope start, Object value) { Kit.codeBug("Attempt to define a const on a `with` scope."); } @Override - public Object get(String name, Scriptable start) { + public Object get(String name, VarScope start) { return ScriptableObject.getProperty(obj, name); } @Override - public void put(String name, Scriptable start, Object value) { + public void put(String name, VarScope start, Object value) { ScriptableObject.putProperty(obj, name, value); } @Override - public boolean has(String name, Scriptable start) { + public boolean has(String name, VarScope start) { return ScriptableObject.hasProperty(obj, name); } diff --git a/rhino/src/main/java/org/mozilla/javascript/lc/type/TypeInfo.java b/rhino/src/main/java/org/mozilla/javascript/lc/type/TypeInfo.java index 9ca3fdd3f54..ccf61c8ec44 100644 --- a/rhino/src/main/java/org/mozilla/javascript/lc/type/TypeInfo.java +++ b/rhino/src/main/java/org/mozilla/javascript/lc/type/TypeInfo.java @@ -14,6 +14,7 @@ import java.util.function.Supplier; import org.mozilla.javascript.FunctionObject; import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.VarScope; import org.mozilla.javascript.lc.ByteAsBool; import org.mozilla.javascript.lc.type.impl.ArrayTypeInfo; import org.mozilla.javascript.lc.type.impl.BasicClassTypeInfo; @@ -315,6 +316,8 @@ default int getTypeTag() { return FunctionObject.JAVA_DOUBLE_TYPE; } else if (Scriptable.class.isAssignableFrom(asClass())) { return FunctionObject.JAVA_SCRIPTABLE_TYPE; + } else if (VarScope.class.isAssignableFrom(asClass())) { + return FunctionObject.JAVA_VARSCOPE_TYPE; } else if (isObjectExact()) { return FunctionObject.JAVA_OBJECT_TYPE; } diff --git a/testutils/src/main/java/org/mozilla/javascript/testutils/Utils.java b/testutils/src/main/java/org/mozilla/javascript/testutils/Utils.java index d0218fe81c1..28cefcbe9f3 100644 --- a/testutils/src/main/java/org/mozilla/javascript/testutils/Utils.java +++ b/testutils/src/main/java/org/mozilla/javascript/testutils/Utils.java @@ -75,7 +75,7 @@ public static void executeScript(String script, boolean interpreted) { * * @param action the action to execute */ - public static void runWithAllModes(final ContextAction action) { + public static void runWithAllModes(final ContextAction action) { runWithMode(action, true); runWithMode(action, false); } @@ -86,8 +86,8 @@ public static void runWithAllModes(final ContextAction action) { * @param contextFactory the context factory to use * @param action the action to execute */ - public static void runWithAllModes( - final ContextFactory contextFactory, final ContextAction action) { + public static void runWithAllModes( + final ContextFactory contextFactory, final ContextAction action) { runWithMode(contextFactory, action, true); runWithMode(contextFactory, action, false); } @@ -98,7 +98,8 @@ public static void runWithAllModes( * @param action the action to execute * @param interpretedMode true if interpreted mode should be used */ - public static void runWithMode(final ContextAction action, final boolean interpretedMode) { + public static void runWithMode( + final ContextAction action, final boolean interpretedMode) { runWithMode(new ContextFactory(), action, interpretedMode); } @@ -109,9 +110,9 @@ public static void runWithMode(final ContextAction action, final boolean inte * @param action the action to execute * @param interpretedMode true if interpreted mode should be used */ - public static void runWithMode( + public static void runWithMode( final ContextFactory contextFactory, - final ContextAction action, + final ContextAction action, final boolean interpretedMode) { try (final Context cx = contextFactory.enterContext()) { From 6ad83c00909834929f148dda0d31061462acf0e6 Mon Sep 17 00:00:00 2001 From: "duncan.macgregor" Date: Fri, 16 Jan 2026 12:29:52 +0000 Subject: [PATCH 002/147] Remove old `NativeWith` implementation. --- .../org/mozilla/javascript/NativeWith.java | 205 ------------------ .../java/org/mozilla/javascript/Node.java | 6 +- .../optimizer/ConstAwareLinker.java | 8 +- 3 files changed, 2 insertions(+), 217 deletions(-) delete mode 100644 rhino/src/main/java/org/mozilla/javascript/NativeWith.java diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeWith.java b/rhino/src/main/java/org/mozilla/javascript/NativeWith.java deleted file mode 100644 index 234f3848c55..00000000000 --- a/rhino/src/main/java/org/mozilla/javascript/NativeWith.java +++ /dev/null @@ -1,205 +0,0 @@ -/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.javascript; - -import java.io.Serializable; - -/** - * This class implements the object lookup required for the {@code with} statement. It simply - * delegates every action to its prototype except for operations on its parent. - */ -public class NativeWith implements Scriptable, SymbolScriptable, IdFunctionCall, Serializable { - private static final long serialVersionUID = 1L; - - static void init(TopLevel scope, boolean sealed) { - NativeWith obj = new NativeWith(); - - obj.setParentScope(scope); - obj.setPrototype(ScriptableObject.getObjectPrototype(scope)); - - IdFunctionObject ctor = new IdFunctionObject(obj, FTAG, Id_constructor, "With", 0, scope); - ctor.markAsConstructor(obj); - if (sealed) { - ctor.sealObject(); - } - ctor.exportAsScopeProperty(); - } - - private NativeWith() {} - - protected NativeWith(VarScope parent, Scriptable prototype) { - this.parent = parent; - this.prototype = prototype; - } - - @Override - public String getClassName() { - return "With"; - } - - @Override - public boolean has(String id, Scriptable start) { - return prototype.has(id, prototype); - } - - @Override - public boolean has(Symbol key, Scriptable start) { - if (prototype instanceof SymbolScriptable) { - return ((SymbolScriptable) prototype).has(key, prototype); - } - return false; - } - - @Override - public boolean has(int index, Scriptable start) { - return prototype.has(index, prototype); - } - - @Override - public Object get(String id, Scriptable start) { - if (start == this) { - start = prototype; - } - return prototype.get(id, start); - } - - @Override - public Object get(Symbol key, Scriptable start) { - if (start == this) { - start = prototype; - } - if (prototype instanceof SymbolScriptable) { - return ((SymbolScriptable) prototype).get(key, start); - } - return Scriptable.NOT_FOUND; - } - - @Override - public Object get(int index, Scriptable start) { - if (start == this) { - start = prototype; - } - return prototype.get(index, start); - } - - @Override - public void put(String id, Scriptable start, Object value) { - if (start == this) start = prototype; - prototype.put(id, start, value); - } - - @Override - public void put(Symbol symbol, Scriptable start, Object value) { - if (start == this) { - start = prototype; - } - if (prototype instanceof SymbolScriptable) { - ((SymbolScriptable) prototype).put(symbol, start, value); - } - } - - @Override - public void put(int index, Scriptable start, Object value) { - if (start == this) start = prototype; - prototype.put(index, start, value); - } - - @Override - public void delete(String id) { - prototype.delete(id); - } - - @Override - public void delete(Symbol key) { - if (prototype instanceof SymbolScriptable) { - ((SymbolScriptable) prototype).delete(key); - } - } - - @Override - public void delete(int index) { - prototype.delete(index); - } - - @Override - public Scriptable getPrototype() { - return prototype; - } - - @Override - public void setPrototype(Scriptable prototype) { - this.prototype = prototype; - } - - @Override - public VarScope getParentScope() { - return parent; - } - - @Override - public void setParentScope(VarScope parent) { - this.parent = parent; - } - - @Override - public Object[] getIds() { - return prototype.getIds(); - } - - @Override - public Object getDefaultValue(Class typeHint) { - return prototype.getDefaultValue(typeHint); - } - - @Override - public boolean hasInstance(Scriptable value) { - return prototype.hasInstance(value); - } - - /** Must return null to continue looping or the final collection result. */ - protected Object updateDotQuery(boolean value) { - // NativeWith itself does not support it - throw new IllegalStateException(); - } - - @Override - public Object execIdCall( - IdFunctionObject f, Context cx, VarScope scope, Scriptable thisObj, Object[] args) { - if (f.hasTag(FTAG)) { - if (f.methodId() == Id_constructor) { - throw Context.reportRuntimeErrorById("msg.cant.call.indirect", "With"); - } - } - throw f.unknown(); - } - - static boolean isWithFunction(Object functionObj) { - if (functionObj instanceof IdFunctionObject) { - IdFunctionObject f = (IdFunctionObject) functionObj; - return f.hasTag(FTAG) && f.methodId() == Id_constructor; - } - return false; - } - - static Object newWithSpecial(Context cx, VarScope scope, Object[] args) { - ScriptRuntime.checkDeprecated(cx, "With"); - TopLevel top = ScriptableObject.getTopLevelScope(scope); - var obj = - args.length == 0 - ? ScriptableObject.getObjectPrototype(scope) - : ScriptRuntime.toObject(cx, scope, args[0]); - var newWith = new WithScope(top, obj); - return newWith; - } - - private static final Object FTAG = "With"; - - private static final int Id_constructor = 1; - - protected Scriptable prototype; - protected VarScope parent; -} diff --git a/rhino/src/main/java/org/mozilla/javascript/Node.java b/rhino/src/main/java/org/mozilla/javascript/Node.java index e3d52b221ad..a65a4c18243 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Node.java +++ b/rhino/src/main/java/org/mozilla/javascript/Node.java @@ -78,8 +78,7 @@ public class Node implements Iterable { public static final int BOTH = 0, LEFT = 1, RIGHT = 2; public static final int // values for SPECIALCALL_PROP NON_SPECIALCALL = 0, - SPECIALCALL_EVAL = 1, - SPECIALCALL_WITH = 2; + SPECIALCALL_EVAL = 1; public static final int // flags for INCRDECR_PROP DECR_FLAG = 0x1, POST_FLAG = 0x2; @@ -1186,9 +1185,6 @@ private void toString(Map printIds, StringBuilder sb) { case SPECIALCALL_EVAL: sb.append("eval"); break; - case SPECIALCALL_WITH: - sb.append("with"); - break; default: // NON_SPECIALCALL should not be stored throw Kit.codeBug(); diff --git a/rhino/src/main/java/org/mozilla/javascript/optimizer/ConstAwareLinker.java b/rhino/src/main/java/org/mozilla/javascript/optimizer/ConstAwareLinker.java index f525ecb9f83..38b44819542 100644 --- a/rhino/src/main/java/org/mozilla/javascript/optimizer/ConstAwareLinker.java +++ b/rhino/src/main/java/org/mozilla/javascript/optimizer/ConstAwareLinker.java @@ -11,7 +11,6 @@ import jdk.dynalink.linker.LinkerServices; import jdk.dynalink.linker.TypeBasedGuardingDynamicLinker; import jdk.dynalink.linker.support.Guards; -import org.mozilla.javascript.NativeWith; import org.mozilla.javascript.RhinoException; import org.mozilla.javascript.ScriptableObject; @@ -26,8 +25,7 @@ class ConstAwareLinker implements TypeBasedGuardingDynamicLinker { @Override public boolean canLinkType(Class type) { - return ScriptableObject.class.isAssignableFrom(type) - || NativeWith.class.isAssignableFrom(type); + return ScriptableObject.class.isAssignableFrom(type); } @Override @@ -103,10 +101,6 @@ private static Object getConst(WeakReference ref) { * constants with a value of "null," which should not be a big loss. */ private Object getConstValue(Object t, String name) { - if (t instanceof NativeWith) { - // Support constants referenced from inside functions - return getConstValue(((NativeWith) t).getPrototype(), name); - } assert t instanceof ScriptableObject; try { ScriptableObject target = (ScriptableObject) t; From 0b0b3c96ca9105e06bbd41f7e7ea92364e5c285c Mon Sep 17 00:00:00 2001 From: "duncan.macgregor" Date: Mon, 4 May 2026 18:33:49 +0100 Subject: [PATCH 003/147] General tidy up. --- .../java/org/mozilla/javascript/Context.java | 2 +- .../org/mozilla/javascript/ContextFactory.java | 2 +- .../org/mozilla/javascript/ES6Generator.java | 8 ++------ .../mozilla/javascript/EqualObjectGraphs.java | 10 +++++----- .../java/org/mozilla/javascript/Interpreter.java | 8 ++++---- .../java/org/mozilla/javascript/JavaAdapter.java | 6 +++--- .../org/mozilla/javascript/NativeBoolean.java | 2 +- .../java/org/mozilla/javascript/NativeDate.java | 4 ++-- .../org/mozilla/javascript/NativeGlobal.java | 4 ++-- .../org/mozilla/javascript/NativeJavaObject.java | 2 +- .../org/mozilla/javascript/NativeObject.java | 2 +- .../org/mozilla/javascript/ScriptRuntime.java | 16 ++++++++++------ .../java/org/mozilla/javascript/WithScope.java | 2 +- .../javascript/optimizer/BodyCodegen.java | 2 +- .../mozilla/javascript/regexp/NativeRegExp.java | 5 ++--- .../org/mozilla/javascript/xml/XMLObject.java | 4 ++-- 16 files changed, 39 insertions(+), 40 deletions(-) diff --git a/rhino/src/main/java/org/mozilla/javascript/Context.java b/rhino/src/main/java/org/mozilla/javascript/Context.java index f757c649e02..e165babd512 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Context.java +++ b/rhino/src/main/java/org/mozilla/javascript/Context.java @@ -561,7 +561,7 @@ public static Object call( if (factory == null) { factory = ContextFactory.getGlobal(); } - return call(factory, cx -> callable.call(cx, (VarScope) scope, thisObj, args)); + return call(factory, cx -> callable.call(cx, scope, thisObj, args)); } /** The method implements {@link ContextFactory#call(ContextAction)} logic. */ diff --git a/rhino/src/main/java/org/mozilla/javascript/ContextFactory.java b/rhino/src/main/java/org/mozilla/javascript/ContextFactory.java index b90bee1941c..b8f60c13707 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ContextFactory.java +++ b/rhino/src/main/java/org/mozilla/javascript/ContextFactory.java @@ -324,7 +324,7 @@ public final void initApplicationClassLoader(ClassLoader loader) { */ protected Object doTopCall( Callable callable, Context cx, VarScope scope, Scriptable thisObj, Object[] args) { - Object result = callable.call(cx, (VarScope) scope, thisObj, args); + Object result = callable.call(cx, scope, thisObj, args); return result instanceof ConsString ? result.toString() : result; } diff --git a/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java b/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java index ca242b65fbc..50c7d6a6046 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java +++ b/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java @@ -244,11 +244,7 @@ private Scriptable resumeLocal(Context cx, VarScope scope, Object value) { try { Object r = function.resumeGenerator( - cx, - (VarScope) scope, - NativeGenerator.GENERATOR_SEND, - savedState, - value); + cx, scope, NativeGenerator.GENERATOR_SEND, savedState, value); if (r instanceof YieldStarResult) { // This special result tells us that we are executing a "yield *" @@ -343,7 +339,7 @@ private Scriptable resumeAbruptLocal(Context cx, VarScope scope, int op, Object } try { - Object r = function.resumeGenerator(cx, (VarScope) scope, op, savedState, throwValue); + Object r = function.resumeGenerator(cx, scope, op, savedState, throwValue); ScriptableObject.putProperty(result, ES6Iterator.VALUE_PROPERTY, r); // If we get here without an exception we can still run. state = State.SUSPENDED_YIELD; diff --git a/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java b/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java index 8ac9b78526a..cc32798075f 100644 --- a/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java +++ b/rhino/src/main/java/org/mozilla/javascript/EqualObjectGraphs.java @@ -342,13 +342,13 @@ private static > Object[] getSortedIds(final PropHolder< } private static > Object[] getIds(final PropHolder s) { - if (s instanceof SlotMapOwner) { + if (s instanceof SlotMapOwner smo) { // Grabs symbols too - try (var map = ((SlotMapOwner) s).startCompoundOp(false)) { - return ((SlotMapOwner) s).getIds(map, true, true); + try (var map = smo.startCompoundOp(false)) { + return smo.getIds(map, true, true); } - } else if (s instanceof DebuggableObject) { - return ((DebuggableObject) s).getAllIds(); + } else if (s instanceof DebuggableObject dbo) { + return dbo.getAllIds(); } else { return s.getIds(); } diff --git a/rhino/src/main/java/org/mozilla/javascript/Interpreter.java b/rhino/src/main/java/org/mozilla/javascript/Interpreter.java index dfb1f6296d4..768543da6a8 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Interpreter.java +++ b/rhino/src/main/java/org/mozilla/javascript/Interpreter.java @@ -545,18 +545,18 @@ public void delete(int index) {} public void delete(Symbol key) {} @Override - public Object get(String name, VarScope start) { + public Object get(String name, VarScope scope) { int offset = getOffsets().getOrDefault(name, -1); return offset >= 0 ? frame.getFromVars(offset) : NOT_FOUND; } @Override - public Object get(int index, VarScope start) { + public Object get(int index, VarScope scope) { return NOT_FOUND; } @Override - public Object get(Symbol key, VarScope start) { + public Object get(Symbol key, VarScope scope) { return NOT_FOUND; } @@ -5059,7 +5059,7 @@ private static void enterFrame( // However, when called from interpretLoop() as part of // restarting a continuation, it can also be a WIthScope if // the continuation was captured within a "with" or "catch" - // block ("catch" implicitly uses NativeWith to create a scope + // block ("catch" implicitly uses WithScope to create a scope // to expose the exception variable). for (; ; ) { if (scope instanceof WithScope) { diff --git a/rhino/src/main/java/org/mozilla/javascript/JavaAdapter.java b/rhino/src/main/java/org/mozilla/javascript/JavaAdapter.java index b8182ff1613..b782a53ce68 100644 --- a/rhino/src/main/java/org/mozilla/javascript/JavaAdapter.java +++ b/rhino/src/main/java/org/mozilla/javascript/JavaAdapter.java @@ -576,9 +576,9 @@ public static Scriptable runScript(final Script script) { return ContextFactory.getGlobal() .call( cx -> { - TopLevel global = ScriptRuntime.getGlobal(cx); - script.exec(cx, global, global.getGlobalThis()); - return global.getGlobalThis(); + TopLevel top = ScriptRuntime.getGlobal(cx); + script.exec(cx, top, top.getGlobalThis()); + return top.getGlobalThis(); }); } diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeBoolean.java b/rhino/src/main/java/org/mozilla/javascript/NativeBoolean.java index 31f350f8afe..26557459749 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeBoolean.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeBoolean.java @@ -37,7 +37,7 @@ final class NativeBoolean extends ScriptableObject { static void init(Context cx, VarScope scope, boolean sealed) { // Boolean is an unusual object in that the prototype is itself a Boolean - DESCRIPTOR.buildConstructor(cx, (VarScope) scope, new NativeBoolean(false), sealed); + DESCRIPTOR.buildConstructor(cx, scope, new NativeBoolean(false), sealed); } NativeBoolean(boolean b) { diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeDate.java b/rhino/src/main/java/org/mozilla/javascript/NativeDate.java index 24baa583ec7..f22702bb9e5 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeDate.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeDate.java @@ -106,7 +106,7 @@ final class NativeDate extends ScriptableObject { static void init(Context cx, VarScope scope, boolean sealed) { DESCRIPTOR.buildConstructor( cx, - (VarScope) scope, + scope, cx.getLanguageVersion() >= Context.VERSION_ES6 ? new NativeObject() : new NativeDate(Double.NaN), @@ -187,7 +187,7 @@ private static Object js_toJSON( ScriptRuntime.toString(o), ScriptRuntime.toString(toISO)); } - Object result = ((Callable) toISO).call(cx, (VarScope) s, o, ScriptRuntime.emptyArgs); + Object result = ((Callable) toISO).call(cx, s, o, ScriptRuntime.emptyArgs); if (!ScriptRuntime.isPrimitive(result)) { throw ScriptRuntime.typeErrorById( "msg.toisostring.must.return.primitive", ScriptRuntime.toString(result)); diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeGlobal.java b/rhino/src/main/java/org/mozilla/javascript/NativeGlobal.java index 07ec60764ff..92705b18b21 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeGlobal.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeGlobal.java @@ -487,8 +487,8 @@ private static Object js_unescape(Context cx, VarScope scope, Object thisObj, Ob * executed via ScriptRuntime.callSpecial(). */ private static Object js_eval(Context cx, VarScope scope, Object[] args) { - TopLevel global = ScriptableObject.getTopLevelScope(scope); - return ScriptRuntime.evalSpecial(cx, global, global.getGlobalThis(), args, "eval code", 1); + TopLevel top = ScriptableObject.getTopLevelScope(scope); + return ScriptRuntime.evalSpecial(cx, top, top.getGlobalThis(), args, "eval code", 1); } /** diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java b/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java index cd234c517ef..20bccc80d91 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java @@ -47,7 +47,7 @@ public NativeJavaObject(VarScope scope, Object javaObject, TypeInfo staticType) public NativeJavaObject( VarScope scope, Object javaObject, TypeInfo staticType, boolean isAdapter) { - this.parent = (VarScope) scope; + this.parent = scope; this.javaObject = javaObject; this.staticType = staticType; this.isAdapter = isAdapter; diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeObject.java b/rhino/src/main/java/org/mozilla/javascript/NativeObject.java index 68063000b34..cc06e45c064 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeObject.java @@ -96,7 +96,7 @@ public class NativeObject extends ScriptableObject implements Map { static JSFunction init(Context cx, VarScope s, boolean sealed) { var desc = cx.version >= Context.VERSION_ES6 ? ES6_DESCRIPTOR : LEGACY_DESCRIPTOR; - return desc.buildConstructor(cx, (VarScope) s, new NativeObject(), sealed); + return desc.buildConstructor(cx, s, new NativeObject(), sealed); } @Override diff --git a/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java b/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java index f3b82f4dd0f..17c3608ecd8 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java @@ -990,7 +990,7 @@ private static void copyProperty( } } else if (id instanceof String) { String propName = (String) id; - value = getObjectProp(source, propName, cx, (VarScope) scope); + value = getObjectProp(source, propName, cx, scope); if (value != Scriptable.NOT_FOUND) { result.put(propName, result, value); } @@ -2618,7 +2618,7 @@ public static Object strictSetName( } public static Object setConst(VarScope bound, Object value, Context cx, String id) { - ScriptableObject.putConstProperty((VarScope) bound, id, value); + ScriptableObject.putConstProperty(bound, id, value); return value; } @@ -2984,7 +2984,9 @@ private static Callable getNameFunctionAndThisInner( } throw notFunctionError(result, name); } - // Top scope is not NativeWith or NativeCall => thisObj == scope + // Top scope is not a with scope or an activation frame, + // the called function will resolve `globalThis` in its + // realm. storeScriptable(cx, Undefined.SCRIPTABLE_UNDEFINED); return (Callable) result; } @@ -3024,7 +3026,9 @@ private static LookupResult getNameAndThisInner( throw notFoundError(scope, name); } } - // Top scope is not NativeWith or NativeCall => thisObj == scope + // If the scope is a wtih scope then `this` will be its + // object, otherwise the callee will resolve `globalThis` + // in its realm. return new LookupResult( result, scope instanceof WithScope @@ -3442,7 +3446,7 @@ public static Object callSpecial( if (callType == Node.SPECIALCALL_EVAL) { if (thisObj.getParentScope() == null && NativeGlobal.isEvalFunction(fun)) { - return evalSpecial(cx, (VarScope) scope, callerThis, args, filename, lineNumber); + return evalSpecial(cx, scope, callerThis, args, filename, lineNumber); } } else { throw Kit.codeBug(); @@ -6188,7 +6192,7 @@ public static Scriptable getThisForScope(VarScope scope, Object callThisArg) { } else if (callThisArg == null) { return null; } - return ScriptRuntime.toObject((VarScope) scope, callThisArg); + return ScriptRuntime.toObject(scope, callThisArg); } /** diff --git a/rhino/src/main/java/org/mozilla/javascript/WithScope.java b/rhino/src/main/java/org/mozilla/javascript/WithScope.java index 35b87ece139..7a2e69168a2 100644 --- a/rhino/src/main/java/org/mozilla/javascript/WithScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/WithScope.java @@ -101,7 +101,7 @@ public Scriptable getObject() { /** Must return null to continue looping or the final collection result. */ protected Object updateDotQuery(boolean value) { - // NativeWith itself does not support it + // WithScope itself does not support it throw new IllegalStateException(); } } diff --git a/rhino/src/main/java/org/mozilla/javascript/optimizer/BodyCodegen.java b/rhino/src/main/java/org/mozilla/javascript/optimizer/BodyCodegen.java index 9d907cd8daa..6584bb02b8a 100644 --- a/rhino/src/main/java/org/mozilla/javascript/optimizer/BodyCodegen.java +++ b/rhino/src/main/java/org/mozilla/javascript/optimizer/BodyCodegen.java @@ -3532,7 +3532,7 @@ private ExceptionInfo getTop() { return exceptionInfo.getLast(); } - private class ExceptionInfo { + private static class ExceptionInfo { ExceptionInfo(Jump node, Node finallyBlock) { this.finallyBlock = finallyBlock; handlerLabels = new int[EXCEPTION_MAX]; diff --git a/rhino/src/main/java/org/mozilla/javascript/regexp/NativeRegExp.java b/rhino/src/main/java/org/mozilla/javascript/regexp/NativeRegExp.java index 11dc6beecfc..ef81ae2d21f 100644 --- a/rhino/src/main/java/org/mozilla/javascript/regexp/NativeRegExp.java +++ b/rhino/src/main/java/org/mozilla/javascript/regexp/NativeRegExp.java @@ -251,7 +251,7 @@ static Object init(Context cx, VarScope scope, boolean sealed) { NativeRegExp proto = NativeRegExpInstantiator.withLanguageVersion(cx.getLanguageVersion()); proto.re = compileRE(cx, "", null, false); - return DESCRIPTOR.buildConstructor(cx, (VarScope) scope, proto, sealed); + return DESCRIPTOR.buildConstructor(cx, scope, proto, sealed); } static ClassDescriptor.Builder makeCtorBuilder() { @@ -4745,8 +4745,7 @@ private static String makeComplexReplacement( } Scriptable callThis = ScriptRuntime.getApplyOrCallThis(cx, scope, null, 0, replaceFunction); - Object replacementValue = - replaceFunction.call(cx, (VarScope) scope, callThis, replacerArgs); + Object replacementValue = replaceFunction.call(cx, scope, callThis, replacerArgs); return ScriptRuntime.toString(replacementValue); } diff --git a/rhino/src/main/java/org/mozilla/javascript/xml/XMLObject.java b/rhino/src/main/java/org/mozilla/javascript/xml/XMLObject.java index af7ed387ffe..b824bffa97b 100644 --- a/rhino/src/main/java/org/mozilla/javascript/xml/XMLObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/xml/XMLObject.java @@ -52,10 +52,10 @@ public XMLObject(VarScope scope, Scriptable prototype) { /** Generic reference to implement x::ns, x.@ns::y, x..@ns::y etc. */ public abstract Ref memberRef(Context cx, Object namespace, Object elem, int memberTypeFlags); - /** Wrap this object into NativeWith to implement the with statement. */ + /** Wrap this object into {@link WithScope} to implement the with statement. */ public abstract WithScope enterWith(VarScope scope); - /** Wrap this object into NativeWith to implement the .() query. */ + /** Wrap this object into {@link WithScope} to implement the .() query. */ public abstract WithScope enterDotQuery(VarScope scope); /** From 7b91f56a33a0a95813d45ec2ca111090e6a869ca Mon Sep 17 00:00:00 2001 From: "duncan.macgregor" Date: Mon, 11 May 2026 19:28:44 +0100 Subject: [PATCH 004/147] Fix up after rebase. --- .../java/org/mozilla/javascript/Context.java | 3 +- .../javascript/FunctionCompileSpecTest.java | 36 +++++++++++++++---- .../javascript/ScriptCompileSpecTest.java | 12 ++++--- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/rhino/src/main/java/org/mozilla/javascript/Context.java b/rhino/src/main/java/org/mozilla/javascript/Context.java index e165babd512..5307272e144 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Context.java +++ b/rhino/src/main/java/org/mozilla/javascript/Context.java @@ -1198,7 +1198,8 @@ public static Object getUndefinedValue() { public final Object evaluateScript(ScriptCompileSpec spec, VarScope scope) { Script script = compileScript(spec); if (script != null) { - return script.exec(this, scope, scope); + return script.exec( + this, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis()); } return null; } diff --git a/rhino/src/test/java/org/mozilla/javascript/FunctionCompileSpecTest.java b/rhino/src/test/java/org/mozilla/javascript/FunctionCompileSpecTest.java index 6cf90461d44..6a2bc781b10 100644 --- a/rhino/src/test/java/org/mozilla/javascript/FunctionCompileSpecTest.java +++ b/rhino/src/test/java/org/mozilla/javascript/FunctionCompileSpecTest.java @@ -40,7 +40,12 @@ public void testCompileFunctionWithBuilder() { .build()); assertNotNull(func); - Object result = func.call(cx, scope, scope, new Object[] {5, 7}); + Object result = + func.call( + cx, + scope, + ScriptableObject.getTopLevelScope(scope).getGlobalThis(), + new Object[] {5, 7}); assertEquals(12, ((Number) result).intValue()); } @@ -54,7 +59,12 @@ public void testCompileFunctionFromReader() throws Exception { .sourceName("mul.js") .build()); - Object result = func.call(cx, scope, scope, new Object[] {6, 7}); + Object result = + func.call( + cx, + scope, + ScriptableObject.getTopLevelScope(scope).getGlobalThis(), + new Object[] {6, 7}); assertEquals(42, ((Number) result).intValue()); } @@ -125,8 +135,12 @@ public void testLegacyCompileFunctionMatchesSpec() { .build()); Object[] args = new Object[] {1, 2}; - Object oldResult = oldWay.call(cx, scope, scope, args); - Object newResult = newWay.call(cx, scope, scope, args); + Object oldResult = + oldWay.call( + cx, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis(), args); + Object newResult = + newWay.call( + cx, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis(), args); assertEquals(((Number) oldResult).intValue(), ((Number) newResult).intValue()); assertEquals(3, ((Number) newResult).intValue()); } @@ -156,7 +170,12 @@ public void testFunctionFollowedByEmptyStatementsIsAccepted() { FunctionCompileSpec.fromSource("function f() { return 1; };;;", scope) .sourceName("trailing.js") .build()); - Object result = func.call(cx, scope, scope, new Object[0]); + Object result = + func.call( + cx, + scope, + ScriptableObject.getTopLevelScope(scope).getGlobalThis(), + new Object[0]); assertEquals(1, ((Number) result).intValue()); } @@ -183,7 +202,12 @@ public void testCompilerEnvironsProcessorIsInvoked() { received.get().isGeneratingSource(), "mutation in processor should take effect on the env passed to it"); - Object result = func.call(cx, scope, scope, new Object[0]); + Object result = + func.call( + cx, + scope, + ScriptableObject.getTopLevelScope(scope).getGlobalThis(), + new Object[0]); assertEquals(7, ((Number) result).intValue()); } } diff --git a/rhino/src/test/java/org/mozilla/javascript/ScriptCompileSpecTest.java b/rhino/src/test/java/org/mozilla/javascript/ScriptCompileSpecTest.java index 44ece991660..05bb99291b9 100644 --- a/rhino/src/test/java/org/mozilla/javascript/ScriptCompileSpecTest.java +++ b/rhino/src/test/java/org/mozilla/javascript/ScriptCompileSpecTest.java @@ -38,7 +38,8 @@ public void testCompileScriptWithBuilder() { .build()); assertNotNull(script); - Object result = script.exec(cx, scope, scope); + Object result = + script.exec(cx, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis()); assertEquals(42, ((Number) result).intValue()); } @@ -100,7 +101,8 @@ public void testCompileFromReader() throws Exception { .lineno(1) .build()); - Object result = script.exec(cx, scope, scope); + Object result = + script.exec(cx, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis()); assertEquals(15, ((Number) result).intValue()); } @@ -198,8 +200,10 @@ public void testLegacyCompileStringMatchesSpec() { .lineno(1) .build()); - Object oldResult = oldWay.exec(cx, scope, scope); - Object newResult = newWay.exec(cx, scope, scope); + Object oldResult = + oldWay.exec(cx, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis()); + Object newResult = + newWay.exec(cx, scope, ScriptableObject.getTopLevelScope(scope).getGlobalThis()); assertEquals(((Number) oldResult).intValue(), ((Number) newResult).intValue()); assertEquals(3, ((Number) newResult).intValue()); } From 2da0fd9f6caa30147891226a75cb534d7a014fc1 Mon Sep 17 00:00:00 2001 From: "duncan.macgregor" Date: Wed, 29 Apr 2026 15:07:16 +0100 Subject: [PATCH 005/147] Tidy up serial version ids. --- .../main/java/org/mozilla/javascript/xmlimpl/XMLLibImpl.java | 2 +- .../src/main/java/org/mozilla/javascript/xmlimpl/XmlNode.java | 2 +- .../src/main/java/org/mozilla/javascript/ClassDescriptor.java | 2 +- .../main/java/org/mozilla/javascript/DeclarationScope.java | 2 +- rhino/src/main/java/org/mozilla/javascript/ES6Generator.java | 2 +- .../src/main/java/org/mozilla/javascript/FunctionObject.java | 2 +- rhino/src/main/java/org/mozilla/javascript/FunctionScope.java | 2 +- .../main/java/org/mozilla/javascript/IdFunctionObject.java | 2 +- rhino/src/main/java/org/mozilla/javascript/JSCode.java | 2 +- .../java/org/mozilla/javascript/KnownBuiltInFunction.java | 2 +- .../src/main/java/org/mozilla/javascript/LambdaFunction.java | 2 +- .../main/java/org/mozilla/javascript/LazilyLoadedCtor.java | 2 +- .../main/java/org/mozilla/javascript/NativeArrayIterator.java | 2 +- .../src/main/java/org/mozilla/javascript/NativeGenerator.java | 2 +- rhino/src/main/java/org/mozilla/javascript/NativeJavaMap.java | 2 +- .../main/java/org/mozilla/javascript/NativeJavaObject.java | 2 +- .../java/org/mozilla/javascript/NativeStringIterator.java | 2 +- rhino/src/main/java/org/mozilla/javascript/ScopeObject.java | 2 +- rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java | 2 +- rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java | 2 +- rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java | 1 - rhino/src/main/java/org/mozilla/javascript/WithScope.java | 2 -- rhino/src/main/java/org/mozilla/javascript/ast/AstNode.java | 2 +- .../org/mozilla/javascript/commonjs/module/ModuleScope.java | 2 +- .../org/mozilla/javascript/commonjs/module/ModuleScript.java | 2 +- .../java/org/mozilla/javascript/commonjs/module/Require.java | 2 +- .../mozilla/javascript/commonjs/module/RequireBuilder.java | 2 +- .../module/provider/DefaultUrlConnectionExpiryCalculator.java | 2 +- .../javascript/commonjs/module/provider/ModuleSource.java | 2 +- .../commonjs/module/provider/ModuleSourceProviderBase.java | 2 +- .../commonjs/module/provider/ParsedContentType.java | 2 +- .../module/provider/SoftCachingModuleScriptProvider.java | 2 +- .../module/provider/StrongCachingModuleScriptProvider.java | 2 +- .../commonjs/module/provider/UrlModuleSourceProvider.java | 4 ++-- .../mozilla/javascript/regexp/NativeRegExpStringIterator.java | 2 +- .../mozilla/javascript/typedarrays/NativeBigInt64Array.java | 2 +- .../mozilla/javascript/typedarrays/NativeBigUint64Array.java | 2 +- .../mozilla/javascript/typedarrays/NativeFloat16Array.java | 2 +- .../mozilla/javascript/typedarrays/NativeFloat32Array.java | 2 +- .../mozilla/javascript/typedarrays/NativeFloat64Array.java | 2 +- .../org/mozilla/javascript/typedarrays/NativeInt32Array.java | 2 +- .../org/mozilla/javascript/typedarrays/NativeInt8Array.java | 2 +- .../org/mozilla/javascript/typedarrays/NativeUint8Array.java | 2 +- .../javascript/typedarrays/NativeUint8ClampedArray.java | 2 +- 44 files changed, 43 insertions(+), 46 deletions(-) diff --git a/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XMLLibImpl.java b/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XMLLibImpl.java index ff0df5ef5c3..2332f213670 100644 --- a/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XMLLibImpl.java +++ b/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XMLLibImpl.java @@ -25,7 +25,7 @@ public final class XMLLibImpl extends XMLLib implements Serializable { // EXPERIMENTAL Java interface // - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -6301237868232033480L; /** This experimental interface is undocumented. */ public static org.w3c.dom.Node toDomNode(Object xmlObject) { diff --git a/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XmlNode.java b/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XmlNode.java index f54eaf668ad..7c8a1681d3e 100644 --- a/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XmlNode.java +++ b/rhino-xml/src/main/java/org/mozilla/javascript/xmlimpl/XmlNode.java @@ -20,7 +20,7 @@ import org.w3c.dom.UserDataHandler; class XmlNode implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 7498300745525888082L; private static final String XML_NAMESPACES_NAMESPACE_URI = "http://www.w3.org/2000/xmlns/"; diff --git a/rhino/src/main/java/org/mozilla/javascript/ClassDescriptor.java b/rhino/src/main/java/org/mozilla/javascript/ClassDescriptor.java index 7f8b9c687fc..900b28bc564 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ClassDescriptor.java +++ b/rhino/src/main/java/org/mozilla/javascript/ClassDescriptor.java @@ -782,7 +782,7 @@ public ClassDescriptor build() { private static class BuiltInJSCode extends JSCode implements Serializable { - private static final long serialVersionUID = 2691205302914111400L; + private static final long serialVersionUID = -346984669839537590L; private final JSCodeExec exec; private final JSCodeResume resume; diff --git a/rhino/src/main/java/org/mozilla/javascript/DeclarationScope.java b/rhino/src/main/java/org/mozilla/javascript/DeclarationScope.java index 1d9571fe169..9ddd57e833f 100644 --- a/rhino/src/main/java/org/mozilla/javascript/DeclarationScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/DeclarationScope.java @@ -1,7 +1,7 @@ package org.mozilla.javascript; public class DeclarationScope extends ScopeObject { - private static final long serialVersionUID = -7471457301304454454L; + private static final long serialVersionUID = -7992031023451233550L; public DeclarationScope(VarScope parentScope) { super(parentScope); diff --git a/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java b/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java index 50c7d6a6046..ae34b12b638 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java +++ b/rhino/src/main/java/org/mozilla/javascript/ES6Generator.java @@ -7,7 +7,7 @@ package org.mozilla.javascript; public final class ES6Generator extends ScriptableObject { - private static final long serialVersionUID = 1645892441041347273L; + private static final long serialVersionUID = -1617667918827493330L; static final Object GENERATOR_TAG = "Generator"; diff --git a/rhino/src/main/java/org/mozilla/javascript/FunctionObject.java b/rhino/src/main/java/org/mozilla/javascript/FunctionObject.java index bdc7f4c2683..21885c691ef 100644 --- a/rhino/src/main/java/org/mozilla/javascript/FunctionObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/FunctionObject.java @@ -16,7 +16,7 @@ import java.lang.reflect.Modifier; public class FunctionObject extends BaseFunction { - private static final long serialVersionUID = -5332312783643935019L; + private static final long serialVersionUID = 8880062939740158370L; /** * Create a JavaScript function object from a Java method. diff --git a/rhino/src/main/java/org/mozilla/javascript/FunctionScope.java b/rhino/src/main/java/org/mozilla/javascript/FunctionScope.java index f2ad393e45f..ed4017e7d2a 100644 --- a/rhino/src/main/java/org/mozilla/javascript/FunctionScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/FunctionScope.java @@ -1,7 +1,7 @@ package org.mozilla.javascript; public class FunctionScope extends DeclarationScope { - private static final long serialVersionUID = -7471457301304454454L; + private static final long serialVersionUID = 4760825497832652202L; public FunctionScope(ScopeObject parentScope) { super(parentScope); diff --git a/rhino/src/main/java/org/mozilla/javascript/IdFunctionObject.java b/rhino/src/main/java/org/mozilla/javascript/IdFunctionObject.java index e81379675b7..3baa1674161 100644 --- a/rhino/src/main/java/org/mozilla/javascript/IdFunctionObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/IdFunctionObject.java @@ -11,7 +11,7 @@ import java.util.Objects; public class IdFunctionObject extends BaseFunction { - private static final long serialVersionUID = -5332312783643935019L; + private static final long serialVersionUID = 4323463961654640261L; public IdFunctionObject(IdFunctionCall idcall, Object tag, int id, int arity) { if (arity < 0) throw new IllegalArgumentException(); diff --git a/rhino/src/main/java/org/mozilla/javascript/JSCode.java b/rhino/src/main/java/org/mozilla/javascript/JSCode.java index 84fc5450e49..92e218782e9 100644 --- a/rhino/src/main/java/org/mozilla/javascript/JSCode.java +++ b/rhino/src/main/java/org/mozilla/javascript/JSCode.java @@ -35,7 +35,7 @@ public JSCode build() { private static class NotCallable extends JSCode implements Serializable { - private static final long serialVersionUID = 2691205302914111400L; + private static final long serialVersionUID = -31340315773728063L; @Override public Object execute( diff --git a/rhino/src/main/java/org/mozilla/javascript/KnownBuiltInFunction.java b/rhino/src/main/java/org/mozilla/javascript/KnownBuiltInFunction.java index 56a3d5cda89..85bb7adfd34 100644 --- a/rhino/src/main/java/org/mozilla/javascript/KnownBuiltInFunction.java +++ b/rhino/src/main/java/org/mozilla/javascript/KnownBuiltInFunction.java @@ -12,7 +12,7 @@ */ public class KnownBuiltInFunction extends LambdaFunction { - private static final long serialVersionUID = -8388132362854748293L; + private static final long serialVersionUID = 4527445659952834584L; private final Object tag; diff --git a/rhino/src/main/java/org/mozilla/javascript/LambdaFunction.java b/rhino/src/main/java/org/mozilla/javascript/LambdaFunction.java index f6ae5f1e80e..ba5578e6e95 100644 --- a/rhino/src/main/java/org/mozilla/javascript/LambdaFunction.java +++ b/rhino/src/main/java/org/mozilla/javascript/LambdaFunction.java @@ -13,7 +13,7 @@ */ public class LambdaFunction extends BaseFunction { - private static final long serialVersionUID = -8388132362854748293L; + private static final long serialVersionUID = 6594410813947157220L; // The target is expected to be a lambda. Lambdas may be serialized, which // requires this special interface. diff --git a/rhino/src/main/java/org/mozilla/javascript/LazilyLoadedCtor.java b/rhino/src/main/java/org/mozilla/javascript/LazilyLoadedCtor.java index a08e568fc43..d7820a68138 100644 --- a/rhino/src/main/java/org/mozilla/javascript/LazilyLoadedCtor.java +++ b/rhino/src/main/java/org/mozilla/javascript/LazilyLoadedCtor.java @@ -17,7 +17,7 @@ *

This improves startup time and average memory usage. */ public final class LazilyLoadedCtor> implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -1531091529063000542L; private static final int STATE_BEFORE_INIT = 0; private static final int STATE_INITIALIZING = 1; private static final int STATE_WITH_VALUE = 2; diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeArrayIterator.java b/rhino/src/main/java/org/mozilla/javascript/NativeArrayIterator.java index 5593f0fad1c..05887afd319 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeArrayIterator.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeArrayIterator.java @@ -15,7 +15,7 @@ public enum ARRAY_ITERATOR_TYPE { VALUES } - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 3370645355934941865L; private static final String ITERATOR_TAG = "ArrayIterator"; private ARRAY_ITERATOR_TYPE type; diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeGenerator.java b/rhino/src/main/java/org/mozilla/javascript/NativeGenerator.java index fb89f2d7031..ebb7152e809 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeGenerator.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeGenerator.java @@ -13,7 +13,7 @@ * @author Norris Boyd */ public final class NativeGenerator extends IdScriptableObject { - private static final long serialVersionUID = 1645892441041347273L; + private static final long serialVersionUID = -1383456283657974338L; private static final Object GENERATOR_TAG = "Generator"; diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeJavaMap.java b/rhino/src/main/java/org/mozilla/javascript/NativeJavaMap.java index 7b4d86a449f..05c2da83241 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeJavaMap.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeJavaMap.java @@ -168,7 +168,7 @@ public int hashCode() { }; private static final class NativeJavaMapIterator extends ES6Iterator { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -6354388021424261488L; private static final String ITERATOR_TAG = "JavaMapIterator"; static void init(TopLevel scope, boolean sealed) { diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java b/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java index 20bccc80d91..379f30fb402 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java @@ -916,7 +916,7 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundE }; private static final class JavaIterableIterator extends ES6Iterator { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -2636492890037940863L; private static final String ITERATOR_TAG = "JavaIterableIterator"; static void init(TopLevel scope, boolean sealed) { diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeStringIterator.java b/rhino/src/main/java/org/mozilla/javascript/NativeStringIterator.java index 989aa3c5f1a..90d8b572c28 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeStringIterator.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeStringIterator.java @@ -7,7 +7,7 @@ package org.mozilla.javascript; public final class NativeStringIterator extends ES6Iterator { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 6709689999500242078L; private static final String ITERATOR_TAG = "StringIterator"; static void init(TopLevel scope, boolean sealed) { diff --git a/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java b/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java index ea48d09cf56..9966fe3781c 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScopeObject.java @@ -10,7 +10,7 @@ import java.io.Serializable; public class ScopeObject extends SlotMapOwner implements VarScope, Serializable { - private static final long serialVersionUID = -7471457301304454454L; + private static final long serialVersionUID = 2283542168979106620L; private final VarScope parentScope; diff --git a/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java b/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java index 90e2616b2de..cf6022dc6ae 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScopeWrapper.java @@ -1,7 +1,7 @@ package org.mozilla.javascript; public class ScopeWrapper extends ScriptableObject { - private static final long serialVersionUID = -7471457301304454454L; + private static final long serialVersionUID = -3481312197060837332L; private final VarScope scope; diff --git a/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java b/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java index 17c3608ecd8..1119fbe2b3c 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java +++ b/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java @@ -2635,7 +2635,7 @@ public static Object setConst(VarScope bound, Object value, Context cx, String i * if a given property has already been enumerated. */ private static class IdEnumeration implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -8685189816346084720L; Scriptable obj; Object[] ids; HashSet used; diff --git a/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java b/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java index 89e6122eec5..2635be5e908 100644 --- a/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java +++ b/rhino/src/main/java/org/mozilla/javascript/SlotMapOwner.java @@ -16,7 +16,6 @@ import java.util.Objects; public abstract class SlotMapOwner> implements PropHolder { - private static final long serialVersionUID = 1L; /** * Maximum size of an {@link EmbeddedSlotMap} before it is promoted to a {@link HashSlotMap}. diff --git a/rhino/src/main/java/org/mozilla/javascript/WithScope.java b/rhino/src/main/java/org/mozilla/javascript/WithScope.java index 7a2e69168a2..a1492e2313a 100644 --- a/rhino/src/main/java/org/mozilla/javascript/WithScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/WithScope.java @@ -3,8 +3,6 @@ import static org.mozilla.javascript.Scriptable.NOT_FOUND; public class WithScope implements VarScope { - private static final long serialVersionUID = -7471457301304454454L; - // This cannot be final because XML dot queries mutate it! private Scriptable obj; private final VarScope parent; diff --git a/rhino/src/main/java/org/mozilla/javascript/ast/AstNode.java b/rhino/src/main/java/org/mozilla/javascript/ast/AstNode.java index f7ebae8cb35..062c87a5634 100644 --- a/rhino/src/main/java/org/mozilla/javascript/ast/AstNode.java +++ b/rhino/src/main/java/org/mozilla/javascript/ast/AstNode.java @@ -138,7 +138,7 @@ public abstract class AstNode extends Node implements Comparable { } public static class PositionComparator implements Comparator, Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1551233591343412911L; /** * Sorts nodes by (relative) start position. The start positions are relative to their diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScope.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScope.java index 718fcace72b..16a8fc82313 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScope.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScope.java @@ -15,7 +15,7 @@ * URIs in order to resolve relative module IDs and check sandbox constraints. */ public class ModuleScope extends DeclarationScope { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -877901398709024429L; private final URI uri; private final URI base; diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScript.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScript.java index aa120a0536e..0d4ec07ea24 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScript.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/ModuleScript.java @@ -16,7 +16,7 @@ * @version $Id: ModuleScript.java,v 1.3 2011/04/07 20:26:11 hannes%helma.at Exp $ */ public class ModuleScript implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -8287890021565388770L; private final Script script; private final URI uri; private final URI base; diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/Require.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/Require.java index 4f681290388..39b1a26b6d3 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/Require.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/Require.java @@ -45,7 +45,7 @@ * @version $Id: Require.java,v 1.4 2011/04/07 20:26:11 hannes%helma.at Exp $ */ public class Require extends BaseFunction { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 5682218649242405574L; private final ModuleScriptProvider moduleScriptProvider; private final TopLevel nativeScope; private final Scriptable paths; diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/RequireBuilder.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/RequireBuilder.java index 543abae3631..2116804eb82 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/RequireBuilder.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/RequireBuilder.java @@ -20,7 +20,7 @@ * @version $Id: RequireBuilder.java,v 1.4 2011/04/07 20:26:11 hannes%helma.at Exp $ */ public class RequireBuilder implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 5244169608278369242L; private boolean sandboxed = true; private ModuleScriptProvider moduleScriptProvider; private Script preExec; diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/DefaultUrlConnectionExpiryCalculator.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/DefaultUrlConnectionExpiryCalculator.java index e118b03998a..2c93d98f245 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/DefaultUrlConnectionExpiryCalculator.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/DefaultUrlConnectionExpiryCalculator.java @@ -19,7 +19,7 @@ */ public class DefaultUrlConnectionExpiryCalculator implements UrlConnectionExpiryCalculator, Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 6649125723317726741L; private final long relativeExpiry; /** Creates a new default expiry calculator with one minute relative expiry. */ diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSource.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSource.java index 3c764c64479..e8fded89631 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSource.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSource.java @@ -31,7 +31,7 @@ * @version $Id: ModuleSource.java,v 1.3 2011/04/07 20:26:12 hannes%helma.at Exp $ */ public class ModuleSource implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 7183957145984428890L; private final Reader reader; private final Object securityDomain; private final URI uri; diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSourceProviderBase.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSourceProviderBase.java index f3f9982ee6d..c34e8913dc0 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSourceProviderBase.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ModuleSourceProviderBase.java @@ -26,7 +26,7 @@ * @version $Id: ModuleSourceProviderBase.java,v 1.3 2011/04/07 20:26:12 hannes%helma.at Exp $ */ public abstract class ModuleSourceProviderBase implements ModuleSourceProvider, Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -5687971989835149396L; @Override public ModuleSource loadSource(String moduleId, Scriptable paths, Object validator) diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ParsedContentType.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ParsedContentType.java index 3d280b11e1e..a430e17e283 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ParsedContentType.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/ParsedContentType.java @@ -14,7 +14,7 @@ * @version $Id: ParsedContentType.java,v 1.3 2011/04/07 20:26:12 hannes%helma.at Exp $ */ public final class ParsedContentType implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2660291075921848672L; private final String contentType; private final String encoding; diff --git a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/SoftCachingModuleScriptProvider.java b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/SoftCachingModuleScriptProvider.java index 70e2d8bd4c5..3560d2c0c8b 100644 --- a/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/SoftCachingModuleScriptProvider.java +++ b/rhino/src/main/java/org/mozilla/javascript/commonjs/module/provider/SoftCachingModuleScriptProvider.java @@ -30,7 +30,7 @@ * $ */ public class SoftCachingModuleScriptProvider extends CachingModuleScriptProviderBase { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 523398435792363456L; private transient ReferenceQueue