From 5769db63bbe3dc1a3eb2eae757b0b3e4598bf9b5 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Sat, 26 Mar 2011 02:35:36 +0000 Subject: [PATCH] add support for super calls...ie...super.foo() --- Robust/src/Analysis/Pointer/Pointer.java | 6 +++++- Robust/src/IR/Flat/BuildCode.java | 2 +- Robust/src/IR/Flat/BuildFlat.java | 4 ++-- Robust/src/IR/Flat/FlatCall.java | 9 +++++++++ Robust/src/IR/Tree/MethodInvokeNode.java | 11 +++++++++++ Robust/src/IR/Tree/SemanticCheck.java | 1 + 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Robust/src/Analysis/Pointer/Pointer.java b/Robust/src/Analysis/Pointer/Pointer.java index 3e30f2c4..8deb3b22 100644 --- a/Robust/src/Analysis/Pointer/Pointer.java +++ b/Robust/src/Analysis/Pointer/Pointer.java @@ -655,7 +655,7 @@ public class Pointer implements HeapAnalysis{ TempDescriptor tmpthis=fcall.getThis(); MethodDescriptor md=fcall.getMethod(); HashSet targets=new HashSet(); - if (md.isStatic()) { + if (md.isStatic()||fcall.getSuper()) { targets.add(md); } else { //Compute Edges @@ -714,6 +714,10 @@ public class Pointer implements HeapAnalysis{ returnDelta=new Delta(null, false); Vector exitblocknodes=block.getExit().nodes(); FlatExit fexit=(FlatExit)exitblocknodes.get(exitblocknodes.size()-1); + if (graphMap.get(fexit)==null) { + System.out.println(fcall); + System.out.println(fm); + } buildInitDelta(graphMap.get(fexit), returnDelta); if (!returnDelta.heapedgeadd.isEmpty()||!returnDelta.heapedgeremove.isEmpty()||!returnDelta.varedgeadd.isEmpty()) { returnDelta.setBlock(new PPoint(callblock, callindex)); diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 39ff5ba7..f6803b08 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -2523,7 +2523,7 @@ public class BuildCode { output.print(generateTemp(fm,fc.getReturnTemp())+"="); /* Do we need to do virtual dispatch? */ - if (md.isStatic()||md.getReturnType()==null||singleCall(fc.getThis().getType().getClassDesc(),md)) { + if (md.isStatic()||md.getReturnType()==null||singleCall(fc.getThis().getType().getClassDesc(),md)||fc.getSuper()) { //no output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring); } else { diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index 148f089a..14987216 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -524,9 +524,9 @@ public class BuildFlat { FlatCall fc; if(md.getReturnType()==null||md.getReturnType().isVoid()) - fc=new FlatCall(md, null, thisarg, temps); + fc=new FlatCall(md, null, thisarg, temps, min.getSuper()); else - fc=new FlatCall(md, out_temp, thisarg, temps); + fc=new FlatCall(md, out_temp, thisarg, temps, min.getSuper()); fc.setNumLine(min.getNumLine()); diff --git a/Robust/src/IR/Flat/FlatCall.java b/Robust/src/IR/Flat/FlatCall.java index f2ca858e..be50e360 100644 --- a/Robust/src/IR/Flat/FlatCall.java +++ b/Robust/src/IR/Flat/FlatCall.java @@ -6,12 +6,18 @@ public class FlatCall extends FlatNode { TempDescriptor this_temp; TempDescriptor dst; MethodDescriptor method; + boolean isSuper; public FlatCall(MethodDescriptor md, TempDescriptor dst, TempDescriptor this_temp, TempDescriptor[] args) { + this(md, dst, this_temp, args, false); + } + + public FlatCall(MethodDescriptor md, TempDescriptor dst, TempDescriptor this_temp, TempDescriptor[] args, boolean isSuper) { this.method=md; this.dst=dst; this.this_temp=this_temp; this.args=args; + this.isSuper=isSuper; } public void rewriteUse(TempMap t) { for(int i=0;i