Skip to content

Commit ae871fa

Browse files
committed
[GR-43064] Backport to 22.3: GR-42560, GR-42568, GR-42798, GR-43097.
PullRequest: js/2700
2 parents e08e780 + 00bcabb commit ae871fa

File tree

51 files changed

+1170
-384
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1170
-384
lines changed

graal-js/src/com.oracle.truffle.js.parser/src/com/oracle/truffle/js/parser/GraalJSEvaluator.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import java.util.Deque;
5353
import java.util.HashMap;
5454
import java.util.HashSet;
55-
import java.util.LinkedHashMap;
5655
import java.util.List;
5756
import java.util.Map;
5857
import java.util.Set;
@@ -259,7 +258,7 @@ private ScriptNode fakeScriptForModule(JSContext context, Source source) {
259258
JSModuleData parsedModule = parseModule(context, source);
260259
RootNode rootNode = new ModuleScriptRoot(context, parsedModule, source);
261260
JSFunctionData functionData = JSFunctionData.createCallOnly(context, rootNode.getCallTarget(), 0, Strings.EMPTY_STRING);
262-
return ScriptNode.fromFunctionData(context, functionData);
261+
return ScriptNode.fromFunctionData(functionData);
263262
}
264263

265264
private final class ModuleScriptRoot extends JavaScriptRootNode {
@@ -584,18 +583,17 @@ public JSDynamicObject getModuleNamespace(JSModuleRecord moduleRecord) {
584583

585584
assert moduleRecord.getStatus() != Status.Unlinked;
586585
Collection<TruffleString> exportedNames = getExportedNames(moduleRecord);
587-
List<Pair<TruffleString, ExportResolution>> unambiguousNames = new ArrayList<>();
586+
List<Map.Entry<TruffleString, ExportResolution>> unambiguousNames = new ArrayList<>();
588587
for (TruffleString exportedName : exportedNames) {
589588
ExportResolution resolution = resolveExport(moduleRecord, exportedName);
590589
if (resolution.isNull()) {
591590
throw Errors.createSyntaxError("Could not resolve export");
592591
} else if (!resolution.isAmbiguous()) {
593-
unambiguousNames.add(new Pair<>(exportedName, resolution));
592+
unambiguousNames.add(Map.entry(exportedName, resolution));
594593
}
595594
}
596-
Map<TruffleString, ExportResolution> sortedNames = new LinkedHashMap<>();
597-
unambiguousNames.stream().sorted((a, b) -> a.getFirst().compareCharsUTF16Uncached(b.getFirst())).forEachOrdered(p -> sortedNames.put(p.getFirst(), p.getSecond()));
598-
JSModuleNamespaceObject namespace = JSModuleNamespace.create(moduleRecord.getContext(), JSRealm.get(null), moduleRecord, sortedNames);
595+
unambiguousNames.sort((a, b) -> a.getKey().compareCharsUTF16Uncached(b.getKey()));
596+
JSModuleNamespaceObject namespace = JSModuleNamespace.create(moduleRecord.getContext(), JSRealm.get(null), moduleRecord, unambiguousNames);
599597
moduleRecord.setNamespace(namespace);
600598
return namespace;
601599
}
@@ -976,12 +974,12 @@ private static boolean occursExactlyOnce(JSModuleRecord moduleRecord, Collection
976974

977975
@Override
978976
public ScriptNode parseScript(JSContext context, Source source, ByteBuffer binary) {
979-
return ScriptNode.fromFunctionRoot(context, (FunctionRootNode) new BinarySnapshotProvider(binary).apply(NodeFactory.getInstance(context), context, source));
977+
return ScriptNode.fromFunctionRoot((FunctionRootNode) new BinarySnapshotProvider(binary).apply(NodeFactory.getInstance(context), context, source));
980978
}
981979

982980
@Override
983981
public ScriptNode parseScript(JSContext context, Source source, SnapshotProvider snapshotProvider) {
984-
return ScriptNode.fromFunctionRoot(context, (FunctionRootNode) snapshotProvider.apply(NodeFactory.getInstance(context), context, source));
982+
return ScriptNode.fromFunctionRoot((FunctionRootNode) snapshotProvider.apply(NodeFactory.getInstance(context), context, source));
985983
}
986984

987985
@Override

graal-js/src/com.oracle.truffle.js.parser/src/com/oracle/truffle/js/parser/GraalJSTranslator.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.Iterator;
5050
import java.util.List;
5151
import java.util.Objects;
52+
import java.util.function.Consumer;
5253
import java.util.function.Supplier;
5354
import java.util.function.UnaryOperator;
5455

@@ -114,7 +115,6 @@
114115
import com.oracle.truffle.js.nodes.NodeFactory.UnaryOperation;
115116
import com.oracle.truffle.js.nodes.ReadNode;
116117
import com.oracle.truffle.js.nodes.RepeatableNode;
117-
import com.oracle.truffle.js.nodes.ScriptNode;
118118
import com.oracle.truffle.js.nodes.access.ArrayLiteralNode;
119119
import com.oracle.truffle.js.nodes.access.CreateObjectNode;
120120
import com.oracle.truffle.js.nodes.access.DeclareEvalVariableNode;
@@ -185,6 +185,7 @@
185185
import com.oracle.truffle.js.runtime.JSRuntime;
186186
import com.oracle.truffle.js.runtime.Strings;
187187
import com.oracle.truffle.js.runtime.builtins.JSFunctionData;
188+
import com.oracle.truffle.js.runtime.objects.ScriptOrModule;
188189
import com.oracle.truffle.js.runtime.objects.Undefined;
189190
import com.oracle.truffle.js.runtime.util.InternalSlotId;
190191
import com.oracle.truffle.js.runtime.util.Pair;
@@ -222,6 +223,7 @@ public Object execute(VirtualFrame frame) {
222223
protected final int sourceLength;
223224
protected final int prologLength;
224225
private final boolean isParentStrict;
226+
private Consumer<ScriptOrModule> scriptOrModuleResolver;
225227

226228
protected GraalJSTranslator(LexicalContext lc, NodeFactory factory, JSContext context, Source source, List<String> argumentNames, int prologLength, Environment environment,
227229
boolean isParentStrict) {
@@ -309,20 +311,18 @@ private JavaScriptNode createBlock(JavaScriptNode[] statements, boolean terminal
309311
}
310312
}
311313

312-
protected final ScriptNode translateScript(FunctionNode functionNode) {
313-
if (!functionNode.isScript()) {
314-
throw new IllegalArgumentException("root function node is not a script");
315-
}
316-
JSFunctionExpressionNode functionExpression = (JSFunctionExpressionNode) transformFunction(functionNode);
317-
return ScriptNode.fromFunctionData(context, functionExpression.getFunctionData());
318-
}
319-
320314
protected final JavaScriptNode transformFunction(FunctionNode functionNode) {
321315
return transform(functionNode);
322316
}
323317

324318
protected abstract GraalJSTranslator newTranslator(Environment env, LexicalContext savedLC);
325319

320+
protected final void resolveScriptOrModule(ScriptOrModule scriptOrModule) {
321+
if (scriptOrModuleResolver != null) {
322+
scriptOrModuleResolver.accept(scriptOrModule);
323+
}
324+
}
325+
326326
// ---
327327

328328
@Override
@@ -515,6 +515,10 @@ private FunctionRootNode createFunctionRoot(FunctionNode functionNode, JSFunctio
515515
FunctionRootNode functionRoot = factory.createFunctionRootNode(functionBody, environment.getFunctionFrameDescriptor().toFrameDescriptor(), functionData, functionSourceSection,
516516
currentFunction.getInternalFunctionName());
517517

518+
if (currentFunction.isScriptOrModule()) {
519+
scriptOrModuleResolver = currentFunction.getScriptOrModuleResolver();
520+
}
521+
518522
if (JSConfig.PrintAst) {
519523
printAST(functionRoot);
520524
}
@@ -529,6 +533,8 @@ private FunctionRootNode createFunctionRoot(FunctionNode functionNode, JSFunctio
529533
* @see #splitModuleBodyAtYield
530534
*/
531535
private FunctionRootNode createModuleRoot(FunctionNode functionNode, JSFunctionData functionData, FunctionEnvironment currentFunction, JavaScriptNode body) {
536+
scriptOrModuleResolver = currentFunction.getScriptOrModuleResolver();
537+
532538
if (JSConfig.PrintAst) {
533539
printAST(body);
534540
}
@@ -1859,10 +1865,7 @@ private JavaScriptNode getActiveModule() {
18591865
}
18601866

18611867
private JavaScriptNode getActiveScriptOrModule() {
1862-
if (lc.inModule()) {
1863-
return getActiveModule();
1864-
}
1865-
return null;
1868+
return environment.findActiveScriptOrModule().createReadNode();
18661869
}
18671870

18681871
private VarRef findScopeVar(TruffleString name, boolean skipWith) {
@@ -2626,9 +2629,7 @@ private JavaScriptNode initializeInstanceElements(JavaScriptNode thisValueNode)
26262629

26272630
private JavaScriptNode createCallEvalNode(JavaScriptNode function, JavaScriptNode[] args) {
26282631
assert (currentFunction().isGlobal() || currentFunction().isStrictMode() || currentFunction().isDirectEval()) || currentFunction().isDynamicallyScoped();
2629-
for (FunctionEnvironment func = currentFunction(); func.getParentFunction() != null; func = func.getParentFunction()) {
2630-
func.setNeedsParentFrame(true);
2631-
}
2632+
currentFunction().prepareForDirectEval();
26322633
return EvalNode.create(context, function, args, createThisNodeUnchecked(), new DirectEvalContext(lc.getCurrentScope(), environment, lc.getCurrentClass()),
26332634
environment.getCurrentBlockScopeSlot());
26342635
}
@@ -2648,10 +2649,11 @@ private JavaScriptNode createCallDirectSuper(JavaScriptNode function, JavaScript
26482649

26492650
private JavaScriptNode createImportCallNode(JavaScriptNode[] args) {
26502651
assert args.length == 1 || (context.getContextOptions().isImportAssertions() && args.length == 2);
2652+
JavaScriptNode activeScriptOrModule = getActiveScriptOrModule();
26512653
if (context.getContextOptions().isImportAssertions() && args.length == 2) {
2652-
return factory.createImportCall(context, args[0], getActiveScriptOrModule(), args[1]);
2654+
return factory.createImportCall(context, args[0], activeScriptOrModule, args[1]);
26532655
}
2654-
return factory.createImportCall(context, args[0], getActiveScriptOrModule());
2656+
return factory.createImportCall(context, args[0], activeScriptOrModule);
26552657
}
26562658

26572659
@Override

graal-js/src/com.oracle.truffle.js.parser/src/com/oracle/truffle/js/parser/JavaScriptTranslator.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.truffle.js.runtime.JSContext;
5656
import com.oracle.truffle.js.runtime.builtins.JSFunctionData;
5757
import com.oracle.truffle.js.runtime.objects.JSModuleData;
58+
import com.oracle.truffle.js.runtime.objects.ScriptOrModule;
5859

5960
public final class JavaScriptTranslator extends GraalJSTranslator {
6061

@@ -125,16 +126,30 @@ public static ScriptNode translateFunction(NodeFactory factory, JSContext contex
125126
public static JSModuleData translateModule(NodeFactory factory, JSContext context, Source source) {
126127
FunctionNode parsed = GraalJSParserHelper.parseModule(context, source, context.getParserOptions().putStrict(true));
127128
JavaScriptTranslator translator = new JavaScriptTranslator(factory, context, source, 0, null, true);
128-
JSFunctionData functionData = translator.translateModule(parsed);
129-
return new JSModuleData(parsed.getModule(), source, functionData, functionData.getRootNode().getFrameDescriptor());
129+
return translator.translateModule(parsed);
130130
}
131131

132-
private JSFunctionData translateModule(com.oracle.js.parser.ir.FunctionNode functionNode) {
132+
private ScriptNode translateScript(FunctionNode functionNode) {
133+
if (!functionNode.isScript()) {
134+
throw new IllegalArgumentException("root function node is not a script");
135+
}
136+
JSFunctionExpressionNode functionExpression = (JSFunctionExpressionNode) transformFunction(functionNode);
137+
JSFunctionData functionData = functionExpression.getFunctionData();
138+
ScriptNode script = ScriptNode.fromFunctionData(functionData);
139+
ScriptOrModule scriptOrModule = factory.createScriptOrModule(context, source);
140+
resolveScriptOrModule(scriptOrModule);
141+
return script;
142+
}
143+
144+
private JSModuleData translateModule(com.oracle.js.parser.ir.FunctionNode functionNode) {
133145
if (!functionNode.isModule()) {
134146
throw new IllegalArgumentException("root function node is not a module");
135147
}
136148
JSFunctionExpressionNode functionExpression = (JSFunctionExpressionNode) transformFunction(functionNode);
137-
return functionExpression.getFunctionData();
149+
JSFunctionData functionData = functionExpression.getFunctionData();
150+
JSModuleData moduleData = new JSModuleData(functionNode.getModule(), source, functionData, functionData.getRootNode().getFrameDescriptor());
151+
resolveScriptOrModule(moduleData);
152+
return moduleData;
138153
}
139154

140155
@Override

graal-js/src/com.oracle.truffle.js.parser/src/com/oracle/truffle/js/parser/env/Environment.java

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -521,15 +521,6 @@ public VarRef createTempVar() {
521521

522522
public VarRef findTempVar(JSFrameSlot var) {
523523
return new VarRef(var.getIdentifier()) {
524-
@Override
525-
public boolean isGlobal() {
526-
return false;
527-
}
528-
529-
@Override
530-
public boolean isFunctionLocal() {
531-
return false;
532-
}
533524

534525
@Override
535526
public JSFrameSlot getFrameSlot() {
@@ -657,13 +648,17 @@ protected VarRef(Object name) {
657648

658649
public abstract JavaScriptNode createWriteNode(JavaScriptNode rhs);
659650

660-
public abstract boolean isFunctionLocal();
651+
public boolean isFunctionLocal() {
652+
return false;
653+
}
661654

662655
public boolean isFrameVar() {
663656
return getFrameSlot() != null;
664657
}
665658

666-
public abstract boolean isGlobal();
659+
public boolean isGlobal() {
660+
return false;
661+
}
667662

668663
public boolean isConst() {
669664
return false;
@@ -952,11 +947,6 @@ public JavaScriptNode createWriteNode(JavaScriptNode rhs) {
952947
return factory.createWriteProperty(factory.createGlobalObject(), getName(), rhs, context, isStrictMode(), isGlobal(), required);
953948
}
954949

955-
@Override
956-
public boolean isFunctionLocal() {
957-
return false;
958-
}
959-
960950
@Override
961951
public JSFrameSlot getFrameSlot() {
962952
return null;
@@ -1168,14 +1158,30 @@ public JavaScriptNode createDeleteNode() {
11681158
return factory.createConstantBoolean(false);
11691159
}
11701160

1161+
}
1162+
1163+
static final class ActiveScriptOrModuleRef extends VarRef {
1164+
1165+
private final FunctionEnvironment resolvedEnv;
1166+
1167+
ActiveScriptOrModuleRef(FunctionEnvironment resolvedEnv) {
1168+
super(null);
1169+
this.resolvedEnv = resolvedEnv;
1170+
}
1171+
11711172
@Override
1172-
public boolean isFunctionLocal() {
1173-
return false;
1173+
public JavaScriptNode createReadNode() {
1174+
return resolvedEnv.getActiveScriptOrModule();
11741175
}
11751176

11761177
@Override
1177-
public boolean isGlobal() {
1178-
return false;
1178+
public JavaScriptNode createWriteNode(JavaScriptNode rhs) {
1179+
throw Errors.shouldNotReachHere();
1180+
}
1181+
1182+
@Override
1183+
public JavaScriptNode createDeleteNode() {
1184+
throw Errors.shouldNotReachHere();
11791185
}
11801186
}
11811187

@@ -1196,22 +1202,35 @@ public JavaScriptNode createWriteNode(JavaScriptNode rhs) {
11961202
}
11971203

11981204
public VarRef findActiveModule() {
1205+
return findActiveScriptOrModule(true);
1206+
}
1207+
1208+
public VarRef findActiveScriptOrModule() {
1209+
return findActiveScriptOrModule(false);
1210+
}
1211+
1212+
private VarRef findActiveScriptOrModule(boolean sourceTextModule) {
11991213
Environment current = this;
12001214
int frameLevel = 0;
12011215
int scopeLevel = 0;
12021216
while (current.getParent() != null) {
12031217
if (current instanceof FunctionEnvironment) {
1204-
assert !((FunctionEnvironment) current).isModule();
1205-
((FunctionEnvironment) current).setNeedsParentFrame(true);
1218+
if (((FunctionEnvironment) current).isScriptOrModule()) {
1219+
break;
1220+
}
1221+
if (sourceTextModule) {
1222+
((FunctionEnvironment) current).setNeedsParentFrame(true);
1223+
}
12061224
frameLevel++;
12071225
scopeLevel = 0;
12081226
} else if (current instanceof BlockEnvironment && current.hasScopeFrame()) {
12091227
scopeLevel++;
12101228
}
12111229
current = current.getParent();
12121230
}
1213-
assert current instanceof FunctionEnvironment && ((FunctionEnvironment) current).isModule();
1214-
return new ActiveModuleRef(scopeLevel, frameLevel, current);
1231+
FunctionEnvironment scriptOrModuleEnv = (FunctionEnvironment) current;
1232+
assert !sourceTextModule || scriptOrModuleEnv.isModule();
1233+
return sourceTextModule ? new ActiveModuleRef(scopeLevel, frameLevel, scriptOrModuleEnv) : new ActiveScriptOrModuleRef(scriptOrModuleEnv);
12151234
}
12161235

12171236
protected String toStringImpl(@SuppressWarnings("unused") Map<String, Integer> state) {

0 commit comments

Comments
 (0)