From: jzhou Date: Sat, 26 Feb 2011 00:28:37 +0000 (+0000) Subject: My changes to add interface affect to FieldShadow X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=444ea59c4431e841b27df08750a275cfd892b6dc;p=IRC.git My changes to add interface affect to FieldShadow --- diff --git a/Robust/src/IR/Flat/BuildCodeMGC.java b/Robust/src/IR/Flat/BuildCodeMGC.java index 77ca64e0..c0accd80 100644 --- a/Robust/src/IR/Flat/BuildCodeMGC.java +++ b/Robust/src/IR/Flat/BuildCodeMGC.java @@ -55,6 +55,9 @@ public class BuildCodeMGC extends BuildCode { e.printStackTrace(); System.exit(-1); } + + /* Fix field safe symbols due to shadowing */ + FieldShadow.handleFieldShadow(state); /* Build the virtual dispatch tables */ super.buildVirtualTables(outvirtual); diff --git a/Robust/src/IR/Flat/BuildCodeMultiCore.java b/Robust/src/IR/Flat/BuildCodeMultiCore.java index 6ca8e8b8..8da73cd4 100644 --- a/Robust/src/IR/Flat/BuildCodeMultiCore.java +++ b/Robust/src/IR/Flat/BuildCodeMultiCore.java @@ -130,9 +130,15 @@ public class BuildCodeMultiCore extends BuildCode { e.printStackTrace(); System.exit(-1); } + + /* Fix field safe symbols due to shadowing */ + FieldShadow.handleFieldShadow(state); /* Build the virtual dispatch tables */ super.buildVirtualTables(outvirtual); + + /* Tag the methods that are invoked by static blocks */ + super.tagMethodInvokedByStaticBlock(); /* Output includes */ outmethodheader.println("#ifndef METHODHEADERS_H"); diff --git a/Robust/src/IR/Flat/FieldShadow.java b/Robust/src/IR/Flat/FieldShadow.java index 2f5f9abb..a420774e 100644 --- a/Robust/src/IR/Flat/FieldShadow.java +++ b/Robust/src/IR/Flat/FieldShadow.java @@ -15,8 +15,23 @@ public class FieldShadow { private static void handleClass(ClassDescriptor cd, State state, HashMap> namemap) { if (cd.getSuperDesc()!=null&&!namemap.containsKey(cd.getSuperDesc())) handleClass(cd.getSuperDesc(), state, namemap); + + Iterator it_sifs = cd.getSuperInterfaces(); + while(it_sifs.hasNext()) { + ClassDescriptor sif = (ClassDescriptor)it_sifs.next(); + if (!namemap.containsKey(sif)) + handleClass(sif, state, namemap); + } + HashMap supermap=cd.getSuperDesc()!=null?namemap.get(cd.getSuperDesc()):new HashMap(); + Vector> superifmaps = new Vector>(); + it_sifs = cd.getSuperInterfaces(); + while(it_sifs.hasNext()) { + ClassDescriptor sif = (ClassDescriptor)it_sifs.next(); + superifmaps.addElement(namemap.get(sif)); + } + HashMap fieldmap=new HashMap(); namemap.put(cd, fieldmap); @@ -28,6 +43,8 @@ public class FieldShadow { fieldmap.put(fd.getSymbol(), new Integer(newint)); fd.changeSafeSymbol(newint); } else { + // the fields in interfaces are defaultely static & final, so do not need to + // check them, they will always have the interface name as prefix fieldmap.put(fd.getSymbol(), new Integer(0)); } }