Subject:
[Rhino] Script compiler bug?
Date:
Tue, 12 Dec 2000 22:08:23 GMT
From:
dave russo <d-russo@ti.com>
Organization:
Deja.com
Newsgroups:
netscape.public.mozilla.jseng
The following script does not seem to compile properly (using Rhino
1.5R1):
test.js:
var test = {};
test.foo = function () { print('foo')}
test.bar = function () { print('bar')}
After compiling test.js ("java org.mozilla.javascript.tools.jsc.Main
test.js"):
js> loadClass('test')
js> test.foo()
bar
js> load('test.js')
js> test.foo()
foo
Note that changing test.js to read:
var test = {};
test.foo = function foo() { print('foo')}
test.bar = function bar() { print('bar')}
Works around the problem. Is there a problem with anonymous functions?
Sent via Deja.com
http://www.deja.com/
[Rhino] importPackage() when not in Rhino shell?
Date:
Tue, 14 Nov 2000 09:37:39 -0000
From:
"Benjamin Geer" <geerb@midas-kapiti.com>
Organization:
Another Netscape Collabra Server User
Newsgroups:
netscape.public.mozilla.jseng
The importPackage() and importClass() functions provided by the Rhino shell
seems as if they would be very generally useful. Unless I've missed
something, they don't seem to be available to scripts compiled using the
JavaScript compiler, or to scripts that are run using Script.exec(). Is
there any chance these functions could be made available for all scripts to
use? This would save a lot of typing; one could then always write a = new
Foo() instead of a = new Package.com.baz.bar.foo.Foo().
--Benjamin Geer
slobo@espial.com wrote:
>
> Hello Mike
>
> In the following test case, tester returns "undefined cat" in Rhino
> while in NN it returns "meow cat".
>
> Thanks
>
> Steven
>
> /////////////////////////////////////////////////////////////////////
> function tester(nest){
> var nest = nest+" cat";
> alert(nest);
> // nest now contains the value undefined.
> }
>
> tester("meow");
More changes to support non NativeJavaObject wrappers
Date:
Fri, 03 Nov 2000 17:56:38 +0100
From:
Igor Bukanov <igor@icesoft.no>
To:
nboyd@atg.com
Hi, Norris,
In post 1.5 rhino one can introduce own wrappers for arbitrary Java
objects. But I think to fully support this
org.mozilla.javascript.ScriptRuntime should be changes as well: its eq
and shallow_eq contain references to NativeJavaObject, this should be
replaced at least to Wrapper (see the atached patch). Even better
solution would be to add to WrapHandler methods to compare wrappers: I
can send a patch for that as well.
There is a small usability problem as well: if
org.mozilla.javascript.JavaMembers would be public I do not need to copy
it to a package with non NativeJavaObject.java wrapper.
Regards, Igor
56318 function literals with names don't work right
57045 negative integers as object properties: weird behavior
58479 functions defined within conditional phrases are always crea
[Rhino] Optimization for OptRuntime.thisGet
Date:
Mon, 23 Oct 2000 17:50:53 +0200
From:
Hannes Wallnoefer <hannes@helma.at>
Organization:
Another Netscape Collabra Server User
Newsgroups:
netscape.public.mozilla.jseng
I found a little oddity in
org.mozilla.javascript.optimizer.OptRuntime.thisGet().
get() is called twice on thisObj, once right at the beginning, and once
when starting to walk down the prototype chain. Below is what I think
this should look like - the prototype walk now begins with thisObj's
prototype, if it exists.
Also, (thisObj == null) was checked only after thisObj.get() was called,
so I moved that up in front.
Hannes
PS: I just made the changes in the news msg editor, so there may be
stupid mistakes.
updated Global, Main and ImporterTopLevel
Date:
Mon, 23 Oct 2000 14:37:45 +0100
From:
Matthias Radestock <matthias@lshift.net>
To:
nboyd@atg.com
Norris,
I've made some more changes to shell.Main and shell.Global in order to
reduce their mutual dependency, enable "quit" and get "load" to operate
in the local scope.
see attachments for updated .diffs.
Matthias.
A Rhino user has complained about concurrency problems in the interpreter,
and I think the attached diff fixes some problems that could be caused if
the same interpreted function or script was called simultaneously from
two different threads.
Re: Rhino1.5.R1: problems with multithreaded embedded application.
Date:
Mon, 03 Jul 2000 14:38:56 -0400
From:
Norris Boyd <nboyd@atg.com>
Organization:
Art Technology Group
To:
Fergus Gallagher <Fergus.Gallagher@orbisuk.com>
Newsgroups:
netscape.public.mozilla.jseng
References:
1
You found a bug in Rhino; I wonder if others have been running into the same thing.
The problem is with a class called LazilyLoadedCtor. I wrote this class to reduce the
time
required by initStandardObjects by only creating standard objects when the associated
constructors are first accessed. The problem is that this class was not threadsafe.
I've
made changes to that class, and to ScriptableObject as well. The design of dynamic
properties calling getters and setters (which LazilyLoadedCtor uses) didn't really
allow
any way for the getter/setter to replace itself without a thread hazard. I've now
extended
setters so that they can return a value which replaces the getter/setter to avoid this
problem.
Thanks for finding this problem. There have been a couple of other reports of problems
in
this area, so I hope this will fix them.
The patch follows.
--N
Index: LazilyLoadedCtor.java
===================================================================
RCS file: /cvsroot/mozilla/js/rhino/org/mozilla/javascript/LazilyLoadedCtor.java,v
retrieving revision 1.1
diff -u -r1.1 LazilyLoadedCtor.java
--- LazilyLoadedCtor.java 2000/02/29 21:34:37 1.1
+++ LazilyLoadedCtor.java 2000/07/03 18:31:03
@@ -58,9 +58,12 @@
}
public Object getProperty(ScriptableObject obj) {
- obj.delete(ctorName);
try {
- ScriptableObject.defineClass(obj, Class.forName(className));
+ synchronized (obj) {
+ if (!isReplaced)
+ ScriptableObject.defineClass(obj, Class.forName(className));
+ isReplaced = true;
+ }
}
catch (ClassNotFoundException e) {
throw WrappedException.wrapException(e);
@@ -83,11 +86,14 @@
return obj.get(ctorName, obj);
}
- public void setProperty(ScriptableObject obj, Object val) {
- obj.delete(ctorName);
- obj.put(ctorName, obj, val);
+ public Object setProperty(ScriptableObject obj, Object val) {
+ synchronized (obj) {
+ isReplaced = true;
+ return val;
+ }
}
private String ctorName;
private String className;
+ private boolean isReplaced;
}
Index: ScriptableObject.java
===================================================================
RCS file: /cvsroot/mozilla/js/rhino/org/mozilla/javascript/ScriptableObject.java,v
retrieving revision 1.17
diff -u -r1.17 ScriptableObject.java
--- ScriptableObject.java 2000/03/13 17:12:36 1.17
+++ ScriptableObject.java 2000/07/03 18:31:04
@@ -246,11 +246,21 @@
break;
}
}
- getterSlot.setter.invoke(start, arg);
+ Object v = getterSlot.setter.invoke(start, arg);
+ if (getterSlot.setterReturnsValue) {
+ slots[slotIndex].value = v;
+ if (!(v instanceof Method))
+ slots[slotIndex].flags = 0;
+ }
return;
}
Object[] args = { this, actualArg };
- getterSlot.setter.invoke(getterSlot.delegateTo, args);
+ Object v = getterSlot.setter.invoke(getterSlot.delegateTo, args);
+ if (getterSlot.setterReturnsValue) {
+ slots[slotIndex].value = v;
+ if (!(v instanceof Method))
+ slots[slotIndex].flags = 0;
+ }
return;
}
catch (InvocationTargetException e) {
@@ -1183,6 +1193,7 @@
slot.delegateTo = delegateTo;
slot.getter = getter;
slot.setter = setter;
+ slot.setterReturnsValue = setter != null && setter.getReturnType() !=
Void.TYPE;
slot.value = null;
slot.attributes = (short) attributes;
slot.flags = flags;
@@ -1551,6 +1562,7 @@
Object delegateTo; // OPT: merge with "value"
Method getter;
Method setter;
+ boolean setterReturnsValue;
}
Fergus Gallagher wrote:
> I am having problems getting my head around contexts and scopes and my
> multi-threaded application fall over.
>
> If I set "global=false" the following code used a per-thread
> initStandardObject() and this seems to work. But when I set
> "global=true", the global "parentScope" is used and I get some wierd
> errors.
>
> If I change "__CODE__.slice(0,5)" to
> 1. "__CODE__" - works
> 2. "__CODE__.substring(0,5)" - fails
> 3. "__CODE__.toString()" - works
>
> Any help appreciated.
>
> Fergus
>
> ===== Test.java =========================================
> import java.io.*;
> import org.mozilla.javascript.*;
>
> public class Test implements Runnable {
> private Script script;
> private Scriptable parentScope;
> private String __CODE__="ABCDEFGHIJK";
> private boolean global = true;
> private static Context globalContext = null;
> public Test() throws Exception {
> String js= "java.lang.System.out.println(__CODE__.slice(0,5));";
> globalContext.setCompileFunctionsWithDynamicScope(false);
> parentScope = globalContext.initStandardObjects(null);
> StringReader sr = new StringReader(js);
> script = globalContext.compileReader(parentScope, sr, "(compiled)",
> 1,null);
> }
>
> public void run() {
> try {
> Context context = Context.enter();
> Scriptable threadScope;
> if (global) {
> threadScope = context.newObject(parentScope);
> threadScope.setPrototype(parentScope);
> threadScope.setParentScope(null);
> } else {
> threadScope = context.initStandardObjects(null);
> }
> threadScope.put("__CODE__",threadScope,__CODE__);
> script.exec(context,threadScope);
> }
> catch (Exception e) {
> System.err.println(e.getClass().getName()+":
"+e.getMessage());
> }
> finally {
> Context.exit();
> }
> }
>
> public static void main(String args[]) throws Exception {
> globalContext = Context.enter();
> Test me = new Test();
> int count=10;
> Thread[] threads = new Thread[count];
> for (int i=0; i<count; i++) {
> Thread t = new Thread(me);
> threads[i] = t;
> t.start();
> }
> for (int i=0; i<count; i++) {
> threads[i].join();
> }
> Context.exit();
> }
> }
>
> ==== OUTPUT ===============================================
> ABCDE
> ABCDE
> org.mozilla.javascript.EcmaError: undefined is not a function.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> org.mozilla.javascript.EvaluatorException: Constructor for "String" not
> found.
> ===========================================================
>
> The number and type of exceptions is highly variable from run to run -
> anywhere from 1-9 out of 10.
> The EcmaError in particular only happens occasionally.
>
> --
> Fergus Gallagher Tel: +44 (20) 8 987 0717
> Orbis Fax: +44 (20) 8 742 2649
> The Swan Centre email: Fergus.Gallagher@orbisuk.com
> Fishers Lane Web: http://www.orbisuk.com
> London W4 1RX / UK
Commit the following contributions:
* Andi Vajda's changes to allow embedders to capture the generated bytecode (and thus control
generated class names).
* Marshall Cline's changes to allow embedders to override the default Java object wrapping
behavior
* Kurt Westerfeld's change to handle calling static methods better