From: bdemsky Date: Tue, 4 Apr 2006 23:35:19 +0000 (+0000) Subject: Support for Virtual Calls X-Git-Tag: preEdgeChange~945 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=19bab0abfb85ab12604a7ddda3253894b0933938;p=IRC.git Support for Virtual Calls --- diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index aee78984..fd2eff59 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -15,13 +15,16 @@ public class BuildCode { public static boolean GENERATEPRECISEGC=false; public static String PREFIX=""; Virtual virtualcalls; + TypeUtil typeutil; - public BuildCode(State st, Hashtable temptovar) { + + public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil) { state=st; this.temptovar=temptovar; paramstable=new Hashtable(); tempstable=new Hashtable(); fieldorder=new Hashtable(); + this.typeutil=typeutil; virtualcalls=new Virtual(state); } @@ -87,9 +90,10 @@ public class BuildCode { outmethod.close(); } + private int maxcount=0; + private void buildVirtualTables(PrintWriter outvirtual) { int numclasses=0; - int maxcount=0; Iterator classit=state.getClassSymbolTable().getDescriptorsIterator(); while(classit.hasNext()) { ClassDescriptor cd=(ClassDescriptor)classit.next(); @@ -256,6 +260,7 @@ public class BuildCode { headersout.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix); printcomma=true; } + for(int i=0;itype*"+maxcount+"+"+virtualcalls.getMethodNumber(md)+"])"); + } + + output.print("("); boolean needcomma=false; if (GENERATEPRECISEGC) { output.print("&__parameterlist__"); @@ -472,6 +510,22 @@ public class BuildCode { output.println(" }"); } + private boolean singleCall(ClassDescriptor thiscd, MethodDescriptor md) { + Set subclasses=typeutil.getSubClasses(thiscd); + if (subclasses==null) + return true; + for(Iterator classit=subclasses.iterator();classit.hasNext();) { + ClassDescriptor cd=(ClassDescriptor)classit.next(); + Set possiblematches=cd.getMethodTable().getSet(md.getSymbol()); + for(Iterator matchit=possiblematches.iterator();matchit.hasNext();) { + MethodDescriptor matchmd=(MethodDescriptor)matchit.next(); + if (md.matches(matchmd)) + return false; + } + } + return true; + } + private void generateFlatFieldNode(FlatMethod fm, FlatFieldNode ffn, PrintWriter output) { output.println(generateTemp(fm, ffn.getDst())+"="+ generateTemp(fm,ffn.getSrc())+"->"+ ffn.getField().getSafeSymbol()+";"); } @@ -548,7 +602,8 @@ public class BuildCode { if (GENERATEPRECISEGC) { output.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix); printcomma=true; - } + } + for(int i=0;i