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

📄 nodes.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    RefPtr<RegisterID> value = generator.newTemporary();    RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident);    RegisterID* oldValue;    if (dst == generator.ignoredResult()) {        oldValue = 0;        emitPreIncOrDec(generator, value.get(), m_operator);    } else {        oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);    }    generator.emitPutById(base.get(), m_ident, value.get());    return oldValue;}// ------------------------------ PostfixBracketNode ----------------------------------PostfixBracketNode::~PostfixBracketNode(){    NodeReleaser::releaseAllNodes(this);}void PostfixBracketNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);    releaser.release(m_subscript);}RegisterID* PostfixBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNode(m_base.get());    RefPtr<RegisterID> property = generator.emitNode(m_subscript.get());    generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset);    RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get());    RegisterID* oldValue;    if (dst == generator.ignoredResult()) {        oldValue = 0;        if (m_operator == OpPlusPlus)            generator.emitPreInc(value.get());        else            generator.emitPreDec(value.get());    } else {        oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get());    }    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitPutByVal(base.get(), property.get(), value.get());    return oldValue;}// ------------------------------ PostfixDotNode ----------------------------------PostfixDotNode::~PostfixDotNode(){    NodeReleaser::releaseAllNodes(this);}void PostfixDotNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);}RegisterID* PostfixDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNode(m_base.get());    generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset);    RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident);    RegisterID* oldValue;    if (dst == generator.ignoredResult()) {        oldValue = 0;        if (m_operator == OpPlusPlus)            generator.emitPreInc(value.get());        else            generator.emitPreDec(value.get());    } else {        oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get());    }    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitPutById(base.get(), m_ident, value.get());    return oldValue;}// ------------------------------ PostfixErrorNode -----------------------------------PostfixErrorNode::~PostfixErrorNode(){    NodeReleaser::releaseAllNodes(this);}void PostfixErrorNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr);}RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*){    return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus ? "Postfix ++ operator applied to value that is not a reference." : "Postfix -- operator applied to value that is not a reference.");}// ------------------------------ DeleteResolveNode -----------------------------------RegisterID* DeleteResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (generator.registerFor(m_ident))        return generator.emitUnexpectedLoad(generator.finalDestination(dst), false);    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    RegisterID* base = generator.emitResolveBase(generator.tempDestination(dst), m_ident);    return generator.emitDeleteById(generator.finalDestination(dst, base), base, m_ident);}// ------------------------------ DeleteBracketNode -----------------------------------DeleteBracketNode::~DeleteBracketNode(){    NodeReleaser::releaseAllNodes(this);}void DeleteBracketNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);    releaser.release(m_subscript);}RegisterID* DeleteBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> r0 = generator.emitNode(m_base.get());    RegisterID* r1 = generator.emitNode(m_subscript.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    return generator.emitDeleteByVal(generator.finalDestination(dst), r0.get(), r1);}// ------------------------------ DeleteDotNode -----------------------------------DeleteDotNode::~DeleteDotNode(){    NodeReleaser::releaseAllNodes(this);}void DeleteDotNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);}RegisterID* DeleteDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RegisterID* r0 = generator.emitNode(m_base.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    return generator.emitDeleteById(generator.finalDestination(dst), r0, m_ident);}// ------------------------------ DeleteValueNode -----------------------------------DeleteValueNode::~DeleteValueNode(){    NodeReleaser::releaseAllNodes(this);}void DeleteValueNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr);}RegisterID* DeleteValueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    generator.emitNode(generator.ignoredResult(), m_expr.get());    // delete on a non-location expression ignores the value and returns true    return generator.emitUnexpectedLoad(generator.finalDestination(dst), true);}// ------------------------------ VoidNode -------------------------------------VoidNode::~VoidNode(){    NodeReleaser::releaseAllNodes(this);}void VoidNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr);}RegisterID* VoidNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (dst == generator.ignoredResult()) {        generator.emitNode(generator.ignoredResult(), m_expr.get());        return 0;    }    RefPtr<RegisterID> r0 = generator.emitNode(m_expr.get());    return generator.emitLoad(dst, jsUndefined());}// ------------------------------ TypeOfValueNode -----------------------------------RegisterID* TypeOfResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (RegisterID* local = generator.registerFor(m_ident)) {        if (dst == generator.ignoredResult())            return 0;        return generator.emitTypeOf(generator.finalDestination(dst), local);    }    RefPtr<RegisterID> scratch = generator.emitResolveBase(generator.tempDestination(dst), m_ident);    generator.emitGetById(scratch.get(), scratch.get(), m_ident);    if (dst == generator.ignoredResult())        return 0;    return generator.emitTypeOf(generator.finalDestination(dst, scratch.get()), scratch.get());}// ------------------------------ TypeOfValueNode -----------------------------------TypeOfValueNode::~TypeOfValueNode(){    NodeReleaser::releaseAllNodes(this);}void TypeOfValueNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr);}RegisterID* TypeOfValueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (dst == generator.ignoredResult()) {        generator.emitNode(generator.ignoredResult(), m_expr.get());        return 0;    }    RefPtr<RegisterID> src = generator.emitNode(m_expr.get());    return generator.emitTypeOf(generator.finalDestination(dst), src.get());}// ------------------------------ PrefixResolveNode ----------------------------------RegisterID* PrefixResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (RegisterID* local = generator.registerFor(m_ident)) {        if (generator.isLocalConstant(m_ident)) {            if (dst == generator.ignoredResult())                return 0;            RefPtr<RegisterID> r0 = generator.emitUnexpectedLoad(generator.finalDestination(dst), (m_operator == OpPlusPlus) ? 1.0 : -1.0);            return generator.emitBinaryOp(op_add, r0.get(), local, r0.get(), OperandTypes());        }        emitPreIncOrDec(generator, local, m_operator);        return generator.moveToDestinationIfNeeded(dst, local);    }    int index = 0;    size_t depth = 0;    JSObject* globalObject = 0;    if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) {        RefPtr<RegisterID> propDst = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject);        emitPreIncOrDec(generator, propDst.get(), m_operator);        generator.emitPutScopedVar(depth, index, propDst.get(), globalObject);        return generator.moveToDestinationIfNeeded(dst, propDst.get());    }    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    RefPtr<RegisterID> propDst = generator.tempDestination(dst);    RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), m_ident);    emitPreIncOrDec(generator, propDst.get(), m_operator);    generator.emitPutById(base.get(), m_ident, propDst.get());    return generator.moveToDestinationIfNeeded(dst, propDst.get());}// ------------------------------ PrefixBracketNode ----------------------------------PrefixBracketNode::~PrefixBracketNode(){    NodeReleaser::releaseAllNodes(this);}void PrefixBracketNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);    releaser.release(m_subscript);}RegisterID* PrefixBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNode(m_base.get());    RefPtr<RegisterID> property = generator.emitNode(m_subscript.get());    RefPtr<RegisterID> propDst = generator.tempDestination(dst);    generator.emitExpressionInfo(divot() + m_subexpressionDivotOffset, m_subexpressionStartOffset, endOffset() - m_subexpressionDivotOffset);    RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get());    if (m_operator == OpPlusPlus)        generator.emitPreInc(value);    else        generator.emitPreDec(value);    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitPutByVal(base.get(), property.get(), value);    return generator.moveToDestinationIfNeeded(dst, propDst.get());}// ------------------------------ PrefixDotNode ----------------------------------PrefixDotNode::~PrefixDotNode(){    NodeReleaser::releaseAllNodes(this);}void PrefixDotNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);}RegisterID* PrefixDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNode(m_base.get());    RefPtr<RegisterID> propDst = generator.tempDestination(dst);    generator.emitExpressionInfo(divot() + m_subexpressionDivotOffset, m_subexpressionStartOffset, endOffset() - m_subexpressionDivotOffset);    RegisterID* value = generator.emitGetById(propDst.get(), base.get(), m_ident);    if (m_operator == OpPlusPlus)        generator.emitPreInc(value);    else        generator.emitPreDec(value);    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitPutById(base.get(), m_ident, value);    return generator.moveToDestinationIfNeeded(dst, propDst.get());}// ------------------------------ PrefixErrorNode -----------------------------------PrefixErrorNode::~PrefixErrorNode(){    NodeReleaser::releaseAllNodes(this);}void PrefixErrorNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr);}RegisterID* PrefixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*){    return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus ? "Prefix ++ operator applied to value that is not a reference." : "Prefix -- operator applied to value that is not a reference.");}// ------------------------------ Unary Operation Nodes -----------------------------------UnaryOpNode::~UnaryOpNode(){    NodeReleaser::releaseAllNodes(this);}void UnaryOpNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr);}RegisterID* UnaryOpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RegisterID* src = generator.emitNode(m_expr.get());    return generator.emitUnaryOp(opcodeID(), generator.finalDestination(dst), src);}// ------------------------------ Binary Operation Nodes -----------------------------------BinaryOpNode::~BinaryOpNode(){    NodeReleaser::releaseAllNodes(this);}void BinaryOpNode::releaseNodes(NodeReleaser& releaser)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -