Skip to content

Commit 6f13441

Browse files
committed
Address some MR comments
- add feature flag - restructure tests accordingly - add factory method for InvokeCustomMatcherOrThrowNode - resolve some todos (better error msgs, ...) - ...
1 parent e855928 commit 6f13441

File tree

17 files changed

+432
-244
lines changed

17 files changed

+432
-244
lines changed

graal-js/src/com.oracle.js.parser/src/com/oracle/js/parser/Parser.java

Lines changed: 60 additions & 94 deletions
Large diffs are not rendered by default.

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@
153153
import com.oracle.truffle.js.nodes.control.SequenceNode;
154154
import com.oracle.truffle.js.nodes.control.StatementNode;
155155
import com.oracle.truffle.js.nodes.control.SuspendNode;
156-
import com.oracle.truffle.js.nodes.extractor.InvokeCustomMatcherOrThrowNode;
157156
import com.oracle.truffle.js.nodes.function.AbstractFunctionArgumentsNode;
158157
import com.oracle.truffle.js.nodes.function.BlockScopeNode;
159158
import com.oracle.truffle.js.nodes.function.EvalNode;
@@ -2849,9 +2848,8 @@ private JavaScriptNode transformAssignmentImpl(Expression assignmentExpression,
28492848
}
28502849
// fall through
28512850
case IDENT:
2852-
// todo-lw: call node :(
28532851
if (lhsExpression instanceof CallNode) {
2854-
assignedNode = transformAssignmentExtractor((CallNode) lhsExpression, assignedValue, binaryOp, returnOldValue, convertLHSToNumeric, initializationAssignment);
2852+
assignedNode = transformAssignmentExtractor((CallNode) lhsExpression, assignedValue, initializationAssignment);
28552853
} else {
28562854
assignedNode = transformAssignmentIdent((IdentNode) lhsExpression, assignedValue, binaryOp, returnOldValue, convertLHSToNumeric, initializationAssignment);
28572855
}
@@ -3066,10 +3064,10 @@ private JavaScriptNode transformDestructuringArrayAssignment(Expression lhsExpre
30663064
LiteralNode.ArrayLiteralNode arrayLiteralNode = (LiteralNode.ArrayLiteralNode) lhsExpression;
30673065
List<Expression> elementExpressions = arrayLiteralNode.getElementExpressions();
30683066

3069-
return this.transformDestructuringArrayAssignment(elementExpressions, getIterator, valueTempVar, initializationAssignment);
3067+
return this.transformDestructuringArrayAssignment(elementExpressions, getIterator, valueTempVar.createReadNode(), initializationAssignment);
30703068
}
30713069

3072-
private JavaScriptNode transformDestructuringArrayAssignment(List<Expression> elementExpressions, JavaScriptNode getIterator, VarRef valueTempVar, boolean initializationAssignment) {
3070+
private JavaScriptNode transformDestructuringArrayAssignment(List<Expression> elementExpressions, JavaScriptNode getIterator, JavaScriptNode valueTempNode, boolean initializationAssignment) {
30733071
JavaScriptNode[] initElements = javaScriptNodeArray(elementExpressions.size());
30743072
VarRef iteratorTempVar = environment.createTempVar();
30753073
// By default, we use the hint to track the type of iterator.
@@ -3094,7 +3092,6 @@ private JavaScriptNode transformDestructuringArrayAssignment(List<Expression> el
30943092
if (init != null) {
30953093
rhsNode = factory.createNotUndefinedOr(rhsNode, transform(init));
30963094
}
3097-
// todo-lw: this change is kind of sus
30983095
if (lhsExpr != null && (lhsExpr.isTokenType(TokenType.SPREAD_ARRAY) || lhsExpr.isTokenType(TokenType.SPREAD_ARGUMENT))) {
30993096
rhsNode = factory.createIteratorToArray(context, iteratorTempVar.createReadNode());
31003097
lhsExpr = ((UnaryNode) lhsExpr).getExpression();
@@ -3106,12 +3103,10 @@ private JavaScriptNode transformDestructuringArrayAssignment(List<Expression> el
31063103
}
31073104
}
31083105
JavaScriptNode closeIfNotDone = factory.createIteratorCloseIfNotDone(context, createBlock(initElements), iteratorTempVar.createReadNode());
3109-
return factory.createExprBlock(initIteratorTempVar, closeIfNotDone, valueTempVar.createReadNode());
3106+
return factory.createExprBlock(initIteratorTempVar, closeIfNotDone, valueTempNode);
31103107
}
31113108

3112-
private JavaScriptNode transformAssignmentExtractor(CallNode fakeCallNode, JavaScriptNode assignedValue, BinaryOperation binaryOp, boolean returnOldValue, boolean convertToNumeric, boolean initializationAssignment) {
3113-
// todo-lw: call node :(
3114-
3109+
private JavaScriptNode transformAssignmentExtractor(CallNode fakeCallNode, JavaScriptNode assignedValue, boolean initializationAssignment) {
31153110
final var functionExpr = fakeCallNode.getFunction();
31163111
final var function = transform(functionExpr);
31173112

@@ -3121,11 +3116,12 @@ private JavaScriptNode transformAssignmentExtractor(CallNode fakeCallNode, JavaS
31213116
receiver = transform(accessNode.getBase());
31223117
}
31233118

3124-
final var invokeCustomMatcherOrThrowNode = InvokeCustomMatcherOrThrowNode.create(context, function, assignedValue, receiver);
3119+
final var invokeCustomMatcherOrThrowNode = factory.createInvokeCustomMatcherOrThrow(context, function, assignedValue, receiver);
31253120

31263121
final var args = fakeCallNode.getArgs();
31273122
VarRef valueTempVar = environment.createTempVar();
3128-
return this.transformDestructuringArrayAssignment(args, invokeCustomMatcherOrThrowNode, valueTempVar, initializationAssignment);
3123+
return this.transformDestructuringArrayAssignment(args, invokeCustomMatcherOrThrowNode,
3124+
createBlock(valueTempVar.createWriteNode(assignedValue), valueTempVar.createReadNode()), initializationAssignment);
31293125
}
31303126

31313127
private JavaScriptNode transformDestructuringObjectAssignment(Expression lhsExpression, JavaScriptNode assignedValue, boolean initializationAssignment) {

graal-js/src/com.oracle.truffle.js.test/js/extractors/as-default.js renamed to graal-js/src/com.oracle.truffle.js.test/js-extractors/as-default.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load('../assert.js');
1+
load('../js/assert.js');
22

33
const DateExtractor = {
44
[Symbol.customMatcher](value) {

graal-js/src/com.oracle.truffle.js.test/js/extractors/assignment.js renamed to graal-js/src/com.oracle.truffle.js.test/js-extractors/assignment-binding.js

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load('../assert.js');
1+
load('../js/assert.js');
22

33
{
44
class C {
@@ -15,10 +15,26 @@ load('../assert.js');
1515

1616
const subject = new C("data");
1717

18-
let x;
19-
C(x) = subject;
18+
{
19+
let x;
20+
C(x) = subject;
21+
assertSame("data", x);
22+
}
23+
24+
{
25+
let C(x) = subject;
26+
assertSame("data", x);
27+
}
28+
29+
{
30+
var C(x) = subject;
31+
assertSame("data", x);
32+
}
2033

21-
assertSame(x, "data");
34+
{
35+
const C(x) = subject;
36+
assertSame("data", x);
37+
}
2238
}
2339

2440
{
@@ -34,11 +50,20 @@ load('../assert.js');
3450

3551
const subject = new C({ x: 1, y: 2 });
3652

37-
let x, y;
38-
C({ x, y }) = subject;
53+
{
54+
let x, y;
55+
C({x, y}) = subject;
56+
57+
assertSame(1, x);
58+
assertSame(2, y);
59+
}
60+
61+
{
62+
let C({x, y}) = subject;
3963

40-
assertSame(x, 1);
41-
assertSame(y, 2);
64+
assertSame(1, x);
65+
assertSame(2, y);
66+
}
4267
}
4368

4469
{
@@ -56,9 +81,18 @@ load('../assert.js');
5681

5782
const subject = new C(undefined, 2);
5883

59-
const C(x = -1, y) = subject;
60-
assertSame(x, -1);
61-
assertSame(y, 2);
84+
{
85+
let x = -1, y = 100;
86+
C(x = -1, y) = subject;
87+
assertSame(-1, x);
88+
assertSame(2, y);
89+
}
90+
91+
{
92+
const C(x = -1, y) = subject;
93+
assertSame(-1, x);
94+
assertSame(2, y);
95+
}
6296
}
6397

6498
{
@@ -80,7 +114,22 @@ load('../assert.js');
80114

81115
const subject = new C(1, 2, 3);
82116

83-
const C(x, ...y) = subject;
84-
assertSame(x, 1);
85-
assertSameContent(y, [2, 3]);
117+
{
118+
let x, y;
119+
C(x, ...y) = subject;
120+
assertSame(1, x);
121+
assertSameContent([2, 3], y);
122+
}
123+
124+
{
125+
const C(x, ...y) = subject;
126+
assertSame(1, x);
127+
assertSameContent([2, 3], y);
128+
}
129+
130+
{
131+
assertSame(subject, C() = subject)
132+
assertSame(subject, C(x) = subject)
133+
assertSame(subject, C(x, ...y) = subject)
134+
}
86135
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
load('../js/assert.js');
2+
3+
{
4+
class C {
5+
#data;
6+
7+
constructor(data) {
8+
this.#data = data;
9+
}
10+
11+
static [Symbol.customMatcher](subject) {
12+
return undefined;
13+
}
14+
}
15+
16+
const subject = new C("data");
17+
18+
try {
19+
const C(x) = subject;
20+
assertTrue(false);
21+
} catch (e) {
22+
// ensure a meaningful error message is thrown
23+
assertTrue(e.message.includes("customMatcher"));
24+
}
25+
}

graal-js/src/com.oracle.truffle.js.test/js/extractors/nested.js renamed to graal-js/src/com.oracle.truffle.js.test/js-extractors/nested.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load('../assert.js');
1+
load('../js/assert.js');
22

33
class C {
44
#data1;
@@ -25,3 +25,9 @@ const subject = new C(new D("data"));
2525
const C(D(x)) = subject;
2626

2727
assertSame(x, "data");
28+
29+
const { a: C(D(y)) } = { a: subject };
30+
assertSame(y, "data");
31+
32+
const { a: { b: C(D(z)) } } = { a: { b: subject } };
33+
assertSame(z, "data");``

graal-js/src/com.oracle.truffle.js.test/js/extractors/object.js renamed to graal-js/src/com.oracle.truffle.js.test/js-extractors/object.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load('../assert.js');
1+
load('../js/assert.js');
22

33
const MapExtractor = {
44
[Symbol.customMatcher](map) {

graal-js/src/com.oracle.truffle.js.test/js/extractors/receiver.js renamed to graal-js/src/com.oracle.truffle.js.test/js-extractors/receiver.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load('../assert.js');
1+
load('../js/assert.js');
22

33
class C {
44
#f;

graal-js/src/com.oracle.truffle.js.test/js/extractors/regexp.js renamed to graal-js/src/com.oracle.truffle.js.test/js-extractors/regexp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load('../assert.js');
1+
load('../js/assert.js');
22

33
// potentially built-in as part of Pattern Matching
44
RegExp.prototype[Symbol.customMatcher] = function (value) {

graal-js/src/com.oracle.truffle.js.test/js/extractors/binding.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)