Menu

#6 OpenJava1.1_20020522 : Problems with anonymous classes

open
nobody
None
5
2003-03-08
2003-03-08
No

I have designed a metaclass that generates anonymous
classes for undo/redo support of instance variables by
generating setter methods.

OpenJava fails when translating callee side assignments
into setter methods and generates errors at
openjava/ptree/util/MemberAccessCorrector.java:74 :

unknown field or variable : __oj_newValue
unknown field or variable : __oj_oldValue

Using -calleroff does not change anything.

The generated setter method for "int
sonema.mutate.test.Point.x" that fails to be reparsed:

public int set_x( int oj_param0 )
{
if (x == oj_param0) {
return x;
} else {
sonema.mutate.Event __oj_event = new
sonema.mutate.Event(){
int __oj_oldValue = x;

int __oj_newValue = oj_param0;

public void redo()
{
x = __oj_newValue;
}

public void undo()
{
x = __oj_oldValue;
}
};
x = oj_param0;

sonema.mutate.EventConsumer.dispatchMutation( __oj_event );
return x;
}
}

OpenJava seems to have a problem with scoping anonymous
class' instance variables inside its method bodies.

Here's the output of ojc.sh:

+ ojc.sh -d=../../gumo/JVM/od
sonema/mutate/test/ColoredPoint.oj
sonema/mutate/test/Color.oj sonema/mutate/test/Point.oj
java openjava.ojc.Main -d=../../gumo/JVM/od
sonema/mutate/test/ColoredPoint.oj
sonema/mutate/test/Color.oj sonema/mutate/test/Point.oj
OpenJava Compiler Version 1.0a build 20011127
Generating parse tree.
..done.

Initializing parse tree.
..done.

Translating callee side
Tracing field mutation : public int
sonema.mutate.test.Point.x
expr = if ( x == oj_param0 ) { return x; } else {
sonema.mutate.Event __oj_event = new
sonema.mutate.Event() { int __oj_oldValue = x;
int __oj_newValue = oj_param0; public void
redo() { x = (__oj_newValue); } public
void undo() { x = (__oj_oldValue); } } ;
x = oj_param0;
sonema.mutate.EventConsumer.dispatchMutation(__oj_event);
return x; }
unknown field or variable : __oj_newValue
ClosedEnvironment
class object table : {}
binding table : {}
parent env : ClosedEnvironment
class object table : {}
binding table : {__oj_event=class sonema.mutate.Event}
parent env : ClosedEnvironment
class object table : {}
binding table : {}
parent env : ClosedEnvironment
class object table : {}
binding table : {oj_param0=int}
parent env : ClassEnvironment
class : Point
member classes : []
parent env : FileEnvironment
package : sonema.mutate.test
main class : Point
local classes : imported classes :
sonema.mutate.TraceableClass imported packages :
java.lang local class table : {}
parent env : GlobalEnvironment
class object table :
{sonema.mutate.test.ColoredPoint=class
sonema.mutate.test.ColoredPoint, char=char,
sonema.mutate.test.Color=class
sonema.mutate.test.Color, long=long, float=float,
short=short, sonema.mutate.Traceable=class
sonema.mutate.Traceable, void=void, int=int,
sonema.mutate.test.Point=class
sonema.mutate.test.Point, java.lang.Object=class
java.lang.Object, <type>null=<type>null, double=double,
java.lang.String=class java.lang.String,
boolean=boolean, sonema.mutate.Event=class
sonema.mutate.Event, byte=byte}

unknown field or variable : __oj_oldValue
ClosedEnvironment
class object table : {}
binding table : {}
parent env : ClosedEnvironment
class object table : {}
binding table : {__oj_event=class sonema.mutate.Event}
parent env : ClosedEnvironment
class object table : {}
binding table : {}
parent env : ClosedEnvironment
class object table : {}
binding table : {oj_param0=int}
parent env : ClassEnvironment
class : Point
member classes : []
parent env : FileEnvironment
package : sonema.mutate.test
main class : Point
local classes : imported classes :
sonema.mutate.TraceableClass imported packages :
java.lang local class table : {}
parent env : GlobalEnvironment
class object table :
{sonema.mutate.test.ColoredPoint=class
sonema.mutate.test.ColoredPoint, char=char,
sonema.mutate.test.Color=class
sonema.mutate.test.Color, long=long, float=float,
short=short, sonema.mutate.Traceable=class
sonema.mutate.Traceable, void=void, int=int,
sonema.mutate.test.Point=class
sonema.mutate.test.Point, java.lang.Object=class
java.lang.Object, <type>null=<type>null, double=double,
java.lang.String=class java.lang.String,
boolean=boolean, sonema.mutate.Event=class
sonema.mutate.Event, byte=byte}

=====================================================================================

Any ideas or pointers on what might need fixing?
BTW: What is the best way to generate unique
identifiers for generated code in OpenJava? I've just
be prefixing them with "__oj_".

Discussion


Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.