Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JS: Hoist function declarations to the top of a block statement #18661

Merged
merged 12 commits into from
Feb 6, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -586,14 +586,6 @@ private static List<Identifier> of(List<Statement> body) {
public static List<Identifier> of(Program p) {
return of(p.getBody());
}

public static List<Identifier> of(IFunction fn) {
Node body = fn.getBody();
if (body instanceof BlockStatement) return of(((BlockStatement) body).getBody());
// if the body of the function is missing or is an expression, then there are
// no hoisted functions
return Collections.emptyList();
}
}

/**
Expand Down Expand Up @@ -1096,8 +1088,6 @@ private void buildFunctionBody(IFunction nd) {
if (nd.hasRest()) paramsAndDefaults.add((Expression) nd.getRest());

Node entry = getEntryNode(nd);
List<Identifier> fns = HoistedFunDecls.of(nd);
hoistedFns.addAll(fns);

// if this is the constructor of a class without a superclass, we need to
// initialise all fields before running the body of the constructor
Expand All @@ -1117,7 +1107,7 @@ private void buildFunctionBody(IFunction nd) {
if (firstField != null) fst = Collections.singleton(First.of(firstField));
fst =
visitSequence(
nd instanceof FunctionDeclaration ? null : nd.getId(), paramsAndDefaults, fns, fst);
nd instanceof FunctionDeclaration ? null : nd.getId(), paramsAndDefaults, fst);
writeSuccessors(entry, fst);

this.ctxt.pop();
Expand Down Expand Up @@ -1255,9 +1245,12 @@ public Void visit(Literal nd, SuccessorInfo i) {

@Override
public Void visit(BlockStatement nd, SuccessorInfo i) {
if (nd.getBody().isEmpty()) writeSuccessors(nd, i.getAllSuccessors());
else writeSuccessor(nd, First.of(nd.getBody().get(0)));
visitSequence(nd.getBody(), i.getAllSuccessors());
// Hoist function declarations in a block statement to the top of the block.
// This reflects non-standard behaviour implemented by most engines.
// See also: ECMAScript "B.3.2 Block-Level Function Declarations Web Legacy Compatibility Semantics".
List<Identifier> hoisted = HoistedFunDecls.of(nd.getBody());
hoistedFns.addAll(hoisted);
writeSuccessors(nd, visitSequence(hoisted, nd.getBody(), i.getAllSuccessors()));
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class Main {
* A version identifier that should be updated every time the extractor changes in such a way that
* it may produce different tuples for the same file under the same {@link ExtractorConfig}.
*/
public static final String EXTRACTOR_VERSION = "2025-01-21";
public static final String EXTRACTOR_VERSION = "2025-02-03";

public static final Pattern NEWLINE = Pattern.compile("\n");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,12 +163,12 @@ hasLocation(#20044,#20028)
#20045=*
exit_cfg_node(#20045,#20030)
hasLocation(#20045,#20028)
successor(#20035,#20036)
successor(#20036,#20038)
successor(#20040,#20039)
successor(#20039,#20037)
successor(#20038,#20040)
successor(#20037,#20045)
successor(#20035,#20036)
successor(#20033,#20035)
successor(#20044,#20033)
successor(#20029,#20030)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,12 @@ hasLocation(#20050,#20034)
#20051=*
exit_cfg_node(#20051,#20036)
hasLocation(#20051,#20034)
successor(#20041,#20042)
successor(#20042,#20044)
successor(#20046,#20045)
successor(#20045,#20043)
successor(#20044,#20046)
successor(#20043,#20051)
successor(#20041,#20042)
successor(#20039,#20041)
successor(#20050,#20039)
successor(#20035,#20036)
Expand Down
4 changes: 2 additions & 2 deletions javascript/extractor/tests/cfg/output/trap/fields.js.trap
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,6 @@ exit_cfg_node(#20215,#20188)
#20216=@"loc,{#10000},16,4,16,3"
locations_default(#20216,#10000,16,4,16,3)
hasLocation(#20215,#20216)
successor(#20192,#20194)
successor(#20203,#20205)
successor(#20205,#20215)
successor(#20198,#20202)
Expand All @@ -680,6 +679,7 @@ successor(#20207,#20203)
successor(#20200,#20209)
successor(#20194,#20196)
successor(#20196,#20198)
successor(#20192,#20194)
successor(#20213,#20192)
successor(#20187,#20188)
successor(#20185,#20180)
Expand Down Expand Up @@ -729,9 +729,9 @@ exit_cfg_node(#20227,#20146)
#20228=@"loc,{#10000},4,4,4,3"
locations_default(#20228,#10000,4,4,4,3)
hasLocation(#20227,#20228)
successor(#20150,#20152)
successor(#20152,#20154)
successor(#20154,#20227)
successor(#20150,#20152)
successor(#20225,#20158)
successor(#20145,#20146)
successor(#20143,#20164)
Expand Down
10 changes: 5 additions & 5 deletions javascript/extractor/tests/cfg/output/trap/tst.js.trap
Original file line number Diff line number Diff line change
Expand Up @@ -1425,30 +1425,30 @@ successor(#20455,#20457)
successor(#20457,#20461)
successor(#20432,#20434)
successor(#20434,#20436)
successor(#20436,#20438)
successor(#20438,#20442)
successor(#20442,#20440)
successor(#20440,#20443)
successor(#20436,#20438)
successor(#20414,#20416)
successor(#20416,#20420)
successor(#20420,#20418)
successor(#20418,#20422)
successor(#20418,#20432)
successor(#20424,#20418)
successor(#20422,#20424)
successor(#20416,#20420)
successor(#20425,#20429)
successor(#20430,#20432)
successor(#20429,#20430)
successor(#20392,#20394)
successor(#20394,#20412)
successor(#20396,#20400)
successor(#20401,#20403)
successor(#20403,#20409)
successor(#20411,#20407)
successor(#20409,#20411)
successor(#20407,#20412)
successor(#20407,#20405)
successor(#20405,#20412)
successor(#20401,#20403)
successor(#20400,#20401)
successor(#20412,#20414)
successor(#20371,#20392)
Expand All @@ -1462,7 +1462,6 @@ exit_cfg_node(#20468,#20371)
#20469=@"loc,{#10000},18,2,18,1"
locations_default(#20469,#10000,18,2,18,1)
hasLocation(#20468,#20469)
successor(#20379,#20383)
successor(#20383,#20381)
successor(#20381,#20384)
successor(#20381,#20468)
Expand All @@ -1481,6 +1480,7 @@ successor(#20391,#20381)
successor(#20384,#20387)
successor(#20387,#20386)
successor(#20386,#20388)
successor(#20379,#20383)
successor(#20377,#20379)
successor(#20466,#20377)
successor(#20365,#20367)
Expand All @@ -1504,7 +1504,6 @@ exit_cfg_node(#20475,#20322)
#20476=@"loc,{#10000},10,2,10,1"
locations_default(#20476,#10000,10,2,10,1)
hasLocation(#20475,#20476)
successor(#20328,#20330)
successor(#20356,#20358)
successor(#20358,#20359)
successor(#20359,#20361)
Expand Down Expand Up @@ -1539,6 +1538,7 @@ successor(#20330,#20334)
successor(#20335,#20332)
successor(#20334,#20335)
successor(#20332,#20336)
successor(#20328,#20330)
successor(#20474,#20328)
successor(#20373,#20322)
successor(#20324,#20373)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,14 +235,14 @@ hasLocation(#20074,#20072)
#20075=*
exit_cfg_node(#20075,#20051)
hasLocation(#20075,#20048)
successor(#20058,#20060)
successor(#20070,#20068)
successor(#20068,#20075)
successor(#20060,#20067)
successor(#20064,#20066)
successor(#20066,#20062)
successor(#20067,#20064)
successor(#20062,#20070)
successor(#20058,#20060)
successor(#20056,#20058)
successor(#20074,#20056)
successor(#20052,#20051)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -509,11 +509,11 @@ exit_cfg_node(#20163,#20143)
#20164=@"loc,{#10000},3,40,3,39"
locations_default(#20164,#10000,3,40,3,39)
hasLocation(#20163,#20164)
successor(#20146,#20148)
successor(#20148,#20152)
successor(#20154,#20150)
successor(#20152,#20154)
successor(#20150,#20163)
successor(#20146,#20148)
successor(#20161,#20146)
successor(#20141,#20143)
successor(#20139,#20160)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -434,14 +434,14 @@ exit_cfg_node(#20134,#20101)
#20135=@"loc,{#10000},7,4,7,3"
locations_default(#20135,#10000,7,4,7,3)
hasLocation(#20134,#20135)
successor(#20107,#20109)
successor(#20109,#20115)
successor(#20119,#20117)
successor(#20117,#20111)
successor(#20116,#20113)
successor(#20115,#20116)
successor(#20113,#20119)
successor(#20111,#20134)
successor(#20107,#20109)
successor(#20105,#20107)
successor(#20132,#20105)
successor(#20100,#20101)
Expand All @@ -457,11 +457,11 @@ exit_cfg_node(#20138,#20086)
#20139=@"loc,{#10000},4,4,4,3"
locations_default(#20139,#10000,4,4,4,3)
hasLocation(#20138,#20139)
successor(#20090,#20096)
successor(#20097,#20094)
successor(#20096,#20097)
successor(#20094,#20092)
successor(#20092,#20138)
successor(#20090,#20096)
successor(#20136,#20090)
successor(#20085,#20086)
successor(#20083,#20100)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,13 +246,13 @@ exit_cfg_node(#20076,#20054)
#20077=@"loc,{#10000},4,4,4,3"
locations_default(#20077,#10000,4,4,4,3)
hasLocation(#20076,#20077)
successor(#20060,#20062)
successor(#20062,#20068)
successor(#20070,#20064)
successor(#20069,#20066)
successor(#20068,#20069)
successor(#20066,#20070)
successor(#20064,#20076)
successor(#20060,#20062)
successor(#20058,#20060)
successor(#20074,#20058)
successor(#20053,#20054)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,12 @@ hasLocation(#20042,#20026)
#20043=*
exit_cfg_node(#20043,#20028)
hasLocation(#20043,#20026)
successor(#20033,#20034)
successor(#20034,#20036)
successor(#20038,#20037)
successor(#20037,#20035)
successor(#20036,#20038)
successor(#20035,#20043)
successor(#20033,#20034)
successor(#20031,#20033)
successor(#20042,#20031)
successor(#20027,#20028)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,12 +261,12 @@ hasLocation(#20075,#20059)
#20076=*
exit_cfg_node(#20076,#20061)
hasLocation(#20076,#20059)
successor(#20066,#20067)
successor(#20067,#20069)
successor(#20071,#20070)
successor(#20070,#20068)
successor(#20069,#20071)
successor(#20068,#20076)
successor(#20066,#20067)
successor(#20064,#20066)
successor(#20075,#20064)
successor(#20060,#20061)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,11 +253,11 @@ exit_cfg_node(#20076,#20050)
#20077=@"loc,{#10000},4,4,4,3"
locations_default(#20077,#10000,4,4,4,3)
hasLocation(#20076,#20077)
successor(#20054,#20060)
successor(#20061,#20058)
successor(#20060,#20061)
successor(#20058,#20056)
successor(#20056,#20076)
successor(#20054,#20060)
successor(#20074,#20054)
successor(#20049,#20050)
successor(#20047,#20064)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,9 +243,9 @@ exit_cfg_node(#20073,#20048)
#20074=@"loc,{#10000},4,4,4,3"
locations_default(#20074,#10000,4,4,4,3)
hasLocation(#20073,#20074)
successor(#20052,#20056)
successor(#20056,#20054)
successor(#20054,#20073)
successor(#20052,#20056)
successor(#20071,#20052)
successor(#20047,#20048)
successor(#20045,#20061)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,11 @@ hasLocation(#20054,#20052)
#20055=*
exit_cfg_node(#20055,#20037)
hasLocation(#20055,#20034)
successor(#20041,#20043)
successor(#20043,#20049)
successor(#20049,#20047)
successor(#20047,#20045)
successor(#20045,#20055)
successor(#20041,#20043)
successor(#20054,#20041)
successor(#20038,#20037)
successor(#20051,#20038)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -822,7 +822,6 @@ hasLocation(#20266,#20267)
#20268=*
exit_cfg_node(#20268,#20230)
hasLocation(#20268,#20173)
successor(#20247,#20249)
successor(#20262,#20260)
successor(#20260,#20268)
successor(#20249,#20259)
Expand All @@ -832,6 +831,7 @@ successor(#20257,#20258)
successor(#20255,#20251)
successor(#20259,#20253)
successor(#20251,#20262)
successor(#20247,#20249)
successor(#20237,#20240)
successor(#20245,#20242)
successor(#20244,#20245)
Expand All @@ -849,21 +849,20 @@ exit_cfg_node(#20270,#20177)
#20271=@"loc,{#10000},8,2,8,1"
locations_default(#20271,#10000,8,2,8,1)
hasLocation(#20270,#20271)
successor(#20190,#20192)
successor(#20203,#20205)
successor(#20205,#20209)
successor(#20209,#20211)
successor(#20212,#20207)
successor(#20211,#20212)
successor(#20207,#20213)
successor(#20205,#20209)
successor(#20213,#20217)
successor(#20218,#20220)
successor(#20220,#20226)
successor(#20229,#20222)
successor(#20228,#20224)
successor(#20226,#20228)
successor(#20224,#20229)
successor(#20222,#20270)
successor(#20218,#20220)
successor(#20217,#20218)
successor(#20192,#20202)
successor(#20196,#20198)
Expand All @@ -872,6 +871,7 @@ successor(#20201,#20194)
successor(#20198,#20199)
successor(#20202,#20196)
successor(#20194,#20203)
successor(#20190,#20192)
successor(#20185,#20187)
successor(#20188,#20190)
successor(#20187,#20188)
Expand Down
4 changes: 2 additions & 2 deletions javascript/extractor/tests/es2015/output/trap/forof.js.trap
Original file line number Diff line number Diff line change
Expand Up @@ -436,28 +436,28 @@ exit_cfg_node(#20140,#20118)
#20141=@"loc,{#10000},7,2,7,1"
locations_default(#20141,#10000,7,2,7,1)
hasLocation(#20140,#20141)
successor(#20124,#20128)
successor(#20128,#20126)
successor(#20126,#20130)
successor(#20126,#20140)
successor(#20134,#20126)
successor(#20130,#20133)
successor(#20133,#20132)
successor(#20132,#20134)
successor(#20124,#20128)
successor(#20138,#20124)
successor(#20094,#20096)
successor(#20098,#20092)
successor(#20097,#20098)
successor(#20096,#20097)
successor(#20092,#20101)
successor(#20092,#20118)
successor(#20105,#20109)
successor(#20109,#20113)
successor(#20117,#20114)
successor(#20116,#20117)
successor(#20114,#20111)
successor(#20113,#20116)
successor(#20111,#20092)
successor(#20105,#20109)
successor(#20101,#20104)
successor(#20104,#20103)
successor(#20103,#20105)
Expand Down
Loading