Changeset 203499 in webkit
- Timestamp:
- Jul 21, 2016, 12:33:28 AM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 9 added
- 23 edited
- 2 copied
-
ChangeLog (modified) (1 diff)
-
bytecode/BytecodeList.json (modified) (1 diff)
-
bytecode/BytecodeUseDef.h (modified) (2 diffs)
-
bytecode/CodeBlock.cpp (modified) (1 diff)
-
bytecompiler/NodesCodegen.cpp (modified) (1 diff)
-
dfg/DFGByteCodeParser.cpp (modified) (1 diff)
-
dfg/DFGCapabilities.cpp (modified) (1 diff)
-
jit/JIT.cpp (modified) (1 diff)
-
jit/JIT.h (modified) (1 diff)
-
jit/JITArithmetic.cpp (modified) (1 diff)
-
llint/LowLevelInterpreter.asm (modified) (1 diff)
-
parser/ASTBuilder.h (modified) (8 diffs)
-
parser/Lexer.cpp (modified) (1 diff)
-
parser/NodeConstructors.h (modified) (1 diff)
-
parser/Nodes.h (modified) (2 diffs)
-
parser/Parser.cpp (modified) (4 diffs)
-
parser/ParserTokens.h (modified) (5 diffs)
-
parser/SyntaxChecker.h (modified) (1 diff)
-
runtime/CommonSlowPaths.cpp (modified) (1 diff)
-
runtime/CommonSlowPaths.h (modified) (1 diff)
-
tests/stress/math-pow-basics.js (modified) (5 diffs)
-
tests/stress/math-pow-nan-behaviors.js (modified) (3 diffs)
-
tests/stress/pow-basics.js (copied) (copied from trunk/Source/JavaScriptCore/tests/stress/math-pow-basics.js ) (12 diffs)
-
tests/stress/pow-coherency.js (added)
-
tests/stress/pow-evaluation-order.js (added)
-
tests/stress/pow-expects-update-expression-on-lhs.js (added)
-
tests/stress/pow-integer-exponent-fastpath.js (added)
-
tests/stress/pow-nan-behaviors.js (copied) (copied from trunk/Source/JavaScriptCore/tests/stress/math-pow-nan-behaviors.js ) (8 diffs)
-
tests/stress/pow-simple.js (added)
-
tests/stress/pow-stable-results.js (added)
-
tests/stress/pow-to-number-should-be-executed-in-code-side.js (added)
-
tests/stress/pow-with-constants.js (added)
-
tests/stress/pow-with-never-NaN-exponent.js (added)
-
tests/test262.yaml (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r203491 r203499 1 2016-07-20 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [ES7] Introduce exponentiation expression 4 https://bugs.webkit.org/show_bug.cgi?id=159969 5 6 Reviewed by Saam Barati. 7 8 This patch implements the exponentiation expression, e.g. `x ** y`. 9 The exponentiation expression is introduced in ECMA262 2016 and ECMA262 2016 10 is already released. So this is not the draft spec. 11 12 The exponentiation expression has 2 interesting points. 13 14 1. Right associative 15 16 To follow the Math expression, ** operator is right associative. 17 When we execute `x ** y ** z`, this is handled as `x ** (y ** z)`, not `(x ** y) ** z`. 18 This patch introduces the right associativity to the binary operator and handles it 19 in the operator precedence parser in Parser.cpp. 20 21 2. LHS of the exponentiation expression is UpdateExpression 22 23 ExponentiationExpression[Yield]: 24 UnaryExpression[?Yield] 25 UpdateExpression[?Yield] ** ExponentiationExpression[?Yield] 26 27 As we can see, the left hand side of the ExponentiationExpression is UpdateExpression, not UnaryExpression. 28 It means that `+x ** y` becomes a syntax error. This is intentional. Without superscript in JS, 29 `-x**y` is confusing between `-(x ** y)` and `(-x) ** y`. So ECMA262 intentionally avoids UnaryExpression here. 30 If we need to use a negated value, we need to write parentheses explicitly e.g. `(-x) ** y`. 31 In this patch, we ensure that the left hand side is not an unary expression by checking an operator in 32 parseBinaryExpression. This works since `**` has the highest operator precedence in the binary operators. 33 34 We introduce a new bytecode, op_pow. That simply works as similar as the other binary operators. 35 And it is converted to ArithPow in DFG and handled in DFG and FTL. 36 In this patch, we take the approach just introducing a new bytecode instead of calling Math.pow. 37 This is because we would like to execute ToNumber in the caller side, not in the callee (Math.pow) side. 38 And we don't want to compile ** into the following. 39 40 lhsNumber = to_number (lhs) 41 rhsNumber = to_number (rhs) 42 call Math.pow(lhsNumber, rhsNumber) 43 44 We ensure that this patch passes all the test262 tests related to the exponentiation expression. 45 46 The only sensitive part to the performance is the parser changes. 47 So we measured the code-load performance and it is neutral in my x64 Linux box (hanayamata). 48 49 Collected 30 samples per benchmark/VM, with 30 VM invocations per benchmark. Emitted a call to 50 gc() between sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used 51 the jsc-specific preciseTime() function to get microsecond-level timing. Reporting benchmark 52 execution times with 95% confidence intervals in milliseconds. 53 54 baseline patched 55 56 closure 0.60499+-0.00250 0.60180+-0.00244 57 jquery 7.89175+-0.02433 ? 7.91287+-0.04759 ? 58 59 <geometric> 2.18499+-0.00523 2.18207+-0.00689 might be 1.0013x faster 60 61 * bytecode/BytecodeList.json: 62 * bytecode/BytecodeUseDef.h: 63 (JSC::computeUsesForBytecodeOffset): 64 (JSC::computeDefsForBytecodeOffset): 65 * bytecode/CodeBlock.cpp: 66 (JSC::CodeBlock::dumpBytecode): 67 * bytecompiler/NodesCodegen.cpp: 68 (JSC::emitReadModifyAssignment): 69 * dfg/DFGByteCodeParser.cpp: 70 (JSC::DFG::ByteCodeParser::parseBlock): 71 * dfg/DFGCapabilities.cpp: 72 (JSC::DFG::capabilityLevel): 73 * jit/JIT.cpp: 74 (JSC::JIT::privateCompileMainPass): 75 * jit/JIT.h: 76 * jit/JITArithmetic.cpp: 77 (JSC::JIT::emit_op_pow): 78 * llint/LowLevelInterpreter.asm: 79 * parser/ASTBuilder.h: 80 (JSC::ASTBuilder::operatorStackShouldReduce): 81 (JSC::ASTBuilder::makePowNode): 82 (JSC::ASTBuilder::makeMultNode): 83 (JSC::ASTBuilder::makeDivNode): 84 (JSC::ASTBuilder::makeModNode): 85 (JSC::ASTBuilder::makeSubNode): 86 (JSC::ASTBuilder::makeBinaryNode): 87 (JSC::ASTBuilder::operatorStackHasHigherPrecedence): Deleted. 88 * parser/Lexer.cpp: 89 (JSC::Lexer<T>::lex): 90 * parser/NodeConstructors.h: 91 (JSC::PowNode::PowNode): 92 * parser/Nodes.h: 93 * parser/Parser.cpp: 94 (JSC::Parser<LexerType>::parseAssignmentExpression): 95 (JSC::isUnaryOpExcludingUpdateOp): 96 (JSC::Parser<LexerType>::parseBinaryExpression): 97 (JSC::isUnaryOp): Deleted. 98 * parser/ParserTokens.h: 99 (JSC::isUpdateOp): 100 (JSC::isUnaryOp): 101 * parser/SyntaxChecker.h: 102 (JSC::SyntaxChecker::operatorStackPop): 103 * runtime/CommonSlowPaths.cpp: 104 (JSC::SLOW_PATH_DECL): 105 * runtime/CommonSlowPaths.h: 106 * tests/stress/pow-basics.js: Added. 107 (valuesAreClose): 108 (mathPowDoubleDouble1): 109 (mathPowDoubleInt1): 110 (test1): 111 (mathPowDoubleDouble2): 112 (mathPowDoubleInt2): 113 (test2): 114 (mathPowDoubleDouble3): 115 (mathPowDoubleInt3): 116 (test3): 117 (mathPowDoubleDouble4): 118 (mathPowDoubleInt4): 119 (test4): 120 (mathPowDoubleDouble5): 121 (mathPowDoubleInt5): 122 (test5): 123 (mathPowDoubleDouble6): 124 (mathPowDoubleInt6): 125 (test6): 126 (mathPowDoubleDouble7): 127 (mathPowDoubleInt7): 128 (test7): 129 (mathPowDoubleDouble8): 130 (mathPowDoubleInt8): 131 (test8): 132 (mathPowDoubleDouble9): 133 (mathPowDoubleInt9): 134 (test9): 135 (mathPowDoubleDouble10): 136 (mathPowDoubleInt10): 137 (test10): 138 (mathPowDoubleDouble11): 139 (mathPowDoubleInt11): 140 (test11): 141 * tests/stress/pow-coherency.js: Added. 142 (pow42): 143 (build42AsDouble.opaqueAdd): 144 (build42AsDouble): 145 (powDouble42): 146 (clobber): 147 (pow42NoConstantFolding): 148 (powDouble42NoConstantFolding): 149 * tests/stress/pow-evaluation-order.js: Added. 150 (shouldBe): 151 (throw.new.Error): 152 * tests/stress/pow-expects-update-expression-on-lhs.js: Added. 153 (testSyntax): 154 (testSyntaxError): 155 (throw.new.Error): 156 (let.token.of.tokens.testSyntax.pow): 157 (testSyntax.pow): 158 * tests/stress/pow-integer-exponent-fastpath.js: Added. 159 (valuesAreClose): 160 (mathPowDoubleDoubleTestExponentFifty): 161 (mathPowDoubleIntTestExponentFifty): 162 (testExponentFifty): 163 (mathPowDoubleDoubleTestExponentTenThousands): 164 (mathPowDoubleIntTestExponentTenThousands): 165 (testExponentTenThousands): 166 * tests/stress/pow-nan-behaviors.js: Added. 167 (testIntegerBaseWithNaNExponentStatic): 168 (mathPowIntegerBaseWithNaNExponentDynamic): 169 (testIntegerBaseWithNaNExponentDynamic): 170 (testFloatingPointBaseWithNaNExponentStatic): 171 (mathPowFloatingPointBaseWithNaNExponentDynamic): 172 (testFloatingPointBaseWithNaNExponentDynamic): 173 (testNaNBaseStatic): 174 (mathPowNaNBaseDynamic1): 175 (mathPowNaNBaseDynamic2): 176 (mathPowNaNBaseDynamic3): 177 (mathPowNaNBaseDynamic4): 178 (testNaNBaseDynamic): 179 (infiniteExponentsStatic): 180 (mathPowInfiniteExponentsDynamic1): 181 (mathPowInfiniteExponentsDynamic2): 182 (mathPowInfiniteExponentsDynamic3): 183 (mathPowInfiniteExponentsDynamic4): 184 (infiniteExponentsDynamic): 185 * tests/stress/pow-simple.js: Added. 186 (shouldBe): 187 (throw.new.Error): 188 * tests/stress/pow-stable-results.js: Added. 189 (opaquePow): 190 (isIdentical): 191 * tests/stress/pow-to-number-should-be-executed-in-code-side.js: Added. 192 (shouldBe): 193 (throw.new.Error): 194 * tests/stress/pow-with-constants.js: Added. 195 (exponentIsZero): 196 (testExponentIsZero): 197 (exponentIsOne): 198 (testExponentIsOne): 199 (powUsedAsSqrt): 200 (testPowUsedAsSqrt): 201 (powUsedAsOneOverSqrt): 202 (testPowUsedAsOneOverSqrt): 203 (powUsedAsSquare): 204 (testPowUsedAsSquare): 205 (intIntConstantsSmallNumbers): 206 (intIntConstantsLargeNumbers): 207 (intIntSmallConstants): 208 (intDoubleConstants): 209 (doubleDoubleConstants): 210 (doubleIntConstants): 211 (testBaseAndExponentConstantLiterals): 212 (exponentIsIntegerConstant): 213 (testExponentIsIntegerConstant): 214 (exponentIsDoubleConstant): 215 (testExponentIsDoubleConstant): 216 (exponentIsInfinityConstant): 217 (testExponentIsInfinityConstant): 218 (exponentIsNegativeInfinityConstant): 219 (testExponentIsNegativeInfinityConstant): 220 * tests/stress/pow-with-never-NaN-exponent.js: Added. 221 (exponentIsNonNanDouble1): 222 (exponentIsNonNanDouble2): 223 (testExponentIsDoubleConstant): 224 * tests/test262.yaml: 225 1 226 2016-07-18 Filip Pizlo <fpizlo@apple.com> 2 227 -
trunk/Source/JavaScriptCore/bytecode/BytecodeList.json
r203361 r203499 40 40 { "name" : "op_mod", "length" : 4 }, 41 41 { "name" : "op_sub", "length" : 5 }, 42 { "name" : "op_pow", "length" : 4 }, 42 43 { "name" : "op_lshift", "length" : 4 }, 43 44 { "name" : "op_rshift", "length" : 4 }, -
trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.h
r203364 r203499 209 209 case op_mod: 210 210 case op_sub: 211 case op_pow: 211 212 case op_lshift: 212 213 case op_rshift: … … 432 433 case op_mod: 433 434 case op_sub: 435 case op_pow: 434 436 case op_lshift: 435 437 case op_rshift: -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r203364 r203499 1023 1023 case op_mod: { 1024 1024 printBinaryOp(out, exec, location, it, "mod"); 1025 break; 1026 } 1027 case op_pow: { 1028 printBinaryOp(out, exec, location, it, "pow"); 1025 1029 break; 1026 1030 } -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r203006 r203499 1994 1994 opcodeID = op_mod; 1995 1995 break; 1996 case OpPowEq: 1997 opcodeID = op_pow; 1998 break; 1996 1999 default: 1997 2000 RELEASE_ASSERT_NOT_REACHED(); -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r203364 r203499 3818 3818 set(VirtualRegister(currentInstruction[1].u.operand), makeSafe(addToGraph(ArithMod, op1, op2))); 3819 3819 NEXT_OPCODE(op_mod); 3820 } 3821 3822 case op_pow: { 3823 // FIXME: ArithPow(Untyped, Untyped) should be supported as the same to ArithMul, ArithSub etc. 3824 // https://bugs.webkit.org/show_bug.cgi?id=160012 3825 Node* op1 = get(VirtualRegister(currentInstruction[2].u.operand)); 3826 Node* op2 = get(VirtualRegister(currentInstruction[3].u.operand)); 3827 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(ArithPow, op1, op2)); 3828 NEXT_OPCODE(op_pow); 3820 3829 } 3821 3830 -
trunk/Source/JavaScriptCore/dfg/DFGCapabilities.cpp
r203364 r203499 124 124 case op_mul: 125 125 case op_mod: 126 case op_pow: 126 127 case op_div: 127 128 case op_debug: -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r203130 r203499 301 301 DEFINE_OP(op_dec) 302 302 DEFINE_OP(op_inc) 303 DEFINE_OP(op_pow) 303 304 DEFINE_OP(op_profile_type) 304 305 DEFINE_OP(op_profile_control_flow) -
trunk/Source/JavaScriptCore/jit/JIT.h
r203081 r203499 567 567 void emit_op_dec(Instruction*); 568 568 void emit_op_inc(Instruction*); 569 void emit_op_pow(Instruction*); 569 570 void emit_op_profile_type(Instruction*); 570 571 void emit_op_profile_control_flow(Instruction*); -
trunk/Source/JavaScriptCore/jit/JITArithmetic.cpp
r201301 r203499 1033 1033 } 1034 1034 1035 /* ------------------------------ END: OP_ADD, OP_SUB, OP_MUL ------------------------------ */ 1035 void JIT::emit_op_pow(Instruction* currentInstruction) 1036 { 1037 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_pow); 1038 slowPathCall.call(); 1039 } 1040 1041 /* ------------------------------ END: OP_ADD, OP_SUB, OP_MUL, OP_POW ------------------------------ */ 1036 1042 1037 1043 } // namespace JSC -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r203130 r203499 1321 1321 1322 1322 1323 _llint_op_pow: 1324 traceExecution() 1325 callOpcodeSlowPath(_slow_path_pow) 1326 dispatch(4) 1327 1328 1323 1329 _llint_op_typeof: 1324 1330 traceExecution() -
trunk/Source/JavaScriptCore/parser/ASTBuilder.h
r201542 r203499 29 29 #include "BuiltinNames.h" 30 30 #include "BytecodeIntrinsicRegistry.h" 31 #include "MathCommon.h" 31 32 #include "NodeConstructors.h" 32 33 #include "SyntaxChecker.h" … … 144 145 ExpressionNode* makeNegateNode(const JSTokenLocation&, ExpressionNode*); 145 146 ExpressionNode* makeBitwiseNotNode(const JSTokenLocation&, ExpressionNode*); 147 ExpressionNode* makePowNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 146 148 ExpressionNode* makeMultNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 147 149 ExpressionNode* makeDivNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); … … 785 787 m_binaryOperatorStack.removeLast(); 786 788 } 787 bool operatorStackHasHigherPrecedence(int&, int precedence) 788 { 789 return precedence <= m_binaryOperatorStack.last().second; 789 bool operatorStackShouldReduce(int precedence) 790 { 791 // If the current precedence of the operator stack is the same to the one of the given operator, 792 // it depends on the associative whether we reduce the stack. 793 // If the operator is right associative, we should not reduce the stack right now. 794 if (precedence == m_binaryOperatorStack.last().second) 795 return !(m_binaryOperatorStack.last().first & RightAssociativeBinaryOpTokenFlag); 796 return precedence < m_binaryOperatorStack.last().second; 790 797 } 791 798 const BinaryOperand& getFromOperandStack(int i) { return m_binaryOperandStack[m_binaryOperandStack.size() + i]; } … … 1045 1052 } 1046 1053 1054 ExpressionNode* ASTBuilder::makePowNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1055 { 1056 auto* strippedExpr1 = expr1->stripUnaryPlus(); 1057 auto* strippedExpr2 = expr2->stripUnaryPlus(); 1058 1059 if (strippedExpr1->isNumber() && strippedExpr2->isNumber()) { 1060 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*strippedExpr1); 1061 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*strippedExpr2); 1062 return createNumberFromBinaryOperation(location, operationMathPow(numberExpr1.value(), numberExpr2.value()), numberExpr1, numberExpr2); 1063 } 1064 1065 if (strippedExpr1->isNumber()) 1066 expr1 = strippedExpr1; 1067 if (strippedExpr2->isNumber()) 1068 expr2 = strippedExpr2; 1069 1070 return new (m_parserArena) PowNode(location, expr1, expr2, rightHasAssignments); 1071 } 1072 1047 1073 ExpressionNode* ASTBuilder::makeMultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1048 1074 { 1075 // FIXME: Unary + change the evaluation order. 1076 // https://bugs.webkit.org/show_bug.cgi?id=159968 1049 1077 expr1 = expr1->stripUnaryPlus(); 1050 1078 expr2 = expr2->stripUnaryPlus(); … … 1067 1095 ExpressionNode* ASTBuilder::makeDivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1068 1096 { 1097 // FIXME: Unary + change the evaluation order. 1098 // https://bugs.webkit.org/show_bug.cgi?id=159968 1069 1099 expr1 = expr1->stripUnaryPlus(); 1070 1100 expr2 = expr2->stripUnaryPlus(); … … 1083 1113 ExpressionNode* ASTBuilder::makeModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1084 1114 { 1115 // FIXME: Unary + change the evaluation order. 1116 // https://bugs.webkit.org/show_bug.cgi?id=159968 1085 1117 expr1 = expr1->stripUnaryPlus(); 1086 1118 expr2 = expr2->stripUnaryPlus(); … … 1107 1139 ExpressionNode* ASTBuilder::makeSubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1108 1140 { 1141 // FIXME: Unary + change the evaluation order. 1142 // https://bugs.webkit.org/show_bug.cgi?id=159968 1109 1143 expr1 = expr1->stripUnaryPlus(); 1110 1144 expr2 = expr2->stripUnaryPlus(); … … 1296 1330 case MOD: 1297 1331 return makeModNode(location, lhs.first, rhs.first, rhs.second.hasAssignment); 1332 1333 case POW: 1334 return makePowNode(location, lhs.first, rhs.first, rhs.second.hasAssignment); 1298 1335 } 1299 1336 CRASH(); -
trunk/Source/JavaScriptCore/parser/Lexer.cpp
r203028 r203499 1957 1957 break; 1958 1958 } 1959 if (m_current == '*') { 1960 shift(); 1961 if (m_current == '=') { 1962 shift(); 1963 token = POWEQUAL; 1964 break; 1965 } 1966 token = POW; 1967 break; 1968 } 1959 1969 token = TIMES; 1960 1970 break; -
trunk/Source/JavaScriptCore/parser/NodeConstructors.h
r201328 r203499 498 498 } 499 499 500 inline PowNode::PowNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 501 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_pow, rightHasAssignments) 502 { 503 } 504 500 505 inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 501 506 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments) -
trunk/Source/JavaScriptCore/parser/Nodes.h
r202680 r203499 68 68 OpOrEq, 69 69 OpModEq, 70 OpPowEq, 70 71 OpLShift, 71 72 OpRShift, … … 1040 1041 }; 1041 1042 1043 class PowNode : public BinaryOpNode { 1044 public: 1045 PowNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 1046 }; 1047 1042 1048 class MultNode : public BinaryOpNode { 1043 1049 public: -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r203263 r203499 3127 3127 case OREQUAL: op = OpOrEq; break; 3128 3128 case MODEQUAL: op = OpModEq; break; 3129 case POWEQUAL: op = OpPowEq; break; 3129 3130 default: 3130 3131 goto end; … … 3219 3220 } 3220 3221 3221 ALWAYS_INLINE static bool isUnaryOp(JSTokenType token) 3222 { 3223 return token & UnaryOpTokenFlag; 3222 ALWAYS_INLINE static bool isUnaryOpExcludingUpdateOp(JSTokenType token) 3223 { 3224 if (isUpdateOp(token)) 3225 return false; 3226 return isUnaryOp(token); 3224 3227 } 3225 3228 … … 3242 3245 JSTextPosition exprStart = tokenStartPosition(); 3243 3246 int initialAssignments = m_parserState.assignmentCount; 3247 JSTokenType leadingTokenTypeForUnaryExpression = m_token.m_type; 3244 3248 TreeExpression current = parseUnaryExpression(context); 3245 3249 failIfFalse(current, "Cannot parse expression"); 3246 3250 3247 3251 context.appendBinaryExpressionInfo(operandStackDepth, current, exprStart, lastTokenEndPosition(), lastTokenEndPosition(), initialAssignments != m_parserState.assignmentCount); 3252 3253 // 12.6 https://tc39.github.io/ecma262/#sec-exp-operator 3254 // ExponentiationExpresion is described as follows. 3255 // 3256 // ExponentiationExpression[Yield]: 3257 // UnaryExpression[?Yield] 3258 // UpdateExpression[?Yield] ** ExponentiationExpression[?Yield] 3259 // 3260 // As we can see, the left hand side of the ExponentiationExpression is UpdateExpression, not UnaryExpression. 3261 // So placing UnaryExpression not included in UpdateExpression here is a syntax error. 3262 // This is intentional. For example, if UnaryExpression is allowed, we can have the code like `-x**y`. 3263 // But this is confusing: `-(x**y)` OR `(-x)**y`, which interpretation is correct? 3264 // To avoid this problem, ECMA262 makes unparenthesized exponentiation expression as operand of unary operators an early error. 3265 // More rationale: https://mail.mozilla.org/pipermail/es-discuss/2015-September/044232.html 3266 // 3267 // Here, we guarantee that the left hand side of this expression is not unary expression by checking the leading operator of the parseUnaryExpression. 3268 // This check just works. Let's consider the example, 3269 // y <> -x ** z 3270 // ^ 3271 // Check this. 3272 // If the binary operator <> has higher precedence than one of "**", this check does not work. 3273 // But it's OK for ** because the operator "**" has the highest operator precedence in the binary operators. 3274 failIfTrue(match(POW) && isUnaryOpExcludingUpdateOp(leadingTokenTypeForUnaryExpression), "Unparenthesized unary expression found on the left hand side of an exponentiation expression"); 3275 3248 3276 int precedence = isBinaryOperator(m_token.m_type); 3249 3277 if (!precedence) … … 3254 3282 next(TreeBuilder::DontBuildStrings); 3255 3283 3256 while (operatorStackDepth && context.operatorStackHasHigherPrecedence(operatorStackDepth,precedence)) {3284 while (operatorStackDepth && context.operatorStackShouldReduce(precedence)) { 3257 3285 ASSERT(operandStackDepth > 1); 3258 3286 -
trunk/Source/JavaScriptCore/parser/ParserTokens.h
r201542 r203499 42 42 BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift, 43 43 ErrorTokenFlag = 1 << (BinaryOpTokenAllowsInPrecedenceAdditionalShift + BinaryOpTokenPrecedenceShift + 7), 44 UnterminatedErrorTokenFlag = ErrorTokenFlag << 1 44 UnterminatedErrorTokenFlag = ErrorTokenFlag << 1, 45 RightAssociativeBinaryOpTokenFlag = UnterminatedErrorTokenFlag << 1 45 46 }; 46 47 … … 110 111 ANDEQUAL, 111 112 MODEQUAL, 113 POWEQUAL, 112 114 XOREQUAL, 113 115 OREQUAL, … … 119 121 PLUSPLUS = 0 | UnaryOpTokenFlag, 120 122 MINUSMINUS = 1 | UnaryOpTokenFlag, 121 EXCLAMATION= 2 | UnaryOpTokenFlag,122 TILDE= 3 | UnaryOpTokenFlag,123 AUTOPLUSPLUS= 4 | UnaryOpTokenFlag,124 AUTOMINUSMINUS= 5 | UnaryOpTokenFlag,123 AUTOPLUSPLUS = 2 | UnaryOpTokenFlag, 124 AUTOMINUSMINUS = 3 | UnaryOpTokenFlag, 125 EXCLAMATION = 4 | UnaryOpTokenFlag, 126 TILDE = 5 | UnaryOpTokenFlag, 125 127 TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag, 126 128 VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag, … … 149 151 DIVIDE = 21 | BINARY_OP_PRECEDENCE(10), 150 152 MOD = 22 | BINARY_OP_PRECEDENCE(10), 153 POW = 23 | BINARY_OP_PRECEDENCE(11) | RightAssociativeBinaryOpTokenFlag, // Make sure that POW has the highest operator precedence. 151 154 ERRORTOK = 0 | ErrorTokenFlag, 152 155 UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK = 0 | ErrorTokenFlag | UnterminatedErrorTokenFlag, … … 223 226 }; 224 227 228 ALWAYS_INLINE bool isUpdateOp(JSTokenType token) 229 { 230 return token >= PLUSPLUS && token <= AUTOMINUSMINUS; 231 } 232 233 ALWAYS_INLINE bool isUnaryOp(JSTokenType token) 234 { 235 return token & UnaryOpTokenFlag; 236 } 237 225 238 } // namespace JSC 226 239 -
trunk/Source/JavaScriptCore/parser/SyntaxChecker.h
r201542 r203499 302 302 // Logic to handle datastructures used during parsing of binary expressions 303 303 void operatorStackPop(int& operatorStackDepth) { operatorStackDepth--; } 304 bool operatorStack HasHigherPrecedence(int&,int) { return true; }304 bool operatorStackShouldReduce(int) { return true; } 305 305 BinaryOperand getFromOperandStack(int) { return m_topBinaryExpr; } 306 306 void shrinkOperandStackBy(int& operandStackDepth, int amount) { operandStackDepth -= amount; } -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
r203081 r203499 471 471 } 472 472 473 SLOW_PATH_DECL(slow_path_pow) 474 { 475 BEGIN(); 476 double a = OP_C(2).jsValue().toNumber(exec); 477 double b = OP_C(3).jsValue().toNumber(exec); 478 RETURN(jsNumber(operationMathPow(a, b))); 479 } 480 473 481 SLOW_PATH_DECL(slow_path_lshift) 474 482 { -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.h
r203081 r203499 220 220 SLOW_PATH_HIDDEN_DECL(slow_path_div); 221 221 SLOW_PATH_HIDDEN_DECL(slow_path_mod); 222 SLOW_PATH_HIDDEN_DECL(slow_path_pow); 222 223 SLOW_PATH_HIDDEN_DECL(slow_path_lshift); 223 224 SLOW_PATH_HIDDEN_DECL(slow_path_rshift); -
trunk/Source/JavaScriptCore/tests/stress/math-pow-basics.js
r180098 r203499 182 182 } 183 183 noInline(test7); 184 test 6(-37.676522764377296, -1.0, -0.026541727490454296, -0.026541727490454296);184 test7(-37.676522764377296, -1.0, -0.026541727490454296, -0.026541727490454296); 185 185 186 186 // Let's square things. … … 208 208 } 209 209 noInline(test8); 210 test 7(-37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407);210 test8(-37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407); 211 211 212 212 function mathPowDoubleDouble9(x, y) { … … 233 233 } 234 234 noInline(test9); 235 test 8(37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407);235 test9(37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407); 236 236 237 237 // Let's cube things. … … 258 258 } 259 259 } 260 noInline(test 9);261 test 9(-37.676522764377296, 3.0, -53482.591444930236, -53482.591444930236);260 noInline(test10); 261 test10(-37.676522764377296, 3.0, -53482.591444930236, -53482.591444930236); 262 262 263 263 function mathPowDoubleDouble11(x, y) { … … 283 283 } 284 284 } 285 noInline(test1 0);286 test1 0(37.676522764377296, 3.0, 53482.591444930236, 53482.591444930236);285 noInline(test11); 286 test11(37.676522764377296, 3.0, 53482.591444930236, 53482.591444930236); -
trunk/Source/JavaScriptCore/tests/stress/math-pow-nan-behaviors.js
r180360 r203499 1 // If y is NaN, the resultis NaN.1 // If an argument is NaN, the result of Math.pow(x, y) is NaN. 2 2 function testIntegerBaseWithNaNExponentStatic() { 3 3 for (var i = 0; i < 10000; ++i) { … … 73 73 74 74 // If y is +0, the result is 1, even if x is NaN. 75 // If y is −0, the result is 1, even if x is NaN.75 // If y is -0, the result is 1, even if x is NaN. 76 76 // If x is NaN and y is nonzero, the result is NaN. 77 77 function testNaNBaseStatic() { … … 141 141 testNaNBaseDynamic(); 142 142 143 // If abs(x) is 1 and y is + ∞,the result is NaN.144 // If abs(x) is 1 and y is − ∞,the result is NaN.143 // If abs(x) is 1 and y is +Inf the result is NaN. 144 // If abs(x) is 1 and y is −Inf the result is NaN. 145 145 function infiniteExponentsStatic() { 146 146 for (var i = 0; i < 10000; ++i) { -
trunk/Source/JavaScriptCore/tests/stress/pow-basics.js
r203498 r203499 5 5 // Some random values. 6 6 function mathPowDoubleDouble1(x, y) { 7 return Math.pow(x, y)7 return x ** y; 8 8 } 9 9 noInline(mathPowDoubleDouble1); 10 10 11 11 function mathPowDoubleInt1(x, y) { 12 return Math.pow(x, y)12 return x ** y; 13 13 } 14 14 noInline(mathPowDoubleInt1); … … 31 31 32 32 function mathPowDoubleDouble2(x, y) { 33 return Math.pow(x, y)33 return x ** y; 34 34 } 35 35 noInline(mathPowDoubleDouble2); 36 36 37 37 function mathPowDoubleInt2(x, y) { 38 return Math.pow(x, y)38 return x ** y; 39 39 } 40 40 noInline(mathPowDoubleInt2); … … 56 56 57 57 function mathPowDoubleDouble3(x, y) { 58 return Math.pow(x, y)58 return x ** y; 59 59 } 60 60 noInline(mathPowDoubleDouble3); 61 61 62 62 function mathPowDoubleInt3(x, y) { 63 return Math.pow(x, y)63 return x ** y; 64 64 } 65 65 noInline(mathPowDoubleInt3); … … 82 82 // Exponent zero. 83 83 function mathPowDoubleDouble4(x, y) { 84 return Math.pow(x, y)84 return x ** y; 85 85 } 86 86 noInline(mathPowDoubleDouble4); 87 87 88 88 function mathPowDoubleInt4(x, y) { 89 return Math.pow(x, y)89 return x ** y; 90 90 } 91 91 noInline(mathPowDoubleInt4); … … 108 108 // Exponent minus zero. 109 109 function mathPowDoubleDouble5(x, y) { 110 return Math.pow(x, y)110 return x ** y; 111 111 } 112 112 noInline(mathPowDoubleDouble5); 113 113 114 114 function mathPowDoubleInt5(x, y) { 115 return Math.pow(x, y)115 return x ** y; 116 116 } 117 117 noInline(mathPowDoubleInt5); … … 134 134 // Exponent 1. 135 135 function mathPowDoubleDouble6(x, y) { 136 return Math.pow(x, y)136 return x ** y; 137 137 } 138 138 noInline(mathPowDoubleDouble6); 139 139 140 140 function mathPowDoubleInt6(x, y) { 141 return Math.pow(x, y)141 return x ** y; 142 142 } 143 143 noInline(mathPowDoubleInt6); … … 160 160 // Exponent -1. 161 161 function mathPowDoubleDouble7(x, y) { 162 return Math.pow(x, y)162 return x ** y; 163 163 } 164 164 noInline(mathPowDoubleDouble7); 165 165 166 166 function mathPowDoubleInt7(x, y) { 167 return Math.pow(x, y)167 return x ** y; 168 168 } 169 169 noInline(mathPowDoubleInt7); … … 182 182 } 183 183 noInline(test7); 184 test 6(-37.676522764377296, -1.0, -0.026541727490454296, -0.026541727490454296);184 test7(-37.676522764377296, -1.0, -0.026541727490454296, -0.026541727490454296); 185 185 186 186 // Let's square things. 187 187 function mathPowDoubleDouble8(x, y) { 188 return Math.pow(x, y)188 return x ** y; 189 189 } 190 190 noInline(mathPowDoubleDouble8); 191 191 192 192 function mathPowDoubleInt8(x, y) { 193 return Math.pow(x, y)193 return x ** y; 194 194 } 195 195 noInline(mathPowDoubleInt8); … … 208 208 } 209 209 noInline(test8); 210 test 7(-37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407);210 test8(-37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407); 211 211 212 212 function mathPowDoubleDouble9(x, y) { 213 return Math.pow(x, y)213 return x ** y; 214 214 } 215 215 noInline(mathPowDoubleDouble9); 216 216 217 217 function mathPowDoubleInt9(x, y) { 218 return Math.pow(x, y)218 return x ** y; 219 219 } 220 220 noInline(mathPowDoubleInt9); … … 233 233 } 234 234 noInline(test9); 235 test 8(37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407);235 test9(37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407); 236 236 237 237 // Let's cube things. 238 238 function mathPowDoubleDouble10(x, y) { 239 return Math.pow(x, y)239 return x ** y; 240 240 } 241 241 noInline(mathPowDoubleDouble10); 242 242 243 243 function mathPowDoubleInt10(x, y) { 244 return Math.pow(x, y)244 return x ** y; 245 245 } 246 246 noInline(mathPowDoubleInt10); … … 258 258 } 259 259 } 260 noInline(test 9);261 test 9(-37.676522764377296, 3.0, -53482.591444930236, -53482.591444930236);260 noInline(test10); 261 test10(-37.676522764377296, 3.0, -53482.591444930236, -53482.591444930236); 262 262 263 263 function mathPowDoubleDouble11(x, y) { 264 return Math.pow(x, y)264 return x ** y; 265 265 } 266 266 noInline(mathPowDoubleDouble11); 267 267 268 268 function mathPowDoubleInt11(x, y) { 269 return Math.pow(x, y)269 return x ** y; 270 270 } 271 271 noInline(mathPowDoubleInt11); … … 283 283 } 284 284 } 285 noInline(test1 0);286 test1 0(37.676522764377296, 3.0, 53482.591444930236, 53482.591444930236);285 noInline(test11); 286 test11(37.676522764377296, 3.0, 53482.591444930236, 53482.591444930236); -
trunk/Source/JavaScriptCore/tests/stress/pow-nan-behaviors.js
r203498 r203499 1 // If y is NaN, the resultis NaN.1 // If an argument is NaN, the result of x ** y is NaN. 2 2 function testIntegerBaseWithNaNExponentStatic() { 3 3 for (var i = 0; i < 10000; ++i) { 4 var result = Math.pow(5, NaN);5 if (!isNaN(result)) 6 throw "Error: bad result, Math.pow(5, NaN)= " + result;7 } 8 for (var i = 0; i < 10000; ++i) { 9 var result = Math.pow(i, NaN);10 if (!isNaN(result)) 11 throw "Error: bad result, Math.pow(i, NaN)= " + result + " with i = " + i;4 var result = 5 ** NaN; 5 if (!isNaN(result)) 6 throw "Error: bad result, 5 ** NaN = " + result; 7 } 8 for (var i = 0; i < 10000; ++i) { 9 var result = i ** NaN; 10 if (!isNaN(result)) 11 throw "Error: bad result, i ** NaN = " + result + " with i = " + i; 12 12 } 13 13 } … … 16 16 17 17 function mathPowIntegerBaseWithNaNExponentDynamic(x, y) { 18 return Math.pow(x, y);18 return x ** y; 19 19 } 20 20 noInline(mathPowIntegerBaseWithNaNExponentDynamic); … … 38 38 function testFloatingPointBaseWithNaNExponentStatic() { 39 39 for (var i = 0; i < 10000; ++i) { 40 var result = Math.pow(5.5, NaN);41 if (!isNaN(result)) 42 throw "Error: bad result, Math.pow(5.5, NaN)= " + result;43 } 44 for (var i = 0; i < 10000; ++i) { 45 var result = Math.pow(i + 0.5, NaN);46 if (!isNaN(result)) 47 throw "Error: bad result, Math.pow(i + 0.5, NaN)= " + result + " with i = " + i;40 var result = 5.5 ** NaN; 41 if (!isNaN(result)) 42 throw "Error: bad result, 5.5 ** NaN = " + result; 43 } 44 for (var i = 0; i < 10000; ++i) { 45 var result = (i + 0.5) ** NaN; 46 if (!isNaN(result)) 47 throw "Error: bad result, (i + 0.5) ** NaN = " + result + " with i = " + i; 48 48 } 49 49 } … … 52 52 53 53 function mathPowFloatingPointBaseWithNaNExponentDynamic(x, y) { 54 return Math.pow(x, y);54 return x ** y; 55 55 } 56 56 noInline(mathPowFloatingPointBaseWithNaNExponentDynamic); … … 73 73 74 74 // If y is +0, the result is 1, even if x is NaN. 75 // If y is −0, the result is 1, even if x is NaN.75 // If y is -0, the result is 1, even if x is NaN. 76 76 // If x is NaN and y is nonzero, the result is NaN. 77 77 function testNaNBaseStatic() { 78 78 for (var i = 0; i < 10000; ++i) { 79 var result = Math.pow(NaN,i + 1);80 if (!isNaN(result)) 81 throw "Error: bad result, Math.pow(NaN,i + 1) = " + result + " with i = " + i;82 } 83 for (var i = 0; i < 10000; ++i) { 84 var result = Math.pow(NaN,i + 1.5);85 if (!isNaN(result)) 86 throw "Error: bad result, Math.pow(NaN,i + 1.5) = " + result + " with i = " + i;87 } 88 for (var i = 0; i < 10000; ++i) { 89 var result = Math.pow(NaN, 0);90 if (result !== 1) 91 throw "Error: bad result, Math.pow(NaN, 0)= " + result;92 } 93 for (var i = 0; i < 10000; ++i) { 94 var result = Math.pow(NaN, -0);95 if (result !== 1) 96 throw "Error: bad result, Math.pow(NaN, -0)= " + result;79 var result = NaN ** (i + 1); 80 if (!isNaN(result)) 81 throw "Error: bad result, NaN ** (i + 1) = " + result + " with i = " + i; 82 } 83 for (var i = 0; i < 10000; ++i) { 84 var result = NaN ** (i + 1.5); 85 if (!isNaN(result)) 86 throw "Error: bad result, NaN ** (i + 1.5) = " + result + " with i = " + i; 87 } 88 for (var i = 0; i < 10000; ++i) { 89 var result = NaN ** 0; 90 if (result !== 1) 91 throw "Error: bad result, NaN ** 0 = " + result; 92 } 93 for (var i = 0; i < 10000; ++i) { 94 var result = NaN ** -0; 95 if (result !== 1) 96 throw "Error: bad result, NaN ** -0 = " + result; 97 97 } 98 98 } … … 101 101 102 102 function mathPowNaNBaseDynamic1(x, y) { 103 return Math.pow(x, y);103 return x ** y; 104 104 } 105 105 function mathPowNaNBaseDynamic2(x, y) { 106 return Math.pow(x, y);106 return x ** y; 107 107 } 108 108 function mathPowNaNBaseDynamic3(x, y) { 109 return Math.pow(x, y);109 return x ** y; 110 110 } 111 111 function mathPowNaNBaseDynamic4(x, y) { 112 return Math.pow(x, y);112 return x ** y; 113 113 } 114 114 noInline(mathPowNaNBaseDynamic1); … … 141 141 testNaNBaseDynamic(); 142 142 143 // If abs(x) is 1 and y is + ∞,the result is NaN.144 // If abs(x) is 1 and y is − ∞,the result is NaN.143 // If abs(x) is 1 and y is +Inf the result is NaN. 144 // If abs(x) is 1 and y is −Inf the result is NaN. 145 145 function infiniteExponentsStatic() { 146 146 for (var i = 0; i < 10000; ++i) { 147 var result = Math.pow(1, Number.POSITIVE_INFINITY);148 if (!isNaN(result)) 149 throw "Error: bad result, Math.pow(1, Number.POSITIVE_INFINITY)= " + result;150 } 151 for (var i = 0; i < 10000; ++i) { 152 var result = Math.pow(-1, Number.POSITIVE_INFINITY);153 if (!isNaN(result)) 154 throw "Error: bad result, Math.pow(-1, Number.POSITIVE_INFINITY)= " + result;155 } 156 for (var i = 0; i < 10000; ++i) { 157 var result = Math.pow(1, Number.NEGATIVE_INFINITY);158 if (!isNaN(result)) 159 throw "Error: bad result, Math.pow(1, Number.NEGATIVE_INFINITY)= " + result;160 } 161 for (var i = 0; i < 10000; ++i) { 162 var result = Math.pow(-1, Number.NEGATIVE_INFINITY);163 if (!isNaN(result)) 164 throw "Error: bad result, Math.pow(-1, Number.NEGATIVE_INFINITY)= " + result;147 var result = 1 ** Number.POSITIVE_INFINITY; 148 if (!isNaN(result)) 149 throw "Error: bad result, 1 ** Number.POSITIVE_INFINITY = " + result; 150 } 151 for (var i = 0; i < 10000; ++i) { 152 var result = (-1) ** Number.POSITIVE_INFINITY; 153 if (!isNaN(result)) 154 throw "Error: bad result, -1 ** Number.POSITIVE_INFINITY = " + result; 155 } 156 for (var i = 0; i < 10000; ++i) { 157 var result = 1 ** Number.NEGATIVE_INFINITY; 158 if (!isNaN(result)) 159 throw "Error: bad result, 1 ** Number.NEGATIVE_INFINITY = " + result; 160 } 161 for (var i = 0; i < 10000; ++i) { 162 var result = (-1) ** Number.NEGATIVE_INFINITY; 163 if (!isNaN(result)) 164 throw "Error: bad result, -1 ** Number.NEGATIVE_INFINITY = " + result; 165 165 } 166 166 } … … 169 169 170 170 function mathPowInfiniteExponentsDynamic1(x, y) { 171 return Math.pow(x, y);171 return x ** y; 172 172 } 173 173 function mathPowInfiniteExponentsDynamic2(x, y) { 174 return Math.pow(x, y);174 return x ** y; 175 175 } 176 176 function mathPowInfiniteExponentsDynamic3(x, y) { 177 return Math.pow(x, y);177 return x ** y; 178 178 } 179 179 function mathPowInfiniteExponentsDynamic4(x, y) { 180 return Math.pow(x, y);180 return x ** y; 181 181 } 182 182 noInline(mathPowInfiniteExponentsDynamic1); -
trunk/Source/JavaScriptCore/tests/test262.yaml
r203332 r203499 60823 60823 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60824 60824 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A1.js 60825 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60825 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60826 60826 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A1.js 60827 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60827 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60828 60828 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A10.js 60829 60829 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] … … 60831 60831 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60832 60832 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A11.js 60833 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60833 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60834 60834 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A11.js 60835 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60835 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60836 60836 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A12.js 60837 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60837 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60838 60838 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A12.js 60839 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60839 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60840 60840 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A13.js 60841 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60841 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60842 60842 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A13.js 60843 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60843 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60844 60844 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A14.js 60845 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60845 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60846 60846 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A14.js 60847 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60847 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60848 60848 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A15.js 60849 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60849 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60850 60850 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A15.js 60851 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60851 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60852 60852 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A16.js 60853 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60853 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60854 60854 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A16.js 60855 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60855 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60856 60856 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A17.js 60857 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60857 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60858 60858 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A17.js 60859 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60859 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60860 60860 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A18.js 60861 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60861 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60862 60862 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A18.js 60863 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60863 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60864 60864 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A19.js 60865 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60865 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60866 60866 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A19.js 60867 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60867 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60868 60868 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A2.js 60869 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60869 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60870 60870 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A2.js 60871 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60871 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60872 60872 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A20.js 60873 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60873 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60874 60874 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A20.js 60875 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60875 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60876 60876 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A21.js 60877 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60877 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60878 60878 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A21.js 60879 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60879 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60880 60880 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A22.js 60881 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60881 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60882 60882 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A22.js 60883 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60883 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60884 60884 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A23.js 60885 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60885 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60886 60886 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A23.js 60887 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60887 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60888 60888 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A3.js 60889 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60889 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60890 60890 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A3.js 60891 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60891 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60892 60892 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A4.js 60893 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60893 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60894 60894 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A4.js 60895 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60895 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60896 60896 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A5.js 60897 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60897 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60898 60898 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A5.js 60899 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60899 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60900 60900 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A6.js 60901 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60901 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60902 60902 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A6.js 60903 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60903 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60904 60904 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A7.js 60905 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60905 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60906 60906 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A7.js 60907 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60907 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60908 60908 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A8.js 60909 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60909 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60910 60910 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A8.js 60911 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60911 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60912 60912 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A9.js 60913 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60913 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60914 60914 - path: test262/test/language/expressions/exponentiation/applying-the-exp-operator_A9.js 60915 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60915 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60916 60916 - path: test262/test/language/expressions/exponentiation/exp-assignment-operator.js 60917 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60917 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60918 60918 - path: test262/test/language/expressions/exponentiation/exp-assignment-operator.js 60919 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60919 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60920 60920 - path: test262/test/language/expressions/exponentiation/exp-operator-evaluation-order.js 60921 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60921 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60922 60922 - path: test262/test/language/expressions/exponentiation/exp-operator-evaluation-order.js 60923 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60923 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60924 60924 - path: test262/test/language/expressions/exponentiation/exp-operator-precedence-unary-expression-semantics.js 60925 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60925 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60926 60926 - path: test262/test/language/expressions/exponentiation/exp-operator-precedence-unary-expression-semantics.js 60927 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60927 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60928 60928 - path: test262/test/language/expressions/exponentiation/exp-operator-precedence-update-expression-semantics.js 60929 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60929 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60930 60930 - path: test262/test/language/expressions/exponentiation/exp-operator-precedence-update-expression-semantics.js 60931 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60931 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60932 60932 - path: test262/test/language/expressions/exponentiation/exp-operator-syntax-error-bitnot-unary-expression-base.js 60933 60933 cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] … … 60959 60959 cmd: runTest262 :normal, "SyntaxError", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60960 60960 - path: test262/test/language/expressions/exponentiation/exp-operator.js 60961 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []60961 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [] 60962 60962 - path: test262/test/language/expressions/exponentiation/exp-operator.js 60963 cmd: runTest262 : fail, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]60963 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict] 60964 60964 - path: test262/test/language/expressions/function/S10.1.1_A1_T2.js 60965 60965 cmd: runTest262 :normal, "NoException", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
Note:
See TracChangeset
for help on using the changeset viewer.