support for method argument default values

This commit is contained in:
Julian Dolby 2018-10-17 19:44:44 -04:00
parent 948d69cbb8
commit 533d392bda
8 changed files with 37 additions and 7 deletions

View File

@ -562,6 +562,10 @@ public class ClosureExtractor extends CAstRewriterExt {
public CAstNodeTypeMap newTypes() { return theTypes; } public CAstNodeTypeMap newTypes() { return theTypes; }
@Override @Override
public Map<CAstNode, Collection<CAstEntity>> newChildren() { return theChildren; } public Map<CAstNode, Collection<CAstEntity>> newChildren() { return theChildren; }
@Override
public CAstNode[] newDefaults() {
return null;
}
}; };
new_entity.setRewrite(rw); new_entity.setRewrite(rw);

View File

@ -815,7 +815,8 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
} }
} }
}).copy(sourceContext.unwindAst, sourceContext.astContext.getControlFlow(), sourceContext.astContext.getSourceMap(), }).copy(sourceContext.unwindAst, sourceContext.astContext.getControlFlow(), sourceContext.astContext.getSourceMap(),
sourceContext.astContext.top().getNodeTypeMap(), sourceContext.astContext.top().getAllScopedEntities()); sourceContext.astContext.top().getNodeTypeMap(), sourceContext.astContext.top().getAllScopedEntities(),
sourceContext.astContext.top().getArgumentDefaults());
sourceContext.astVisitor.visit(ast.newRoot(), new DelegatingContext(sourceContext.astContext) { sourceContext.astVisitor.visit(ast.newRoot(), new DelegatingContext(sourceContext.astContext) {
@Override @Override
public CAstSourcePositionMap getSourceMap() { public CAstSourcePositionMap getSourceMap() {

View File

@ -296,7 +296,7 @@ public interface TranslatorToCAst {
if (replicateForDoLoops) { if (replicateForDoLoops) {
loopBody = Ast.makeNode(CAstNode.BLOCK_STMT, loopBody, continueNode); loopBody = Ast.makeNode(CAstNode.BLOCK_STMT, loopBody, continueNode);
CAstRewriter.Rewrite x = (new CAstCloner(Ast, false)).copy(loopBody, wc.cfg(), wc.pos(), wc.getNodeTypeMap(), null); CAstRewriter.Rewrite x = (new CAstCloner(Ast, false)).copy(loopBody, wc.cfg(), wc.pos(), wc.getNodeTypeMap(), null, null);
CAstNode otherBody = x.newRoot(); CAstNode otherBody = x.newRoot();
wc.cfg().addAll(x.newCfg()); wc.cfg().addAll(x.newCfg());

View File

@ -46,7 +46,7 @@ public class AstConstantFolder {
} }
} }
}.rewrite(ce.getAST(), ce.getControlFlow(), ce.getSourceMap(), ce.getNodeTypeMap(), ce.getAllScopedEntities()); }.rewrite(ce.getAST(), ce.getControlFlow(), ce.getSourceMap(), ce.getNodeTypeMap(), ce.getAllScopedEntities(), ce.getArgumentDefaults());
return new DelegatingEntity(ce) { return new DelegatingEntity(ce) {
@Override @Override

View File

@ -62,7 +62,7 @@ public class CAstCloner extends CAstBasicRewriter<CAstBasicRewriter.NonCopyingCo
} }
public Rewrite copy(CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types, public Rewrite copy(CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types,
final Map<CAstNode, Collection<CAstEntity>> children) { final Map<CAstNode, Collection<CAstEntity>> children, CAstNode[] defaults) {
return rewrite(root, cfg, pos, types, children); return rewrite(root, cfg, pos, types, children, defaults);
} }
} }

View File

@ -100,6 +100,7 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
Map<CAstNode, Collection<CAstEntity>> newChildren(); Map<CAstNode, Collection<CAstEntity>> newChildren();
CAstNode[] newDefaults();
} }
protected final CAst Ast; protected final CAst Ast;
@ -342,9 +343,14 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
* rewrite the CAst sub-tree rooted at root * rewrite the CAst sub-tree rooted at root
*/ */
public Rewrite rewrite(final CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types, public Rewrite rewrite(final CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types,
final Map<CAstNode, Collection<CAstEntity>> children) { final Map<CAstNode, Collection<CAstEntity>> children, final CAstNode[] defaults) {
final Map<Pair<CAstNode, K>, CAstNode> nodes = HashMapFactory.make(); final Map<Pair<CAstNode, K>, CAstNode> nodes = HashMapFactory.make();
final CAstNode newRoot = copyNodes(root, cfg, rootContext, nodes); 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() { return new Rewrite() {
private CAstControlFlowMap theCfg = null; private CAstControlFlowMap theCfg = null;
@ -354,6 +360,11 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
private Map<CAstNode, Collection<CAstEntity>> theChildren = null; private Map<CAstNode, Collection<CAstEntity>> theChildren = null;
@Override
public CAstNode[] newDefaults() {
return newDefaults;
}
@Override @Override
public CAstNode newRoot() { public CAstNode newRoot() {
return newRoot; return newRoot;
@ -397,7 +408,7 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
if (root.getAST() != null) { if (root.getAST() != null) {
final Rewrite rewrite = rewrite(root.getAST(), root.getControlFlow(), root.getSourceMap(), root.getNodeTypeMap(), final Rewrite rewrite = rewrite(root.getAST(), root.getControlFlow(), root.getSourceMap(), root.getNodeTypeMap(),
root.getAllScopedEntities()); root.getAllScopedEntities(), root.getArgumentDefaults());
return new DelegatingEntity(root) { return new DelegatingEntity(root) {
@Override @Override
@ -439,6 +450,11 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
public CAstControlFlowMap getControlFlow() { public CAstControlFlowMap getControlFlow() {
return rewrite.newCfg(); return rewrite.newCfg();
} }
@Override
public CAstNode[] getArgumentDefaults() {
return rewrite.newDefaults();
}
}; };
} else if (recursive) { } else if (recursive) {

View File

@ -184,6 +184,10 @@ public abstract class CAstVisitor<C extends CAstVisitor.Context> {
break; break;
} }
case CAstEntity.FUNCTION_ENTITY: { 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); C codeContext = visitor.makeCodeContext(context, n);
if (visitor.visitFunctionEntity(n, context, codeContext, visitor)) if (visitor.visitFunctionEntity(n, context, codeContext, visitor))
break; break;

View File

@ -160,4 +160,9 @@ public interface IMethod extends IMember, ContextItem {
* @return true iff the local variable table information for this method is available * @return true iff the local variable table information for this method is available
*/ */
boolean hasLocalVariableTable(); boolean hasLocalVariableTable();
default int getNumberOfDefaultParameters() {
return 0;
}
} }