Changeset 182433 in webkit
- Timestamp:
- Apr 6, 2015 12:07:12 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r182406 r182433 1 2015-04-06 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [ES6] DFG and FTL should be aware of that StringConstructor behavior for symbols becomes different from ToString 4 https://bugs.webkit.org/show_bug.cgi?id=143424 5 6 Reviewed by Geoffrey Garen. 7 8 In ES6, StringConstructor behavior becomes different from ToString abstract operations in the spec. (and JSValue::toString). 9 10 ToString(symbol) throws a type error. 11 However, String(symbol) produces SymbolDescriptiveString(symbol). 12 13 So, in DFG and FTL phase, they should not inline StringConstructor to ToString. 14 15 Now, in the template literals patch, ToString DFG operation is planned to be used. 16 And current ToString behavior is aligned to the spec (and JSValue::toString) and it's better. 17 So intead of changing ToString behavior, this patch adds CallStringConstructor operation into DFG and FTL. 18 In CallStringConstructor, all behavior in DFG analysis is the same. 19 Only the difference from ToString is, when calling DFG operation functions, it calls 20 operationCallStringConstructorOnCell and operationCallStringConstructor instead of 21 operationToStringOnCell and operationToString. 22 23 * dfg/DFGAbstractInterpreterInlines.h: 24 (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): 25 * dfg/DFGBackwardsPropagationPhase.cpp: 26 (JSC::DFG::BackwardsPropagationPhase::propagate): 27 * dfg/DFGByteCodeParser.cpp: 28 (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): 29 * dfg/DFGClobberize.h: 30 (JSC::DFG::clobberize): 31 * dfg/DFGDoesGC.cpp: 32 (JSC::DFG::doesGC): 33 * dfg/DFGFixupPhase.cpp: 34 (JSC::DFG::FixupPhase::fixupNode): 35 (JSC::DFG::FixupPhase::fixupToStringOrCallStringConstructor): 36 (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd): 37 (JSC::DFG::FixupPhase::fixupToString): Deleted. 38 * dfg/DFGNodeType.h: 39 * dfg/DFGOperations.cpp: 40 * dfg/DFGOperations.h: 41 * dfg/DFGPredictionPropagationPhase.cpp: 42 (JSC::DFG::PredictionPropagationPhase::propagate): 43 * dfg/DFGSafeToExecute.h: 44 (JSC::DFG::safeToExecute): 45 * dfg/DFGSpeculativeJIT.cpp: 46 (JSC::DFG::SpeculativeJIT::compileToStringOrCallStringConstructorOnCell): 47 (JSC::DFG::SpeculativeJIT::compileToStringOnCell): Deleted. 48 * dfg/DFGSpeculativeJIT.h: 49 * dfg/DFGSpeculativeJIT32_64.cpp: 50 (JSC::DFG::SpeculativeJIT::compile): 51 * dfg/DFGSpeculativeJIT64.cpp: 52 (JSC::DFG::SpeculativeJIT::compile): 53 * dfg/DFGStructureRegistrationPhase.cpp: 54 (JSC::DFG::StructureRegistrationPhase::run): 55 * ftl/FTLCapabilities.cpp: 56 (JSC::FTL::canCompile): 57 * ftl/FTLLowerDFGToLLVM.cpp: 58 (JSC::FTL::LowerDFGToLLVM::compileNode): 59 (JSC::FTL::LowerDFGToLLVM::compileToStringOrCallStringConstructor): 60 (JSC::FTL::LowerDFGToLLVM::compileToString): Deleted. 61 * runtime/StringConstructor.cpp: 62 (JSC::stringConstructor): 63 (JSC::callStringConstructor): 64 * runtime/StringConstructor.h: 65 * tests/stress/symbol-and-string-constructor.js: Added. 66 (performString): 67 1 68 2015-04-06 Yusuke Suzuki <utatane.tea@gmail.com> 2 69 -
trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
r181993 r182433 1262 1262 } 1263 1263 1264 case ToString: { 1264 case ToString: 1265 case CallStringConstructor: { 1265 1266 switch (node->child1().useKind()) { 1266 1267 case StringObjectUse: -
trunk/Source/JavaScriptCore/dfg/DFGBackwardsPropagationPhase.cpp
r181993 r182433 346 346 } 347 347 348 case ToString: { 348 case ToString: 349 case CallStringConstructor: { 349 350 node->child1()->mergeFlags(NodeBytecodeUsesAsNumber | NodeBytecodeUsesAsOther); 350 351 break; -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r182294 r182433 2178 2178 result = jsConstant(m_vm->smallStrings.emptyString()); 2179 2179 else 2180 result = addToGraph( ToString, get(virtualRegisterForArgument(1, registerOffset)));2180 result = addToGraph(CallStringConstructor, get(virtualRegisterForArgument(1, registerOffset))); 2181 2181 2182 2182 if (kind == CodeForConstruct) -
trunk/Source/JavaScriptCore/dfg/DFGClobberize.h
r182213 r182433 898 898 899 899 case ToString: 900 case CallStringConstructor: 900 901 switch (node->child1().useKind()) { 901 902 case StringObjectUse: -
trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp
r181993 r182433 144 144 case ToPrimitive: 145 145 case ToString: 146 case CallStringConstructor: 146 147 case In: 147 148 case Jump: -
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r182114 r182433 768 768 } 769 769 770 case ToString: { 771 fixupToString(node); 770 case ToString: 771 case CallStringConstructor: { 772 fixupToStringOrCallStringConstructor(node); 772 773 break; 773 774 } … … 1364 1365 } 1365 1366 1366 void fixupToString (Node* node)1367 void fixupToStringOrCallStringConstructor(Node* node) 1367 1368 { 1368 1369 if (node->child1()->shouldSpeculateString()) { … … 1425 1426 1426 1427 fixupToPrimitive(toPrimitive); 1427 fixupToString (toString);1428 fixupToStringOrCallStringConstructor(toString); 1428 1429 1429 1430 right.setNode(toString); -
trunk/Source/JavaScriptCore/dfg/DFGNodeType.h
r181993 r182433 262 262 macro(ToPrimitive, NodeResultJS | NodeMustGenerate) \ 263 263 macro(ToString, NodeResultJS | NodeMustGenerate) \ 264 macro(CallStringConstructor, NodeResultJS | NodeMustGenerate) \ 264 265 macro(NewStringObject, NodeResultJS) \ 265 266 macro(MakeRope, NodeResultJS) \ -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r182057 r182433 1007 1007 } 1008 1008 1009 JSCell* JIT_OPERATION operationCallStringConstructorOnCell(ExecState* exec, JSCell* cell) 1010 { 1011 VM& vm = exec->vm(); 1012 NativeCallFrameTracer tracer(&vm, exec); 1013 1014 return stringConstructor(exec, cell); 1015 } 1016 1017 JSCell* JIT_OPERATION operationCallStringConstructor(ExecState* exec, EncodedJSValue value) 1018 { 1019 VM& vm = exec->vm(); 1020 NativeCallFrameTracer tracer(&vm, exec); 1021 1022 return stringConstructor(exec, JSValue::decode(value)); 1023 } 1024 1009 1025 JSCell* JIT_OPERATION operationMakeRope2(ExecState* exec, JSString* left, JSString* right) 1010 1026 { -
trunk/Source/JavaScriptCore/dfg/DFGOperations.h
r181993 r182433 122 122 JSCell* JIT_OPERATION operationToStringOnCell(ExecState*, JSCell*); 123 123 JSCell* JIT_OPERATION operationToString(ExecState*, EncodedJSValue); 124 JSCell* JIT_OPERATION operationCallStringConstructorOnCell(ExecState*, JSCell*); 125 JSCell* JIT_OPERATION operationCallStringConstructor(ExecState*, EncodedJSValue); 124 126 JSCell* JIT_OPERATION operationMakeRope2(ExecState*, JSString*, JSString*); 125 127 JSCell* JIT_OPERATION operationMakeRope3(ExecState*, JSString*, JSString*, JSString*); -
trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
r181993 r182433 481 481 } 482 482 case StringCharAt: 483 case CallStringConstructor: 483 484 case ToString: 484 485 case MakeRope: { -
trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h
r181993 r182433 220 220 case ToPrimitive: 221 221 case ToString: 222 case CallStringConstructor: 222 223 case NewStringObject: 223 224 case MakeRope: -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r182098 r182433 4849 4849 } 4850 4850 4851 void SpeculativeJIT::compileToStringO nCell(Node* node)4851 void SpeculativeJIT::compileToStringOrCallStringConstructorOnCell(Node* node) 4852 4852 { 4853 4853 SpeculateCellOperand op1(this, node->child1()); … … 4907 4907 needCall.link(&m_jit); 4908 4908 } 4909 callOperation(operationToStringOnCell, resultGPR, op1GPR); 4909 if (node->op() == ToString) 4910 callOperation(operationToStringOnCell, resultGPR, op1GPR); 4911 else { 4912 ASSERT(node->op() == CallStringConstructor); 4913 callOperation(operationCallStringConstructorOnCell, resultGPR, op1GPR); 4914 } 4910 4915 if (done.isSet()) 4911 4916 done.link(&m_jit); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r181993 r182433 2139 2139 void emitSwitch(Node*); 2140 2140 2141 void compileToStringO nCell(Node*);2141 void compileToStringOrCallStringConstructorOnCell(Node*); 2142 2142 void compileNewStringObject(Node*); 2143 2143 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r182001 r182433 3099 3099 } 3100 3100 3101 case ToString: { 3101 case ToString: 3102 case CallStringConstructor: { 3102 3103 if (node->child1().useKind() == UntypedUse) { 3103 3104 JSValueOperand op1(this, node->child1()); … … 3119 3120 slowPath2.link(&m_jit); 3120 3121 } 3121 callOperation(operationToString, resultGPR, op1TagGPR, op1PayloadGPR); 3122 if (op == ToString) 3123 callOperation(operationToString, resultGPR, op1TagGPR, op1PayloadGPR); 3124 else { 3125 ASSERT(op == CallStringConstructor); 3126 callOperation(operationCallStringConstructor, resultGPR, op1TagGPR, op1PayloadGPR); 3127 } 3122 3128 if (done.isSet()) 3123 3129 done.link(&m_jit); … … 3126 3132 } 3127 3133 3128 compileToStringO nCell(node);3134 compileToStringOrCallStringConstructorOnCell(node); 3129 3135 break; 3130 3136 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r181993 r182433 3186 3186 } 3187 3187 3188 case ToString: { 3188 case ToString: 3189 case CallStringConstructor: { 3189 3190 if (node->child1().useKind() == UntypedUse) { 3190 3191 JSValueOperand op1(this, node->child1()); … … 3205 3206 slowPath2.link(&m_jit); 3206 3207 } 3207 callOperation(operationToString, resultGPR, op1GPR); 3208 if (op == ToString) 3209 callOperation(operationToString, resultGPR, op1GPR); 3210 else { 3211 ASSERT(op == CallStringConstructor); 3212 callOperation(operationCallStringConstructor, resultGPR, op1GPR); 3213 } 3208 3214 if (done.isSet()) 3209 3215 done.link(&m_jit); … … 3212 3218 } 3213 3219 3214 compileToStringO nCell(node);3220 compileToStringOrCallStringConstructorOnCell(node); 3215 3221 break; 3216 3222 } -
trunk/Source/JavaScriptCore/dfg/DFGStructureRegistrationPhase.cpp
r181993 r182433 112 112 113 113 case ToString: 114 case CallStringConstructor: 114 115 registerStructure(m_graph.globalObjectFor(node->origin.semantic)->stringObjectStructure()); 115 116 break; -
trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp
r181993 r182433 147 147 case GetArgumentCount: 148 148 case ToString: 149 case CallStringConstructor: 149 150 case MakeRope: 150 151 case NewArrayWithSize: -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r182009 r182433 640 640 break; 641 641 case ToString: 642 compileToString(); 642 case CallStringConstructor: 643 compileToStringOrCallStringConstructor(); 643 644 break; 644 645 case ToPrimitive: … … 3289 3290 } 3290 3291 3291 void compileToString ()3292 void compileToStringOrCallStringConstructor() 3292 3293 { 3293 3294 switch (m_node->child1().useKind()) { … … 3357 3358 LValue operation; 3358 3359 if (m_node->child1().useKind() == CellUse) 3359 operation = m_out.operation( operationToStringOnCell);3360 operation = m_out.operation(m_node->op() == ToString ? operationToStringOnCell : operationCallStringConstructorOnCell); 3360 3361 else 3361 operation = m_out.operation( operationToString);3362 operation = m_out.operation(m_node->op() == ToString ? operationToString : operationCallStringConstructor); 3362 3363 ValueFromBlock convertedResult = m_out.anchor(vmCall(operation, m_callFrame, value)); 3363 3364 m_out.jump(continuation); -
trunk/Source/JavaScriptCore/runtime/StringConstructor.cpp
r179429 r182433 107 107 } 108 108 109 JSCell* stringConstructor(ExecState* exec, JSValue argument) 110 { 111 if (argument.isSymbol()) 112 return jsNontrivialString(exec, asSymbol(argument)->descriptiveString()); 113 return argument.toString(exec); 114 } 115 109 116 static EncodedJSValue JSC_HOST_CALL callStringConstructor(ExecState* exec) 110 117 { 111 118 if (!exec->argumentCount()) 112 119 return JSValue::encode(jsEmptyString(exec)); 113 JSValue argument = exec->uncheckedArgument(0); 114 if (argument.isSymbol()) 115 return JSValue::encode(jsString(exec, asSymbol(argument)->descriptiveString())); 116 return JSValue::encode(argument.toString(exec)); 120 return JSValue::encode(stringConstructor(exec, exec->uncheckedArgument(0))); 117 121 } 118 122 -
trunk/Source/JavaScriptCore/runtime/StringConstructor.h
r173269 r182433 57 57 static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&); 58 58 }; 59 59 60 60 JSCell* JSC_HOST_CALL stringFromCharCode(ExecState*, int32_t); 61 JSCell* stringConstructor(ExecState*, JSValue); 61 62 62 63 } // namespace JSC
Note: See TracChangeset
for help on using the changeset viewer.