more support for out-of-order lexical declarations

This commit is contained in:
Julian Dolby 2018-06-22 19:49:49 -04:00
parent 4de0ed876d
commit 37eea27f4a
1 changed files with 24 additions and 3 deletions

View File

@ -207,6 +207,13 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
*/
protected abstract CAstType exceptionType();
/**
* lift variable declarations for lexical scoping purposes?
*/
protected boolean liftDeclarationsForLexicalScoping() {
return false;
}
/**
* used to generate instructions for array operations; defaults to this
*/
@ -3303,7 +3310,7 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
declareFunction(n, context);
else {
declareFunction(n, context);
initFunctionEntity(codeContext);
initFunctionEntity(n, codeContext);
}
return false;
}
@ -3322,7 +3329,7 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
@Override
protected boolean visitScriptEntity(CAstEntity n, WalkContext context, WalkContext codeContext, CAstVisitor<WalkContext> visitor) {
declareFunction(n, codeContext);
initFunctionEntity(codeContext);
initFunctionEntity(n, codeContext);
return false;
}
@ -3331,7 +3338,15 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
closeFunctionEntity(n, context, codeContext);
}
public void initFunctionEntity(WalkContext functionContext) {
public void initFunctionEntity(CAstEntity n, WalkContext functionContext) {
if (liftDeclarationsForLexicalScoping()) {
Set<String> names = entity2ExposedNames.get(n);
if (names != null) {
names.forEach((String nm) -> {
functionContext.currentScope().declare(new CAstSymbolImpl(nm, CAstType.DYNAMIC));
});
}
}
// entry block
functionContext.cfg().makeEntryBlock(functionContext.cfg().newBlock(false));
// first real block
@ -4909,6 +4924,9 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
// this.inlinedSourceMap = inlinedSourceMap;
final ExposedNamesCollector exposedNamesCollector = new ExposedNamesCollector();
exposedNamesCollector.run(N);
if (liftDeclarationsForLexicalScoping()) {
exposedNamesCollector.run(N);
}
entity2ExposedNames = exposedNamesCollector.getEntity2ExposedNames();
// CAstEntity rewrite = (new ExposedParamRenamer(new CAstImpl(),
// entity2ExposedNames)).rewrite(N);
@ -4918,6 +4936,9 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public void translate(final CAstEntity N, final WalkContext context) {
final ExposedNamesCollector exposedNamesCollector = new ExposedNamesCollector();
exposedNamesCollector.run(N);
if (liftDeclarationsForLexicalScoping()) {
exposedNamesCollector.run(N);
}
entity2ExposedNames = exposedNamesCollector.getEntity2ExposedNames();
walkEntities(N, context);
}