Skip to content

Commit b0e49e0

Browse files
authored
Fix the order of evaluation of various operations in compiled mode
* Fix for compiled bitwise operation evaluation order. * Fix order of evaluation for arithmetic operations. * Fix order of evaluation of unisgned right shift.
1 parent 2a20db8 commit b0e49e0

File tree

2 files changed

+22
-23
lines changed

2 files changed

+22
-23
lines changed

rhino/src/main/java/org/mozilla/javascript/optimizer/BodyCodegen.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3860,8 +3860,12 @@ private void visitArithmetic(Node node, int type, Node child, Node parent) {
38603860
}
38613861
} else {
38623862
generateExpression(child, node);
3863-
if (!isArithmeticNode(child)) addObjectToNumeric();
38643863
generateExpression(child.getNext(), node);
3864+
if (!isArithmeticNode(child)) {
3865+
cfw.add(ByteCode.SWAP);
3866+
addObjectToNumeric();
3867+
cfw.add(ByteCode.SWAP);
3868+
}
38653869
if (!isArithmeticNode(child.getNext())) addObjectToNumeric();
38663870

38673871
switch (type) {
@@ -3931,8 +3935,11 @@ private void visitBitOp(Node node, int type, Node child) {
39313935
// that we can return a 32-bit unsigned value, and call
39323936
// toUint32 instead of toInt32.
39333937
if (type == Token.URSH) {
3934-
addDynamicInvoke("MATH:TOUINT32", Signatures.MATH_TO_UINT32);
39353938
generateExpression(child.getNext(), node);
3939+
cfw.add(ByteCode.SWAP);
3940+
addDynamicInvoke("MATH:TOUINT32", Signatures.MATH_TO_UINT32);
3941+
cfw.add(ByteCode.DUP2_X1);
3942+
cfw.add(ByteCode.POP2);
39363943
addDynamicInvoke("MATH:TOINT32", Signatures.MATH_TO_INT32);
39373944
// Looks like we need to explicitly mask the shift to 5 bits -
39383945
// LUSHR takes 6 bits.
@@ -3944,8 +3951,10 @@ private void visitBitOp(Node node, int type, Node child) {
39443951
return;
39453952
}
39463953
if (childNumberFlag == -1) {
3947-
addObjectToNumeric();
39483954
generateExpression(child.getNext(), node);
3955+
cfw.add(ByteCode.SWAP);
3956+
addObjectToNumeric();
3957+
cfw.add(ByteCode.SWAP);
39493958
addObjectToNumeric();
39503959

39513960
switch (type) {

tests/testsrc/test262.properties

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3994,16 +3994,13 @@ language/expressions/async-arrow-function 42/60 (70.0%)
39943994

39953995
~language/expressions/await
39963996

3997-
language/expressions/bitwise-and 1/30 (3.33%)
3998-
order-of-evaluation.js compiled
3997+
language/expressions/bitwise-and 0/30 (0.0%)
39993998

40003999
language/expressions/bitwise-not 0/16 (0.0%)
40014000

4002-
language/expressions/bitwise-or 1/30 (3.33%)
4003-
order-of-evaluation.js compiled
4001+
language/expressions/bitwise-or 0/30 (0.0%)
40044002

4005-
language/expressions/bitwise-xor 1/30 (3.33%)
4006-
order-of-evaluation.js compiled
4003+
language/expressions/bitwise-xor 0/30 (0.0%)
40074004

40084005
language/expressions/call 34/92 (36.96%)
40094006
eval-realm-indirect.js non-strict
@@ -4191,8 +4188,7 @@ language/expressions/delete 6/69 (8.7%)
41914188
super-property-null-base.js {unsupported: [class]}
41924189
super-property-uninitialized-this.js
41934190

4194-
language/expressions/division 1/45 (2.22%)
4195-
order-of-evaluation.js compiled
4191+
language/expressions/division 0/45 (0.0%)
41964192

41974193
language/expressions/does-not-equals 0/38 (0.0%)
41984194

@@ -4571,8 +4567,7 @@ language/expressions/instanceof 5/43 (11.63%)
45714567
symbol-hasinstance-not-callable.js
45724568
symbol-hasinstance-to-boolean.js
45734569

4574-
language/expressions/left-shift 1/45 (2.22%)
4575-
order-of-evaluation.js compiled
4570+
language/expressions/left-shift 0/45 (0.0%)
45764571

45774572
language/expressions/less-than 0/45 (0.0%)
45784573

@@ -4630,11 +4625,9 @@ language/expressions/logical-or 1/18 (5.56%)
46304625

46314626
~language/expressions/member-expression 1/1 (100.0%)
46324627

4633-
language/expressions/modulus 1/40 (2.5%)
4634-
order-of-evaluation.js compiled
4628+
language/expressions/modulus 0/40 (0.0%)
46354629

4636-
language/expressions/multiplication 1/40 (2.5%)
4637-
order-of-evaluation.js compiled
4630+
language/expressions/multiplication 0/40 (0.0%)
46384631

46394632
language/expressions/new 22/59 (37.29%)
46404633
spread-err-mult-err-expr-throws.js
@@ -5422,15 +5415,13 @@ language/expressions/property-accessors 0/21 (0.0%)
54225415

54235416
language/expressions/relational 0/1 (0.0%)
54245417

5425-
language/expressions/right-shift 1/37 (2.7%)
5426-
order-of-evaluation.js compiled
5418+
language/expressions/right-shift 0/37 (0.0%)
54275419

54285420
language/expressions/strict-does-not-equals 0/30 (0.0%)
54295421

54305422
language/expressions/strict-equals 0/30 (0.0%)
54315423

5432-
language/expressions/subtraction 1/38 (2.63%)
5433-
order-of-evaluation.js compiled
5424+
language/expressions/subtraction 0/38 (0.0%)
54345425

54355426
language/expressions/super 73/94 (77.66%)
54365427
call-arg-evaluation-err.js {unsupported: [class]}
@@ -5524,9 +5515,8 @@ language/expressions/unary-minus 0/14 (0.0%)
55245515

55255516
language/expressions/unary-plus 0/17 (0.0%)
55265517

5527-
language/expressions/unsigned-right-shift 2/45 (4.44%)
5518+
language/expressions/unsigned-right-shift 1/45 (2.22%)
55285519
bigint-toprimitive.js
5529-
order-of-evaluation.js compiled
55305520

55315521
language/expressions/void 0/9 (0.0%)
55325522

0 commit comments

Comments
 (0)