public class Object {
public native int nativehashCode();
- private int cachedCode;
+ private int cachedCode;//first field has to be a primitive
private boolean cachedHash;
/* DO NOT USE ANY OF THESE - THEY ARE FOR IMPLEMENTING TAGS */
public class Object {
- public int cachedCode;
+ public int cachedCode; //first field has to be a primitive
public boolean cachedHash;
public native int nativehashCode();
public class Object {
- public int cachedCode;
+ public int cachedCode; //first field has to be a primitive
public boolean cachedHash;
public native int nativehashCode();
+ public Object foo;
public int hashCode() {
if (!cachedHash) {
public class FieldDescriptor extends Descriptor {
- public static FieldDescriptor arrayLength=new FieldDescriptor(new Modifiers(Modifiers.PUBLIC|Modifiers.FINAL), new TypeDescriptor(TypeDescriptor.INT), "length", null);
+ public static FieldDescriptor arrayLength=new FieldDescriptor(new Modifiers(Modifiers.PUBLIC|Modifiers.FINAL), new TypeDescriptor(TypeDescriptor.INT), "length", null, false);
protected Modifiers modifier;
protected TypeDescriptor td;
protected String identifier;
protected ExpressionNode en;
-
- public FieldDescriptor(Modifiers m, TypeDescriptor t, String identifier, ExpressionNode e) {
+ private boolean isglobal;
+
+ public FieldDescriptor(Modifiers m, TypeDescriptor t, String identifier, ExpressionNode e, boolean isglobal) {
super(identifier);
this.modifier=m;
this.td=t;
this.en=e;
this.safename = "___" + name + "___";
this.uniqueid=count++;
+ this.isglobal=isglobal;
if (en!=null) throw new Error("Field initializers not implemented");
}
+ public boolean isGlobal() {
+ return isglobal;
+ }
+
public TypeDescriptor getType() {
return td;
}
protected SymbolTable paramtable;
protected ClassDescriptor cd;
protected VarDescriptor thisvd;
-
+ protected boolean isglobal;
public MethodDescriptor(Modifiers m, TypeDescriptor rt, String identifier) {
super(identifier);
}
public MethodDescriptor(Modifiers m, String identifier) {
+ this(m, identifier, false);
+ }
+
+ public MethodDescriptor(Modifiers m, String identifier, boolean isglobal) {
super(identifier);
+ this.isglobal=isglobal;
this.modifier=m;
this.returntype=null;
this.identifier=identifier;
--- /dev/null
+package IR.Tree;
+
+public class AtomicNode extends BlockStatementNode {
+ BlockNode bn;
+ public AtomicNode(BlockNode bn) {
+ this.bn=bn;
+ }
+
+ public String printNode(int indent) {
+ return printSpace(indent)+"atomic {\n"+bn.printNode(indent)+"\n"+printSpace(indent)+"}";
+ }
+
+ public BlockNode getBlockNode() {
+ return bn;
+ }
+
+ public int kind() {
+ return Kind.AtomicNode;
+ }
+}
TypeDescriptor t=parseTypeDescriptor(tn);
ParseNode vn=pn.getChild("variables").getChild("variable_declarators_list");
ParseNodeVector pnv=vn.getChildren();
+ boolean isglobal=pn.getChild("global")!=null;
+
for(int i=0;i<pnv.size();i++) {
ParseNode vardecl=pnv.elementAt(i);
-
-
ParseNode tmp=vardecl;
TypeDescriptor arrayt=t;
while (tmp.getChild("single")==null) {
tmp=tmp.getChild("array");
}
String identifier=tmp.getChild("single").getTerminal();
-
ParseNode epn=vardecl.getChild("initializer");
-
+
ExpressionNode en=null;
if (epn!=null)
en=parseExpression(epn.getFirstChild());
- cn.addField(new FieldDescriptor(m,arrayt,identifier, en));
+ cn.addField(new FieldDescriptor(m, arrayt, identifier, en, isglobal));
}
-
}
private ExpressionNode parseExpression(ParseNode pn) {
} else if (isNode(pn,"createobject")) {
TypeDescriptor td=parseTypeDescriptor(pn);
Vector args=parseArgumentList(pn);
- CreateObjectNode con=new CreateObjectNode(td);
+ boolean isglobal=pn.getChild("global")!=null;
+ CreateObjectNode con=new CreateObjectNode(td, isglobal);
for(int i=0;i<args.size();i++) {
con.addArgument((ExpressionNode)args.get(i));
}
return con;
} else if (isNode(pn,"createarray")) {
//System.out.println(pn.PPrint(3,true));
+ boolean isglobal=pn.getChild("createarray")!=null;
TypeDescriptor td=parseTypeDescriptor(pn);
Vector args=parseDimExprs(pn);
int num=0;
num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
for(int i=0;i<(args.size()+num);i++)
td=td.makeArray(state);
- CreateObjectNode con=new CreateObjectNode(td);
+ CreateObjectNode con=new CreateObjectNode(td, isglobal);
for(int i=0;i<args.size();i++) {
con.addArgument((ExpressionNode)args.get(i));
}
ParseNode mn=pn.getChild("modifiers");
Modifiers m=parseModifiersList(mn);
ParseNode cdecl=pn.getChild("constructor_declarator");
+ boolean isglobal=cdecl.getChild("global")!=null;
String name=cdecl.getChild("name").getChild("identifier").getTerminal();
- MethodDescriptor md=new MethodDescriptor(m, name);
+ MethodDescriptor md=new MethodDescriptor(m, name, isglobal);
ParseNode paramnode=cdecl.getChild("parameters");
parseParameterList(md,paramnode);
ParseNode bodyn0=pn.getChild("body");
ccs=parseChecks(pn.getChild("cons_checks"));
blockstatements.add(new TaskExitNode(vfe, ccs));
+ } else if (isNode(pn,"atomic")) {
+ BlockNode bn=parseBlockHelper(pn);
+ blockstatements.add(new AtomicNode(bn));
} else if (isNode(pn,"return")) {
if (isEmpty(pn.getTerminal()))
blockstatements.add(new ReturnNode());
m.addModifier(Modifiers.NATIVE);
else if (isNode(modn,"synchronized"))
m.addModifier(Modifiers.SYNCHRONIZED);
+ else if (isNode(modn,"atomic"))
+ m.addModifier(Modifiers.ATOMIC);
else throw new Error("Unrecognized Modifier");
}
}
Vector argumentlist;
MethodDescriptor md;
FlagEffects fe;
+ boolean isglobal;
- public CreateObjectNode(TypeDescriptor type) {
+ public CreateObjectNode(TypeDescriptor type, boolean isglobal) {
td=type;
argumentlist=new Vector();
+ this.isglobal=isglobal;
+ }
+
+ public boolean isGlobal() {
+ return isglobal;
}
public void addFlagEffects(FlagEffects fe) {
public final static int FlagOpNode=18;
public final static int TaskExitNode=19;
public final static int TagDeclarationNode=20;
+ public final static int AtomicNode=21;
}
public static final int FINAL=32;
public static final int NATIVE=64;
public static final int SYNCHRONIZED=128;
+ public static final int ATOMIC=2048;
// TRANSIENT=256
// VOLATILE=512
// STRICTFP=1024
throw new Error("Synchronized native methods are not supported");
}
+ public boolean isAtomic() {
+ return ((value&ATOMIC)!=0);
+ }
+
public boolean isSynchronized() {
return ((value&SYNCHRONIZED)!=0);
}
st+="native ";
if ((value&SYNCHRONIZED)!=0)
st+="synchronized ";
+ if ((value&ATOMIC)!=0)
+ st+="atomic ";
return st;
}
}
readSourceFile(state, ClassLibraryPrefix+"File.java");
readSourceFile(state, ClassLibraryPrefix+"InetAddress.java");
- if (state.THREAD) {
- readSourceFile(state, ClassLibraryPrefix+"Thread.java");
- readSourceFile(state, ClassLibraryPrefix+"ObjectJava.java");
- } else {
+
+
+ if (state.TASK) {
readSourceFile(state, ClassLibraryPrefix+"Object.java");
readSourceFile(state, ClassLibraryPrefix+"TagDescriptor.java");
+ } else {
+ if (state.THREAD) {
+ readSourceFile(state, ClassLibraryPrefix+"Thread.java");
+ readSourceFile(state, ClassLibraryPrefix+"ObjectJava.java");
+ } else
+ readSourceFile(state, ClassLibraryPrefix+"ObjectJavaNT.java");
}
if (state.TASK) {
pn.addChild(cd);
pn.addChild("body").addChild(body);
RESULT=pn;
+ :} |
+ modifiers_opt:mo GLOBAL constructor_declarator:cd
+//throws_opt
+ constructor_body:body {:
+ ParseNode pn=new ParseNode("constructor_declaration");
+ pn.addChild("global");
+ pn.addChild("modifiers").addChild(mo);
+ pn.addChild(cd);
+ pn.addChild("body").addChild(body);
+ RESULT=pn;
:}
;
constructor_declarator ::=
//Global object
| GLOBAL NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN flag_list_opt:feo {:
ParseNode pn=new ParseNode("createobject");
- pn.addChild("global");
pn.addChild(type);
pn.addChild(args);
pn.addChild(feo);
+ pn.addChild("global");
RESULT=pn;
:}
| NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN LBRACE RBRACE LBRACE tag_list:tl RBRACE {:
pn.addChild("dims_opt").setLiteral(dims);
RESULT=pn;
:}
+ | NEW GLOBAL primitive_type:type dim_exprs:dimexpr dims_opt:dims {:
+ ParseNode pn=new ParseNode("createarray");
+ pn.addChild(type);
+ pn.addChild(dimexpr);
+ pn.addChild("dims_opt").setLiteral(dims);
+ pn.addChild("global");
+ RESULT=pn;
+ :}
+ | NEW GLOBAL class_or_interface_type:type dim_exprs:dimexpr dims_opt:dims {:
+ ParseNode pn=new ParseNode("createarray");
+ pn.addChild(type);
+ pn.addChild(dimexpr);
+ pn.addChild("dims_opt").setLiteral(dims);
+ pn.addChild("global");
+ RESULT=pn;
+ :}
;
//array_creation_init ::=
// NEW primitive_type dims array_initializer