Support for printing Strings!!!
authorbdemsky <bdemsky>
Mon, 10 Apr 2006 23:03:07 +0000 (23:03 +0000)
committerbdemsky <bdemsky>
Mon, 10 Apr 2006 23:03:07 +0000 (23:03 +0000)
Robust/src/ClassLibrary/System.java
Robust/src/IR/FieldDescriptor.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Tree/Modifiers.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/Main/Main.java
Robust/src/Runtime/runtime.c
Robust/src/Runtime/runtime.h

index 142eca83531261ed1553baf3050d2754f0a37ade..7a03cc2e9627b52724b805e80e66efa38d1be6b6 100644 (file)
@@ -1,3 +1,4 @@
 public class System {
     public static native void printInt(int x);
+    public static native void printString(String s);
 }
index b8f0a20191435808adf2b9b117bcd0be38d51257..41626d41721c3b3a3ca09f637c15367c85357c30 100644 (file)
@@ -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() {
index 29e5a4a6c41ceb6d6880ca46e8e85c6c9eeeb027..6f4f95fad5da8ff502d85b86689925b8d228755a 100644 (file)
@@ -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;");
index 0fcb74ad0f5079d299f23d2015e652590abf2884..827f3acfbbac2271874e141d0704c81a3ebdcecf 100644 (file)
@@ -19,6 +19,10 @@ public class Modifiers {
        value=0;
     }
 
+    public Modifiers(int v) {
+       value=v;
+    }
+
     public void addModifier(int mod) {
        value|=mod;
     }
index da31b9d34233e4fe4e826f00f07bbec8ad8d2c70..f9ef70c7c8f9138113ba11645190fe73ac3fe2cd 100644 (file)
@@ -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);
index 731398b3210327dc7b5b0ac41e8a262ec628cc02..da4c77bdb1b0f5406b8752410383a747bcc97870 100644 (file)
@@ -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();
index 4a408c02f758d5515abdebffb5bc23b46f99ce7f..3d23c43aea58fbbaaeeb156b3b332c063bb70e7e 100644 (file)
@@ -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<chararray->___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;i++) {
+    ((short *)(((char *)& chararray->___length___)+sizeof(int)))[i]=(short)str[i];  }
+  return strobj;
+}
index 8278de1db574123151d6521efcd7261421cc8547..05811d268f2bbfd2c9b1c85915318160dc61a2ca 100644 (file)
@@ -6,5 +6,5 @@
 
 void * allocate_new(int type);
 void * allocate_newarray(int type, int length);
-
+struct ___String___ * NewString(char *str,int length);
 #endif