Skip to content

Commit 00ec1f4

Browse files
committed
[GR-33279] Avoiding a potential NPE from NativeFunctionRootNode.getName().
PullRequest: js/2150
2 parents 4f4b578 + fb053db commit 00ec1f4

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/GraalJSAccess.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -1747,16 +1747,22 @@ public Object functionTemplateGetFunction(Object realm, Object templateObj) {
17471747

17481748
private DynamicObject functionTemplateCreateCallback(JSContext context, JSRealm realm, FunctionTemplate template) {
17491749
CompilerAsserts.neverPartOfCompilation("do not create function template in compiled code");
1750-
JSOrdinary instanceLayout = template.getInstanceTemplate().getInternalFieldCount() > 0 ? JSOrdinary.INTERNAL_FIELD_INSTANCE : JSOrdinary.INSTANCE;
1751-
JSFunctionData functionData = JSFunctionData.create(context, template.getLength(), template.getClassName(), template.getPrototypeTemplate() != null, false, false, false);
1752-
CallTarget callTarget = Truffle.getRuntime().createCallTarget(new ExecuteNativeFunctionNode.NativeFunctionRootNode(this, context, template, false, false));
1753-
CallTarget newCallTarget = Truffle.getRuntime().createCallTarget(new ExecuteNativeFunctionNode.NativeFunctionRootNode(this, context, template, true, false));
1754-
CallTarget newTargetCallTarget = Truffle.getRuntime().createCallTarget(new ExecuteNativeFunctionNode.NativeFunctionRootNode(this, context, template, true, true));
1755-
CallTarget constructTarget = Truffle.getRuntime().createCallTarget(ConstructorRootNode.create(functionData, newCallTarget, false, instanceLayout));
1756-
CallTarget constructNewTarget = Truffle.getRuntime().createCallTarget(ConstructorRootNode.create(functionData, newTargetCallTarget, true, instanceLayout));
1757-
functionData.setCallTarget(callTarget);
1758-
functionData.setConstructTarget(constructTarget);
1759-
functionData.setConstructNewTarget(constructNewTarget);
1750+
1751+
JSFunctionData functionData = template.getFunctionData();
1752+
if (functionData == null) {
1753+
JSOrdinary instanceLayout = template.getInstanceTemplate().getInternalFieldCount() > 0 ? JSOrdinary.INTERNAL_FIELD_INSTANCE : JSOrdinary.INSTANCE;
1754+
functionData = JSFunctionData.create(context, template.getLength(), template.getClassName(), template.getPrototypeTemplate() != null, false, false, false);
1755+
CallTarget callTarget = Truffle.getRuntime().createCallTarget(new ExecuteNativeFunctionNode.NativeFunctionRootNode(this, context, template, false, false));
1756+
CallTarget newCallTarget = Truffle.getRuntime().createCallTarget(new ExecuteNativeFunctionNode.NativeFunctionRootNode(this, context, template, true, false));
1757+
CallTarget newTargetCallTarget = Truffle.getRuntime().createCallTarget(new ExecuteNativeFunctionNode.NativeFunctionRootNode(this, context, template, true, true));
1758+
CallTarget constructTarget = Truffle.getRuntime().createCallTarget(ConstructorRootNode.create(functionData, newCallTarget, false, instanceLayout));
1759+
CallTarget constructNewTarget = Truffle.getRuntime().createCallTarget(ConstructorRootNode.create(functionData, newTargetCallTarget, true, instanceLayout));
1760+
functionData.setCallTarget(callTarget);
1761+
functionData.setConstructTarget(constructTarget);
1762+
functionData.setConstructNewTarget(constructNewTarget);
1763+
template.setFunctionData(functionData);
1764+
}
1765+
17601766
DynamicObject functionObject = JSFunction.create(realm, functionData);
17611767
template.setFunctionObject(realm, functionObject);
17621768

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/info/FunctionTemplate.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -43,6 +43,7 @@
4343
import com.oracle.truffle.api.object.DynamicObject;
4444
import com.oracle.truffle.api.object.HiddenKey;
4545
import com.oracle.truffle.js.runtime.JSRealm;
46+
import com.oracle.truffle.js.runtime.builtins.JSFunctionData;
4647
import com.oracle.truffle.trufflenode.GraalJSAccess;
4748

4849
/**
@@ -64,6 +65,7 @@ public final class FunctionTemplate {
6465
private FunctionTemplate parent;
6566
private String className = "";
6667
private boolean readOnlyPrototype;
68+
private JSFunctionData functionData;
6769
private DynamicObject functionObj;
6870
private final boolean singleFunctionTemplate;
6971

@@ -91,6 +93,14 @@ public ObjectTemplate getPrototypeTemplate() {
9193
return prototypeTemplate;
9294
}
9395

96+
public void setFunctionData(JSFunctionData functionData) {
97+
this.functionData = functionData;
98+
}
99+
100+
public JSFunctionData getFunctionData() {
101+
return functionData;
102+
}
103+
94104
public void setFunctionObject(JSRealm realm, DynamicObject functionObj) {
95105
if (singleFunctionTemplate) {
96106
this.functionObj = functionObj;

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/node/ExecuteNativeFunctionNode.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public Object execute(VirtualFrame frame) {
345345

346346
@Override
347347
public String getName() {
348-
return JSFunction.getFunctionData(template.getFunctionObject(getRealm())).getName();
348+
return template.getFunctionData().getName();
349349
}
350350

351351
@Override

0 commit comments

Comments
 (0)