diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java index 110e318ce..c39f05b8c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/correlations/extraction/ClosureExtractor.java @@ -562,6 +562,10 @@ public class ClosureExtractor extends CAstRewriterExt { public CAstNodeTypeMap newTypes() { return theTypes; } @Override public Map> newChildren() { return theChildren; } + @Override + public CAstNode[] newDefaults() { + return null; + } }; new_entity.setRewrite(rw); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java index 22e9cc2f2..b2aa07fda 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java @@ -815,7 +815,8 @@ public abstract class AstTranslator extends CAstVisitor> children) { - return rewrite(root, cfg, pos, types, children); + final Map> children, CAstNode[] defaults) { + return rewrite(root, cfg, pos, types, children, defaults); } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java index 7a95c2015..538a0153a 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/rewrite/CAstRewriter.java @@ -100,6 +100,7 @@ public abstract class CAstRewriter, K e Map> newChildren(); + CAstNode[] newDefaults(); } protected final CAst Ast; @@ -342,9 +343,14 @@ public abstract class CAstRewriter, K e * rewrite the CAst sub-tree rooted at root */ public Rewrite rewrite(final CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types, - final Map> children) { + final Map> children, final CAstNode[] defaults) { final Map, CAstNode> nodes = HashMapFactory.make(); final CAstNode newRoot = copyNodes(root, cfg, rootContext, nodes); + final CAstNode newDefaults[] = new CAstNode[ defaults==null? 0: defaults.length ]; + for(int i = 0; i < newDefaults.length; i++) { + newDefaults[i] = copyNodes(defaults[i], cfg, rootContext, nodes); + } + return new Rewrite() { private CAstControlFlowMap theCfg = null; @@ -354,6 +360,11 @@ public abstract class CAstRewriter, K e private Map> theChildren = null; + @Override + public CAstNode[] newDefaults() { + return newDefaults; + } + @Override public CAstNode newRoot() { return newRoot; @@ -397,7 +408,7 @@ public abstract class CAstRewriter, K e if (root.getAST() != null) { final Rewrite rewrite = rewrite(root.getAST(), root.getControlFlow(), root.getSourceMap(), root.getNodeTypeMap(), - root.getAllScopedEntities()); + root.getAllScopedEntities(), root.getArgumentDefaults()); return new DelegatingEntity(root) { @Override @@ -439,6 +450,11 @@ public abstract class CAstRewriter, K e public CAstControlFlowMap getControlFlow() { return rewrite.newCfg(); } + + @Override + public CAstNode[] getArgumentDefaults() { + return rewrite.newDefaults(); + } }; } else if (recursive) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java index 8aef1b5e6..94d27d6e6 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/tree/visit/CAstVisitor.java @@ -184,6 +184,10 @@ public abstract class CAstVisitor { break; } case CAstEntity.FUNCTION_ENTITY: { + for(CAstNode dflt : n.getArgumentDefaults()) { + visitor.visit(dflt, context, visitor); + visitor.visitScopedEntities(context.top(), context.top().getScopedEntities(dflt), context, visitor); + } C codeContext = visitor.makeCodeContext(context, n); if (visitor.visitFunctionEntity(n, context, codeContext, visitor)) break; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMethod.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMethod.java index 785600f3f..724c846d3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/IMethod.java @@ -160,4 +160,9 @@ public interface IMethod extends IMember, ContextItem { * @return true iff the local variable table information for this method is available */ boolean hasLocalVariableTable(); + + default int getNumberOfDefaultParameters() { + return 0; + } + }