--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Thu Jun 27 13:47:20 2013 +0530
@@ -166,11 +166,11 @@
mi.putStatic(className, MAP_FIELD_NAME, MAP_DESC);
mi.loadClass(className);
mi.invokeStatic(MAP_TYPE, MAP_NEWMAP, MAP_NEWMAP_DESC);
- mi.storeLocal(0);
+ // stack: PropertyMap
}
static void emitStaticInitSuffix(final MethodGenerator mi, final String className) {
- mi.loadLocal(0);
+ // stack: PropertyMap
mi.putStatic(className, MAP_FIELD_NAME, MAP_DESC);
mi.returnVoid();
mi.computeMaxs();
@@ -278,7 +278,7 @@
static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo memInfo) {
final String propertyName = memInfo.getName();
- mi.loadLocal(0);
+ // stack: PropertyMap
mi.loadLiteral(propertyName);
// setup flags
mi.push(memInfo.getAttributes());
@@ -293,12 +293,12 @@
mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, setterDesc(memInfo)));
}
mi.invokeStatic(LOOKUP_TYPE, LOOKUP_NEWPROPERTY, LOOKUP_NEWPROPERTY_DESC);
- mi.storeLocal(0);
+ // stack: PropertyMap
}
static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo getter, final MemberInfo setter) {
final String propertyName = getter.getName();
- mi.loadLocal(0);
+ // stack: PropertyMap
mi.loadLiteral(propertyName);
// setup flags
mi.push(getter.getAttributes());
@@ -313,7 +313,7 @@
setter.getJavaName(), setter.getJavaDesc()));
}
mi.invokeStatic(LOOKUP_TYPE, LOOKUP_NEWPROPERTY, LOOKUP_NEWPROPERTY_DESC);
- mi.storeLocal(0);
+ // stack: PropertyMap
}
static ScriptClassInfo getScriptClassInfo(final String fileName) throws IOException {
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInstrumentor.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInstrumentor.java Thu Jun 27 13:47:20 2013 +0530
@@ -159,10 +159,14 @@
public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
if (isConstructor && opcode == INVOKESPECIAL &&
INIT.equals(name) && SCRIPTOBJECT_TYPE.equals(owner)) {
- super.visitFieldInsn(GETSTATIC, scriptClassInfo.getJavaName(),
- MAP_FIELD_NAME, MAP_DESC);
- super.visitMethodInsn(INVOKESPECIAL, SCRIPTOBJECT_TYPE, INIT,
- SCRIPTOBJECT_INIT_DESC);
+
+ // replace call to empty super-constructor with one passing PropertyMap argument
+ if (DEFAULT_INIT_DESC.equals(desc)) {
+ super.visitFieldInsn(GETSTATIC, scriptClassInfo.getJavaName(), MAP_FIELD_NAME, MAP_DESC);
+ super.visitMethodInsn(INVOKESPECIAL, SCRIPTOBJECT_TYPE, INIT, SCRIPTOBJECT_INIT_DESC);
+ } else {
+ super.visitMethodInsn(opcode, owner, name, desc);
+ }
if (memberCount > 0) {
// initialize @Property fields if needed
@@ -223,7 +227,7 @@
ClassGenerator.addSetter(cv, className, memInfo);
}
}
- ClassGenerator.addMapField(this);
+ // omit addMapField() since instance classes already define a static PropertyMap field
}
void emitGettersSetters() {
--- a/nashorn/docs/JavaScriptingProgrammersGuide.html Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/docs/JavaScriptingProgrammersGuide.html Thu Jun 27 13:47:20 2013 +0530
@@ -227,6 +227,16 @@
it. Note that the syntax to access Java objects, methods and fields
is dependent on the scripting language. JavaScript supports the
most "natural" Java-like syntax.</p>
+<p>
+Nashorn script engine pre-defines two global variables named "context"
+and "engine". The "context" variable is of type javax.script.ScriptContext
+and refers to the current ScriptContext instance passed to script engine's
+eval method. The "engine" variable is of type javax.script.ScriptEngine and
+refers to the current nashorn script engine instance evaluating the script.
+Both of these variables are non-writable, non-enumerable and non-configurable
+- which implies script code can not write overwrite the value, for..loop iteration
+on global object will not iterate these variables and these variables can not be
+deleted by script.
<pre><code>
// <a href="source/ScriptVars.java">ScriptVars.java</a>
--- a/nashorn/src/jdk/nashorn/api/scripting/JSObject.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/api/scripting/JSObject.java Thu Jun 27 13:47:20 2013 +0530
@@ -30,13 +30,23 @@
*/
public abstract class JSObject {
/**
- * Call a JavaScript method
+ * Call a JavaScript function
*
- * @param methodName name of method
+ * @param functionName name of function
* @param args arguments to method
* @return result of call
*/
- public abstract Object call(String methodName, Object args[]);
+ public abstract Object call(String functionName, Object... args);
+
+ /**
+ * Call a JavaScript method as a constructor. This is equivalent to
+ * calling new obj.Method(arg1, arg2...) in JavaScript.
+ *
+ * @param functionName name of function
+ * @param args arguments to method
+ * @return result of constructor call
+ */
+ public abstract Object newObject(String functionName, Object... args);
/**
* Evaluate a JavaScript expression
--- a/nashorn/src/jdk/nashorn/api/scripting/NashornException.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/api/scripting/NashornException.java Thu Jun 27 13:47:20 2013 +0530
@@ -25,6 +25,9 @@
package jdk.nashorn.api.scripting;
+import java.util.ArrayList;
+import java.util.List;
+import jdk.nashorn.internal.codegen.CompilerConstants;
import jdk.nashorn.internal.runtime.ECMAErrors;
/**
@@ -136,4 +139,52 @@
return column;
}
+ /**
+ * Returns array javascript stack frames from the given exception object.
+ *
+ * @param exception exception from which stack frames are retrieved and filtered
+ * @return array of javascript stack frames
+ */
+ public static StackTraceElement[] getScriptFrames(final Throwable exception) {
+ final StackTraceElement[] frames = ((Throwable)exception).getStackTrace();
+ final List<StackTraceElement> filtered = new ArrayList<>();
+ for (final StackTraceElement st : frames) {
+ if (ECMAErrors.isScriptFrame(st)) {
+ final String className = "<" + st.getFileName() + ">";
+ String methodName = st.getMethodName();
+ if (methodName.equals(CompilerConstants.RUN_SCRIPT.symbolName())) {
+ methodName = "<program>";
+ }
+ filtered.add(new StackTraceElement(className, methodName,
+ st.getFileName(), st.getLineNumber()));
+ }
+ }
+ return filtered.toArray(new StackTraceElement[filtered.size()]);
+ }
+
+ /**
+ * Return a formatted script stack trace string with frames information separated by '\n'
+ *
+ * @param exception exception for which script stack string is returned
+ * @return formatted stack trace string
+ */
+ public static String getScriptStackString(final Throwable exception) {
+ final StringBuilder buf = new StringBuilder();
+ final StackTraceElement[] frames = getScriptFrames((Throwable)exception);
+ for (final StackTraceElement st : frames) {
+ buf.append(st.getMethodName());
+ buf.append(" @ ");
+ buf.append(st.getFileName());
+ buf.append(':');
+ buf.append(st.getLineNumber());
+ buf.append('\n');
+ }
+ final int len = buf.length();
+ // remove trailing '\n'
+ if (len > 0) {
+ assert buf.charAt(len - 1) == '\n';
+ buf.deleteCharAt(len - 1);
+ }
+ return buf.toString();
+ }
}
--- a/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Thu Jun 27 13:47:20 2013 +0530
@@ -71,6 +71,9 @@
private final ScriptEngineFactory factory;
private final Context nashornContext;
private final ScriptObject global;
+ // initialized bit late to be made 'final'. Property object for "context"
+ // property of global object
+ private Property contextProperty;
// default options passed to Nashorn Options object
private static final String[] DEFAULT_OPTIONS = new String[] { "-scripting", "-doe" };
@@ -281,13 +284,16 @@
nashornContext.initGlobal(newGlobal);
+ final int NON_ENUMERABLE_CONSTANT = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE;
// current ScriptContext exposed as "context"
- newGlobal.addOwnProperty("context", Property.NOT_ENUMERABLE, UNDEFINED);
+ // "context" is non-writable from script - but script engine still
+ // needs to set it and so save the context Property object
+ contextProperty = newGlobal.addOwnProperty("context", NON_ENUMERABLE_CONSTANT, UNDEFINED);
// current ScriptEngine instance exposed as "engine". We added @SuppressWarnings("LeakingThisInConstructor") as
// NetBeans identifies this assignment as such a leak - this is a false positive as we're setting this property
// in the Global of a Context we just created - both the Context and the Global were just created and can not be
// seen from another thread outside of this constructor.
- newGlobal.addOwnProperty("engine", Property.NOT_ENUMERABLE, this);
+ newGlobal.addOwnProperty("engine", NON_ENUMERABLE_CONSTANT, this);
// global script arguments with undefined value
newGlobal.addOwnProperty("arguments", Property.NOT_ENUMERABLE, UNDEFINED);
// file name default is null
@@ -322,9 +328,10 @@
// scripts should see "context" and "engine" as variables
private void setContextVariables(final ScriptContext ctxt) {
- ctxt.setAttribute("context", ctxt, ScriptContext.ENGINE_SCOPE);
final ScriptObject ctxtGlobal = getNashornGlobalFrom(ctxt);
- ctxtGlobal.set("context", ctxt, false);
+ // set "context" global variable via contextProperty - because this
+ // property is non-writable
+ contextProperty.setObjectValue(ctxtGlobal, ctxtGlobal, ctxt, false);
Object args = ScriptObjectMirror.unwrap(ctxt.getAttribute("arguments"), ctxtGlobal);
if (args == null || args == UNDEFINED) {
args = ScriptRuntime.EMPTY_ARRAY;
--- a/nashorn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Thu Jun 27 13:47:20 2013 +0530
@@ -102,7 +102,7 @@
// JSObject methods
@Override
- public Object call(final String methodName, final Object args[]) {
+ public Object call(final String functionName, final Object... args) {
final ScriptObject oldGlobal = NashornScriptEngine.getNashornGlobal();
final boolean globalChanged = (oldGlobal != global);
@@ -111,9 +111,9 @@
NashornScriptEngine.setNashornGlobal(global);
}
- final Object val = sobj.get(methodName);
+ final Object val = functionName == null? sobj : sobj.get(functionName);
if (! (val instanceof ScriptFunction)) {
- throw new RuntimeException("No such method: " + methodName);
+ throw new RuntimeException("No such function " + ((functionName != null)? functionName : ""));
}
final Object[] modArgs = globalChanged? wrapArray(args, oldGlobal) : args;
@@ -130,6 +130,34 @@
}
@Override
+ public Object newObject(final String functionName, final Object... args) {
+ final ScriptObject oldGlobal = NashornScriptEngine.getNashornGlobal();
+ final boolean globalChanged = (oldGlobal != global);
+
+ try {
+ if (globalChanged) {
+ NashornScriptEngine.setNashornGlobal(global);
+ }
+
+ final Object val = functionName == null? sobj : sobj.get(functionName);
+ if (! (val instanceof ScriptFunction)) {
+ throw new RuntimeException("not a constructor " + ((functionName != null)? functionName : ""));
+ }
+
+ final Object[] modArgs = globalChanged? wrapArray(args, oldGlobal) : args;
+ return wrap(ScriptRuntime.checkAndConstruct((ScriptFunction)val, unwrapArray(modArgs, global)), global);
+ } catch (final RuntimeException | Error e) {
+ throw e;
+ } catch (final Throwable t) {
+ throw new RuntimeException(t);
+ } finally {
+ if (globalChanged) {
+ NashornScriptEngine.setNashornGlobal(oldGlobal);
+ }
+ }
+ }
+
+ @Override
public Object eval(final String s) {
return inGlobal(new Callable<Object>() {
@Override
--- a/nashorn/src/jdk/nashorn/internal/codegen/ClassEmitter.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/codegen/ClassEmitter.java Thu Jun 27 13:47:20 2013 +0530
@@ -165,7 +165,8 @@
/**
* Constructor from the compiler
*
- * @param compiler Compiler
+ * @param env Script environment
+ * @param sourceName Source name
* @param unitClassName Compile unit class name.
* @param strictMode Should we generate this method in strict mode
*/
--- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Jun 27 13:47:20 2013 +0530
@@ -244,7 +244,7 @@
/**
* Check if this symbol can be accessed directly with a putfield or getfield or dynamic load
*
- * @param function function to check for fast scope
+ * @param symbol symbol to check for fast scope
* @return true if fast scope
*/
private boolean isFastScope(final Symbol symbol) {
@@ -1016,6 +1016,8 @@
assert lc.hasCompileUnits();
method = lc.pushMethodEmitter(unit.getClassEmitter().method(functionNode));
+ // new method - reset last line number
+ lastLineNumber = -1;
// Mark end for variable tables.
method.begin();
@@ -1093,7 +1095,7 @@
private void lineNumber(final Statement statement) {
final int lineNumber = statement.getLineNumber();
if (lineNumber != lastLineNumber) {
- method.lineNumber(statement.getLineNumber());
+ method.lineNumber(lineNumber);
}
lastLineNumber = lineNumber;
}
--- a/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Thu Jun 27 13:47:20 2013 +0530
@@ -245,9 +245,9 @@
/**
* Constructor
*
+ * @param env script environment
* @param installer code installer
- * @param functionNode function node (in any available {@link CompilationState}) to compile
- * @param sequence {@link Compiler#CompilationSequence} of {@link CompilationPhase}s to apply as this compilation
+ * @param sequence {@link Compiler.CompilationSequence} of {@link CompilationPhase}s to apply as this compilation
* @param strict should this compilation use strict mode semantics
*/
//TODO support an array of FunctionNodes for batch lazy compilation
--- a/nashorn/src/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/codegen/ObjectClassGenerator.java Thu Jun 27 13:47:20 2013 +0530
@@ -82,13 +82,13 @@
* Debug field logger
* Should we print debugging information for fields when they are generated and getters/setters are called?
*/
- public static final DebugLogger LOG = new DebugLogger("fields", "nashorn.fields.debug");
+ public static final DebugLogger LOG = new DebugLogger("fields", "nashorn.fields.debug");
/**
* is field debugging enabled. Several modules in codegen and properties use this, hence
* public access.
*/
- public static final boolean DEBUG_FIELDS = LOG.isEnabled();
+ public static final boolean DEBUG_FIELDS = LOG.isEnabled();
/**
* Should the runtime only use java.lang.Object slots for fields? If this is false, the representation
--- a/nashorn/src/jdk/nashorn/internal/objects/AccessorPropertyDescriptor.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/AccessorPropertyDescriptor.java Thu Jun 27 13:47:20 2013 +0530
@@ -34,6 +34,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.PropertyDescriptor;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -63,16 +64,19 @@
@Property
public Object set;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
AccessorPropertyDescriptor() {
this(false, false, UNDEFINED, UNDEFINED);
}
AccessorPropertyDescriptor(final boolean configurable, final boolean enumerable, final Object get, final Object set) {
+ super(Global.objectPrototype(), $nasgenmap$);
this.configurable = configurable;
this.enumerable = enumerable;
this.get = get;
this.set = set;
- setProto(Global.objectPrototype());
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java Thu Jun 27 13:47:20 2013 +0530
@@ -29,6 +29,7 @@
import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -38,6 +39,9 @@
@ScriptClass("ArrayBufferView")
abstract class ArrayBufferView extends ScriptObject {
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
ArrayBufferView(final NativeArrayBuffer buffer, final int byteOffset, final int elementLength) {
checkConstructorArgs(buffer, byteOffset, elementLength);
this.setProto(getPrototype());
--- a/nashorn/src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.PropertyDescriptor;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
@@ -61,16 +62,19 @@
@Property
public Object value;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
DataPropertyDescriptor() {
this(false, false, false, UNDEFINED);
}
DataPropertyDescriptor(final boolean configurable, final boolean enumerable, final boolean writable, final Object value) {
+ super(Global.objectPrototype(), $nasgenmap$);
this.configurable = configurable;
this.enumerable = enumerable;
this.writable = writable;
this.value = value;
- setProto(Global.objectPrototype());
}
--- a/nashorn/src/jdk/nashorn/internal/objects/GenericPropertyDescriptor.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/GenericPropertyDescriptor.java Thu Jun 27 13:47:20 2013 +0530
@@ -30,6 +30,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.PropertyDescriptor;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -51,14 +52,17 @@
@Property
public Object enumerable;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
GenericPropertyDescriptor() {
this(false, false);
}
GenericPropertyDescriptor(final boolean configurable, final boolean enumerable) {
+ super(Global.objectPrototype(), $nasgenmap$);
this.configurable = configurable;
this.enumerable = enumerable;
- setProto(Global.objectPrototype());
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/Global.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/Global.java Thu Jun 27 13:47:20 2013 +0530
@@ -53,8 +53,10 @@
import jdk.nashorn.internal.runtime.GlobalObject;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.NativeJavaPackage;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptEnvironment;
import jdk.nashorn.internal.runtime.PropertyDescriptor;
+import jdk.nashorn.internal.runtime.arrays.ArrayData;
import jdk.nashorn.internal.runtime.regexp.RegExpResult;
import jdk.nashorn.internal.runtime.Scope;
import jdk.nashorn.internal.runtime.ScriptFunction;
@@ -379,6 +381,9 @@
private final Context context;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
/**
* Constructor
*
@@ -484,7 +489,7 @@
@Override
public ScriptObject newObject() {
- return newEmptyInstance();
+ return new JO(getObjectPrototype());
}
@Override
@@ -1242,7 +1247,17 @@
* @return the new array
*/
public static NativeArray allocate(final Object[] initial) {
- return new NativeArray(initial);
+ ArrayData arrayData = ArrayData.allocate(initial);
+
+ for (int index = 0; index < initial.length; index++) {
+ final Object value = initial[index];
+
+ if (value == ScriptRuntime.EMPTY) {
+ arrayData = arrayData.delete(index);
+ }
+ }
+
+ return new NativeArray(arrayData);
}
/**
@@ -1252,7 +1267,7 @@
* @return the new array
*/
public static NativeArray allocate(final double[] initial) {
- return new NativeArray(initial);
+ return new NativeArray(ArrayData.allocate(initial));
}
/**
@@ -1262,7 +1277,7 @@
* @return the new array
*/
public static NativeArray allocate(final long[] initial) {
- return new NativeArray(initial);
+ return new NativeArray(ArrayData.allocate(initial));
}
/**
@@ -1272,7 +1287,7 @@
* @return the new array
*/
public static NativeArray allocate(final int[] initial) {
- return new NativeArray(initial);
+ return new NativeArray(ArrayData.allocate(initial));
}
/**
@@ -1329,9 +1344,7 @@
* @return New empty object.
*/
public static ScriptObject newEmptyInstance() {
- final ScriptObject sobj = new JO();
- sobj.setProto(objectPrototype());
- return sobj;
+ return Global.instance().newObject();
}
/**
@@ -1545,7 +1558,7 @@
addOwnProperty("echo", Attribute.NOT_ENUMERABLE, value);
// Nashorn extension: global.$OPTIONS (scripting-mode-only)
- final ScriptObject options = newEmptyInstance();
+ final ScriptObject options = newObject();
final ScriptEnvironment scriptEnv = context.getEnv();
copyOptions(options, scriptEnv);
addOwnProperty("$OPTIONS", Attribute.NOT_ENUMERABLE, options);
@@ -1554,7 +1567,7 @@
if (System.getSecurityManager() == null) {
// do not fill $ENV if we have a security manager around
// Retrieve current state of ENV variables.
- final ScriptObject env = newEmptyInstance();
+ final ScriptObject env = newObject();
env.putAll(System.getenv());
addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, env);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeArguments.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeArguments.java Thu Jun 27 13:47:20 2013 +0530
@@ -61,13 +61,13 @@
private static final MethodHandle G$CALLEE = findOwnMH("G$callee", Object.class, Object.class);
private static final MethodHandle S$CALLEE = findOwnMH("S$callee", void.class, Object.class, Object.class);
- private static final PropertyMap nasgenmap$;
+ private static final PropertyMap map$;
static {
PropertyMap map = PropertyMap.newMap(NativeArguments.class);
map = Lookup.newProperty(map, "length", Property.NOT_ENUMERABLE, G$LENGTH, S$LENGTH);
map = Lookup.newProperty(map, "callee", Property.NOT_ENUMERABLE, G$CALLEE, S$CALLEE);
- nasgenmap$ = map;
+ map$ = map;
}
private Object length;
@@ -76,8 +76,8 @@
// This is lazily initialized - only when delete is invoked at all
private BitSet deleted;
- NativeArguments(final Object[] arguments, final Object callee, final int numParams) {
- super(nasgenmap$);
+ NativeArguments(final ScriptObject proto, final Object[] arguments, final Object callee, final int numParams) {
+ super(proto, map$);
setIsArguments();
setArray(ArrayData.allocate(arguments));
@@ -102,9 +102,6 @@
}
System.arraycopy(arguments, 0, newValues, 0, Math.min(newValues.length, arguments.length));
this.namedArgs = ArrayData.allocate(newValues);
-
- // set Object.prototype as __proto__
- this.setProto(Global.objectPrototype());
}
@Override
@@ -553,7 +550,8 @@
public static ScriptObject allocate(final Object[] arguments, final ScriptFunction callee, final int numParams) {
// Strict functions won't always have a callee for arguments, and will pass null instead.
final boolean isStrict = callee == null || callee.isStrict();
- return isStrict ? new NativeStrictArguments(arguments, numParams) : new NativeArguments(arguments, callee, numParams);
+ final ScriptObject proto = Global.objectPrototype();
+ return isStrict ? new NativeStrictArguments(proto, arguments, numParams) : new NativeArguments(proto, arguments, callee, numParams);
}
/**
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeArray.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeArray.java Thu Jun 27 13:47:20 2013 +0530
@@ -50,6 +50,7 @@
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.PropertyDescriptor;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -82,6 +83,8 @@
private static final InvokeByName TO_LOCALE_STRING = new InvokeByName("toLocaleString", ScriptObject.class, String.class);
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
/*
* Constructors.
@@ -126,8 +129,8 @@
this.setArray(arrayData);
}
- private NativeArray(final ArrayData arrayData) {
- setProto(Global.instance().getArrayPrototype());
+ NativeArray(final ArrayData arrayData) {
+ super(Global.instance().getArrayPrototype(), $nasgenmap$);
this.setArray(arrayData);
this.setIsArray();
}
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -39,6 +40,9 @@
final class NativeArrayBuffer extends ScriptObject {
private final byte[] buffer;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
@Constructor(arity = 1)
public static Object constructor(final boolean newObj, final Object self, final Object... args) {
if (args.length == 0) {
@@ -49,8 +53,8 @@
}
protected NativeArrayBuffer(final byte[] byteArray) {
+ super(Global.instance().getArrayBufferPrototype(), $nasgenmap$);
this.buffer = byteArray;
- this.setProto(Global.instance().getArrayBufferPrototype());
}
protected NativeArrayBuffer(final int byteLength) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java Thu Jun 27 13:47:20 2013 +0530
@@ -37,6 +37,7 @@
import jdk.nashorn.internal.objects.annotations.Function;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
@@ -52,13 +53,16 @@
final static MethodHandle WRAPFILTER = findWrapFilter();
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeBoolean(final boolean value) {
this(value, Global.instance().getBooleanPrototype());
}
private NativeBoolean(final boolean value, final ScriptObject proto) {
+ super(proto, $nasgenmap$);
this.value = value;
- this.setProto(proto);
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Thu Jun 27 13:47:20 2013 +0530
@@ -42,6 +42,7 @@
import jdk.nashorn.internal.parser.DateParser;
import jdk.nashorn.internal.runtime.ConsString;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptEnvironment;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
@@ -100,16 +101,19 @@
private double time;
private final TimeZone timezone;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeDate() {
this(System.currentTimeMillis());
}
NativeDate(final double time) {
+ super(Global.instance().getDatePrototype(), $nasgenmap$);
final ScriptEnvironment env = Global.getEnv();
this.time = time;
this.timezone = env._timezone;
- this.setProto(Global.instance().getDatePrototype());
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeDebug.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeDebug.java Thu Jun 27 13:47:20 2013 +0530
@@ -47,8 +47,12 @@
*/
@ScriptClass("Debug")
public final class NativeDebug extends ScriptObject {
+
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeDebug() {
- this.setProto(Global.objectPrototype());
+ super(Global.objectPrototype(), $nasgenmap$);
}
@Override
@@ -187,7 +191,7 @@
out.println("Scope count " + ScriptObject.getScopeCount());
out.println("ScriptObject listeners added " + PropertyListenerManager.getListenersAdded());
out.println("ScriptObject listeners removed " + PropertyListenerManager.getListenersRemoved());
- out.println("ScriptFunction count " + ScriptObject.getCount());
+ out.println("ScriptFunction constructor calls " + ScriptFunction.getConstructorCount());
out.println("ScriptFunction invokes " + ScriptFunction.getInvokes());
out.println("ScriptFunction allocations " + ScriptFunction.getAllocations());
out.println("PropertyMap count " + PropertyMap.getCount());
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeError.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.List;
+import jdk.nashorn.api.scripting.NashornException;
import jdk.nashorn.internal.codegen.CompilerConstants;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
import jdk.nashorn.internal.objects.annotations.Attribute;
@@ -43,6 +44,7 @@
import jdk.nashorn.internal.runtime.ECMAErrors;
import jdk.nashorn.internal.runtime.ECMAException;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -86,8 +88,11 @@
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeError(final Object msg) {
- this.setProto(Global.instance().getErrorPrototype());
+ super(Global.instance().getErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
@@ -115,6 +120,20 @@
}
/**
+ * Nashorn extension: Error.captureStackTrace. Capture stack trace at the point of call into the Error object provided.
+ *
+ * @param self self reference
+ */
+ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
+ public static Object captureStackTrace(final Object self, final Object errorObj) {
+ Global.checkObject(errorObj);
+ final ScriptObject sobj = (ScriptObject)errorObj;
+ final ECMAException exp = new ECMAException(sobj, null);
+ sobj.set("stack", NashornException.getScriptStackString(exp), false);
+ return UNDEFINED;
+ }
+
+ /**
* Nashorn extension: Error.dumpStack
* dumps the stack of the current thread.
*
@@ -144,6 +163,30 @@
}
/**
+ * Nashorn extension: Error.prototype.getStackTrace()
+ * "stack" property is an array typed value containing {@link StackTraceElement}
+ * objects of JavaScript stack frames.
+ *
+ * @param self self reference
+ *
+ * @return stack trace as a script array.
+ */
+ @Function(attributes = Attribute.NOT_ENUMERABLE)
+ public static Object getStackTrace(final Object self) {
+ Global.checkObject(self);
+ final ScriptObject sobj = (ScriptObject)self;
+ final Object exception = ECMAException.getException(sobj);
+ Object[] res;
+ if (exception instanceof Throwable) {
+ res = NashornException.getScriptFrames((Throwable)exception);
+ } else {
+ res = ScriptRuntime.EMPTY_ARRAY;
+ }
+
+ return new NativeArray(res);
+ }
+
+ /**
* Nashorn extension: Error.prototype.lineNumber
*
* @param self self reference
@@ -229,8 +272,8 @@
/**
* Nashorn extension: Error.prototype.stack
- * "stack" property is an array typed value containing {@link StackTraceElement}
- * objects of JavaScript stack frames.
+ * "stack" property is a string typed value containing JavaScript stack frames.
+ * Each frame information is separated bv "\n" character.
*
* @param self self reference
*
@@ -244,27 +287,11 @@
}
final Object exception = ECMAException.getException(sobj);
- Object[] res;
if (exception instanceof Throwable) {
- final StackTraceElement[] frames = ((Throwable)exception).getStackTrace();
- final List<StackTraceElement> filtered = new ArrayList<>();
- for (final StackTraceElement st : frames) {
- if (ECMAErrors.isScriptFrame(st)) {
- final String className = "<" + st.getFileName() + ">";
- String methodName = st.getMethodName();
- if (methodName.equals(CompilerConstants.RUN_SCRIPT.symbolName())) {
- methodName = "<program>";
- }
- filtered.add(new StackTraceElement(className, methodName,
- st.getFileName(), st.getLineNumber()));
- }
- }
- res = filtered.toArray();
+ return NashornException.getScriptStackString((Throwable)exception);
} else {
- res = ScriptRuntime.EMPTY_ARRAY;
+ return "";
}
-
- return new NativeArray(res);
}
/**
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeEvalError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeEvalError.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -52,10 +53,13 @@
/** ECMA 15.1.1.1 message property */
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
+ public Object message;
- public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeEvalError(final Object msg) {
- this.setProto(Global.instance().getEvalErrorPrototype());
+ super(Global.instance().getEvalErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeFloat32Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeFloat32Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -46,6 +47,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 4;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeFloat64Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeFloat64Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -46,6 +47,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 8;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java Thu Jun 27 13:47:20 2013 +0530
@@ -38,6 +38,7 @@
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.ParserException;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -52,6 +53,10 @@
*/
@ScriptClass("Function")
public final class NativeFunction {
+
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
// do *not* create me!
private NativeFunction() {
}
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeInt16Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeInt16Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -31,6 +31,7 @@
import jdk.nashorn.internal.objects.annotations.Property;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -39,6 +40,10 @@
*/
@ScriptClass("Int16Array")
public final class NativeInt16Array extends ArrayBufferView {
+
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
/**
* The size in bytes of each element in the array.
*/
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeInt32Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeInt32Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -31,6 +31,7 @@
import jdk.nashorn.internal.objects.annotations.Property;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -45,6 +46,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 4;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeInt8Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeInt8Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -31,6 +31,7 @@
import jdk.nashorn.internal.objects.annotations.Property;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -45,6 +46,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 1;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java Thu Jun 27 13:47:20 2013 +0530
@@ -42,6 +42,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.FindProperty;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -142,9 +143,12 @@
private static final MethodHandle IS_JSADAPTOR = findOwnMH("isJSAdaptor", boolean.class, Object.class, Object.class, MethodHandle.class, Object.class, ScriptFunction.class);
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeJSAdapter(final ScriptObject proto, final Object overrides, final ScriptObject adaptee) {
+ super(proto, $nasgenmap$);
this.adaptee = wrapAdaptee(adaptee);
- this.setProto(proto);
if (overrides instanceof ScriptObject) {
this.overrides = true;
final ScriptObject sobj = (ScriptObject)overrides;
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeJSON.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJSON.java Thu Jun 27 13:47:20 2013 +0530
@@ -42,6 +42,7 @@
import jdk.nashorn.internal.runtime.ConsString;
import jdk.nashorn.internal.runtime.JSONFunctions;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator;
@@ -58,9 +59,11 @@
private static final MethodHandle REPLACER_INVOKER = Bootstrap.createDynamicInvoker("dyn:call", Object.class,
ScriptFunction.class, ScriptObject.class, Object.class, Object.class);
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
NativeJSON() {
- this.setProto(Global.objectPrototype());
+ super(Global.objectPrototype(), $nasgenmap$);
}
/**
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeJava.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJava.java Thu Jun 27 13:47:20 2013 +0530
@@ -40,6 +40,7 @@
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.ListAdapter;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.linker.JavaAdapterFactory;
@@ -52,6 +53,9 @@
@ScriptClass("Java")
public final class NativeJava {
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private NativeJava() {
}
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Thu Jun 27 13:47:20 2013 +0530
@@ -34,6 +34,7 @@
import jdk.nashorn.internal.objects.annotations.Function;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.runtime.NativeJavaPackage;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -55,9 +56,12 @@
public final class NativeJavaImporter extends ScriptObject {
private final Object[] args;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeJavaImporter(final Object[] args) {
+ super(Global.instance().getJavaImporterPrototype(), $nasgenmap$);
this.args = args;
- this.setProto(Global.instance().getJavaImporterPrototype());
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeMath.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeMath.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import jdk.nashorn.internal.objects.annotations.SpecializedFunction;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -41,8 +42,11 @@
@ScriptClass("Math")
public final class NativeMath extends ScriptObject {
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeMath() {
- this.setProto(Global.objectPrototype());
+ super(Global.objectPrototype(), $nasgenmap$);
}
/** ECMA 15.8.1.1 - E, always a double constant. Not writable or configurable */
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java Thu Jun 27 13:47:20 2013 +0530
@@ -45,6 +45,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
@@ -83,15 +84,18 @@
private final boolean isInt;
private final boolean isLong;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeNumber(final double value) {
this(value, Global.instance().getNumberPrototype());
}
private NativeNumber(final double value, final ScriptObject proto) {
+ super(proto, $nasgenmap$);
this.value = value;
this.isInt = isRepresentableAsInt(value);
this.isLong = isRepresentableAsLong(value);
- this.setProto(proto);
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Thu Jun 27 13:47:20 2013 +0530
@@ -36,6 +36,7 @@
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.ECMAException;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -53,6 +54,9 @@
public final class NativeObject {
private static final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private NativeObject() {
}
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeRangeError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeRangeError.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -54,8 +55,11 @@
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeRangeError(final Object msg) {
- setProto(Global.instance().getRangeErrorPrototype());
+ super(Global.instance().getRangeErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeReferenceError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeReferenceError.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -54,8 +55,11 @@
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeReferenceError(final Object msg) {
- this.setProto(Global.instance().getReferenceErrorPrototype());
+ super(Global.instance().getReferenceErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Thu Jun 27 13:47:20 2013 +0530
@@ -43,6 +43,7 @@
import jdk.nashorn.internal.runtime.BitVector;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.ParserException;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.regexp.RegExp;
import jdk.nashorn.internal.runtime.regexp.RegExpFactory;
import jdk.nashorn.internal.runtime.regexp.RegExpResult;
@@ -66,6 +67,9 @@
// Reference to global object needed to support static RegExp properties
private Global globalObject;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeRegExp(final String input, final String flagString) {
try {
this.regexp = RegExpFactory.create(input, flagString);
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeRegExpExecResult.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeRegExpExecResult.java Thu Jun 27 13:47:20 2013 +0530
@@ -31,6 +31,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Setter;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.regexp.RegExpResult;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -49,8 +50,11 @@
@Property
public Object input;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeRegExpExecResult(final RegExpResult result) {
- setProto(Global.instance().getArrayPrototype());
+ super(Global.instance().getArrayPrototype(), $nasgenmap$);
setIsArray();
this.setArray(ArrayData.allocate(result.getGroups().clone()));
this.index = result.getIndex();
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeStrictArguments.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeStrictArguments.java Thu Jun 27 13:47:20 2013 +0530
@@ -51,22 +51,24 @@
private static final MethodHandle S$LENGTH = findOwnMH("S$length", void.class, Object.class, Object.class);
// property map for strict mode arguments object
- private static final PropertyMap nasgenmap$;
+ private static final PropertyMap map$;
static {
PropertyMap map = PropertyMap.newMap(NativeStrictArguments.class);
map = Lookup.newProperty(map, "length", Property.NOT_ENUMERABLE, G$LENGTH, S$LENGTH);
// In strict mode, the caller and callee properties should throw TypeError
- map = ScriptFunctionImpl.newThrowerProperty(map, "caller");
- map = ScriptFunctionImpl.newThrowerProperty(map, "callee");
- nasgenmap$ = map;
+ // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors.
+ final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
+ map = map.addProperty(map.newUserAccessors("caller", flags));
+ map = map.addProperty(map.newUserAccessors("callee", flags));
+ map$ = map;
}
private Object length;
private final Object[] namedArgs;
- NativeStrictArguments(final Object[] values, final int numParams) {
- super(nasgenmap$);
+ NativeStrictArguments(final ScriptObject proto, final Object[] values, final int numParams) {
+ super(proto, map$);
setIsArguments();
final ScriptFunction func = ScriptFunctionImpl.getTypeErrorThrower();
@@ -84,8 +86,6 @@
Arrays.fill(namedArgs, UNDEFINED);
}
System.arraycopy(values, 0, namedArgs, 0, Math.min(namedArgs.length, values.length));
-
- this.setProto(Global.objectPrototype());
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeString.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeString.java Thu Jun 27 13:47:20 2013 +0530
@@ -52,6 +52,7 @@
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.ConsString;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -70,14 +71,17 @@
static final MethodHandle WRAPFILTER = findWrapFilter();
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeString(final CharSequence value) {
this(value, Global.instance().getStringPrototype());
}
private NativeString(final CharSequence value, final ScriptObject proto) {
+ super(proto, $nasgenmap$);
assert value instanceof String || value instanceof ConsString;
this.value = value;
- this.setProto(proto);
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeSyntaxError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeSyntaxError.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -54,8 +55,11 @@
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeSyntaxError(final Object msg) {
- this.setProto(Global.instance().getSyntaxErrorPrototype());
+ super(Global.instance().getSyntaxErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeTypeError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeTypeError.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -54,8 +55,11 @@
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeTypeError(final Object msg) {
- this.setProto(Global.instance().getTypeErrorPrototype());
+ super(Global.instance().getTypeErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java Thu Jun 27 13:47:20 2013 +0530
@@ -33,6 +33,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
/**
@@ -53,8 +54,11 @@
@Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE)
public Object message;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
NativeURIError(final Object msg) {
- this.setProto(Global.instance().getURIErrorPrototype());
+ super(Global.instance().getURIErrorPrototype(), $nasgenmap$);
if (msg != UNDEFINED) {
this.instMessage = JSType.toString(msg);
} else {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeUint16Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeUint16Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -31,6 +31,7 @@
import jdk.nashorn.internal.objects.annotations.Property;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -45,6 +46,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 2;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeUint32Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeUint32Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -46,6 +47,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 4;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteBegin, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeUint8Array.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeUint8Array.java Thu Jun 27 13:47:20 2013 +0530
@@ -31,6 +31,7 @@
import jdk.nashorn.internal.objects.annotations.Property;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -45,6 +46,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 1;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,6 +32,7 @@
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import jdk.nashorn.internal.objects.annotations.Where;
import jdk.nashorn.internal.runtime.JSType;
+import jdk.nashorn.internal.runtime.PropertyMap;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.arrays.ArrayData;
@@ -46,6 +47,9 @@
@Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE, where = Where.CONSTRUCTOR)
public static final int BYTES_PER_ELEMENT = 1;
+ // initialized by nasgen
+ private static PropertyMap $nasgenmap$;
+
private static final Factory FACTORY = new Factory(BYTES_PER_ELEMENT) {
@Override
public ArrayBufferView construct(final NativeArrayBuffer buffer, final int byteOffset, final int length) {
--- a/nashorn/src/jdk/nashorn/internal/objects/PrototypeObject.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/PrototypeObject.java Thu Jun 27 13:47:20 2013 +0530
@@ -44,7 +44,7 @@
*
*/
public class PrototypeObject extends ScriptObject {
- private static final PropertyMap nasgenmap$;
+ private static final PropertyMap map$;
private Object constructor;
@@ -54,11 +54,11 @@
static {
PropertyMap map = PropertyMap.newMap(PrototypeObject.class);
map = Lookup.newProperty(map, "constructor", Property.NOT_ENUMERABLE, GET_CONSTRUCTOR, SET_CONSTRUCTOR);
- nasgenmap$ = map;
+ map$ = map;
}
PrototypeObject() {
- this(nasgenmap$);
+ this(map$);
}
/**
@@ -67,12 +67,12 @@
* @param map property map
*/
public PrototypeObject(final PropertyMap map) {
- super(map != nasgenmap$ ? map.addAll(nasgenmap$) : nasgenmap$);
+ super(map != map$ ? map.addAll(map$) : map$);
setProto(Global.objectPrototype());
}
PrototypeObject(final ScriptFunction func) {
- this();
+ this(map$);
this.constructor = func;
}
--- a/nashorn/src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Thu Jun 27 13:47:20 2013 +0530
@@ -51,7 +51,7 @@
// property map for bound functions
private static final PropertyMap boundfunctionmap$;
// property map for non-strict, non-bound functions.
- private static final PropertyMap nasgenmap$;
+ private static final PropertyMap map$;
// Marker object for lazily initialized prototype object
private static final Object LAZY_PROTOTYPE = new Object();
@@ -65,7 +65,7 @@
* @param specs specialized versions of this method, if available, null otherwise
*/
ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final MethodHandle[] specs) {
- super(name, invokeHandle, nasgenmap$, null, specs, false, true, true);
+ super(name, invokeHandle, map$, null, specs, false, true, true);
init();
}
@@ -79,7 +79,7 @@
* @param specs specialized versions of this method, if available, null otherwise
*/
ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final PropertyMap map, final MethodHandle[] specs) {
- super(name, invokeHandle, map.addAll(nasgenmap$), null, specs, false, true, true);
+ super(name, invokeHandle, map.addAll(map$), null, specs, false, true, true);
init();
}
@@ -124,8 +124,8 @@
map = Lookup.newProperty(map, "prototype", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE, G$PROTOTYPE, S$PROTOTYPE);
map = Lookup.newProperty(map, "length", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$LENGTH, null);
map = Lookup.newProperty(map, "name", Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE | Property.NOT_WRITABLE, G$NAME, null);
- nasgenmap$ = map;
- strictmodemap$ = createStrictModeMap(nasgenmap$);
+ map$ = map;
+ strictmodemap$ = createStrictModeMap(map$);
boundfunctionmap$ = createBoundFunctionMap(strictmodemap$);
}
@@ -149,19 +149,17 @@
return typeErrorThrower;
}
- // add a new property that throws TypeError on get as well as set
- static synchronized PropertyMap newThrowerProperty(final PropertyMap map, final String name) {
- return map.newProperty(name, Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE, -1,
- Lookup.TYPE_ERROR_THROWER_GETTER, Lookup.TYPE_ERROR_THROWER_SETTER);
- }
-
- private static PropertyMap createStrictModeMap(final PropertyMap functionMap) {
- return newThrowerProperty(newThrowerProperty(functionMap, "arguments"), "caller");
+ private static PropertyMap createStrictModeMap(PropertyMap map) {
+ final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
+ // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors.
+ map = map.addProperty(map.newUserAccessors("arguments", flags));
+ map = map.addProperty(map.newUserAccessors("caller", flags));
+ return map;
}
// Choose the map based on strict mode!
private static PropertyMap getMap(final boolean strict) {
- return strict ? strictmodemap$ : nasgenmap$;
+ return strict ? strictmodemap$ : map$;
}
private static PropertyMap createBoundFunctionMap(final PropertyMap strictModeMap) {
@@ -260,12 +258,15 @@
this.setProto(Global.instance().getFunctionPrototype());
this.prototype = LAZY_PROTOTYPE;
- if (isStrict()) {
- final ScriptFunction func = getTypeErrorThrower();
- // We have to fill user accessor functions late as these are stored
- // in this object rather than in the PropertyMap of this object.
- setUserAccessors("arguments", func, func);
- setUserAccessors("caller", func, func);
+ // We have to fill user accessor functions late as these are stored
+ // in this object rather than in the PropertyMap of this object.
+
+ if (findProperty("arguments", true) != null) {
+ setUserAccessors("arguments", getTypeErrorThrower(), getTypeErrorThrower());
+ }
+
+ if (findProperty("caller", true) != null) {
+ setUserAccessors("caller", getTypeErrorThrower(), getTypeErrorThrower());
}
}
}
--- a/nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java Thu Jun 27 13:47:20 2013 +0530
@@ -288,7 +288,7 @@
}
@Override
- protected void setObjectValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) {
+ public void setObjectValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) {
if (isSpill()) {
self.spill[getSlot()] = value;
} else {
@@ -303,7 +303,7 @@
}
@Override
- protected Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
+ public Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
if (isSpill()) {
return self.spill[getSlot()];
}
--- a/nashorn/src/jdk/nashorn/internal/runtime/Context.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Context.java Thu Jun 27 13:47:20 2013 +0530
@@ -101,13 +101,7 @@
/** Is Context global debug mode enabled ? */
public static final boolean DEBUG = Options.getBooleanProperty("nashorn.debug");
- private static final ThreadLocal<ScriptObject> currentGlobal =
- new ThreadLocal<ScriptObject>() {
- @Override
- protected ScriptObject initialValue() {
- return null;
- }
- };
+ private static final ThreadLocal<ScriptObject> currentGlobal = new ThreadLocal<>();
/**
* Get the current global scope
--- a/nashorn/src/jdk/nashorn/internal/runtime/ECMAException.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ECMAException.java Thu Jun 27 13:47:20 2013 +0530
@@ -51,7 +51,7 @@
/** Field handle to the{@link ECMAException#thrown} field, so that it can be accessed from generated code */
public static final FieldAccess THROWN = virtualField(ECMAException.class, "thrown", Object.class);
- private static final String EXCEPTION_PROPERTY = "nashornException";
+ public static final String EXCEPTION_PROPERTY = "nashornException";
/** Object thrown. */
public final Object thrown;
--- a/nashorn/src/jdk/nashorn/internal/runtime/FindProperty.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/FindProperty.java Thu Jun 27 13:47:20 2013 +0530
@@ -89,7 +89,7 @@
MethodHandle setter = property.getSetter(type, getOwner().getMap());
if (property instanceof UserAccessorProperty) {
final UserAccessorProperty uc = (UserAccessorProperty) property;
- setter = MH.insertArguments(setter, 0, (isInherited() ? getOwner() : null),
+ setter = MH.insertArguments(setter, 0, isInherited() ? getOwner() : null,
uc.getSetterSlot(), strict? property.getKey() : null);
}
@@ -109,7 +109,7 @@
* @return appropriate receiver
*/
public ScriptObject getGetterReceiver() {
- return property != null && property.hasGetterFunction() ? self : prototype;
+ return property != null && property.hasGetterFunction(prototype) ? self : prototype;
}
/**
@@ -117,7 +117,7 @@
* @return appropriate receiver
*/
public ScriptObject getSetterReceiver() {
- return property != null && property.hasSetterFunction() ? self : prototype;
+ return property != null && property.hasSetterFunction(prototype) ? self : prototype;
}
/**
--- a/nashorn/src/jdk/nashorn/internal/runtime/FunctionScope.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/FunctionScope.java Thu Jun 27 13:47:20 2013 +0530
@@ -54,9 +54,8 @@
* @param arguments arguments
*/
public FunctionScope(final PropertyMap map, final ScriptObject callerScope, final Object arguments) {
- super(map);
+ super(callerScope, map);
this.arguments = arguments;
- setProto(callerScope);
setIsScope();
}
@@ -67,9 +66,8 @@
* @param callerScope caller scope
*/
public FunctionScope(final PropertyMap map, final ScriptObject callerScope) {
- super(map);
+ super(callerScope, map);
this.arguments = null;
- setProto(callerScope);
setIsScope();
}
--- a/nashorn/src/jdk/nashorn/internal/runtime/Property.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Property.java Thu Jun 27 13:47:20 2013 +0530
@@ -180,17 +180,19 @@
/**
* Check whether this property has a user defined getter function. See {@link UserAccessorProperty}
+ * @param obj object containing getter
* @return true if getter function exists, false is default
*/
- public boolean hasGetterFunction() {
+ public boolean hasGetterFunction(final ScriptObject obj) {
return false;
}
/**
* Check whether this property has a user defined setter function. See {@link UserAccessorProperty}
+ * @param obj object containing setter
* @return true if getter function exists, false is default
*/
- public boolean hasSetterFunction() {
+ public boolean hasSetterFunction(final ScriptObject obj) {
return false;
}
@@ -363,7 +365,7 @@
* @param value the new property value
* @param strict is this a strict setter?
*/
- protected abstract void setObjectValue(ScriptObject self, ScriptObject owner, Object value, boolean strict);
+ public abstract void setObjectValue(ScriptObject self, ScriptObject owner, Object value, boolean strict);
/**
* Set the Object value of this property from {@code owner}. This allows to bypass creation of the
@@ -373,7 +375,7 @@
* @param owner the owner object
* @return the property value
*/
- protected abstract Object getObjectValue(ScriptObject self, ScriptObject owner);
+ public abstract Object getObjectValue(ScriptObject self, ScriptObject owner);
/**
* Abstract method for retrieving the setter for the property. We do not know
--- a/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java Thu Jun 27 13:47:20 2013 +0530
@@ -25,6 +25,8 @@
package jdk.nashorn.internal.runtime;
+import jdk.nashorn.internal.scripts.JO;
+
import static jdk.nashorn.internal.runtime.PropertyHashMap.EMPTY_HASHMAP;
import java.lang.invoke.MethodHandle;
@@ -166,7 +168,7 @@
*/
public static PropertyMap newMap(final Class<?> structure, final Collection<Property> properties, final int fieldCount, final int fieldMaximum) {
// Reduce the number of empty maps in the context.
- if (structure == jdk.nashorn.internal.scripts.JO.class) {
+ if (structure == JO.class) {
return EMPTY_MAP;
}
@@ -302,7 +304,7 @@
*
* @return New {@link PropertyMap} with {@link Property} added.
*/
- PropertyMap addProperty(final Property property) {
+ public PropertyMap addProperty(final Property property) {
PropertyMap newMap = checkHistory(property);
if (newMap == null) {
@@ -383,6 +385,21 @@
return newMap;
}
+ /*
+ * Make a new UserAccessorProperty property. getter and setter functions are stored in
+ * this ScriptObject and slot values are used in property object. Note that slots
+ * are assigned speculatively and should be added to map before adding other
+ * properties.
+ */
+ public UserAccessorProperty newUserAccessors(final String key, final int propertyFlags) {
+ int oldSpillLength = spillLength;
+
+ final int getterSlot = oldSpillLength++;
+ final int setterSlot = oldSpillLength++;
+
+ return new UserAccessorProperty(key, propertyFlags, getterSlot, setterSlot);
+ }
+
/**
* Find a property in the map.
*
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java Thu Jun 27 13:47:20 2013 +0530
@@ -203,6 +203,16 @@
}
/**
+ * Execute this script function as a constructor.
+ * @param arguments Call arguments.
+ * @return Newly constructed result.
+ * @throws Throwable if there is an exception/error with the invocation or thrown from it
+ */
+ Object construct(final Object... arguments) throws Throwable {
+ return data.construct(this, arguments);
+ }
+
+ /**
* Allocate function. Called from generated {@link ScriptObject} code
* for allocation as a factory method
*
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java Thu Jun 27 13:47:20 2013 +0530
@@ -216,6 +216,12 @@
return composeGenericMethod(code.mostGeneric().getInvoker());
}
+ final MethodHandle getGenericConstructor() {
+ ensureCodeGenerated();
+ ensureConstructor(code.mostGeneric());
+ return composeGenericMethod(code.mostGeneric().getConstructor());
+ }
+
private CompiledFunction getBest(final MethodType callSiteType) {
ensureCodeGenerated();
return code.best(callSiteType);
@@ -535,10 +541,74 @@
}
}
+ Object construct(final ScriptFunction fn, final Object... arguments) throws Throwable {
+ final MethodHandle mh = getGenericConstructor();
+
+ final Object[] args = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments;
+
+ if (isVarArg(mh)) {
+ if (needsCallee(mh)) {
+ return mh.invokeExact(fn, args);
+ }
+ return mh.invokeExact(args);
+ }
+
+ final int paramCount = mh.type().parameterCount();
+ if (needsCallee(mh)) {
+ switch (paramCount) {
+ case 1:
+ return mh.invokeExact(fn);
+ case 2:
+ return mh.invokeExact(fn, getArg(args, 0));
+ case 3:
+ return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1));
+ case 4:
+ return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1), getArg(args, 2));
+ default:
+ return mh.invokeWithArguments(withArguments(fn, paramCount, args));
+ }
+ }
+
+ switch (paramCount) {
+ case 0:
+ return mh.invokeExact();
+ case 1:
+ return mh.invokeExact(getArg(args, 0));
+ case 2:
+ return mh.invokeExact(getArg(args, 0), getArg(args, 1));
+ case 3:
+ return mh.invokeExact(getArg(args, 0), getArg(args, 1), getArg(args, 2));
+ default:
+ return mh.invokeWithArguments(withArguments(null, paramCount, args));
+ }
+ }
+
private static Object getArg(final Object[] args, final int i) {
return i < args.length ? args[i] : UNDEFINED;
}
+ private static Object[] withArguments(final ScriptFunction fn, final int argCount, final Object[] args) {
+ final Object[] finalArgs = new Object[argCount];
+
+ int nextArg = 0;
+ if (fn != null) {
+ //needs callee
+ finalArgs[nextArg++] = fn;
+ }
+
+ // Don't add more args that there is argCount in the handle (including self and callee).
+ for (int i = 0; i < args.length && nextArg < argCount;) {
+ finalArgs[nextArg++] = args[i++];
+ }
+
+ // If we have fewer args than argCount, pad with undefined.
+ while (nextArg < argCount) {
+ finalArgs[nextArg++] = UNDEFINED;
+ }
+
+ return finalArgs;
+ }
+
private static Object[] withArguments(final ScriptFunction fn, final Object self, final int argCount, final Object[] args) {
final Object[] finalArgs = new Object[argCount];
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Thu Jun 27 13:47:20 2013 +0530
@@ -170,13 +170,30 @@
}
this.arrayData = ArrayData.EMPTY_ARRAY;
-
- if (map == null) {
- this.setMap(PropertyMap.newMap(getClass()));
- return;
+ this.setMap(map == null ? PropertyMap.newMap(getClass()) : map);
+ }
+
+ /**
+ * Constructor that directly sets the prototype to {@code proto} and property map to
+ * {@code map} without invalidating the map as calling {@link #setProto(ScriptObject)}
+ * would do. This should only be used for objects that are always constructed with the
+ * same combination of prototype and property map.
+ *
+ * @param proto the prototype object
+ * @param map intial {@link PropertyMap}
+ */
+ protected ScriptObject(final ScriptObject proto, final PropertyMap map) {
+ if (Context.DEBUG) {
+ ScriptObject.count++;
}
- this.setMap(map);
+ this.arrayData = ArrayData.EMPTY_ARRAY;
+ this.setMap(map == null ? PropertyMap.newMap(getClass()) : map);
+ this.proto = proto;
+
+ if (proto != null) {
+ proto.setIsPrototype();
+ }
}
/**
@@ -777,30 +794,18 @@
public final Property modifyOwnProperty(final Property oldProperty, final int propertyFlags, final ScriptFunction getter, final ScriptFunction setter) {
Property newProperty;
if (oldProperty instanceof UserAccessorProperty) {
- // re-use the slots of the old user accessor property.
final UserAccessorProperty uc = (UserAccessorProperty) oldProperty;
-
- int getterSlot = uc.getGetterSlot();
- // clear the old getter and set the new getter
+ final int getterSlot = uc.getGetterSlot();
+ final int setterSlot = uc.getSetterSlot();
setSpill(getterSlot, getter);
- // if getter function is null, flag the slot to be negative (less by 1)
- if (getter == null) {
- getterSlot = -getterSlot - 1;
- }
-
- int setterSlot = uc.getSetterSlot();
- // clear the old setter and set the new setter
setSpill(setterSlot, setter);
- // if setter function is null, flag the slot to be negative (less by 1)
- if (setter == null) {
- setterSlot = -setterSlot - 1;
+
+ // if just flipping getter and setter with new functions, no need to change property or map
+ if (uc.flags == propertyFlags) {
+ return oldProperty;
}
newProperty = new UserAccessorProperty(oldProperty.getKey(), propertyFlags, getterSlot, setterSlot);
- // if just flipping getter and setter with new functions, no need to change property or map
- if (oldProperty.equals(newProperty)) {
- return oldProperty;
- }
} else {
// erase old property value and create new user accessor property
erasePropertyValue(oldProperty);
@@ -862,12 +867,10 @@
*/
public final void setUserAccessors(final String key, final ScriptFunction getter, final ScriptFunction setter) {
final Property oldProperty = getMap().findProperty(key);
- if (oldProperty != null) {
- final UserAccessorProperty newProperty = newUserAccessors(oldProperty.getKey(), oldProperty.getFlags(), getter, setter);
- modifyOwnProperty(oldProperty, newProperty);
+ if (oldProperty instanceof UserAccessorProperty) {
+ modifyOwnProperty(oldProperty, oldProperty.getFlags(), getter, setter);
} else {
- final UserAccessorProperty newProperty = newUserAccessors(key, 0, getter, setter);
- addOwnProperty(newProperty);
+ addOwnProperty(newUserAccessors(key, oldProperty != null ? oldProperty.getFlags() : 0, getter, setter));
}
}
@@ -1712,7 +1715,7 @@
final ScriptObject prototype = find.getOwner();
- if (!property.hasGetterFunction()) {
+ if (!property.hasGetterFunction(prototype)) {
methodHandle = bindTo(methodHandle, prototype);
}
return new GuardedInvocation(methodHandle, getMap().getProtoGetSwitchPoint(proto, name), guard);
@@ -3144,49 +3147,30 @@
* Make a new UserAccessorProperty property. getter and setter functions are stored in
* this ScriptObject and slot values are used in property object.
*/
- private UserAccessorProperty newUserAccessors(final String key, final int propertyFlags, final ScriptFunction getter, final ScriptFunction setter) {
- int oldSpillLength = getMap().getSpillLength();
-
- int getterSlot = oldSpillLength++;
- setSpill(getterSlot, getter);
- // if getter function is null, flag the slot to be negative (less by 1)
- if (getter == null) {
- getterSlot = -getterSlot - 1;
- }
-
- int setterSlot = oldSpillLength++;
-
- setSpill(setterSlot, setter);
- // if setter function is null, flag the slot to be negative (less by 1)
- if (setter == null) {
- setterSlot = -setterSlot - 1;
- }
-
- return new UserAccessorProperty(key, propertyFlags, getterSlot, setterSlot);
+ protected final UserAccessorProperty newUserAccessors(final String key, final int propertyFlags, final ScriptFunction getter, final ScriptFunction setter) {
+ final UserAccessorProperty property = getMap().newUserAccessors(key, propertyFlags);
+ setSpill(property.getGetterSlot(), getter);
+ setSpill(property.getSetterSlot(), setter);
+
+ return property;
}
- private void setSpill(final int slot, final Object value) {
- if (slot >= 0) {
- final int index = slot;
- if (spill == null) {
- // create new spill.
- spill = new Object[Math.max(index + 1, SPILL_RATE)];
- } else if (index >= spill.length) {
- // grow spill as needed
- final Object[] newSpill = new Object[index + 1];
- System.arraycopy(spill, 0, newSpill, 0, spill.length);
- spill = newSpill;
- }
-
- spill[index] = value;
+ protected final void setSpill(final int slot, final Object value) {
+ if (spill == null) {
+ // create new spill.
+ spill = new Object[Math.max(slot + 1, SPILL_RATE)];
+ } else if (slot >= spill.length) {
+ // grow spill as needed
+ final Object[] newSpill = new Object[slot + 1];
+ System.arraycopy(spill, 0, newSpill, 0, spill.length);
+ spill = newSpill;
}
+
+ spill[slot] = value;
}
- // user accessors are either stored in spill array slots
- // get the accessor value using slot number. Note that slot is spill array index.
- Object getSpill(final int slot) {
- final int index = slot;
- return (index < 0 || (index >= spill.length)) ? null : spill[index];
+ protected Object getSpill(final int slot) {
+ return spill != null && slot < spill.length ? spill[slot] : null;
}
private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Thu Jun 27 13:47:20 2013 +0530
@@ -361,6 +361,47 @@
}
/**
+ * Check that the target function is associated with current Context.
+ * And also make sure that 'self', if ScriptObject, is from current context.
+ *
+ * Call a function as a constructor given args.
+ *
+ * @param target ScriptFunction object.
+ * @param args Call arguments.
+ * @return Constructor call result.
+ */
+ public static Object checkAndConstruct(final ScriptFunction target, final Object... args) {
+ final ScriptObject global = Context.getGlobalTrusted();
+ if (! (global instanceof GlobalObject)) {
+ throw new IllegalStateException("No current global set");
+ }
+
+ if (target.getContext() != global.getContext()) {
+ throw new IllegalArgumentException("'target' function is not from current Context");
+ }
+
+ // all in order - call real 'construct'
+ return construct(target, args);
+ }
+
+ /*
+ * Call a script function as a constructor with given args.
+ *
+ * @param target ScriptFunction object.
+ * @param args Call arguments.
+ * @return Constructor call result.
+ */
+ public static Object construct(final ScriptFunction target, final Object... args) {
+ try {
+ return target.construct(args);
+ } catch (final RuntimeException | Error e) {
+ throw e;
+ } catch (final Throwable t) {
+ throw new RuntimeException(t);
+ }
+ }
+
+ /**
* Generic implementation of ECMA 9.12 - SameValue algorithm
*
* @param x first value to compare
--- a/nashorn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java Thu Jun 27 13:47:20 2013 +0530
@@ -151,9 +151,10 @@
assert methodHandle != null;
assert property != null;
+ final ScriptObject prototype = find.getOwner();
final MethodHandle boundHandle;
- if (!property.hasSetterFunction() && find.isInherited()) {
- boundHandle = ScriptObject.bindTo(methodHandle, find.getOwner());
+ if (!property.hasSetterFunction(prototype) && find.isInherited()) {
+ boundHandle = ScriptObject.bindTo(methodHandle, prototype);
} else {
boundHandle = methodHandle;
}
--- a/nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java Thu Jun 27 13:47:20 2013 +0530
@@ -96,19 +96,19 @@
}
/**
- * Return getter slot for this UserAccessorProperty. Slots start with first embed field.
+ * Return getter spill slot for this UserAccessorProperty.
* @return getter slot
*/
public int getGetterSlot() {
- return getterSlot < 0 ? -getterSlot - 1 : getterSlot;
+ return getterSlot;
}
/**
- * Return setter slot for this UserAccessorProperty. Slots start with first embed field.
+ * Return setter spill slot for this UserAccessorProperty.
* @return setter slot
*/
public int getSetterSlot() {
- return setterSlot < 0 ? -setterSlot - 1 : setterSlot;
+ return setterSlot;
}
@Override
@@ -124,7 +124,7 @@
final UserAccessorProperty uc = (UserAccessorProperty) other;
return getterSlot == uc.getterSlot && setterSlot == uc.setterSlot;
- }
+ }
@Override
public int hashCode() {
@@ -136,34 +136,26 @@
*/
@Override
public int getSpillCount() {
- // calculate how many spill array slots used by this propery.
- int count = 0;
- if (getGetterSlot() >= 0) {
- count++;
- }
- if (getSetterSlot() >= 0) {
- count++;
- }
- return count;
+ return 2;
}
@Override
- public boolean hasGetterFunction() {
- return getterSlot > -1;
+ public boolean hasGetterFunction(final ScriptObject obj) {
+ return obj.getSpill(getterSlot) != null;
}
@Override
- public boolean hasSetterFunction() {
- return setterSlot > -1;
+ public boolean hasSetterFunction(final ScriptObject obj) {
+ return obj.getSpill(setterSlot) != null;
}
@Override
- protected Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
+ public Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
return userAccessorGetter(owner, getGetterSlot(), self);
}
@Override
- protected void setObjectValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) {
+ public void setObjectValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) {
userAccessorSetter(owner, getSetterSlot(), strict ? getKey() : null, self, value);
}
--- a/nashorn/src/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Thu Jun 27 13:47:20 2013 +0530
@@ -45,44 +45,14 @@
* as ScriptObjects from other Nashorn contexts.
*/
final class JSObjectLinker implements TypeBasedGuardingDynamicLinker {
- /**
- * Instances of this class are used to represent a method member of a JSObject
- */
- private static final class JSObjectMethod {
- // The name of the JSObject method property
- private final String name;
-
- JSObjectMethod(final String name) {
- this.name = name;
- }
-
- String getName() {
- return name;
- }
-
- static GuardedInvocation lookup(final CallSiteDescriptor desc) {
- final String operator = CallSiteDescriptorFactory.tokenizeOperators(desc).get(0);
- switch (operator) {
- case "call": {
- // collect everything except the first two - JSObjectMethod instance and the actual 'self'
- final int paramCount = desc.getMethodType().parameterCount();
- final MethodHandle caller = MH.asCollector(JSOBJECTMETHOD_CALL, Object[].class, paramCount - 2);
- return new GuardedInvocation(caller, null, IS_JSOBJECTMETHOD_GUARD);
- }
- default:
- return null;
- }
- }
- }
-
@Override
public boolean canLinkType(final Class<?> type) {
return canLinkTypeStatic(type);
}
static boolean canLinkTypeStatic(final Class<?> type) {
- // can link JSObject and JSObjectMethod
- return JSObject.class.isAssignableFrom(type) || JSObjectMethod.class.isAssignableFrom(type);
+ // can link JSObject
+ return JSObject.class.isAssignableFrom(type);
}
@Override
@@ -99,8 +69,6 @@
final GuardedInvocation inv;
if (self instanceof JSObject) {
inv = lookup(desc);
- } else if (self instanceof JSObjectMethod) {
- inv = JSObjectMethod.lookup(desc);
} else {
throw new AssertionError(); // Should never reach here.
}
@@ -115,7 +83,7 @@
case "getProp":
case "getElem":
case "getMethod":
- return c > 2 ? findGetMethod(desc, operator) : findGetIndexMethod();
+ return c > 2 ? findGetMethod(desc) : findGetIndexMethod();
case "setProp":
case "setElem":
return c > 2 ? findSetMethod(desc) : findSetIndexMethod();
@@ -123,15 +91,14 @@
case "callMethod":
return findCallMethod(desc, operator);
case "new":
+ return findNewMethod(desc);
default:
return null;
}
}
- private static GuardedInvocation findGetMethod(final CallSiteDescriptor desc, final String operator) {
- // if "getMethod" then return JSObjectMethod object - which just holds the name of the method
- // subsequently, link on dyn:call for JSObjectMethod will actually call that method
- final MethodHandle getter = MH.insertArguments("getMethod".equals(operator)? JSOBJECT_GETMETHOD : JSOBJECT_GET, 1, desc.getNameToken(2));
+ private static GuardedInvocation findGetMethod(final CallSiteDescriptor desc) {
+ final MethodHandle getter = MH.insertArguments(JSOBJECT_GET, 1, desc.getNameToken(2));
return new GuardedInvocation(getter, null, IS_JSOBJECT_GUARD);
}
@@ -156,9 +123,9 @@
return new GuardedInvocation(func, null, IS_JSOBJECT_GUARD);
}
- @SuppressWarnings("unused")
- private static boolean isJSObjectMethod(final Object self) {
- return self instanceof JSObjectMethod;
+ private static GuardedInvocation findNewMethod(final CallSiteDescriptor desc) {
+ MethodHandle func = MH.asCollector(JSOBJECT_NEW, Object[].class, desc.getMethodType().parameterCount() - 1);
+ return new GuardedInvocation(func, null, IS_JSOBJECT_GUARD);
}
@SuppressWarnings("unused")
@@ -166,12 +133,6 @@
return self instanceof JSObject;
}
-
- @SuppressWarnings("unused")
- private static Object getMethod(final Object jsobj, final Object key) {
- return new JSObjectMethod(Objects.toString(key));
- }
-
@SuppressWarnings("unused")
private static Object get(final Object jsobj, final Object key) {
if (key instanceof String) {
@@ -200,11 +161,8 @@
}
@SuppressWarnings("unused")
- private static Object jsObjectMethodCall(final Object jsObjMethod, final Object jsobj, final Object... args) {
- // we have JSObjectMethod, JSObject and args. Get method name from JSObjectMethod instance
- final String methodName = ((JSObjectMethod)jsObjMethod).getName();
- // call the method on JSObject
- return ((JSObject)jsobj).call(methodName, args);
+ private static Object newObject(final Object jsobj, final Object... args) {
+ return ((JSObject)jsobj).newObject(null, args);
}
private static int getIndex(final Number n) {
@@ -214,13 +172,11 @@
private static final MethodHandleFunctionality MH = MethodHandleFactory.getFunctionality();
- private static final MethodHandle IS_JSOBJECTMETHOD_GUARD = findOwnMH("isJSObjectMethod", boolean.class, Object.class);
private static final MethodHandle IS_JSOBJECT_GUARD = findOwnMH("isJSObject", boolean.class, Object.class);
- private static final MethodHandle JSOBJECT_GETMETHOD = findOwnMH("getMethod", Object.class, Object.class, Object.class);
private static final MethodHandle JSOBJECT_GET = findOwnMH("get", Object.class, Object.class, Object.class);
private static final MethodHandle JSOBJECT_PUT = findOwnMH("put", Void.TYPE, Object.class, Object.class, Object.class);
private static final MethodHandle JSOBJECT_CALL = findOwnMH("call", Object.class, Object.class, Object.class, Object[].class);
- private static final MethodHandle JSOBJECTMETHOD_CALL = findOwnMH("jsObjectMethodCall", Object.class, Object.class, Object.class, Object[].class);
+ private static final MethodHandle JSOBJECT_NEW = findOwnMH("newObject", Object.class, Object.class, Object[].class);
private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
final Class<?> own = JSObjectLinker.class;
--- a/nashorn/src/jdk/nashorn/internal/scripts/JO.java Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/src/jdk/nashorn/internal/scripts/JO.java Thu Jun 27 13:47:20 2013 +0530
@@ -32,11 +32,14 @@
* Empty object class.
*/
public class JO extends ScriptObject {
+
+ private static final PropertyMap map$ = PropertyMap.newMap(JO.class);
+
/**
* Constructor
*/
public JO() {
- super(PropertyMap.newMap(JO.class));
+ super(map$);
}
/**
@@ -49,6 +52,15 @@
}
/**
+ * Constructor given an initial prototype using the default property map
+ *
+ * @param proto the prototype object
+ */
+ public JO(final ScriptObject proto) {
+ super(proto, map$);
+ }
+
+ /**
* Used by FunctionObjectCreator. A method handle of this method is passed to the ScriptFunction constructor.
*
* @param map the property map to use for allocatorMap
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8010732.js Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8010732: BigDecimal, BigInteger and Long handling in nashorn
+ *
+ * @test
+ * @run
+ */
+
+var x = new java.math.BigDecimal(1111.5);
+var y = new java.math.BigDecimal(2222.5);
+
+print(x);
+print(y);
+
+print(x + y);
+print(x - y);
+print(x * y);
+print(x / y);
+print(Math.sin(x));
+
+print(x.toString());
+print(y.toString());
+print(x.class);
+print(y.class);
+print(x.doubleValue() + y.doubleValue());
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8010732.js.EXPECTED Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,12 @@
+1111.5
+2222.5
+3334
+-1111
+2470308.75
+0.5001124859392576
+-0.5841231854504038
+1111.5
+2222.5
+class java.math.BigDecimal
+class java.math.BigDecimal
+3334
--- a/nashorn/test/script/basic/JDK-8012164.js Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/test/script/basic/JDK-8012164.js Thu Jun 27 13:47:20 2013 +0530
@@ -37,8 +37,9 @@
try {
throw new Error('foo');
} catch (e) {
- for (i in e.stack) {
- printFrame(e.stack[i]);
+ var frames = e.getStackTrace();
+ for (i in frames) {
+ printFrame(frames[i]);
}
}
}
--- a/nashorn/test/script/basic/JDK-8012164.js.EXPECTED Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/test/script/basic/JDK-8012164.js.EXPECTED Thu Jun 27 13:47:20 2013 +0530
@@ -1,3 +1,3 @@
<test/script/basic/JDK-8012164.js>.error(test/script/basic/JDK-8012164.js:38)
<test/script/basic/JDK-8012164.js>.func(test/script/basic/JDK-8012164.js:33)
-<test/script/basic/JDK-8012164.js>.<program>(test/script/basic/JDK-8012164.js:46)
+<test/script/basic/JDK-8012164.js>.<program>(test/script/basic/JDK-8012164.js:47)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8014781.js Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8014781: support Error.captureStackTrace
+ *
+ * @test
+ * @run
+ */
+
+function MyError() {
+ Error.captureStackTrace(this);
+}
+
+function func() {
+ return new MyError();
+}
+
+var e = func();
+print(e.stack.replace(/\\/g, '/'));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8014781.js.EXPECTED Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,3 @@
+MyError @ test/script/basic/JDK-8014781.js:32
+func @ test/script/basic/JDK-8014781.js:36
+<program> @ test/script/basic/JDK-8014781.js:39
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8015959.js Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8015959: Can't call foreign constructor
+ *
+ * @test
+ * @run
+ */
+
+function check(global) {
+ var obj = new global.Point(344, 12);
+ print("obj.x " + obj.x);
+ print("obj.y " + obj.y);
+ print("obj instanceof global.Point? " + (obj instanceof global.Point))
+
+ var P = global.Point;
+ var p = new P(343, 54);
+ print("p.x " + p.x);
+ print("p.y " + p.y);
+ print("p instanceof P? " + (p instanceof P))
+}
+
+print("check with loadWithNewGlobal");
+check(loadWithNewGlobal({
+ name: "myscript",
+ script: "function Point(x, y) { this.x = x; this.y = y }; this"
+}));
+
+print("check with script engine");
+var m = new javax.script.ScriptEngineManager();
+var e = m.getEngineByName('nashorn');
+check(e.eval("function Point(x, y) { this.x = x; this.y = y }; this"));
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8015959.js.EXPECTED Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,14 @@
+check with loadWithNewGlobal
+obj.x 344
+obj.y 12
+obj instanceof global.Point? true
+p.x 343
+p.y 54
+p instanceof P? true
+check with script engine
+obj.x 344
+obj.y 12
+obj instanceof global.Point? true
+p.x 343
+p.y 54
+p instanceof P? true
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8015969.js Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8015969: Needs to enforce and document that global "context" and "engine" can't be modified when running via jsr223
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+var m = new javax.script.ScriptEngineManager();
+var e = m.getEngineByName("nashorn");
+
+e.eval(<<EOF
+
+'use strict';
+
+try {
+ context = 444;
+ print("FAILED!! context write should have thrown error");
+} catch (e) {
+ if (! (e instanceof TypeError)) {
+ print("TypeError expected but got " + e);
+ }
+}
+
+try {
+ engine = "hello";
+ print("FAILED!! engine write should have thrown error");
+} catch (e) {
+ if (! (e instanceof TypeError)) {
+ print("TypeError expected but got " + e);
+ }
+}
+
+try {
+ delete context;
+ print("FAILED!! context delete should have thrown error");
+} catch (e) {
+ if (! (e instanceof SyntaxError)) {
+ print("SyntaxError expected but got " + e);
+ }
+}
+
+try {
+ delete engine;
+ print("FAILED!! engine delete should have thrown error");
+} catch (e) {
+ if (! (e instanceof SyntaxError)) {
+ print("SyntaxError expected but got " + e);
+ }
+}
+
+EOF);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8017950.js Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8017950: error.stack should be a string rather than an array
+ *
+ * @test
+ * @run
+ */
+
+function func() {
+ try {
+ throw new Error();
+ } catch (e){
+ print(e.stack.replace(/\\/g, '/'))
+ }
+}
+
+function f() {
+ func()
+}
+
+function g() {
+ f()
+}
+
+g()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8017950.js.EXPECTED Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,4 @@
+func @ test/script/basic/JDK-8017950.js:33
+f @ test/script/basic/JDK-8017950.js:40
+g @ test/script/basic/JDK-8017950.js:44
+<program> @ test/script/basic/JDK-8017950.js:47
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8019226.js Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8019226: line number not generated for first statement if it is on the same function declaration line
+ *
+ * @test
+ * @run
+ */
+
+function func1() { func2() }
+
+function func2() { throw new Error() }
+
+try {
+ func1()
+} catch (e) {
+ print(e.stack.replace(/\\/g, '/'))
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8019226.js.EXPECTED Thu Jun 27 13:47:20 2013 +0530
@@ -0,0 +1,3 @@
+func2 @ test/script/basic/JDK-8019226.js:33
+func1 @ test/script/basic/JDK-8019226.js:31
+<program> @ test/script/basic/JDK-8019226.js:36
--- a/nashorn/test/script/basic/NASHORN-109.js Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/test/script/basic/NASHORN-109.js Thu Jun 27 13:47:20 2013 +0530
@@ -33,8 +33,9 @@
throw new Error("error");
}
} catch (e) {
- for (i in e.stack) {
- print(e.stack[i].methodName + ' ' + e.stack[i].lineNumber);
+ var frames = e.getStackTrace();
+ for (i in frames) {
+ print(frames[i].methodName + ' ' + frames[i].lineNumber);
}
}
--- a/nashorn/test/script/basic/NASHORN-296.js Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/test/script/basic/NASHORN-296.js Thu Jun 27 13:47:20 2013 +0530
@@ -33,7 +33,7 @@
load({ script: 'throw new Error()', name: name });
} catch(e) {
// normalize windows path separator to URL style
- var actual = e.stack[0].fileName;
+ var actual = e.getStackTrace()[0].fileName;
if (actual !== name) {
fail("expected file name to be " + name +
", actually got file name " + actual);
@@ -48,6 +48,6 @@
try {
throw new Error();
} catch (e) {
- test(e.stack[0].fileName.substring(6));
+ test(e.getStackTrace()[0].fileName.substring(6));
}
--- a/nashorn/test/script/basic/errorstack.js Fri Jun 21 17:33:05 2013 +0530
+++ b/nashorn/test/script/basic/errorstack.js Thu Jun 27 13:47:20 2013 +0530
@@ -22,7 +22,7 @@
*/
/**
- * "stack" property of Error objects. (nashorn extension).
+ * "getStackTrace()" method of Error objects. (nashorn extension).
*
* @test
* @run
@@ -43,9 +43,9 @@
try {
func1();
} catch (e) {
- // "stack" is java.lang.StackTraceElement object
- for (i in e.stack) {
- print(e.stack[i].methodName + " : " + e.stack[i].lineNumber);
+ var frames = e.getStackTrace();
+ for (i in frames) {
+ print(frames[i].methodName + " : " + frames[i].lineNumber);
}
}