📄 jitstubs.cpp
字号:
// by the caller is null, the global object should be used. It also says // that the section does not apply to internal functions, but for simplicity // of implementation we use the global object anyway here. This guarantees // that in host objects you always get a valid object for this. // We also handle wrapper substitution for the global object at the same time. JSObject* thisObj = base->toThisObject(callFrame); JSValuePtr result = slot.getValue(callFrame, ident); CHECK_FOR_EXCEPTION_AT_END(); RETURN_PAIR(thisObj, JSValuePtr::encode(result)); } ++iter; } while (iter != end); CodeBlock* codeBlock = callFrame->codeBlock(); unsigned vPCIndex = codeBlock->getBytecodeIndex(callFrame, STUB_RETURN_ADDRESS); ARG_globalData->exception = createUndefinedVariableError(callFrame, ident, vPCIndex, codeBlock); VM_THROW_EXCEPTION_2();}JSValueEncodedAsPointer* JITStubs::cti_op_sub(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; JSValuePtr src2 = ARG_src2; double left; double right; if (src1.getNumber(left) && src2.getNumber(right)) return JSValuePtr::encode(jsNumber(ARG_globalData, left - right)); CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsNumber(ARG_globalData, src1.toNumber(callFrame) - src2.toNumber(callFrame)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}void JITStubs::cti_op_put_by_val(STUB_ARGS){ BEGIN_STUB_FUNCTION(); CallFrame* callFrame = ARG_callFrame; JSGlobalData* globalData = ARG_globalData; JSValuePtr baseValue = ARG_src1; JSValuePtr subscript = ARG_src2; JSValuePtr value = ARG_src3; if (LIKELY(subscript.isUInt32Fast())) { uint32_t i = subscript.getUInt32Fast(); if (isJSArray(globalData, baseValue)) { JSArray* jsArray = asArray(baseValue); if (jsArray->canSetIndex(i)) jsArray->setIndex(i, value); else jsArray->JSArray::put(callFrame, i, value); } else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { JSByteArray* jsByteArray = asByteArray(baseValue); ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_put_by_val_byte_array)); // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. if (value.isInt32Fast()) { jsByteArray->setIndex(i, value.getInt32Fast()); return; } else { double dValue = 0; if (value.getNumber(dValue)) { jsByteArray->setIndex(i, dValue); return; } } baseValue.put(callFrame, i, value); } else baseValue.put(callFrame, i, value); } else { Identifier property(callFrame, subscript.toString(callFrame)); if (!ARG_globalData->exception) { // Don't put to an object if toString threw an exception. PutPropertySlot slot; baseValue.put(callFrame, property, value, slot); } } CHECK_FOR_EXCEPTION_AT_END();}void JITStubs::cti_op_put_by_val_array(STUB_ARGS){ BEGIN_STUB_FUNCTION(); CallFrame* callFrame = ARG_callFrame; JSValuePtr baseValue = ARG_src1; int i = ARG_int2; JSValuePtr value = ARG_src3; ASSERT(isJSArray(ARG_globalData, baseValue)); if (LIKELY(i >= 0)) asArray(baseValue)->JSArray::put(callFrame, i, value); else { // This should work since we're re-boxing an immediate unboxed in JIT code. ASSERT(JSValuePtr::makeInt32Fast(i)); Identifier property(callFrame, JSValuePtr::makeInt32Fast(i).toString(callFrame)); // FIXME: can toString throw an exception here? if (!ARG_globalData->exception) { // Don't put to an object if toString threw an exception. PutPropertySlot slot; baseValue.put(callFrame, property, value, slot); } } CHECK_FOR_EXCEPTION_AT_END();}void JITStubs::cti_op_put_by_val_byte_array(STUB_ARGS){ BEGIN_STUB_FUNCTION(); CallFrame* callFrame = ARG_callFrame; JSGlobalData* globalData = ARG_globalData; JSValuePtr baseValue = ARG_src1; JSValuePtr subscript = ARG_src2; JSValuePtr value = ARG_src3; if (LIKELY(subscript.isUInt32Fast())) { uint32_t i = subscript.getUInt32Fast(); if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { JSByteArray* jsByteArray = asByteArray(baseValue); // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. if (value.isInt32Fast()) { jsByteArray->setIndex(i, value.getInt32Fast()); return; } else { double dValue = 0; if (value.getNumber(dValue)) { jsByteArray->setIndex(i, dValue); return; } } } if (!isJSByteArray(globalData, baseValue)) ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_put_by_val)); baseValue.put(callFrame, i, value); } else { Identifier property(callFrame, subscript.toString(callFrame)); if (!ARG_globalData->exception) { // Don't put to an object if toString threw an exception. PutPropertySlot slot; baseValue.put(callFrame, property, value, slot); } } CHECK_FOR_EXCEPTION_AT_END();}JSValueEncodedAsPointer* JITStubs::cti_op_lesseq(STUB_ARGS){ BEGIN_STUB_FUNCTION(); CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsBoolean(jsLessEq(callFrame, ARG_src1, ARG_src2)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}int JITStubs::cti_op_loop_if_true(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; CallFrame* callFrame = ARG_callFrame; bool result = src1.toBoolean(callFrame); CHECK_FOR_EXCEPTION_AT_END(); return result;}JSValueEncodedAsPointer* JITStubs::cti_op_negate(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src = ARG_src1; double v; if (src.getNumber(v)) return JSValuePtr::encode(jsNumber(ARG_globalData, -v)); CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsNumber(ARG_globalData, -src.toNumber(callFrame)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}JSValueEncodedAsPointer* JITStubs::cti_op_resolve_base(STUB_ARGS){ BEGIN_STUB_FUNCTION(); return JSValuePtr::encode(JSC::resolveBase(ARG_callFrame, *ARG_id1, ARG_callFrame->scopeChain()));}JSValueEncodedAsPointer* JITStubs::cti_op_resolve_skip(STUB_ARGS){ BEGIN_STUB_FUNCTION(); CallFrame* callFrame = ARG_callFrame; ScopeChainNode* scopeChain = callFrame->scopeChain(); int skip = ARG_int2; ScopeChainIterator iter = scopeChain->begin(); ScopeChainIterator end = scopeChain->end(); ASSERT(iter != end); while (skip--) { ++iter; ASSERT(iter != end); } Identifier& ident = *ARG_id1; do { JSObject* o = *iter; PropertySlot slot(o); if (o->getPropertySlot(callFrame, ident, slot)) { JSValuePtr result = slot.getValue(callFrame, ident); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result); } } while (++iter != end); CodeBlock* codeBlock = callFrame->codeBlock(); unsigned vPCIndex = codeBlock->getBytecodeIndex(callFrame, STUB_RETURN_ADDRESS); ARG_globalData->exception = createUndefinedVariableError(callFrame, ident, vPCIndex, codeBlock); VM_THROW_EXCEPTION();}JSValueEncodedAsPointer* JITStubs::cti_op_resolve_global(STUB_ARGS){ BEGIN_STUB_FUNCTION(); CallFrame* callFrame = ARG_callFrame; JSGlobalObject* globalObject = asGlobalObject(ARG_src1); Identifier& ident = *ARG_id2; unsigned globalResolveInfoIndex = ARG_int3; ASSERT(globalObject->isGlobalObject()); PropertySlot slot(globalObject); if (globalObject->getPropertySlot(callFrame, ident, slot)) { JSValuePtr result = slot.getValue(callFrame, ident); if (slot.isCacheable() && !globalObject->structure()->isDictionary()) { GlobalResolveInfo& globalResolveInfo = callFrame->codeBlock()->globalResolveInfo(globalResolveInfoIndex); if (globalResolveInfo.structure) globalResolveInfo.structure->deref(); globalObject->structure()->ref(); globalResolveInfo.structure = globalObject->structure(); globalResolveInfo.offset = slot.cachedOffset(); return JSValuePtr::encode(result); } CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result); } unsigned vPCIndex = callFrame->codeBlock()->getBytecodeIndex(callFrame, STUB_RETURN_ADDRESS); ARG_globalData->exception = createUndefinedVariableError(callFrame, ident, vPCIndex, callFrame->codeBlock()); VM_THROW_EXCEPTION();}JSValueEncodedAsPointer* JITStubs::cti_op_div(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; JSValuePtr src2 = ARG_src2; double left; double right; if (src1.getNumber(left) && src2.getNumber(right)) return JSValuePtr::encode(jsNumber(ARG_globalData, left / right)); CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsNumber(ARG_globalData, src1.toNumber(callFrame) / src2.toNumber(callFrame)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}JSValueEncodedAsPointer* JITStubs::cti_op_pre_dec(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr v = ARG_src1; CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsNumber(ARG_globalData, v.toNumber(callFrame) - 1); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}int JITStubs::cti_op_jless(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; JSValuePtr src2 = ARG_src2; CallFrame* callFrame = ARG_callFrame; bool result = jsLess(callFrame, src1, src2); CHECK_FOR_EXCEPTION_AT_END(); return result;}JSValueEncodedAsPointer* JITStubs::cti_op_not(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src = ARG_src1; CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsBoolean(!src.toBoolean(callFrame)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}int JITStubs::cti_op_jtrue(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; CallFrame* callFrame = ARG_callFrame; bool result = src1.toBoolean(callFrame); CHECK_FOR_EXCEPTION_AT_END(); return result;}VoidPtrPair JITStubs::cti_op_post_inc(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr v = ARG_src1; CallFrame* callFrame = ARG_callFrame; JSValuePtr number = v.toJSNumber(callFrame); CHECK_FOR_EXCEPTION_AT_END(); RETURN_PAIR(JSValuePtr::encode(number), JSValuePtr::encode(jsNumber(ARG_globalData, number.uncheckedGetNumber() + 1)));}JSValueEncodedAsPointer* JITStubs::cti_op_eq(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; JSValuePtr src2 = ARG_src2; CallFrame* callFrame = ARG_callFrame; ASSERT(!JSValuePtr::areBothInt32Fast(src1, src2)); JSValuePtr result = jsBoolean(JSValuePtr::equalSlowCaseInline(callFrame, src1, src2)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}JSValueEncodedAsPointer* JITStubs::cti_op_lshift(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr val = ARG_src1; JSValuePtr shift = ARG_src2; int32_t left; uint32_t right; if (JSValuePtr::areBothInt32Fast(val, shift)) return JSValuePtr::encode(jsNumber(ARG_globalData, val.getInt32Fast() << (shift.getInt32Fast() & 0x1f))); if (val.numberToInt32(left) && shift.numberToUInt32(right)) return JSValuePtr::encode(jsNumber(ARG_globalData, left << (right & 0x1f))); CallFrame* callFrame = ARG_callFrame; JSValuePtr result = jsNumber(ARG_globalData, (val.toInt32(callFrame)) << (shift.toUInt32(callFrame) & 0x1f)); CHECK_FOR_EXCEPTION_AT_END(); return JSValuePtr::encode(result);}JSValueEncodedAsPointer* JITStubs::cti_op_bitand(STUB_ARGS){ BEGIN_STUB_FUNCTION(); JSValuePtr src1 = ARG_src1; JSValuePtr src2 = ARG_src2; int32_t left; int32_t right; if (src1.numberToInt32(left) && src2.numberToInt32(right)) return JSValuePtr::encode(jsNumber(ARG_globalData, left & right)); CallFrame* callFrame = ARG_callFrame;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -