* Use WeakReferences to store java object wrappers. Since they hold a reference to
the wrapped objects, they prevent them from being garbage collected if stored as WeakHashMap values. * Clean up parsing of rhino.optlevel property. Don't run into exceptions and log an error message if it couldn't be parsed. * Remove some variable initializers that weren't necessary after all.
This commit is contained in:
parent
676f4a06f0
commit
7b232f7eb1
1 changed files with 19 additions and 17 deletions
|
@ -33,6 +33,7 @@ import org.mozilla.javascript.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.text.*;
|
import java.text.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the implementation of ScriptingEnvironment for the Mozilla Rhino EcmaScript interpreter.
|
* This is the implementation of ScriptingEnvironment for the Mozilla Rhino EcmaScript interpreter.
|
||||||
|
@ -95,9 +96,13 @@ public final class RhinoCore implements ScopeProvider {
|
||||||
// Set default optimization level according to whether debugger is on
|
// Set default optimization level according to whether debugger is on
|
||||||
int optLevel = debugger == null ? 0 : -1;
|
int optLevel = debugger == null ? 0 : -1;
|
||||||
|
|
||||||
try {
|
String opt = app.getProperty("rhino.optlevel");
|
||||||
optLevel = Integer.parseInt(app.getProperty("rhino.optlevel"));
|
if (opt != null) {
|
||||||
} catch (Exception ignore) {
|
try {
|
||||||
|
optLevel = Integer.parseInt(opt);
|
||||||
|
} catch (Exception ignore) {
|
||||||
|
app.logError("Invalid rhino optlevel: " + opt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.setOptimizationLevel(optLevel);
|
context.setOptimizationLevel(optLevel);
|
||||||
|
@ -569,26 +574,25 @@ public final class RhinoCore implements ScopeProvider {
|
||||||
* to use. Otherwise, a Java-Class-to-Script-Prototype mapping is consulted.
|
* to use. Otherwise, a Java-Class-to-Script-Prototype mapping is consulted.
|
||||||
*/
|
*/
|
||||||
public Scriptable getElementWrapper(Object e) {
|
public Scriptable getElementWrapper(Object e) {
|
||||||
|
WeakReference ref = (WeakReference) wrappercache.get(e);
|
||||||
|
Scriptable wrapper = ref == null ? null : (Scriptable) ref.get();
|
||||||
|
|
||||||
Scriptable w = (Scriptable) wrappercache.get(e);
|
if (wrapper == null) {
|
||||||
|
|
||||||
if (w == null) {
|
|
||||||
// Gotta find out the prototype name to use for this object...
|
// Gotta find out the prototype name to use for this object...
|
||||||
String prototypeName = app.getPrototypeName(e);
|
String prototypeName = app.getPrototypeName(e);
|
||||||
|
|
||||||
Scriptable op = getPrototype(prototypeName);
|
Scriptable op = getPrototype(prototypeName);
|
||||||
|
|
||||||
if (op == null) {
|
if (op == null) {
|
||||||
// no prototype found, return an unscripted wrapper
|
// no prototype found, return an unscripted wrapper
|
||||||
w = new NativeJavaObject(global, e, e.getClass());
|
wrapper = new NativeJavaObject(global, e, e.getClass());
|
||||||
} else {
|
} else {
|
||||||
w = new JavaObject(global, e, prototypeName, op, this);
|
wrapper = new JavaObject(global, e, prototypeName, op, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
wrappercache.put(e, w);
|
wrappercache.put(e, new WeakReference(wrapper));
|
||||||
}
|
}
|
||||||
|
|
||||||
return w;
|
return wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -605,9 +609,7 @@ public final class RhinoCore implements ScopeProvider {
|
||||||
|
|
||||||
String protoname = n.getPrototype();
|
String protoname = n.getPrototype();
|
||||||
|
|
||||||
Scriptable op = null;
|
Scriptable op = getValidPrototype(protoname);
|
||||||
|
|
||||||
op = getValidPrototype(protoname);
|
|
||||||
|
|
||||||
// no prototype found for this node
|
// no prototype found for this node
|
||||||
if (op == null) {
|
if (op == null) {
|
||||||
|
@ -652,7 +654,7 @@ public final class RhinoCore implements ScopeProvider {
|
||||||
// get the currently active rhino engine and invoke the function
|
// get the currently active rhino engine and invoke the function
|
||||||
Context cx = Context.getCurrentContext();
|
Context cx = Context.getCurrentContext();
|
||||||
RhinoEngine engine = (RhinoEngine) cx.getThreadLocal("engine");
|
RhinoEngine engine = (RhinoEngine) cx.getThreadLocal("engine");
|
||||||
Object result = null;
|
Object result;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
result = engine.invoke(handler, hrefFunction,
|
result = engine.invoke(handler, hrefFunction,
|
||||||
|
@ -1036,7 +1038,7 @@ public final class RhinoCore implements ScopeProvider {
|
||||||
class DateFormat extends BaseFunction {
|
class DateFormat extends BaseFunction {
|
||||||
public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
|
public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
|
||||||
Date date = new Date((long) ScriptRuntime.toNumber(thisObj));
|
Date date = new Date((long) ScriptRuntime.toNumber(thisObj));
|
||||||
SimpleDateFormat df = null;
|
SimpleDateFormat df;
|
||||||
|
|
||||||
if (args.length > 0 && args[0] != Undefined.instance && args[0] != null) {
|
if (args.length > 0 && args[0] != Undefined.instance && args[0] != null) {
|
||||||
if (args.length > 1 && args[1] instanceof NativeJavaObject) {
|
if (args.length > 1 && args[1] instanceof NativeJavaObject) {
|
||||||
|
@ -1059,7 +1061,7 @@ public final class RhinoCore implements ScopeProvider {
|
||||||
|
|
||||||
class NumberFormat extends BaseFunction {
|
class NumberFormat extends BaseFunction {
|
||||||
public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
|
public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
|
||||||
DecimalFormat df = null;
|
DecimalFormat df;
|
||||||
if (args.length > 0 && args[0] != Undefined.instance) {
|
if (args.length > 0 && args[0] != Undefined.instance) {
|
||||||
df = new DecimalFormat(args[0].toString());
|
df = new DecimalFormat(args[0].toString());
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue