⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jitstubs.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            // 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 + -