@@ -95,13 +95,24 @@ public final class IRFactory {
95
95
private AstNodePosition astNodePos ;
96
96
97
97
public IRFactory (CompilerEnvirons env , String sourceString ) {
98
- this (env , sourceString , env .getErrorReporter ());
98
+ this (env , null , sourceString , env .getErrorReporter ());
99
99
}
100
100
101
+ /** Use {@link #IRFactory(CompilerEnvirons, String, String, ErrorReporter)} */
102
+ @ Deprecated
101
103
public IRFactory (CompilerEnvirons env , String sourceString , ErrorReporter errorReporter ) {
104
+ this (env , null , sourceString , errorReporter );
105
+ }
106
+
107
+ public IRFactory (
108
+ CompilerEnvirons env ,
109
+ String sourceName ,
110
+ String sourceString ,
111
+ ErrorReporter errorReporter ) {
102
112
parser = new Parser (env , errorReporter );
103
113
astNodePos = new AstNodePosition (sourceString );
104
114
parser .currentPos = astNodePos ;
115
+ parser .setSourceURI (sourceName );
105
116
}
106
117
107
118
/** Transforms the tree into a lower-level IR suitable for codegen. */
@@ -180,7 +191,9 @@ private Node transform(AstNode node) {
180
191
case Token .NULL :
181
192
case Token .DEBUGGER :
182
193
return transformLiteral (node );
183
-
194
+ case Token .SUPER :
195
+ parser .setRequiresActivation ();
196
+ return transformLiteral (node );
184
197
case Token .NAME :
185
198
return transformName ((Name ) node );
186
199
case Token .NUMBER :
@@ -533,6 +546,9 @@ private Node transformElementGet(ElementGet node) {
533
546
if (node .type == Token .QUESTION_DOT ) {
534
547
getElem .putIntProp (Node .OPTIONAL_CHAINING , 1 );
535
548
}
549
+ if (target .getType () == Token .SUPER ) {
550
+ getElem .putIntProp (Node .SUPER_PROPERTY_ACCESS , 1 );
551
+ }
536
552
return getElem ;
537
553
}
538
554
@@ -660,17 +676,26 @@ private Node transformFunction(FunctionNode fn) {
660
676
}
661
677
662
678
private Node transformFunctionCall (FunctionCall node ) {
663
- Node call = createCallOrNew (Token .CALL , transform (node .getTarget ()));
664
- call .setLineColumnNumber (node .getLineno (), node .getColumn ());
665
- List <AstNode > args = node .getArguments ();
666
- for (int i = 0 ; i < args .size (); i ++) {
667
- AstNode arg = args .get (i );
668
- call .addChildToBack (transform (arg ));
669
- }
670
- if (node .isOptionalCall ()) {
671
- call .putIntProp (Node .OPTIONAL_CHAINING , 1 );
679
+ astNodePos .push (node );
680
+ try {
681
+ Node transformedTarget = transform (node .getTarget ());
682
+ Node call = createCallOrNew (Token .CALL , transformedTarget );
683
+ call .setLineColumnNumber (node .getLineno (), node .getColumn ());
684
+ List <AstNode > args = node .getArguments ();
685
+ for (int i = 0 ; i < args .size (); i ++) {
686
+ AstNode arg = args .get (i );
687
+ call .addChildToBack (transform (arg ));
688
+ }
689
+ if (node .isOptionalCall ()) {
690
+ call .putIntProp (Node .OPTIONAL_CHAINING , 1 );
691
+ }
692
+ if (transformedTarget .getIntProp (Node .SUPER_PROPERTY_ACCESS , 0 ) == 1 ) {
693
+ call .putIntProp (Node .SUPER_PROPERTY_ACCESS , 1 );
694
+ }
695
+ return call ;
696
+ } finally {
697
+ astNodePos .pop ();
672
698
}
673
- return call ;
674
699
}
675
700
676
701
private Node transformGenExpr (GeneratorExpression node ) {
@@ -863,6 +888,11 @@ private Node transformLetNode(LetNode node) {
863
888
}
864
889
865
890
private Node transformLiteral (AstNode node ) {
891
+ // Trying to call super as a function. See 15.4.2 Static Semantics: HasDirectSuper
892
+ if (node .getParent () instanceof FunctionCall
893
+ && node .getType () == Token .SUPER
894
+ && parser .currentScriptOrFn .isMethodDefinition ())
895
+ parser .reportError ("msg.super.shorthand.function" );
866
896
return node ;
867
897
}
868
898
@@ -969,8 +999,12 @@ private Node transformTemplateLiteral(TemplateLiteral node) {
969
999
}
970
1000
971
1001
private Node transformTemplateLiteralCall (TaggedTemplateLiteral node ) {
972
- Node call = createCallOrNew (Token .CALL , transform (node .getTarget ()));
1002
+ Node transformedTarget = transform (node .getTarget ());
1003
+ Node call = createCallOrNew (Token .CALL , transformedTarget );
973
1004
call .setLineColumnNumber (node .getLineno (), node .getColumn ());
1005
+ if (transformedTarget .getIntProp (Node .SUPER_PROPERTY_ACCESS , 0 ) == 1 ) {
1006
+ call .putIntProp (Node .SUPER_PROPERTY_ACCESS , 1 );
1007
+ }
974
1008
TemplateLiteral templateLiteral = (TemplateLiteral ) node .getTemplateLiteral ();
975
1009
List <AstNode > elems = templateLiteral .getElements ();
976
1010
call .addChildToBack (templateLiteral );
@@ -1937,13 +1971,19 @@ private Node createPropertyGet(
1937
1971
ref .putIntProp (Node .OPTIONAL_CHAINING , 1 );
1938
1972
getRef .putIntProp (Node .OPTIONAL_CHAINING , 1 );
1939
1973
}
1974
+ if (target .getType () == Token .SUPER ) {
1975
+ getRef .putIntProp (Node .SUPER_PROPERTY_ACCESS , 1 );
1976
+ }
1940
1977
return getRef ;
1941
1978
}
1942
1979
1943
1980
Node node = new Node (Token .GETPROP , target , Node .newString (name ));
1944
1981
if (type == Token .QUESTION_DOT ) {
1945
1982
node .putIntProp (Node .OPTIONAL_CHAINING , 1 );
1946
1983
}
1984
+ if (target .getType () == Token .SUPER ) {
1985
+ node .putIntProp (Node .SUPER_PROPERTY_ACCESS , 1 );
1986
+ }
1947
1987
return node ;
1948
1988
}
1949
1989
Node elem = Node .newString (name );
@@ -2147,7 +2187,9 @@ private Node createAssignment(int assignType, Node left, Node right) {
2147
2187
int assignOp ;
2148
2188
switch (assignType ) {
2149
2189
case Token .ASSIGN :
2150
- return parser .simpleAssignment (left , right );
2190
+ {
2191
+ return propagateSuperFromLhs (parser .simpleAssignment (left , right ), left );
2192
+ }
2151
2193
case Token .ASSIGN_BITOR :
2152
2194
assignOp = Token .BITOR ;
2153
2195
break ;
@@ -2203,7 +2245,7 @@ private Node createAssignment(int assignType, Node left, Node right) {
2203
2245
{
2204
2246
Node op = new Node (assignOp , left , right );
2205
2247
Node lvalueLeft = Node .newString (Token .BINDNAME , left .getString ());
2206
- return new Node (Token .SETNAME , lvalueLeft , op );
2248
+ return propagateSuperFromLhs ( new Node (Token .SETNAME , lvalueLeft , op ), left );
2207
2249
}
2208
2250
case Token .GETPROP :
2209
2251
case Token .GETELEM :
@@ -2215,21 +2257,28 @@ private Node createAssignment(int assignType, Node left, Node right) {
2215
2257
2216
2258
Node opLeft = new Node (Token .USE_STACK );
2217
2259
Node op = new Node (assignOp , opLeft , right );
2218
- return new Node (type , obj , id , op );
2260
+ return propagateSuperFromLhs ( new Node (type , obj , id , op ), left );
2219
2261
}
2220
2262
case Token .GET_REF :
2221
2263
{
2222
2264
ref = left .getFirstChild ();
2223
2265
parser .checkMutableReference (ref );
2224
2266
Node opLeft = new Node (Token .USE_STACK );
2225
2267
Node op = new Node (assignOp , opLeft , right );
2226
- return new Node (Token .SET_REF_OP , ref , op );
2268
+ return propagateSuperFromLhs ( new Node (Token .SET_REF_OP , ref , op ), left );
2227
2269
}
2228
2270
}
2229
2271
2230
2272
throw Kit .codeBug ();
2231
2273
}
2232
2274
2275
+ private Node propagateSuperFromLhs (Node result , Node left ) {
2276
+ if (left .getIntProp (Node .SUPER_PROPERTY_ACCESS , 0 ) == 1 ) {
2277
+ result .putIntProp (Node .SUPER_PROPERTY_ACCESS , 1 );
2278
+ }
2279
+ return result ;
2280
+ }
2281
+
2233
2282
private static Node createUseLocal (Node localBlock ) {
2234
2283
if (Token .LOCAL_BLOCK != localBlock .getType ()) throw Kit .codeBug ();
2235
2284
Node result = new Node (Token .LOCAL_LOAD );
0 commit comments