src/jdk/nashorn/internal/runtime/Context.java
Print this page
@@ -154,35 +154,44 @@
}
/** Is Context global debug mode enabled ? */
public static final boolean DEBUG = Options.getBooleanProperty("nashorn.debug");
- private static final ThreadLocal<ScriptObject> currentGlobal = new ThreadLocal<>();
+ private static final ThreadLocal<Global> currentGlobal = new ThreadLocal<>();
// class cache
private ClassCache classCache;
/**
* Get the current global scope
* @return the current global scope
*/
- public static ScriptObject getGlobal() {
+ public static Global getGlobal() {
// This class in a package.access protected package.
// Trusted code only can call this method.
- return getGlobalTrusted();
+ return currentGlobal.get();
}
/**
* Set the current global scope
* @param global the global scope
*/
public static void setGlobal(final ScriptObject global) {
if (global != null && !(global instanceof Global)) {
- throw new IllegalArgumentException("global is not an instance of Global!");
+ throw new IllegalArgumentException("not a global!");
+ }
+ setGlobal((Global)global);
}
- setGlobalTrusted(global);
+ /**
+ * Set the current global scope
+ * @param global the global scope
+ */
+ public static void setGlobal(final Global global) {
+ // This class in a package.access protected package.
+ // Trusted code only can call this method.
+ currentGlobal.set(global);
}
/**
* Get context of the current global
* @return current global scope's context.
@@ -199,11 +208,11 @@
* Get current context's error writer
*
* @return error writer of the current context
*/
public static PrintWriter getCurrentErr() {
- final ScriptObject global = getGlobalTrusted();
+ final ScriptObject global = getGlobal();
return (global != null)? global.getContext().getErr() : new PrintWriter(System.err);
}
/**
* Output text to this Context's error stream
@@ -404,11 +413,11 @@
/**
* Get the PropertyMap of the current global scope
* @return the property map of the current global scope
*/
public static PropertyMap getGlobalMap() {
- return Context.getGlobalTrusted().getMap();
+ return Context.getGlobal().getMap();
}
/**
* Compile a top level script.
*
@@ -434,11 +443,11 @@
*/
public Object eval(final ScriptObject initialScope, final String string, final Object callThis, final Object location, final boolean strict) {
final String file = (location == UNDEFINED || location == null) ? "<eval>" : location.toString();
final Source source = new Source(file, string);
final boolean directEval = location != UNDEFINED; // is this direct 'eval' call or indirectly invoked eval?
- final ScriptObject global = Context.getGlobalTrusted();
+ final Global global = Context.getGlobal();
ScriptObject scope = initialScope;
// ECMA section 10.1.1 point 2 says eval code is strict if it begins
// with "use strict" directive or eval direct call itself is made
@@ -466,11 +475,11 @@
// In strict mode, eval does not instantiate variables and functions
// in the caller's environment. A new environment is created!
if (strictFlag) {
// Create a new scope object
- final ScriptObject strictEvalScope = ((GlobalObject)global).newObject();
+ final ScriptObject strictEvalScope = global.newObject();
// bless it as a "scope"
strictEvalScope.setIsScope();
// set given scope to be it's proto so that eval can still
@@ -591,14 +600,14 @@
* @return return value for load call (undefined)
*
* @throws IOException if source cannot be found or loaded
*/
public Object loadWithNewGlobal(final Object from, final Object...args) throws IOException {
- final ScriptObject oldGlobal = getGlobalTrusted();
- final ScriptObject newGlobal = AccessController.doPrivileged(new PrivilegedAction<ScriptObject>() {
+ final Global oldGlobal = getGlobal();
+ final Global newGlobal = AccessController.doPrivileged(new PrivilegedAction<Global>() {
@Override
- public ScriptObject run() {
+ public Global run() {
try {
return newGlobal();
} catch (final RuntimeException e) {
if (Context.DEBUG) {
e.printStackTrace();
@@ -607,21 +616,21 @@
}
}
}, CREATE_GLOBAL_ACC_CTXT);
// initialize newly created Global instance
initGlobal(newGlobal);
- setGlobalTrusted(newGlobal);
+ setGlobal(newGlobal);
final Object[] wrapped = args == null? ScriptRuntime.EMPTY_ARRAY : ScriptObjectMirror.wrapArray(args, oldGlobal);
- newGlobal.put("arguments", ((GlobalObject)newGlobal).wrapAsObject(wrapped), env._strict);
+ newGlobal.put("arguments", newGlobal.wrapAsObject(wrapped), env._strict);
try {
// wrap objects from newGlobal's world as mirrors - but if result
// is from oldGlobal's world, unwrap it!
return ScriptObjectMirror.unwrap(ScriptObjectMirror.wrap(load(newGlobal, from), newGlobal), oldGlobal);
} finally {
- setGlobalTrusted(oldGlobal);
+ setGlobal(oldGlobal);
}
}
/**
* Load or get a structure class. Structure class names are based on the number of parameter fields
@@ -792,73 +801,54 @@
/**
* Create and initialize a new global scope object.
*
* @return the initialized global scope object.
*/
- public ScriptObject createGlobal() {
+ public Global createGlobal() {
return initGlobal(newGlobal());
}
/**
* Create a new uninitialized global scope object
* @return the global script object
*/
- public ScriptObject newGlobal() {
+ public Global newGlobal() {
return new Global(this);
}
/**
* Initialize given global scope object.
*
* @param global the global
* @return the initialized global scope object.
*/
- public ScriptObject initGlobal(final ScriptObject global) {
- if (! (global instanceof GlobalObject)) {
- throw new IllegalArgumentException("not a global object!");
- }
-
+ public Global initGlobal(final Global global) {
// Need only minimal global object, if we are just compiling.
if (!env._compile_only) {
- final ScriptObject oldGlobal = Context.getGlobalTrusted();
+ final Global oldGlobal = Context.getGlobal();
try {
- Context.setGlobalTrusted(global);
+ Context.setGlobal(global);
// initialize global scope with builtin global objects
- ((GlobalObject)global).initBuiltinObjects();
+ global.initBuiltinObjects();
} finally {
- Context.setGlobalTrusted(oldGlobal);
+ Context.setGlobal(oldGlobal);
}
}
return global;
}
/**
- * Trusted variants - package-private
+ * Trusted variant - package-private
*/
/**
- * Return the current global scope
- * @return current global scope
- */
- static ScriptObject getGlobalTrusted() {
- return currentGlobal.get();
- }
-
- /**
- * Set the current global scope
- */
- static void setGlobalTrusted(ScriptObject global) {
- currentGlobal.set(global);
- }
-
- /**
* Return the current global's context
* @return current global's context
*/
static Context getContextTrusted() {
- return Context.getGlobalTrusted().getContext();
+ return ((ScriptObject)Context.getGlobal()).getContext();
}
/**
* Try to infer Context instance from the Class. If we cannot,
* then get it from the thread local variable.
@@ -923,11 +913,11 @@
} catch (final NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
strict = false;
}
// Package as a JavaScript function and pass function back to shell.
- return ((GlobalObject)Context.getGlobalTrusted()).newScriptFunction(RUN_SCRIPT.symbolName(), runMethodHandle, scope, strict);
+ return Context.getGlobal().newScriptFunction(RUN_SCRIPT.symbolName(), runMethodHandle, scope, strict);
}
private ScriptFunction compileScript(final Source source, final ScriptObject scope, final ErrorManager errMan) {
return getRunScriptFunction(compile(source, errMan, this._strict), scope);
}