From eeeef5f7104d69f3cf478ad5500784c4ae82964d Mon Sep 17 00:00:00 2001 From: bdemsky Date: Fri, 28 Jul 2006 18:34:23 +0000 Subject: [PATCH] added test script --- Robust/src/ClassLibrary/Object.java | 5 +++++ Robust/src/ClassLibrary/String.java | 21 +++++++++++++++++++++ Robust/src/ClassLibrary/System.java | 7 ++++++- Robust/src/IR/Flat/BuildCode.java | 11 +++++++++++ Robust/src/IR/Flat/FlatElementNode.java | 4 ++++ Robust/src/IR/Flat/FlatSetElementNode.java | 4 ++++ Robust/src/Main/Main.java | 2 +- Robust/src/Makefile | 2 +- Robust/src/Parse/java14.cup | 4 ++-- Robust/src/Runtime/runtime.c | 12 +++++++++++- Robust/src/Runtime/runtime.h | 3 +++ Robust/src/buildscript | 7 +++++++ 12 files changed, 76 insertions(+), 6 deletions(-) create mode 100755 Robust/src/buildscript diff --git a/Robust/src/ClassLibrary/Object.java b/Robust/src/ClassLibrary/Object.java index 45736237..1e66c956 100644 --- a/Robust/src/ClassLibrary/Object.java +++ b/Robust/src/ClassLibrary/Object.java @@ -1,6 +1,11 @@ public class Object { public native int hashcode(); + public String toString() { + return String.valueOf(this); + } + + public boolean equals(Object o) { if (o==this) return true; diff --git a/Robust/src/ClassLibrary/String.java b/Robust/src/ClassLibrary/String.java index 35d865be..8f448a7b 100644 --- a/Robust/src/ClassLibrary/String.java +++ b/Robust/src/ClassLibrary/String.java @@ -4,4 +4,25 @@ public class String { public String(char string[]) { this.string=string; } + + public static String valueOf(Object o) { + return o.toString(); + } + + /* public static String valueOf(int x) { + int length=0; + int tmp=x; + do { + tmp=tmp/10; + length=length+1; + } while(tmp!=0); + char chararray[]=new chararray[length]; + do { + length--; + chararray[length]=x%10; + x=x/10; + } while (length!=0); + return new String(chararray); + }*/ + } diff --git a/Robust/src/ClassLibrary/System.java b/Robust/src/ClassLibrary/System.java index 7a03cc2e..23e5295e 100644 --- a/Robust/src/ClassLibrary/System.java +++ b/Robust/src/ClassLibrary/System.java @@ -1,4 +1,9 @@ public class System { - public static native void printInt(int x); + /* public static void printInt(int x) { + String s=String.valueOf(x); + printString(s); + }*/ + public static native void printString(String s); + public static native void printInt(int x); } diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 78989dd3..ea8bd2f5 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -636,6 +636,12 @@ public class BuildCode { type="void *"; else type=elementtype.getSafeSymbol()+" "; + + if (fen.needsBoundsCheck()) { + output.println("if ("+generateTemp(fm, fen.getIndex())+"< 0 || "+generateTemp(fm, fen.getIndex())+" >= "+generateTemp(fm,fen.getSrc()) + "->___length___)"); + output.println("failedboundschk();"); + } + output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];"); } @@ -650,6 +656,11 @@ public class BuildCode { else type=elementtype.getSafeSymbol()+" "; + if (fsen.needsBoundsCheck()) { + output.println("if ("+generateTemp(fm, fsen.getIndex())+"< 0 || "+generateTemp(fm, fsen.getIndex())+" >= "+generateTemp(fm,fsen.getDst()) + "->___length___)"); + output.println("failedboundschk();"); + } + output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst())+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";"); } diff --git a/Robust/src/IR/Flat/FlatElementNode.java b/Robust/src/IR/Flat/FlatElementNode.java index d94affa0..6edc297b 100644 --- a/Robust/src/IR/Flat/FlatElementNode.java +++ b/Robust/src/IR/Flat/FlatElementNode.java @@ -12,6 +12,10 @@ public class FlatElementNode extends FlatNode { this.dst=dst; } + public boolean needsBoundsCheck() { + return true; + } + public TempDescriptor getIndex() { return index; } diff --git a/Robust/src/IR/Flat/FlatSetElementNode.java b/Robust/src/IR/Flat/FlatSetElementNode.java index aac90d3b..c231e079 100644 --- a/Robust/src/IR/Flat/FlatSetElementNode.java +++ b/Robust/src/IR/Flat/FlatSetElementNode.java @@ -12,6 +12,10 @@ public class FlatSetElementNode extends FlatNode { this.dst=dst; } + public boolean needsBoundsCheck() { + return true; + } + public TempDescriptor getSrc() { return src; } diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java index da4c77bd..9f29ce67 100644 --- a/Robust/src/Main/Main.java +++ b/Robust/src/Main/Main.java @@ -65,7 +65,7 @@ public class Main { Lex.Lexer l = new Lex.Lexer(fr); java_cup.runtime.lr_parser g; g = new Parse.Parser(l); - ParseNode p=(ParseNode) g./*debug_*/parse().value; + ParseNode p=(ParseNode) g.debug_parse().value; state.addParseNode(p); if (l.numErrors()!=0) { System.out.println("Error parsing Object.java"); diff --git a/Robust/src/Makefile b/Robust/src/Makefile index 8d60cc04..38fe6669 100644 --- a/Robust/src/Makefile +++ b/Robust/src/Makefile @@ -46,7 +46,7 @@ all: Parse/Sym.class Parse/Parser.class $(CLASSFILES) Parse/Parser.java Parse/Sym.java: Parse/java14.cup cd Parse && \ - java -cp ../../cup:$(CLASSPATH) java_cup.Main -parser Parser -symbols Sym < java14.cup + java -cp ../../cup:$(CLASSPATH) java_cup.Main -debug -nonterms -parser Parser -symbols Sym < java14.cup %.class: %.java javac -cp ../cup:.:$(CLASSPATH) $< diff --git a/Robust/src/Parse/java14.cup b/Robust/src/Parse/java14.cup index 52c5e099..6333defd 100644 --- a/Robust/src/Parse/java14.cup +++ b/Robust/src/Parse/java14.cup @@ -340,7 +340,7 @@ flag_effect ::= IDENTIFIER:id LBRACE flag_list:fl RBRACE {: RESULT=pn; :}; -flag_list_opt ::= LPAREN flag_list:fl RPAREN {:RESULT=fl;:} +flag_list_opt ::= LBRACE flag_list:fl RBRACE {:RESULT=fl;:} | {: RESULT = new ParseNode("empty"); :} ; @@ -1173,7 +1173,7 @@ primary_no_new_array ::= // | name DOT THIS ; class_instance_creation_expression ::= - NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN flag_effects_opt:feo {: + NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN flag_list_opt:feo {: ParseNode pn=new ParseNode("createobject"); pn.addChild(type); pn.addChild(args); diff --git a/Robust/src/Runtime/runtime.c b/Robust/src/Runtime/runtime.c index 5b6afb19..bb933db3 100644 --- a/Robust/src/Runtime/runtime.c +++ b/Robust/src/Runtime/runtime.c @@ -13,7 +13,7 @@ int ___Object______hashcode____(struct ___Object___ * ___this___) { } void ___System______printInt____I(int x) { - printf("%d\n",x); + printf("%d",x); } void ___System______printString____L___String___(struct ___String___ * s) { @@ -48,3 +48,13 @@ struct ___String___ * NewString(char *str,int length) { ((short *)(((char *)& chararray->___length___)+sizeof(int)))[i]=(short)str[i]; } return strobj; } + +void failedboundschk() { + printf("Array out of bounds\n"); + exit(-1); +} + +void failednullptr() { + printf("Dereferenced a null pointer\n"); + exit(-1); +} diff --git a/Robust/src/Runtime/runtime.h b/Robust/src/Runtime/runtime.h index 05811d26..b84919e7 100644 --- a/Robust/src/Runtime/runtime.h +++ b/Robust/src/Runtime/runtime.h @@ -7,4 +7,7 @@ void * allocate_new(int type); void * allocate_newarray(int type, int length); struct ___String___ * NewString(char *str,int length); + +void failedboundschk(); +void failednullptr(); #endif diff --git a/Robust/src/buildscript b/Robust/src/buildscript new file mode 100755 index 00000000..b7a0c04a --- /dev/null +++ b/Robust/src/buildscript @@ -0,0 +1,7 @@ +#!/bin/bash +ROBUSTROOT=~/research/Robust/src +MAINFILE=$1 +shift +mkdir tmpbuilddirectory +java -cp $ROBUSTROOT/../cup/:$ROBUSTROOT Main.Main -classlibrary $ROBUSTROOT/ClassLibrary/ -dir tmpbuilddirectory -mainclass $MAINFILE $@ +gcc -I$ROBUSTROOT/Runtime -Itmpbuilddirectory -O0 -g tmpbuilddirectory/methods.c $ROBUSTROOT/Runtime/runtime.c -o $MAINFILE.bin \ No newline at end of file -- 2.34.1