Closed
Bug 13417
Opened 25 years ago
Closed 25 years ago
Rhino: use of 'this' in methods called from JavaAdapter
Categories
(Core :: JavaScript Engine, defect, P3)
Tracking
()
RESOLVED
FIXED
People
(Reporter: norrisboyd, Assigned: norrisboyd)
Details
Subject:
Rhino and overloaded drawImage
Date:
Wed, 08 Sep 1999 15:06:31 -0400
From:
Andrew Wason <aw@softcom.com>
To:
norris@netscape.com
CC:
Howard Lin <howard@softcom.com>
I'm getting an EvaluatorException for this:
g.drawImage(bgImg,0,0,this);
The message is:
org.mozilla.javascript.EvaluatorException: The choice of Java method
sun.awt.windows.WGraphics.drawImage matching JavaScript argument types
(sun.awt.windows.WImage,number,number,object) is ambiguous; candidate
methods are: void
drawImage(java.awt.image.BufferedImage,java.awt.image.BufferedImageOp,int,in
t), boolean drawImage(java.awt.Image,int,int,java.awt.image.ImageObserver)
See the attached output and JS file.
Andrew
--
Andrew Wason
SoftCom, Inc.
aw@softcom.com
bug3.js
Name:
bug3.js
Type:
Plain Text (text/plain)
bug3.txt
Name:
bug3.txt
Type:
Plain Text (text/plain)
bug3.js:
importPackage(Packages.javax.swing);
importPackage(java.awt);
importPackage(java.net);
importPackage(java.lang);
var bgImg = Toolkit.getDefaultToolkit().getImage(new
URL("http://www.mozilla.org/rhino/rhino50.jpg"));
var foo = new JComponent() {
paint: function(g) {
g.drawImage(bgImg,0,0,this);
super.paint(g);
}
};
var f = new Frame();
f.add(foo, BorderLayout.CENTER);
f.setSize(300,300);
f.setVisible(true);
bug3.txt:
org.mozilla.javascript.EvaluatorException: The choice of Java method sun.awt.win
at org.mozilla.javascript.DefaultErrorReporter.runtimeError(DefaultError
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:484)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:500)
at org.mozilla.javascript.NativeJavaMethod.findFunction(NativeJavaMethod
at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java, C
at org.mozilla.javascript.ScriptRuntime.call(ScriptRuntime.java:1256)
at org.mozilla.javascript.Interpreter.interpret(Interpreter.java, Compil
at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.j
at org.mozilla.javascript.NativeClosure.call(NativeClosure.java:56)
at org.mozilla.javascript.ScriptRuntime.call(ScriptRuntime.java:1256)
at org.mozilla.javascript.FlattenedObject.call(FlattenedObject.java:234)
at org.mozilla.javascript.FlattenedObject.callMethod(FlattenedObject.jav
at org.mozilla.javascript.JavaAdapter.callMethod(JavaAdapter.java:156)
at adapter0.paint(<adapter>)
at java.awt.Container.paint(Container.java:773)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:117)
at java.awt.Component.dispatchEventImpl(Component.java:2447)
at java.awt.Container.dispatchEventImpl(Container.java:1035)
at java.awt.Window.dispatchEventImpl(Window.java:749)
at java.awt.Component.dispatchEvent(Component.java:2307)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:287)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:10
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:92)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:83)
Exception occurred during event dispatching:
java.lang.Error: The choice of Java method sun.awt.windows.WGraphics.drawImage m
at org.mozilla.javascript.JavaAdapter.callMethod(JavaAdapter.java:162)
at adapter0.paint(<adapter>)
at java.awt.Container.paint(Container.java:773)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:117)
at java.awt.Component.dispatchEventImpl(Component.java:2447)
at java.awt.Container.dispatchEventImpl(Container.java:1035)
at java.awt.Window.dispatchEventImpl(Window.java:749)
at java.awt.Component.dispatchEvent(Component.java:2307)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:287)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:10
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:92)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:83)
Assignee | ||
Updated•25 years ago
|
Assignee: norris → rogerl
Updated•25 years ago
|
Status: NEW → ASSIGNED
Updated•25 years ago
|
Assignee: rogerl → norris
Status: ASSIGNED → NEW
Comment 1•25 years ago
|
||
This is that bug I was trying to forward to you just before some nice guy yanked
my network connection.
The problem is that the user is trying to use 'this' to satisfy the
ImageObserver parameter in the drawImage call - but the 'this' is the JS object
not the Java object he wishes it were (same applies to his use of 'super' in the
statement following).
Assignee | ||
Updated•25 years ago
|
Status: NEW → ASSIGNED
Summary: Rhino: overloaded drawImage → Rhino: use of 'this' in methods called from JavaAdapter
Assignee | ||
Comment 3•25 years ago
|
||
Now get a verify error:
js: "bug3.js", line 9: error instantiating (java.lang.VerifyError: (class: adapt
er0, method: super$paint signature: (Ljava/awt/Graphics;)V) Falling off the end
of the code): class javax.swing.JComponent is interface or abstract
Subject:
JavaAdater.generateSuper() is in
Date:
Fri, 24 Sep 1999 11:22:29 -0700
From:
beard@netscape.com (Patrick Beard)
To:
Norris Boyd <norris@netscape.com>
Norris -
As discussed yesterday, I've implemented the facility for calling
"super.method()". The method name is currently called "super$method".
Since Java implements some thunk methods with '$' in identifiers,
this seems reasonable, because it won't conflict with programmer
generated names. So, here's an example I've written to test it:
/*
super.js
Demonstrates calling overridden methods in a JavaAdapter class.
by Patrick C. Beard.
*/
var runnable = new java.lang.Runnable() {
hashCode: function() {
return this.super$hashCode();
},
equals: function(obj) {
return this.super$equals(obj);
},
run: function() {
print('run here.');
}
};
- Patrick
// Patrick C. Beard
// Java Runtime Enthusiast -- "Will invoke interfaces for food."
// mailto:beard@netscape.com
Assignee | ||
Updated•25 years ago
|
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
Assignee | ||
Comment 4•25 years ago
|
||
Patrick and I fixed this. See his post in the netscape.public.mozilla.jseng
newsgroup:
Subject:
[Rhino] Speaking of JS Components...
Date:
Fri, 24 Sep 1999 19:14:58 -0700
From:
Patrick Beard <beard@netscape.com>
Organization:
Netscape Communications
Newsgroups:
netscape.public.mozilla.jseng
We now have the ability to do pretty much first-class subclassing of
Java classes from Rhino. Whereas before you could specify a set of Java
interfaces to implement using a JavaScript object, now you can sub-class
real-live Java classes, and call superclass methods from within methods
overridden by JavaScript. Here's a trivial example:
importPackage(java.util);
var enum = new Enumeration() {
// override Object.hashCode:
hashCode: function() {
return this.super$hashCode() + 1;
},
// implement the java.util.Enumeration interface:
hasMoreElements: function() {
return this.equals(this);
},
n: 0,
nextElement: function {
return this.n++;
}
}
For now, you must access the overridden method using "super$method" but
I hope to eventually support "super.method" to get at superclass
methods. Obviously, that should be the only way, otherwise your script
can do things that even Java programs aren't allowed to do.
Another recent change is that the prototype chain of the JavaScript
object includes the LiveConnect wrapper of the adapter object. So,
inside the JavaScript object, you can access superclass methods that
aren't overridden using "this.method", demonstrated in the
hasMoreElements property above, which is calling java.lang.Object.equals.
- Patrick
--
// Patrick C. Beard
// Netscape Communications Corporation
You need to log in
before you can comment on or make changes to this bug.
Description
•