From 548da59336409ff67b9f0d9e00e708d66eeb0bd0 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Sat, 8 Apr 2006 06:32:16 +0000 Subject: [PATCH] changes --- Robust/src/IR/ClassDescriptor.java | 12 ++++++- Robust/src/IR/Flat/BuildCode.java | 30 +++++++++++++++--- Robust/src/IR/Flat/BuildFlat.java | 26 +++++++++++++++ Robust/src/IR/Flat/FKind.java | 2 +- Robust/src/IR/Flat/FlatElementNode.java | 42 +++++++++++++++++++++++++ Robust/src/IR/Flat/FlatNew.java | 4 +++ Robust/src/IR/State.java | 21 +++++++++++++ Robust/src/IR/Tree/BuildIR.java | 10 +++--- Robust/src/IR/TypeDescriptor.java | 12 ++++++- 9 files changed, 147 insertions(+), 12 deletions(-) create mode 100644 Robust/src/IR/Flat/FlatElementNode.java diff --git a/Robust/src/IR/ClassDescriptor.java b/Robust/src/IR/ClassDescriptor.java index e5888b3d..73b66d7a 100644 --- a/Robust/src/IR/ClassDescriptor.java +++ b/Robust/src/IR/ClassDescriptor.java @@ -15,7 +15,17 @@ public class ClassDescriptor extends Descriptor { methods=new SymbolTable(); classid=UIDCount++; } - private static int UIDCount=0; + private static int UIDCount=10; /* 0 is for Arrays */ + /* For element types we use as defined in TypeDescriptor + public static final int BYTE=1; + public static final int SHORT=2; + public static final int INT=3; + public static final int LONG=4; + public static final int CHAR=5; + public static final int BOOLEAN=6; + public static final int FLOAT=7; + public static final int DOUBLE=8;*/ + private final int classid; String classname; String superclass; diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index cf269d1f..8dfb38d5 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -14,6 +14,7 @@ public class BuildCode { String paramsprefix="___params___"; public static boolean GENERATEPRECISEGC=false; public static String PREFIX=""; + public static String arraytype="___array___"; Virtual virtualcalls; TypeUtil typeutil; @@ -58,12 +59,20 @@ public class BuildCode { // Output the C declarations // These could mutually reference each other + outclassdefs.println("struct "+arraytype+";"); while(it.hasNext()) { ClassDescriptor cn=(ClassDescriptor)it.next(); outclassdefs.println("struct "+cn.getSafeSymbol()+";"); } outclassdefs.println(""); - + { + //Print out definition for array type + outclassdefs.println("struct "+arraytype+" {"); + outclassdefs.println(" int type;"); + printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs); + outclassdefs.println(" int length;"); + outclassdefs.println("};\n"); + } it=state.getClassSymbolTable().getDescriptorsIterator(); while(it.hasNext()) { ClassDescriptor cn=(ClassDescriptor)it.next(); @@ -120,7 +129,7 @@ public class BuildCode { if (virtualcalls.getMethodCount(cd)>maxcount) maxcount=virtualcalls.getMethodCount(cd); } - MethodDescriptor[][] virtualtable=new MethodDescriptor[state.numClasses()][maxcount]; + MethodDescriptor[][] virtualtable=new MethodDescriptor[state.numClasses()+state.numArrays()][maxcount]; /* Fill in virtual table */ classit=state.getClassSymbolTable().getDescriptorsIterator(); @@ -128,9 +137,18 @@ public class BuildCode { ClassDescriptor cd=(ClassDescriptor)classit.next(); fillinRow(cd, virtualtable, cd.getId()); } + + ClassDescriptor objectcd=typeutil.getClass(TypeUtil.ObjectClass); + Iteratory arrait=state.getArrayIterator(); + while(arrayit.hasNext()) { + TypeDescriptor td=(TypeDescriptor)arrayit.next(); + int id=getArrayNumber(td); + fillinRow(objectcd, virtualtable, id+state.numClasses()); + } + outvirtual.print("void * virtualtable[]={"); boolean needcomma=false; - for(int i=0;i