From: bdemsky Date: Mon, 10 Apr 2006 23:03:07 +0000 (+0000) Subject: Support for printing Strings!!! X-Git-Tag: preEdgeChange~928 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=58912972740fda96277cb192ff12b3c4da6d9be1;p=IRC.git Support for printing Strings!!! --- diff --git a/Robust/src/ClassLibrary/System.java b/Robust/src/ClassLibrary/System.java index 142eca83..7a03cc2e 100644 --- a/Robust/src/ClassLibrary/System.java +++ b/Robust/src/ClassLibrary/System.java @@ -1,3 +1,4 @@ public class System { public static native void printInt(int x); + public static native void printString(String s); } diff --git a/Robust/src/IR/FieldDescriptor.java b/Robust/src/IR/FieldDescriptor.java index b8f0a201..41626d41 100644 --- a/Robust/src/IR/FieldDescriptor.java +++ b/Robust/src/IR/FieldDescriptor.java @@ -10,6 +10,8 @@ import IR.Tree.ExpressionNode; public class FieldDescriptor extends Descriptor { + public static FieldDescriptor arrayLength=new FieldDescriptor(new Modifiers(Modifiers.PUBLIC|Modifiers.FINAL), new TypeDescriptor(TypeDescriptor.INT), "length", null); + protected Modifiers modifier; protected TypeDescriptor td; protected String identifier; @@ -23,6 +25,7 @@ public class FieldDescriptor extends Descriptor { this.en=e; this.safename = "___" + name + "___"; this.uniqueid=count++; + if (en!=null) throw new Error("Field initializers not implemented"); } public TypeDescriptor getType() { diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 29e5a4a6..6f4f95fa 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -57,6 +57,11 @@ public class BuildCode { outstructs.println("#include \"classdefs.h\""); outmethodheader.println("#include \"structdefs.h\""); + /* Output types for short array and string */ + outstructs.println("#define STRINGTYPE "+typeutil.getClass(TypeUtil.StringClass).getId()); + outstructs.println("#define CHARARRAYTYPE "+ + (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state))+state.numClasses())); + // Output the C declarations // These could mutually reference each other outclassdefs.println("struct "+arraytype+";"); @@ -70,7 +75,7 @@ public class BuildCode { outclassdefs.println("struct "+arraytype+" {"); outclassdefs.println(" int type;"); printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs); - outclassdefs.println(" int length;"); + outclassdefs.println(" int ___length___;"); outclassdefs.println("};\n"); } it=state.getClassSymbolTable().getDescriptorsIterator(); @@ -79,6 +84,8 @@ public class BuildCode { generateCallStructs(cn, outclassdefs, outstructs, outmethodheader); } + + outstructs.close(); outmethodheader.close(); @@ -616,6 +623,8 @@ public class BuildCode { } private void generateFlatSetFieldNode(FlatMethod fm, FlatSetFieldNode fsfn, PrintWriter output) { + if (fsfn.getField().getSymbol().equals("length")&&fsfn.getDst().getType().isArray()) + throw new Error("Can't set array length"); output.println(generateTemp(fm, fsfn.getDst())+"->"+ fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); } @@ -627,7 +636,7 @@ public class BuildCode { type="void *"; else type=elementtype.getSafeSymbol()+" "; - output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->length))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];"); + output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];"); } private void generateFlatSetElementNode(FlatMethod fm, FlatSetElementNode fsen, PrintWriter output) { @@ -641,7 +650,7 @@ public class BuildCode { else type=elementtype.getSafeSymbol()+" "; - output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst())+"->length))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";"); + output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst())+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";"); } private void generateFlatNew(FlatMethod fm, FlatNew fn, PrintWriter output) { @@ -683,7 +692,7 @@ public class BuildCode { if (fln.getValue()==null) output.println(generateTemp(fm, fln.getDst())+"=0;"); else if (fln.getType().getSymbol().equals(TypeUtil.StringClass)) - output.println(generateTemp(fm, fln.getDst())+"=newstring(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\");"); + output.println(generateTemp(fm, fln.getDst())+"=NewString(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\","+((String)fln.getValue()).length()+");"); else if (fln.getType().isBoolean()) { if (((Boolean)fln.getValue()).booleanValue()) output.println(generateTemp(fm, fln.getDst())+"=1;"); diff --git a/Robust/src/IR/Tree/Modifiers.java b/Robust/src/IR/Tree/Modifiers.java index 0fcb74ad..827f3acf 100644 --- a/Robust/src/IR/Tree/Modifiers.java +++ b/Robust/src/IR/Tree/Modifiers.java @@ -19,6 +19,10 @@ public class Modifiers { value=0; } + public Modifiers(int v) { + value=v; + } + public void addModifier(int mod) { value|=mod; } diff --git a/Robust/src/IR/Tree/SemanticCheck.java b/Robust/src/IR/Tree/SemanticCheck.java index da31b9d3..f9ef70c7 100644 --- a/Robust/src/IR/Tree/SemanticCheck.java +++ b/Robust/src/IR/Tree/SemanticCheck.java @@ -238,7 +238,12 @@ public class SemanticCheck { checkExpressionNode(md,nametable,left,null); TypeDescriptor ltd=left.getType(); String fieldname=fan.getFieldName(); - FieldDescriptor fd=(FieldDescriptor) ltd.getClassDesc().getFieldTable().get(fieldname); + + FieldDescriptor fd=null; + if (ltd.isArray()&&fieldname.equals("length")) + fd=FieldDescriptor.arrayLength; + else + fd=(FieldDescriptor) ltd.getClassDesc().getFieldTable().get(fieldname); if (fd==null) throw new Error("Unknown field "+fieldname); fan.setField(fd); diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java index 731398b3..da4c77bd 100644 --- a/Robust/src/Main/Main.java +++ b/Robust/src/Main/Main.java @@ -41,6 +41,7 @@ public class Main { readSourceFile(state, ClassLibraryPrefix+"Object.java"); readSourceFile(state, ClassLibraryPrefix+"System.java"); + readSourceFile(state, ClassLibraryPrefix+"String.java"); BuildIR bir=new BuildIR(state); bir.buildtree(); diff --git a/Robust/src/Runtime/runtime.c b/Robust/src/Runtime/runtime.c index 4a408c02..3d23c43a 100644 --- a/Robust/src/Runtime/runtime.c +++ b/Robust/src/Runtime/runtime.c @@ -10,6 +10,16 @@ void ___System______printInt____I(int x) { printf("%d\n",x); } +void ___System______printString____L___String___(struct ___String___ * s) { + struct ArrayObject * chararray=s->___string___; + int i; + for(i=0;i___length___;i++) { + short s= ((short *)(((char *)& chararray->___length___)+sizeof(int)))[i]; + putchar(s); + } +} + + void * allocate_new(int type) { void * v=calloc(1,classsize[type]); *((int *)v)=type; @@ -18,7 +28,17 @@ void * allocate_new(int type) { void * allocate_newarray(int type, int length) { void * v=calloc(1,sizeof(struct ArrayObject)+length*classsize[type]); - ((int *)v)[0]=type; - ((int *)v)[1]=length; + *((int *)v)=type; + ((struct ArrayObject *)v)->___length___=length; return v; } + +struct ___String___ * NewString(char *str,int length) { + struct ArrayObject * chararray=allocate_newarray(CHARARRAYTYPE, length); + struct ___String___ * strobj=allocate_new(STRINGTYPE); + int i; + strobj->___string___=chararray; + for(i=0;i___length___)+sizeof(int)))[i]=(short)str[i]; } + return strobj; +} diff --git a/Robust/src/Runtime/runtime.h b/Robust/src/Runtime/runtime.h index 8278de1d..05811d26 100644 --- a/Robust/src/Runtime/runtime.h +++ b/Robust/src/Runtime/runtime.h @@ -6,5 +6,5 @@ void * allocate_new(int type); void * allocate_newarray(int type, int length); - +struct ___String___ * NewString(char *str,int length); #endif