Changeset 180550 in webkit
- Timestamp:
- Feb 23, 2015 9:47:22 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 9 added
- 39 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r180549 r180550 1 2015-02-23 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 Constructor returning null should construct an object instead of null 4 https://bugs.webkit.org/show_bug.cgi?id=141640 5 6 Reviewed by Geoffrey Garen. 7 8 * js/dfg-to-primitive-pass-symbol-expected.txt: Added. 9 * js/dfg-to-primitive-pass-symbol.html: Added. 10 * js/dom/constructor-with-return-masquerades-expected.txt: Added. 11 * js/dom/constructor-with-return-masquerades.html: Added. 12 * js/dom/script-tests/constructor-with-return-masquerades.js: Added. 13 (Constructor): 14 15 Follow the old ret_object_or_this semantics. 16 When constructor returns an object that masquerades as undefined, we see it as an object. 17 18 * js/regress/constructor-with-return-expected.txt: Added. 19 * js/regress/constructor-with-return.html: Added. 20 * js/regress/script-tests/constructor-with-return.js: Added. 21 (Test): 22 23 When constructor doesn't return an object, `this` should be returned instead. 24 In this test, we check all primitives. And test object, array and wrappers. 25 26 * js/script-tests/dfg-to-primitive-pass-symbol.js: Added. 27 (toPrimitiveTarget): 28 (doToPrimitive): 29 30 op_to_primitive operation passes Symbol in fast path. 31 1 32 2015-02-23 Ryosuke Niwa <rniwa@webkit.org> 2 33 -
trunk/Source/JavaScriptCore/ChangeLog
r180549 r180550 1 2015-02-23 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 Constructor returning null should construct an object instead of null 4 https://bugs.webkit.org/show_bug.cgi?id=141640 5 6 Reviewed by Geoffrey Garen. 7 8 When constructor code doesn't return object, constructor should return `this` object instead. 9 Since we used `op_is_object` for this check and `op_is_object` is intended to be used for `typeof`, 10 it allows `null` as an object. 11 This patch fixes it by introducing an new bytecode `op_is_object_or_null` for `typeof` use cases. 12 Instead, constructor uses simplified `is_object`. 13 14 As a result, `op_is_object` becomes fairly simple. So we introduce optimization for `op_is_object`. 15 16 1. LLInt and baseline JIT support `op_is_object` as a fast path. 17 2. DFG abstract interpreter support `op_is_object`. And recognize its speculated type and read-write effects. 18 3. DFG introduces inlined asm for `op_is_object` rather than calling a C++ function. 19 4. FTL lowers DFG's IsObject into LLVM IR. 20 21 And at the same time, this patch fixes isString / isObject predicate used for `op_is_object` and others 22 in LLInt, JIT, DFG and FTL. 23 Before introducing ES6 Symbol, JSCell is only used for object and string in user observable area. 24 So in many places, when the cell is not object, we recognize it as a string, and vice versa. 25 However, now ES6 Symbol is implemented as a JSCell, this assumption is broken. 26 So this patch stop using !isString as isObject. 27 To check whether a cell is an object, instead of seeing that structure ID of a cell is not stringStructure, 28 we examine typeInfo in JSCell. 29 30 * JavaScriptCore.order: 31 * bytecode/BytecodeList.json: 32 * bytecode/BytecodeUseDef.h: 33 (JSC::computeUsesForBytecodeOffset): 34 (JSC::computeDefsForBytecodeOffset): 35 * bytecode/CodeBlock.cpp: 36 (JSC::CodeBlock::dumpBytecode): 37 * bytecode/PutByIdStatus.cpp: 38 (JSC::PutByIdStatus::computeFor): 39 * bytecompiler/BytecodeGenerator.cpp: 40 (JSC::BytecodeGenerator::emitEqualityOp): 41 (JSC::BytecodeGenerator::emitReturn): 42 * dfg/DFGAbstractInterpreterInlines.h: 43 (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): 44 * dfg/DFGByteCodeParser.cpp: 45 (JSC::DFG::ByteCodeParser::parseBlock): 46 * dfg/DFGCapabilities.cpp: 47 (JSC::DFG::capabilityLevel): 48 * dfg/DFGClobberize.h: 49 (JSC::DFG::clobberize): 50 51 IsObject operation only touches JSCell typeInfoType. 52 And this value would not be changed through structure transition. 53 As a result, IsObject can report that it doesn't read any information. 54 55 * dfg/DFGDoesGC.cpp: 56 (JSC::DFG::doesGC): 57 * dfg/DFGFixupPhase.cpp: 58 (JSC::DFG::FixupPhase::fixupNode): 59 60 Just like IsString, IsObject is also fixed up. 61 62 * dfg/DFGHeapLocation.cpp: 63 (WTF::printInternal): 64 * dfg/DFGHeapLocation.h: 65 * dfg/DFGNodeType.h: 66 * dfg/DFGOperations.cpp: 67 * dfg/DFGOperations.h: 68 * dfg/DFGPredictionPropagationPhase.cpp: 69 (JSC::DFG::PredictionPropagationPhase::propagate): 70 * dfg/DFGSafeToExecute.h: 71 (JSC::DFG::safeToExecute): 72 * dfg/DFGSpeculativeJIT.cpp: 73 (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): 74 (JSC::DFG::SpeculativeJIT::compileStringToUntypedEquality): 75 (JSC::DFG::SpeculativeJIT::compileStringIdentToNotStringVarEquality): 76 (JSC::DFG::SpeculativeJIT::compileToStringOnCell): 77 (JSC::DFG::SpeculativeJIT::speculateObject): 78 (JSC::DFG::SpeculativeJIT::speculateObjectOrOther): 79 (JSC::DFG::SpeculativeJIT::speculateString): 80 (JSC::DFG::SpeculativeJIT::speculateNotStringVar): 81 (JSC::DFG::SpeculativeJIT::emitSwitchChar): 82 (JSC::DFG::SpeculativeJIT::emitSwitchString): 83 (JSC::DFG::SpeculativeJIT::branchIsObject): 84 (JSC::DFG::SpeculativeJIT::branchNotObject): 85 (JSC::DFG::SpeculativeJIT::branchIsString): 86 (JSC::DFG::SpeculativeJIT::branchNotString): 87 * dfg/DFGSpeculativeJIT.h: 88 * dfg/DFGSpeculativeJIT32_64.cpp: 89 (JSC::DFG::SpeculativeJIT::compileObjectEquality): 90 (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): 91 (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): 92 (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): 93 (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): 94 (JSC::DFG::SpeculativeJIT::compile): 95 * dfg/DFGSpeculativeJIT64.cpp: 96 (JSC::DFG::SpeculativeJIT::compileObjectEquality): 97 (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): 98 (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): 99 (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): 100 (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): 101 (JSC::DFG::SpeculativeJIT::compile): 102 * ftl/FTLCapabilities.cpp: 103 (JSC::FTL::canCompile): 104 * ftl/FTLLowerDFGToLLVM.cpp: 105 (JSC::FTL::LowerDFGToLLVM::compileNode): 106 (JSC::FTL::LowerDFGToLLVM::compileToString): 107 (JSC::FTL::LowerDFGToLLVM::compileIsObject): 108 (JSC::FTL::LowerDFGToLLVM::compileIsObjectOrNull): 109 (JSC::FTL::LowerDFGToLLVM::speculateTruthyObject): 110 (JSC::FTL::LowerDFGToLLVM::equalNullOrUndefined): 111 (JSC::FTL::LowerDFGToLLVM::isObject): 112 (JSC::FTL::LowerDFGToLLVM::isNotObject): 113 (JSC::FTL::LowerDFGToLLVM::isNotString): 114 (JSC::FTL::LowerDFGToLLVM::speculateNonNullObject): 115 * jit/JIT.cpp: 116 (JSC::JIT::privateCompileMainPass): 117 * jit/JIT.h: 118 * jit/JITInlines.h: 119 (JSC::JIT::emitJumpIfCellObject): 120 * jit/JITOpcodes.cpp: 121 (JSC::JIT::emit_op_is_object): 122 (JSC::JIT::emit_op_to_primitive): 123 * jit/JITOpcodes32_64.cpp: 124 (JSC::JIT::emit_op_is_object): 125 (JSC::JIT::emit_op_to_primitive): 126 (JSC::JIT::compileOpStrictEq): 127 * llint/LowLevelInterpreter.asm: 128 * llint/LowLevelInterpreter32_64.asm: 129 * llint/LowLevelInterpreter64.asm: 130 * runtime/CommonSlowPaths.cpp: 131 (JSC::SLOW_PATH_DECL): 132 * runtime/CommonSlowPaths.h: 133 * runtime/Operations.cpp: 134 (JSC::jsIsObjectTypeOrNull): 135 (JSC::jsIsObjectType): Deleted. 136 * runtime/Operations.h: 137 1 138 2015-02-23 Ryosuke Niwa <rniwa@webkit.org> 2 139 -
trunk/Source/JavaScriptCore/JavaScriptCore.order
r180547 r180550 1349 1349 __ZN3JSC11PostfixNode11emitResolveERNS_17BytecodeGeneratorEPNS_10RegisterIDE 1350 1350 __ZN3JSC17BytecodeGenerator7emitIncEPNS_10RegisterIDE 1351 __ZN3JSC14jsIsObjectTypeEPNS_9ExecStateENS_7JSValueE1352 1351 __ZN3JSC6JSCell11getCallDataEPS0_RNS_8CallDataE 1353 1352 __ZN3JSC8JSObject16getPropertyNamesEPS0_PNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE … … 1666 1665 _cti_op_stricteq 1667 1666 _cti_op_jtrue 1668 _cti_op_is_object 1667 _cti_op_is_object_or_null 1669 1668 __ZN3JSC8JSString12toThisObjectEPNS_6JSCellEPNS_9ExecStateE 1670 1669 __ZN3JSC12StringObjectC1ERNS_2VMEPNS_9StructureE … … 2964 2963 __ZN3WTF15BinarySemaphore4waitEd 2965 2964 __ZN3WTF15BinarySemaphore6signalEv 2966 _JSValueIsObject2967 2965 __ZN3JSCL19arrayProtoFuncShiftEPNS_9ExecStateE 2968 2966 __ZN3JSC5shiftILNS_7JSArray14ShiftCountModeE0EEEvPNS_9ExecStateEPNS_8JSObjectEjjjj … … 3391 3389 __ZN3JSC8JSObject20ensureContiguousSlowERNS_2VMENS0_22DoubleToContiguousModeE 3392 3390 _operationMakeRope3 3393 _operationIsObject3394 3391 __ZN3JSC3DFG12slowPathCallINS_22AbstractMacroAssemblerINS_12X86AssemblerEE4JumpEPFxPNS_9ExecStateExPNS_7JSArrayEENS0_11NoResultTagENS_12X86Registers10RegisterIDESE_SE_EEN3WTF10PassOwnPtrINS0_17SlowPathGeneratorEEET_PNS0_14SpeculativeJITET0_T1_T2_T3_T4_NS0_18SpillRegistersModeE 3395 3392 __ZN3JSC3DFG14SpeculativeJIT13callOperationEPFxPNS_9ExecStateExPNS_7JSArrayEENS_12X86Registers10RegisterIDES9_S9_ … … 4898 4895 _llint_slow_path_instanceof 4899 4896 _llint_slow_path_typeof 4900 _llint_slow_path_is_object 4897 _llint_slow_path_is_object_or_null 4901 4898 _llint_slow_path_is_function 4902 4899 _llint_slow_path_in … … 5036 5033 _llint_op_mod 5037 5034 _llint_op_typeof 5038 _llint_op_is_object 5035 _llint_op_is_object_or_null 5039 5036 _llint_op_is_function 5040 5037 _llint_op_in -
trunk/Source/JavaScriptCore/bytecode/BytecodeList.json
r180514 r180550 54 54 { "name" : "op_is_string", "length" : 3 }, 55 55 { "name" : "op_is_object", "length" : 3 }, 56 { "name" : "op_is_object_or_null", "length" : 3 }, 56 57 { "name" : "op_is_function", "length" : 3 }, 57 58 { "name" : "op_in", "length" : 4 }, -
trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.h
r179372 r180550 134 134 case op_is_string: 135 135 case op_is_object: 136 case op_is_object_or_null: 136 137 case op_is_function: 137 138 case op_to_number: … … 333 334 case op_is_string: 334 335 case op_is_object: 336 case op_is_object_or_null: 335 337 case op_is_function: 336 338 case op_in: -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r180518 r180550 1007 1007 case op_is_object: { 1008 1008 printUnaryOp(out, exec, location, it, "is_object"); 1009 break; 1010 } 1011 case op_is_object_or_null: { 1012 printUnaryOp(out, exec, location, it, "is_object_or_null"); 1009 1013 break; 1010 1014 } -
trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp
r178928 r180550 361 361 // If the structure corresponds to something that isn't an object, then give up, since 362 362 // we don't want to be adding properties to strings. 363 if ( structure->typeInfo().type() == StringType)363 if (!structure->typeInfo().isObject()) 364 364 return PutByIdStatus(TakesSlowPath); 365 365 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r180518 r180550 1097 1097 if (value == "object") { 1098 1098 rewindUnaryOp(); 1099 emitOpcode(op_is_object );1099 emitOpcode(op_is_object_or_null); 1100 1100 instructions().append(dst->index()); 1101 1101 instructions().append(srcIndex); … … 1942 1942 1943 1943 size_t begin = instructions().size(); 1944 emitOpcode(op_jtrue);1945 instructions().append(isObjectRegister->index());1946 instructions().append(isObjectLabel->bind(begin, instructions().size()));1947 1948 emitOpcode(op_is_function);1949 instructions().append(isObjectRegister->index());1950 instructions().append(src->index());1951 1952 begin = instructions().size();1953 1944 emitOpcode(op_jtrue); 1954 1945 instructions().append(isObjectRegister->index()); -
trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
r180505 r180550 801 801 case IsString: 802 802 case IsObject: 803 case IsObjectOrNull: 803 804 case IsFunction: { 804 805 JSValue child = forNode(node->child1()).value(); … … 822 823 break; 823 824 case IsObject: 825 setConstant(node, jsBoolean(child.isObject())); 826 break; 827 case IsObjectOrNull: 824 828 if (child.isNull() || !child.isObject()) { 825 829 setConstant(node, jsBoolean(child.isNull())); -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r180546 r180550 2886 2886 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(IsObject, value)); 2887 2887 NEXT_OPCODE(op_is_object); 2888 } 2889 2890 case op_is_object_or_null: { 2891 Node* value = get(VirtualRegister(currentInstruction[2].u.operand)); 2892 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(IsObjectOrNull, value)); 2893 NEXT_OPCODE(op_is_object_or_null); 2888 2894 } 2889 2895 -
trunk/Source/JavaScriptCore/dfg/DFGCapabilities.cpp
r180279 r180550 133 133 case op_is_string: 134 134 case op_is_object: 135 case op_is_object_or_null: 135 136 case op_is_function: 136 137 case op_not: -
trunk/Source/JavaScriptCore/dfg/DFGClobberize.h
r180279 r180550 138 138 case IsNumber: 139 139 case IsString: 140 case IsObject: 140 141 case LogicalNot: 141 142 case CheckInBounds: … … 341 342 return; 342 343 343 case IsObject :344 case IsObjectOrNull: 344 345 read(MiscFields); 345 def(HeapLocation(IsObject Loc, MiscFields, node->child1()), node);346 def(HeapLocation(IsObjectOrNullLoc, MiscFields, node->child1()), node); 346 347 return; 347 348 -
trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp
r180279 r180550 136 136 case IsString: 137 137 case IsObject: 138 case IsObjectOrNull: 138 139 case IsFunction: 139 140 case TypeOf: -
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r180279 r180550 1090 1090 break; 1091 1091 1092 case IsObject: 1093 if (node->child1()->shouldSpeculateObject()) { 1094 m_insertionSet.insertNode( 1095 m_indexInBlock, SpecNone, Phantom, node->origin, 1096 Edge(node->child1().node(), ObjectUse)); 1097 m_graph.convertToConstant(node, jsBoolean(true)); 1098 observeUseKindOnNode<ObjectUse>(node); 1099 } 1100 break; 1101 1092 1102 case GetEnumerableLength: { 1093 1103 fixEdge<CellUse>(node->child1()); … … 1231 1241 case IsBoolean: 1232 1242 case IsNumber: 1233 case IsObject :1243 case IsObjectOrNull: 1234 1244 case IsFunction: 1235 1245 case CreateArguments: -
trunk/Source/JavaScriptCore/dfg/DFGHeapLocation.cpp
r173993 r180550 61 61 return; 62 62 63 case IsObject Loc:64 out.print("IsObject Loc");63 case IsObjectOrNullLoc: 64 out.print("IsObjectOrNullLoc"); 65 65 return; 66 66 67 67 case IsFunctionLoc: 68 68 out.print("IsFunctionLoc"); -
trunk/Source/JavaScriptCore/dfg/DFGHeapLocation.h
r173993 r180550 51 51 InvalidationPointLoc, 52 52 IsFunctionLoc, 53 IsObject Loc,53 IsObjectOrNullLoc, 54 54 MyArgumentByValLoc, 55 55 MyArgumentsLengthLoc, -
trunk/Source/JavaScriptCore/dfg/DFGNodeType.h
r180279 r180550 251 251 macro(IsString, NodeResultBoolean) \ 252 252 macro(IsObject, NodeResultBoolean) \ 253 macro(IsObjectOrNull, NodeResultBoolean) \ 253 254 macro(IsFunction, NodeResultBoolean) \ 254 255 macro(TypeOf, NodeResultJS) \ -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r180279 r180550 809 809 } 810 810 811 size_t JIT_OPERATION operationIsObject (ExecState* exec, EncodedJSValue value)812 { 813 return jsIsObjectType (exec, JSValue::decode(value));811 size_t JIT_OPERATION operationIsObjectOrNull(ExecState* exec, EncodedJSValue value) 812 { 813 return jsIsObjectTypeOrNull(exec, JSValue::decode(value)); 814 814 } 815 815 -
trunk/Source/JavaScriptCore/dfg/DFGOperations.h
r180279 r180550 103 103 JSCell* JIT_OPERATION operationNewFunctionNoCheck(ExecState*, JSScope*, JSCell*) WTF_INTERNAL; 104 104 double JIT_OPERATION operationFModOnInts(int32_t, int32_t) WTF_INTERNAL; 105 size_t JIT_OPERATION operationIsObject (ExecState*, EncodedJSValue) WTF_INTERNAL;105 size_t JIT_OPERATION operationIsObjectOrNull(ExecState*, EncodedJSValue) WTF_INTERNAL; 106 106 size_t JIT_OPERATION operationIsFunction(EncodedJSValue) WTF_INTERNAL; 107 107 JSCell* JIT_OPERATION operationTypeOf(ExecState*, JSCell*) WTF_INTERNAL; -
trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
r180279 r180550 359 359 case IsString: 360 360 case IsObject: 361 case IsObjectOrNull: 361 362 case IsFunction: { 362 363 changed |= setPrediction(SpecBoolean); -
trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h
r180279 r180550 211 211 case IsString: 212 212 case IsObject: 213 case IsObjectOrNull: 213 214 case IsFunction: 214 215 case TypeOf: -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r180098 r180550 1158 1158 if (m_state.forNode(node->child1()).m_type & ~SpecObject) { 1159 1159 speculationCheck( 1160 BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), 1161 m_jit.branchStructurePtr( 1162 MacroAssembler::Equal, 1163 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1164 m_jit.vm()->stringStructure.get())); 1160 BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), branchNotObject(op1GPR)); 1165 1161 } 1166 1162 if (m_state.forNode(node->child2()).m_type & ~SpecObject) { 1167 1163 speculationCheck( 1168 BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), 1169 m_jit.branchStructurePtr( 1170 MacroAssembler::Equal, 1171 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1172 m_jit.vm()->stringStructure.get())); 1164 BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), branchNotObject(op2GPR)); 1173 1165 } 1174 1166 } else { 1175 GPRTemporary structure(this);1176 GPRTemporary temp(this);1177 GPRReg structureGPR = structure.gpr();1178 1179 m_jit.emitLoadStructure(op1GPR, structureGPR, temp.gpr());1180 1167 if (m_state.forNode(node->child1()).m_type & ~SpecObject) { 1181 1168 speculationCheck( 1182 1169 BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), 1183 m_jit.branchPtr( 1184 MacroAssembler::Equal, 1185 structureGPR, 1186 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1170 branchNotObject(op1GPR)); 1187 1171 } 1188 1172 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), … … 1192 1176 MacroAssembler::TrustedImm32(MasqueradesAsUndefined))); 1193 1177 1194 m_jit.emitLoadStructure(op2GPR, structureGPR, temp.gpr());1195 1178 if (m_state.forNode(node->child2()).m_type & ~SpecObject) { 1196 1179 speculationCheck( 1197 1180 BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), 1198 m_jit.branchPtr( 1199 MacroAssembler::Equal, 1200 structureGPR, 1201 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1181 branchNotObject(op2GPR)); 1202 1182 } 1203 1183 speculationCheck(BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), … … 3964 3944 MacroAssembler::Equal, leftGPR, rightRegs.payloadGPR())); 3965 3945 3966 fastFalse.append(m_jit.branchStructurePtr( 3967 MacroAssembler::NotEqual, 3968 MacroAssembler::Address(rightRegs.payloadGPR(), JSCell::structureIDOffset()), 3969 m_jit.vm()->stringStructure.get())); 3946 fastFalse.append(branchNotString(rightRegs.payloadGPR())); 3970 3947 3971 3948 compileStringEquality( … … 4015 3992 JITCompiler::JumpList notString; 4016 3993 notString.append(branchNotCell(rightRegs)); 4017 notString.append(m_jit.branchStructurePtr( 4018 MacroAssembler::NotEqual, 4019 MacroAssembler::Address(rightRegs.payloadGPR(), JSCell::structureIDOffset()), 4020 m_jit.vm()->stringStructure.get())); 3994 notString.append(branchNotString(rightRegs.payloadGPR())); 4021 3995 4022 3996 speculateStringIdentAndLoadStorage(notStringVarEdge, rightRegs.payloadGPR(), rightTempGPR); … … 4461 4435 m_jit.load32(JITCompiler::Address(op1GPR, JSCell::structureIDOffset()), resultGPR); 4462 4436 JITCompiler::Jump isString = m_jit.branchStructurePtr( 4463 JITCompiler::Equal, 4437 JITCompiler::Equal, 4464 4438 resultGPR, 4465 4439 m_jit.vm()->stringStructure.get()); 4466 4440 4467 4441 speculateStringObjectForStructure(node->child1(), resultGPR); 4468 4442 … … 4490 4464 JITCompiler::Jump done; 4491 4465 if (node->child1()->prediction() & SpecString) { 4492 JITCompiler::Jump needCall = m_jit.branchStructurePtr( 4493 JITCompiler::NotEqual, 4494 JITCompiler::Address(op1GPR, JSCell::structureIDOffset()), 4495 m_jit.vm()->stringStructure.get()); 4466 JITCompiler::Jump needCall = branchNotString(op1GPR); 4496 4467 m_jit.move(op1GPR, resultGPR); 4497 4468 done = m_jit.jump(); … … 4717 4688 GPRReg gpr = operand.gpr(); 4718 4689 DFG_TYPE_CHECK( 4719 JSValueSource::unboxedCell(gpr), edge, SpecObject, m_jit.branchStructurePtr( 4720 MacroAssembler::Equal, 4721 MacroAssembler::Address(gpr, JSCell::structureIDOffset()), 4722 m_jit.vm()->stringStructure.get())); 4690 JSValueSource::unboxedCell(gpr), edge, SpecObject, branchNotObject(gpr)); 4723 4691 } 4724 4692 … … 4752 4720 GPRReg gpr = operand.jsValueRegs().payloadGPR(); 4753 4721 DFG_TYPE_CHECK( 4754 operand.jsValueRegs(), edge, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 4755 MacroAssembler::Equal, 4756 MacroAssembler::Address(gpr, JSCell::structureIDOffset()), 4757 m_jit.vm()->stringStructure.get())); 4722 operand.jsValueRegs(), edge, (~SpecCell) | SpecObject, branchNotObject(gpr)); 4758 4723 MacroAssembler::Jump done = m_jit.jump(); 4759 4724 notCell.link(&m_jit); … … 4769 4734 { 4770 4735 DFG_TYPE_CHECK( 4771 JSValueSource::unboxedCell(cell), edge, SpecString | ~SpecCell, 4772 m_jit.branchStructurePtr( 4773 MacroAssembler::NotEqual, 4774 MacroAssembler::Address(cell, JSCell::structureIDOffset()), 4775 m_jit.vm()->stringStructure.get())); 4736 JSValueSource::unboxedCell(cell), edge, SpecString | ~SpecCell, branchNotString(cell)); 4776 4737 } 4777 4738 … … 4878 4839 GPRReg cell = operand.jsValueRegs().payloadGPR(); 4879 4840 4880 JITCompiler::Jump notString = m_jit.branchStructurePtr( 4881 MacroAssembler::NotEqual, 4882 MacroAssembler::Address(cell, JSCell::structureIDOffset()), 4883 m_jit.vm()->stringStructure.get()); 4841 JITCompiler::Jump notString = branchNotString(cell); 4884 4842 4885 4843 speculateStringIdentAndLoadStorage(edge, cell, tempGPR); … … 5157 5115 addBranch(branchNotCell(op1Regs), data->fallThrough.block); 5158 5116 5159 addBranch( 5160 m_jit.branchStructurePtr( 5161 MacroAssembler::NotEqual, 5162 MacroAssembler::Address(op1Regs.payloadGPR(), JSCell::structureIDOffset()), 5163 m_jit.vm()->stringStructure.get()), 5164 data->fallThrough.block); 5117 addBranch(branchNotString(op1Regs.payloadGPR()), data->fallThrough.block); 5165 5118 5166 5119 emitSwitchCharStringJump(data, op1Regs.payloadGPR(), tempGPR); … … 5447 5400 addBranch(branchNotCell(op1Regs), data->fallThrough.block); 5448 5401 5449 addBranch( 5450 m_jit.branchStructurePtr( 5451 MacroAssembler::NotEqual, 5452 MacroAssembler::Address(op1Regs.payloadGPR(), JSCell::structureIDOffset()), 5453 m_jit.vm()->stringStructure.get()), 5454 data->fallThrough.block); 5402 addBranch(branchNotString(op1Regs.payloadGPR()), data->fallThrough.block); 5455 5403 5456 5404 emitSwitchStringOnString(data, op1Regs.payloadGPR()); … … 5500 5448 branch.jump.linkTo(m_jit.blockHeads()[branch.destination->index], &m_jit); 5501 5449 } 5450 } 5451 5452 JITCompiler::Jump SpeculativeJIT::branchIsObject(GPRReg cellGPR) 5453 { 5454 return m_jit.branch8( 5455 MacroAssembler::AboveOrEqual, 5456 MacroAssembler::Address(cellGPR, JSCell::typeInfoTypeOffset()), 5457 MacroAssembler::TrustedImm32(ObjectType)); 5458 } 5459 5460 JITCompiler::Jump SpeculativeJIT::branchNotObject(GPRReg cellGPR) 5461 { 5462 return m_jit.branch8( 5463 MacroAssembler::Below, 5464 MacroAssembler::Address(cellGPR, JSCell::typeInfoTypeOffset()), 5465 MacroAssembler::TrustedImm32(ObjectType)); 5466 } 5467 5468 JITCompiler::Jump SpeculativeJIT::branchIsString(GPRReg cellGPR) 5469 { 5470 return m_jit.branchStructurePtr( 5471 MacroAssembler::Equal, 5472 MacroAssembler::Address(cellGPR, JSCell::structureIDOffset()), 5473 m_jit.vm()->stringStructure.get()); 5474 } 5475 5476 JITCompiler::Jump SpeculativeJIT::branchNotString(GPRReg cellGPR) 5477 { 5478 return m_jit.branchStructurePtr( 5479 MacroAssembler::NotEqual, 5480 MacroAssembler::Address(cellGPR, JSCell::structureIDOffset()), 5481 m_jit.vm()->stringStructure.get()); 5502 5482 } 5503 5483 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r180345 r180550 2192 2192 JITCompiler::Jump branchIsOther(JSValueRegs, GPRReg tempGPR); 2193 2193 JITCompiler::Jump branchNotOther(JSValueRegs, GPRReg tempGPR); 2194 JITCompiler::Jump branchIsObject(GPRReg cellGPR); 2195 JITCompiler::Jump branchNotObject(GPRReg cellGPR); 2196 JITCompiler::Jump branchIsString(GPRReg cellGPR); 2197 JITCompiler::Jump branchNotString(GPRReg cellGPR); 2194 2198 2195 2199 void moveTrueTo(GPRReg); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r180279 r180550 1201 1201 if (masqueradesAsUndefinedWatchpointIsStillValid()) { 1202 1202 DFG_TYPE_CHECK( 1203 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, m_jit.branchPtr( 1204 MacroAssembler::Equal, 1205 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1206 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1203 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, branchNotObject(op1GPR)); 1207 1204 DFG_TYPE_CHECK( 1208 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, m_jit.branchPtr( 1209 MacroAssembler::Equal, 1210 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1211 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1205 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, branchNotObject(op2GPR)); 1212 1206 } else { 1213 1207 DFG_TYPE_CHECK( 1214 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, m_jit.branchPtr( 1215 MacroAssembler::Equal, 1216 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1217 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1218 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), 1208 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, branchNotObject(op1GPR)); 1209 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), 1219 1210 m_jit.branchTest8( 1220 1211 MacroAssembler::NonZero, 1221 MacroAssembler::Address(op1GPR, JSCell::typeInfoFlagsOffset()), 1212 MacroAssembler::Address(op1GPR, JSCell::typeInfoFlagsOffset()), 1222 1213 MacroAssembler::TrustedImm32(MasqueradesAsUndefined))); 1223 1214 1224 1215 DFG_TYPE_CHECK( 1225 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, m_jit.branchPtr( 1226 MacroAssembler::Equal, 1227 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1228 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1229 speculationCheck(BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), 1216 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, branchNotObject(op2GPR)); 1217 speculationCheck(BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), 1230 1218 m_jit.branchTest8( 1231 MacroAssembler::NonZero, 1232 MacroAssembler::Address(op2GPR, JSCell::typeInfoFlagsOffset()), 1219 MacroAssembler::NonZero, 1220 MacroAssembler::Address(op2GPR, JSCell::typeInfoFlagsOffset()), 1233 1221 MacroAssembler::TrustedImm32(MasqueradesAsUndefined))); 1234 1222 } … … 1263 1251 if (masqueradesAsUndefinedWatchpointValid) { 1264 1252 DFG_TYPE_CHECK( 1265 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchPtr( 1266 MacroAssembler::Equal, 1267 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1268 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1253 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1269 1254 } else { 1270 1255 DFG_TYPE_CHECK( 1271 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchPtr( 1272 MacroAssembler::Equal, 1273 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1274 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1256 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1275 1257 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), leftChild, 1276 1258 m_jit.branchTest8( … … 1288 1270 if (masqueradesAsUndefinedWatchpointValid) { 1289 1271 DFG_TYPE_CHECK( 1290 JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, (~SpecCell) | SpecObject, 1291 m_jit.branchPtr( 1292 MacroAssembler::Equal, 1293 MacroAssembler::Address(op2PayloadGPR, JSCell::structureIDOffset()), 1294 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1272 JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, (~SpecCell) | SpecObject, branchNotObject(op2PayloadGPR)); 1295 1273 } else { 1296 1274 DFG_TYPE_CHECK( 1297 JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, (~SpecCell) | SpecObject, 1298 m_jit.branchPtr( 1299 MacroAssembler::Equal, 1300 MacroAssembler::Address(op2PayloadGPR, JSCell::structureIDOffset()), 1301 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1275 JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, (~SpecCell) | SpecObject, branchNotObject(op2PayloadGPR)); 1302 1276 speculationCheck(BadType, JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, 1303 1277 m_jit.branchTest8( … … 1356 1330 if (masqueradesAsUndefinedWatchpointValid) { 1357 1331 DFG_TYPE_CHECK( 1358 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchPtr( 1359 MacroAssembler::Equal, 1360 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1361 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1332 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1362 1333 } else { 1363 1334 DFG_TYPE_CHECK( 1364 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchPtr( 1365 MacroAssembler::Equal, 1366 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1367 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1335 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1368 1336 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), leftChild, 1369 1337 m_jit.branchTest8( … … 1381 1349 DFG_TYPE_CHECK( 1382 1350 JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, (~SpecCell) | SpecObject, 1383 m_jit.branchPtr( 1384 MacroAssembler::Equal, 1385 MacroAssembler::Address(op2PayloadGPR, JSCell::structureIDOffset()), 1386 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1351 branchNotObject(op2PayloadGPR)); 1387 1352 } else { 1388 1353 DFG_TYPE_CHECK( 1389 1354 JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, (~SpecCell) | SpecObject, 1390 m_jit.branchPtr( 1391 MacroAssembler::Equal, 1392 MacroAssembler::Address(op2PayloadGPR, JSCell::structureIDOffset()), 1393 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1355 branchNotObject(op2PayloadGPR)); 1394 1356 speculationCheck(BadType, JSValueRegs(op2TagGPR, op2PayloadGPR), rightChild, 1395 1357 m_jit.branchTest8( … … 1475 1437 DFG_TYPE_CHECK( 1476 1438 JSValueRegs(valueTagGPR, valuePayloadGPR), nodeUse, (~SpecCell) | SpecObject, 1477 m_jit.branchPtr( 1478 MacroAssembler::Equal, 1479 MacroAssembler::Address(valuePayloadGPR, JSCell::structureIDOffset()), 1480 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1439 branchNotObject(valuePayloadGPR)); 1481 1440 } else { 1482 m_jit.loadPtr(MacroAssembler::Address(valuePayloadGPR, JSCell::structureIDOffset()), structureGPR);1483 1484 1441 DFG_TYPE_CHECK( 1485 1442 JSValueRegs(valueTagGPR, valuePayloadGPR), nodeUse, (~SpecCell) | SpecObject, 1486 m_jit.branchPtr( 1487 MacroAssembler::Equal, 1488 structureGPR, 1489 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1443 branchNotObject(valuePayloadGPR)); 1490 1444 1491 1445 MacroAssembler::Jump isNotMasqueradesAsUndefined = … … 1495 1449 MacroAssembler::TrustedImm32(MasqueradesAsUndefined)); 1496 1450 1451 m_jit.loadPtr(MacroAssembler::Address(valuePayloadGPR, JSCell::structureIDOffset()), structureGPR); 1497 1452 speculationCheck(BadType, JSValueRegs(valueTagGPR, valuePayloadGPR), nodeUse, 1498 1453 m_jit.branchPtr( … … 1604 1559 DFG_TYPE_CHECK( 1605 1560 JSValueRegs(valueTagGPR, valuePayloadGPR), nodeUse, (~SpecCell) | SpecObject, 1606 m_jit.branchPtr( 1607 MacroAssembler::Equal, 1608 MacroAssembler::Address(valuePayloadGPR, JSCell::structureIDOffset()), 1609 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1561 branchNotObject(valuePayloadGPR)); 1610 1562 } else { 1611 m_jit.loadPtr(MacroAssembler::Address(valuePayloadGPR, JSCell::structureIDOffset()), scratchGPR);1612 1613 1563 DFG_TYPE_CHECK( 1614 1564 JSValueRegs(valueTagGPR, valuePayloadGPR), nodeUse, (~SpecCell) | SpecObject, 1615 m_jit.branchPtr( 1616 MacroAssembler::Equal, 1617 scratchGPR, 1618 MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()))); 1565 branchNotObject(valuePayloadGPR)); 1619 1566 1620 1567 JITCompiler::Jump isNotMasqueradesAsUndefined = m_jit.branchTest8( … … 1623 1570 TrustedImm32(MasqueradesAsUndefined)); 1624 1571 1572 m_jit.loadPtr(MacroAssembler::Address(valuePayloadGPR, JSCell::structureIDOffset()), scratchGPR); 1625 1573 speculationCheck(BadType, JSValueRegs(valueTagGPR, valuePayloadGPR), nodeUse, 1626 1574 m_jit.branchPtr( … … 3166 3114 } else { 3167 3115 MacroAssembler::Jump alreadyPrimitive = branchNotCell(op1.jsValueRegs()); 3168 MacroAssembler::Jump notPrimitive = m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(op1PayloadGPR, JSCell::structureIDOffset()), MacroAssembler::TrustedImmPtr(m_jit.vm()->stringStructure.get()));3116 MacroAssembler::Jump notPrimitive = branchIsObject(op1PayloadGPR); 3169 3117 3170 3118 alreadyPrimitive.link(&m_jit); … … 3196 3144 if (node->child1()->prediction() & SpecString) { 3197 3145 JITCompiler::Jump slowPath1 = branchNotCell(op1.jsValueRegs()); 3198 JITCompiler::Jump slowPath2 = m_jit.branchPtr( 3199 JITCompiler::NotEqual, 3200 JITCompiler::Address(op1PayloadGPR, JSCell::structureIDOffset()), 3201 TrustedImmPtr(m_jit.vm()->stringStructure.get())); 3146 JITCompiler::Jump slowPath2 = branchNotString(op1PayloadGPR); 3202 3147 m_jit.move(op1PayloadGPR, resultGPR); 3203 3148 done = m_jit.jump(); … … 4208 4153 case IsObject: { 4209 4154 JSValueOperand value(this, node->child1()); 4155 GPRTemporary result(this, Reuse, value, TagWord); 4156 4157 JITCompiler::Jump isNotCell = branchNotCell(value.jsValueRegs()); 4158 4159 m_jit.compare8(JITCompiler::AboveOrEqual, 4160 JITCompiler::Address(value.payloadGPR(), JSCell::typeInfoTypeOffset()), 4161 TrustedImm32(ObjectType), 4162 result.gpr()); 4163 JITCompiler::Jump done = m_jit.jump(); 4164 4165 isNotCell.link(&m_jit); 4166 m_jit.move(TrustedImm32(0), result.gpr()); 4167 4168 done.link(&m_jit); 4169 booleanResult(result.gpr(), node); 4170 break; 4171 } 4172 4173 case IsObjectOrNull: { 4174 JSValueOperand value(this, node->child1()); 4210 4175 GPRReg valueTagGPR = value.tagGPR(); 4211 4176 GPRReg valuePayloadGPR = value.payloadGPR(); … … 4213 4178 GPRReg resultGPR = result.gpr(); 4214 4179 flushRegisters(); 4215 callOperation(operationIsObject , resultGPR, valueTagGPR, valuePayloadGPR);4180 callOperation(operationIsObjectOrNull, resultGPR, valueTagGPR, valuePayloadGPR); 4216 4181 booleanResult(result.gpr(), node); 4217 4182 break; … … 4248 4213 4249 4214 if (!node->child1()->shouldSpeculateObject() || node->child1().useKind() == StringUse) { 4250 JITCompiler::Jump notString = m_jit.branch8( 4251 JITCompiler::NotEqual, 4252 JITCompiler::Address(payloadGPR, JSCell::typeInfoTypeOffset()), 4253 TrustedImm32(StringType)); 4215 JITCompiler::Jump notString = branchNotString(payloadGPR); 4254 4216 if (node->child1().useKind() == StringUse) 4255 4217 DFG_TYPE_CHECK(JSValueRegs(tagGPR, payloadGPR), node->child1(), SpecString, notString); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r180279 r180550 1307 1307 if (masqueradesAsUndefinedWatchpointIsStillValid()) { 1308 1308 DFG_TYPE_CHECK( 1309 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, m_jit.branchStructurePtr( 1310 MacroAssembler::Equal, 1311 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1312 m_jit.vm()->stringStructure.get())); 1309 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, branchNotObject(op1GPR)); 1313 1310 DFG_TYPE_CHECK( 1314 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, m_jit.branchStructurePtr( 1315 MacroAssembler::Equal, 1316 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1317 m_jit.vm()->stringStructure.get())); 1311 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, branchNotObject(op2GPR)); 1318 1312 } else { 1319 1313 DFG_TYPE_CHECK( 1320 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, m_jit.branchStructurePtr( 1321 MacroAssembler::Equal, 1322 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1323 m_jit.vm()->stringStructure.get())); 1314 JSValueSource::unboxedCell(op1GPR), node->child1(), SpecObject, branchNotObject(op1GPR)); 1324 1315 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), node->child1(), 1325 1316 m_jit.branchTest8( … … 1329 1320 1330 1321 DFG_TYPE_CHECK( 1331 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, m_jit.branchStructurePtr( 1332 MacroAssembler::Equal, 1333 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1334 m_jit.vm()->stringStructure.get())); 1322 JSValueSource::unboxedCell(op2GPR), node->child2(), SpecObject, branchNotObject(op2GPR)); 1335 1323 speculationCheck(BadType, JSValueSource::unboxedCell(op2GPR), node->child2(), 1336 1324 m_jit.branchTest8( … … 1365 1353 if (masqueradesAsUndefinedWatchpointValid) { 1366 1354 DFG_TYPE_CHECK( 1367 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchStructurePtr( 1368 MacroAssembler::Equal, 1369 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1370 m_jit.vm()->stringStructure.get())); 1355 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1371 1356 } else { 1372 1357 DFG_TYPE_CHECK( 1373 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchStructurePtr( 1374 MacroAssembler::Equal, 1375 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1376 m_jit.vm()->stringStructure.get())); 1358 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1377 1359 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), leftChild, 1378 1360 m_jit.branchTest8( … … 1389 1371 if (masqueradesAsUndefinedWatchpointValid) { 1390 1372 DFG_TYPE_CHECK( 1391 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1392 MacroAssembler::Equal, 1393 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1394 m_jit.vm()->stringStructure.get())); 1373 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, branchNotObject(op2GPR)); 1395 1374 } else { 1396 1375 DFG_TYPE_CHECK( 1397 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1398 MacroAssembler::Equal, 1399 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1400 m_jit.vm()->stringStructure.get())); 1376 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, branchNotObject(op2GPR)); 1401 1377 speculationCheck(BadType, JSValueRegs(op2GPR), rightChild, 1402 1378 m_jit.branchTest8( … … 1455 1431 if (masqueradesAsUndefinedWatchpointValid) { 1456 1432 DFG_TYPE_CHECK( 1457 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchStructurePtr( 1458 MacroAssembler::Equal, 1459 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1460 m_jit.vm()->stringStructure.get())); 1433 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1461 1434 } else { 1462 1435 DFG_TYPE_CHECK( 1463 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, m_jit.branchStructurePtr( 1464 MacroAssembler::Equal, 1465 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 1466 m_jit.vm()->stringStructure.get())); 1436 JSValueSource::unboxedCell(op1GPR), leftChild, SpecObject, branchNotObject(op1GPR)); 1467 1437 speculationCheck(BadType, JSValueSource::unboxedCell(op1GPR), leftChild, 1468 1438 m_jit.branchTest8( … … 1479 1449 if (masqueradesAsUndefinedWatchpointValid) { 1480 1450 DFG_TYPE_CHECK( 1481 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1482 MacroAssembler::Equal, 1483 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1484 m_jit.vm()->stringStructure.get())); 1451 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, branchNotObject(op2GPR)); 1485 1452 } else { 1486 1453 DFG_TYPE_CHECK( 1487 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1488 MacroAssembler::Equal, 1489 MacroAssembler::Address(op2GPR, JSCell::structureIDOffset()), 1490 m_jit.vm()->stringStructure.get())); 1454 JSValueRegs(op2GPR), rightChild, (~SpecCell) | SpecObject, branchNotObject(op2GPR)); 1491 1455 speculationCheck(BadType, JSValueRegs(op2GPR), rightChild, 1492 1456 m_jit.branchTest8( … … 1610 1574 if (masqueradesAsUndefinedWatchpointValid) { 1611 1575 DFG_TYPE_CHECK( 1612 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1613 MacroAssembler::Equal, 1614 MacroAssembler::Address(valueGPR, JSCell::structureIDOffset()), 1615 m_jit.vm()->stringStructure.get())); 1576 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, branchNotObject(valueGPR)); 1616 1577 } else { 1617 1578 DFG_TYPE_CHECK( 1618 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1619 MacroAssembler::Equal, 1620 MacroAssembler::Address(valueGPR, JSCell::structureIDOffset()), 1621 m_jit.vm()->stringStructure.get())); 1579 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, branchNotObject(valueGPR)); 1622 1580 1623 1581 MacroAssembler::Jump isNotMasqueradesAsUndefined = … … 1760 1718 if (masqueradesAsUndefinedWatchpointIsStillValid()) { 1761 1719 DFG_TYPE_CHECK( 1762 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1763 MacroAssembler::Equal, 1764 MacroAssembler::Address(valueGPR, JSCell::structureIDOffset()), 1765 m_jit.vm()->stringStructure.get())); 1720 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, branchNotObject(valueGPR)); 1766 1721 } else { 1767 1722 DFG_TYPE_CHECK( 1768 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, m_jit.branchStructurePtr( 1769 MacroAssembler::Equal, 1770 MacroAssembler::Address(valueGPR, JSCell::structureIDOffset()), 1771 m_jit.vm()->stringStructure.get())); 1723 JSValueRegs(valueGPR), nodeUse, (~SpecCell) | SpecObject, branchNotObject(valueGPR)); 1772 1724 1773 1725 JITCompiler::Jump isNotMasqueradesAsUndefined = m_jit.branchTest8( … … 3280 3232 3281 3233 MacroAssembler::Jump alreadyPrimitive = branchNotCell(JSValueRegs(op1GPR)); 3282 MacroAssembler::Jump notPrimitive = m_jit.branchStructurePtr( 3283 MacroAssembler::NotEqual, 3284 MacroAssembler::Address(op1GPR, JSCell::structureIDOffset()), 3285 m_jit.vm()->stringStructure.get()); 3234 MacroAssembler::Jump notPrimitive = branchIsObject(op1GPR); 3286 3235 3287 3236 alreadyPrimitive.link(&m_jit); … … 3308 3257 if (node->child1()->prediction() & SpecString) { 3309 3258 JITCompiler::Jump slowPath1 = branchNotCell(JSValueRegs(op1GPR)); 3310 JITCompiler::Jump slowPath2 = m_jit.branchStructurePtr( 3311 JITCompiler::NotEqual, 3312 JITCompiler::Address(op1GPR, JSCell::structureIDOffset()), 3313 m_jit.vm()->stringStructure.get()); 3259 JITCompiler::Jump slowPath2 = branchNotString(op1GPR); 3314 3260 m_jit.move(op1GPR, resultGPR); 3315 3261 done = m_jit.jump(); … … 4263 4209 break; 4264 4210 } 4265 4211 4266 4212 case IsObject: { 4213 JSValueOperand value(this, node->child1()); 4214 GPRTemporary result(this, Reuse, value); 4215 4216 JITCompiler::Jump isNotCell = branchNotCell(value.jsValueRegs()); 4217 4218 m_jit.compare8(JITCompiler::AboveOrEqual, 4219 JITCompiler::Address(value.gpr(), JSCell::typeInfoTypeOffset()), 4220 TrustedImm32(ObjectType), 4221 result.gpr()); 4222 m_jit.or32(TrustedImm32(ValueFalse), result.gpr()); 4223 JITCompiler::Jump done = m_jit.jump(); 4224 4225 isNotCell.link(&m_jit); 4226 m_jit.move(TrustedImm32(ValueFalse), result.gpr()); 4227 4228 done.link(&m_jit); 4229 jsValueResult(result.gpr(), node, DataFormatJSBoolean); 4230 break; 4231 } 4232 4233 case IsObjectOrNull: { 4267 4234 JSValueOperand value(this, node->child1()); 4268 4235 GPRReg valueGPR = value.gpr(); … … 4270 4237 GPRReg resultGPR = result.gpr(); 4271 4238 flushRegisters(); 4272 callOperation(operationIsObject , resultGPR, valueGPR);4239 callOperation(operationIsObjectOrNull, resultGPR, valueGPR); 4273 4240 m_jit.or32(TrustedImm32(ValueFalse), resultGPR); 4274 4241 jsValueResult(result.gpr(), node, DataFormatJSBoolean); … … 4304 4271 4305 4272 if (!node->child1()->shouldSpeculateObject() || node->child1().useKind() == StringUse) { 4306 JITCompiler::Jump notString = m_jit.branch8( 4307 JITCompiler::NotEqual, 4308 JITCompiler::Address(valueGPR, JSCell::typeInfoTypeOffset()), 4309 TrustedImm32(StringType)); 4273 JITCompiler::Jump notString = branchNotString(valueGPR); 4310 4274 if (node->child1().useKind() == StringUse) 4311 4275 DFG_TYPE_CHECK(JSValueSource(valueGPR), node->child1(), SpecString, notString); … … 5079 5043 else if (cachedTypeLocation->m_lastSeenType == TypeString) { 5080 5044 MacroAssembler::Jump isNotCell = branchNotCell(JSValueRegs(valueGPR)); 5081 jumpToEnd.append( m_jit.branch8(MacroAssembler::Equal, MacroAssembler::Address(valueGPR, JSCell::typeInfoTypeOffset()), TrustedImm32(StringType)));5045 jumpToEnd.append(branchIsString(valueGPR)); 5082 5046 isNotCell.link(&m_jit); 5083 5047 } -
trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp
r180279 r180550 157 157 case IsString: 158 158 case IsObject: 159 case IsObjectOrNull: 159 160 case IsFunction: 160 161 case CheckHasInstance: -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r180360 r180550 761 761 case IsObject: 762 762 compileIsObject(); 763 break; 764 case IsObjectOrNull: 765 compileIsObjectOrNull(); 763 766 break; 764 767 case IsFunction: … … 3097 3100 LValue isStringPredicate; 3098 3101 if (m_node->child1()->prediction() & SpecString) { 3099 isStringPredicate = m_out.equal( 3100 m_out.load32(value, m_heaps.JSCell_structureID), 3101 m_out.constInt32(vm().stringStructure->id())); 3102 isStringPredicate = isString(value); 3102 3103 } else 3103 3104 isStringPredicate = m_out.booleanFalse; … … 4205 4206 setBoolean(m_out.phi(m_out.boolean, notCellResult, cellResult)); 4206 4207 } 4207 4208 4208 4209 void compileIsObject() 4209 4210 { 4211 LValue value = lowJSValue(m_node->child1()); 4212 4213 LBasicBlock isCellCase = FTL_NEW_BLOCK(m_out, ("IsObject cell case")); 4214 LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("IsObject continuation")); 4215 4216 ValueFromBlock notCellResult = m_out.anchor(m_out.booleanFalse); 4217 m_out.branch(isCell(value), unsure(isCellCase), unsure(continuation)); 4218 4219 LBasicBlock lastNext = m_out.appendTo(isCellCase, continuation); 4220 ValueFromBlock cellResult = m_out.anchor(isObject(value)); 4221 m_out.jump(continuation); 4222 4223 m_out.appendTo(continuation, lastNext); 4224 setBoolean(m_out.phi(m_out.boolean, notCellResult, cellResult)); 4225 } 4226 4227 void compileIsObjectOrNull() 4228 { 4210 4229 LValue pointerResult = vmCall( 4211 m_out.operation(operationIsObject ), m_callFrame, lowJSValue(m_node->child1()));4230 m_out.operation(operationIsObjectOrNull), m_callFrame, lowJSValue(m_node->child1())); 4212 4231 setBoolean(m_out.notNull(pointerResult)); 4213 4232 } … … 5131 5150 } 5132 5151 5133 LValue structureID = m_out.load32(cell, m_heaps.JSCell_structureID); 5134 FTL_TYPE_CHECK( 5135 jsValueValue(cell), edge, filter, 5136 m_out.equal(structureID, m_out.constInt32(vm().stringStructure->id()))); 5152 FTL_TYPE_CHECK(jsValueValue(cell), edge, filter, isNotObject(cell)); 5137 5153 speculate( 5138 5154 BadType, jsValueValue(cell), edge.node(), … … 5444 5460 case CellCaseSpeculatesObject: 5445 5461 FTL_TYPE_CHECK( 5446 jsValueValue(value), edge, (~SpecCell) | SpecObject, 5447 m_out.equal( 5448 m_out.load32(value, m_heaps.JSCell_structureID), 5449 m_out.constInt32(vm().stringStructure->id()))); 5462 jsValueValue(value), edge, (~SpecCell) | SpecObject, isNotObject(value)); 5450 5463 break; 5451 5464 } … … 6273 6286 LValue isObject(LValue cell) 6274 6287 { 6288 return m_out.aboveOrEqual( 6289 m_out.load8(cell, m_heaps.JSCell_typeInfoType), 6290 m_out.constInt8(ObjectType)); 6291 } 6292 6293 LValue isNotObject(LValue cell) 6294 { 6295 return m_out.below( 6296 m_out.load8(cell, m_heaps.JSCell_typeInfoType), 6297 m_out.constInt8(ObjectType)); 6298 } 6299 6300 LValue isNotString(LValue cell) 6301 { 6275 6302 return m_out.notEqual( 6276 6303 m_out.load32(cell, m_heaps.JSCell_structureID), … … 6278 6305 } 6279 6306 6280 LValue isNotString(LValue cell)6281 {6282 return isObject(cell);6283 }6284 6285 6307 LValue isString(LValue cell) 6286 6308 { … … 6288 6310 m_out.load32(cell, m_heaps.JSCell_structureID), 6289 6311 m_out.constInt32(vm().stringStructure->id())); 6290 }6291 6292 LValue isNotObject(LValue cell)6293 {6294 return isString(cell);6295 6312 } 6296 6313 … … 6491 6508 void speculateNonNullObject(Edge edge, LValue cell) 6492 6509 { 6493 FTL_TYPE_CHECK( 6494 jsValueValue(cell), edge, SpecObject, 6495 m_out.equal( 6496 m_out.load32(cell, m_heaps.JSCell_structureID), 6497 m_out.constInt32(vm().stringStructure->id()))); 6510 FTL_TYPE_CHECK(jsValueValue(cell), edge, SpecObject, isNotObject(cell)); 6498 6511 if (masqueradesAsUndefinedWatchpointIsStillValid()) 6499 6512 return; -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r180279 r180550 186 186 DEFINE_SLOW_OP(greatereq) 187 187 DEFINE_SLOW_OP(is_function) 188 DEFINE_SLOW_OP(is_object )188 DEFINE_SLOW_OP(is_object_or_null) 189 189 DEFINE_SLOW_OP(typeof) 190 190 … … 226 226 DEFINE_OP(op_is_number) 227 227 DEFINE_OP(op_is_string) 228 DEFINE_OP(op_is_object) 228 229 DEFINE_OP(op_jeq_null) 229 230 DEFINE_OP(op_jfalse) -
trunk/Source/JavaScriptCore/jit/JIT.h
r180514 r180550 308 308 void emitLoadDouble(int index, FPRegisterID value); 309 309 void emitLoadInt32ToDouble(int index, FPRegisterID value); 310 Jump emitJumpIfCellObject(RegisterID cellReg); 310 311 Jump emitJumpIfCellNotObject(RegisterID cellReg); 311 312 … … 490 491 void emit_op_is_number(Instruction*); 491 492 void emit_op_is_string(Instruction*); 493 void emit_op_is_object(Instruction*); 492 494 void emit_op_jeq_null(Instruction*); 493 495 void emit_op_jfalse(Instruction*); -
trunk/Source/JavaScriptCore/jit/JITInlines.h
r180514 r180550 686 686 } 687 687 688 ALWAYS_INLINE JIT::Jump JIT::emitJumpIfCellObject(RegisterID cellReg) 689 { 690 return branch8(AboveOrEqual, Address(cellReg, JSCell::typeInfoTypeOffset()), TrustedImm32(ObjectType)); 691 } 692 688 693 ALWAYS_INLINE JIT::Jump JIT::emitJumpIfCellNotObject(RegisterID cellReg) 689 694 { -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r180514 r180550 227 227 } 228 228 229 void JIT::emit_op_is_object(Instruction* currentInstruction) 230 { 231 int dst = currentInstruction[1].u.operand; 232 int value = currentInstruction[2].u.operand; 233 234 emitGetVirtualRegister(value, regT0); 235 Jump isNotCell = emitJumpIfNotJSCell(regT0); 236 237 compare8(AboveOrEqual, Address(regT0, JSCell::typeInfoTypeOffset()), TrustedImm32(ObjectType), regT0); 238 emitTagAsBoolImmediate(regT0); 239 Jump done = jump(); 240 241 isNotCell.link(this); 242 move(TrustedImm32(ValueFalse), regT0); 243 244 done.link(this); 245 emitPutVirtualRegister(dst); 246 } 247 229 248 void JIT::emit_op_tear_off_arguments(Instruction* currentInstruction) 230 249 { … … 261 280 262 281 Jump isImm = emitJumpIfNotJSCell(regT0); 263 addSlowCase(branchStructure(NotEqual, 264 Address(regT0, JSCell::structureIDOffset()), 265 m_vm->stringStructure.get())); 282 addSlowCase(emitJumpIfCellObject(regT0)); 266 283 isImm.link(this); 267 284 -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r180514 r180550 332 332 } 333 333 334 void JIT::emit_op_is_object(Instruction* currentInstruction) 335 { 336 int dst = currentInstruction[1].u.operand; 337 int value = currentInstruction[2].u.operand; 338 339 emitLoad(value, regT1, regT0); 340 Jump isNotCell = branch32(NotEqual, regT1, TrustedImm32(JSValue::CellTag)); 341 342 compare8(AboveOrEqual, Address(regT0, JSCell::typeInfoTypeOffset()), TrustedImm32(ObjectType), regT0); 343 Jump done = jump(); 344 345 isNotCell.link(this); 346 move(TrustedImm32(0), regT0); 347 348 done.link(this); 349 emitStoreBool(dst, regT0); 350 } 351 334 352 void JIT::emit_op_tear_off_arguments(Instruction* currentInstruction) 335 353 { … … 352 370 353 371 Jump isImm = branch32(NotEqual, regT1, TrustedImm32(JSValue::CellTag)); 354 addSlowCase( branchPtr(NotEqual, Address(regT0, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));372 addSlowCase(emitJumpIfCellObject(regT0)); 355 373 isImm.link(this); 356 374 … … 625 643 addSlowCase(branch32(Below, regT1, TrustedImm32(JSValue::LowestTag))); 626 644 627 // Jump to a slow case if both are strings .645 // Jump to a slow case if both are strings or symbols (non object). 628 646 Jump notCell = branch32(NotEqual, regT1, TrustedImm32(JSValue::CellTag)); 629 Jump first NotString = branchPtr(NotEqual, Address(regT0, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get()));630 addSlowCase( branchPtr(Equal, Address(regT2, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));647 Jump firstIsObject = emitJumpIfCellObject(regT0); 648 addSlowCase(emitJumpIfCellNotObject(regT2)); 631 649 notCell.link(this); 632 first NotString.link(this);650 firstIsObject.link(this); 633 651 634 652 // Simply compare the payloads. -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r180514 r180550 984 984 985 985 986 _llint_op_is_object :987 traceExecution() 988 callSlowPath(_slow_path_is_object )986 _llint_op_is_object_or_null: 987 traceExecution() 988 callSlowPath(_slow_path_is_object_or_null) 989 989 dispatch(3) 990 991 990 992 991 _llint_op_is_function: -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
r180060 r180550 953 953 bineq t2, t3, .slow 954 954 bib t2, LowestTag, .slow 955 bineq t2, CellTag, .notString 956 bb neq JSCell::m_type[t0], StringType, .notString957 bb eq JSCell::m_type[t1], StringType, .slow958 .notString :955 bineq t2, CellTag, .notStringOrSymbol 956 bbaeq JSCell::m_type[t0], ObjectType, .notStringOrSymbol 957 bbb JSCell::m_type[t1], ObjectType, .slow 958 .notStringOrSymbol: 959 959 loadi 4[PC], t2 960 960 equalityOperation(t0, t1, t0) … … 1330 1330 dispatch(3) 1331 1331 .opIsStringNotCell: 1332 storep 0, PayloadOffset[cfr, t2, 8] 1333 dispatch(3) 1334 1335 1336 _llint_op_is_object: 1337 traceExecution() 1338 loadi 8[PC], t1 1339 loadi 4[PC], t2 1340 loadConstantOrVariable(t1, t0, t3) 1341 storei BooleanTag, TagOffset[cfr, t2, 8] 1342 bineq t0, CellTag, .opIsObjectNotCell 1343 cbaeq JSCell::m_type[t3], ObjectType, t1 1344 storei t1, PayloadOffset[cfr, t2, 8] 1345 dispatch(3) 1346 .opIsObjectNotCell: 1332 1347 storep 0, PayloadOffset[cfr, t2, 8] 1333 1348 dispatch(3) … … 1977 1992 loadConstantOrVariable(t2, t1, t0) 1978 1993 bineq t1, CellTag, .opToPrimitiveIsImm 1979 bb neq JSCell::m_type[t0], StringType, .opToPrimitiveSlowCase1994 bbaeq JSCell::m_type[t0], ObjectType, .opToPrimitiveSlowCase 1980 1995 .opToPrimitiveIsImm: 1981 1996 storei t1, TagOffset[cfr, t3, 8] -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
r180234 r180550 1207 1207 1208 1208 1209 _llint_op_is_object: 1210 traceExecution() 1211 loadisFromInstruction(2, t1) 1212 loadisFromInstruction(1, t2) 1213 loadConstantOrVariable(t1, t0) 1214 btqnz t0, tagMask, .opIsObjectNotCell 1215 cbaeq JSCell::m_type[t0], ObjectType, t1 1216 orq ValueFalse, t1 1217 storeq t1, [cfr, t2, 8] 1218 dispatch(3) 1219 .opIsObjectNotCell: 1220 storeq ValueFalse, [cfr, t2, 8] 1221 dispatch(3) 1222 1223 1209 1224 macro loadPropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value) 1210 1225 bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline … … 1835 1850 loadConstantOrVariable(t2, t0) 1836 1851 btqnz t0, tagMask, .opToPrimitiveIsImm 1837 bb neq JSCell::m_type[t0], StringType, .opToPrimitiveSlowCase1852 bbaeq JSCell::m_type[t0], ObjectType, .opToPrimitiveSlowCase 1838 1853 .opToPrimitiveIsImm: 1839 1854 storeq t0, [cfr, t3, 8] -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
r179429 r180550 456 456 } 457 457 458 SLOW_PATH_DECL(slow_path_is_object )459 { 460 BEGIN(); 461 RETURN(jsBoolean(jsIsObjectType (exec, OP_C(2).jsValue())));458 SLOW_PATH_DECL(slow_path_is_object_or_null) 459 { 460 BEGIN(); 461 RETURN(jsBoolean(jsIsObjectTypeOrNull(exec, OP_C(2).jsValue()))); 462 462 } 463 463 -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.h
r179429 r180550 215 215 SLOW_PATH_HIDDEN_DECL(slow_path_typeof); 216 216 SLOW_PATH_HIDDEN_DECL(slow_path_is_object); 217 SLOW_PATH_HIDDEN_DECL(slow_path_is_object_or_null); 217 218 SLOW_PATH_HIDDEN_DECL(slow_path_is_function); 218 219 SLOW_PATH_HIDDEN_DECL(slow_path_in); -
trunk/Source/JavaScriptCore/runtime/Operations.cpp
r179429 r180550 86 86 } 87 87 88 bool jsIsObjectType (CallFrame* callFrame, JSValue v)88 bool jsIsObjectTypeOrNull(CallFrame* callFrame, JSValue v) 89 89 { 90 90 if (!v.isCell()) -
trunk/Source/JavaScriptCore/runtime/Operations.h
r178441 r180550 32 32 JSValue jsTypeStringForValue(CallFrame*, JSValue); 33 33 JSValue jsTypeStringForValue(VM&, JSGlobalObject*, JSValue); 34 bool jsIsObjectType (CallFrame*, JSValue);34 bool jsIsObjectTypeOrNull(CallFrame*, JSValue); 35 35 bool jsIsFunctionType(JSValue); 36 36
Note: See TracChangeset
for help on using the changeset viewer.