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+";");
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();
generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
}
+
+
outstructs.close();
outmethodheader.close();
}
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())+";");
}
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) {
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) {
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;");
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;
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;
+}