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

📄 nodes.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{    releaser.release(m_expr1);    releaser.release(m_expr2);}RegisterID* BinaryOpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    OpcodeID opcodeID = this->opcodeID();    if (opcodeID == op_neq) {        if (m_expr1->isNull() || m_expr2->isNull()) {            RefPtr<RegisterID> src = generator.tempDestination(dst);            generator.emitNode(src.get(), m_expr1->isNull() ? m_expr2.get() : m_expr1.get());            return generator.emitUnaryOp(op_neq_null, generator.finalDestination(dst, src.get()), src.get());        }    }    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator));    RegisterID* src2 = generator.emitNode(m_expr2.get());    return generator.emitBinaryOp(opcodeID, generator.finalDestination(dst, src1.get()), src1.get(), src2, OperandTypes(m_expr1->resultDescriptor(), m_expr2->resultDescriptor()));}RegisterID* EqualNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (m_expr1->isNull() || m_expr2->isNull()) {        RefPtr<RegisterID> src = generator.tempDestination(dst);        generator.emitNode(src.get(), m_expr1->isNull() ? m_expr2.get() : m_expr1.get());        return generator.emitUnaryOp(op_eq_null, generator.finalDestination(dst, src.get()), src.get());    }    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator));    RegisterID* src2 = generator.emitNode(m_expr2.get());    return generator.emitEqualityOp(op_eq, generator.finalDestination(dst, src1.get()), src1.get(), src2);}RegisterID* StrictEqualNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator));    RegisterID* src2 = generator.emitNode(m_expr2.get());    return generator.emitEqualityOp(op_stricteq, generator.finalDestination(dst, src1.get()), src1.get(), src2);}RegisterID* ReverseBinaryOpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator));    RegisterID* src2 = generator.emitNode(m_expr2.get());    return generator.emitBinaryOp(opcodeID(), generator.finalDestination(dst, src1.get()), src2, src1.get(), OperandTypes(m_expr2->resultDescriptor(), m_expr1->resultDescriptor()));}RegisterID* ThrowableBinaryOpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator));    RegisterID* src2 = generator.emitNode(m_expr2.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    return generator.emitBinaryOp(opcodeID(), generator.finalDestination(dst, src1.get()), src1.get(), src2, OperandTypes(m_expr1->resultDescriptor(), m_expr2->resultDescriptor()));}RegisterID* InstanceOfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator));    RefPtr<RegisterID> src2 = generator.emitNode(m_expr2.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitGetByIdExceptionInfo(op_instanceof);    RegisterID* src2Prototype = generator.emitGetById(generator.newTemporary(), src2.get(), generator.globalData()->propertyNames->prototype);    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    return generator.emitInstanceOf(generator.finalDestination(dst, src1.get()), src1.get(), src2.get(), src2Prototype);}// ------------------------------ LogicalOpNode ----------------------------LogicalOpNode::~LogicalOpNode(){    NodeReleaser::releaseAllNodes(this);}void LogicalOpNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_expr1);    releaser.release(m_expr2);}RegisterID* LogicalOpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> temp = generator.tempDestination(dst);    RefPtr<Label> target = generator.newLabel();        generator.emitNode(temp.get(), m_expr1.get());    if (m_operator == OpLogicalAnd)        generator.emitJumpIfFalse(temp.get(), target.get());    else        generator.emitJumpIfTrue(temp.get(), target.get());    generator.emitNode(temp.get(), m_expr2.get());    generator.emitLabel(target.get());    return generator.moveToDestinationIfNeeded(dst, temp.get());}// ------------------------------ ConditionalNode ------------------------------ConditionalNode::~ConditionalNode(){    NodeReleaser::releaseAllNodes(this);}void ConditionalNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_logical);    releaser.release(m_expr1);    releaser.release(m_expr2);}RegisterID* ConditionalNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> newDst = generator.finalDestination(dst);    RefPtr<Label> beforeElse = generator.newLabel();    RefPtr<Label> afterElse = generator.newLabel();    RegisterID* cond = generator.emitNode(m_logical.get());    generator.emitJumpIfFalse(cond, beforeElse.get());    generator.emitNode(newDst.get(), m_expr1.get());    generator.emitJump(afterElse.get());    generator.emitLabel(beforeElse.get());    generator.emitNode(newDst.get(), m_expr2.get());    generator.emitLabel(afterElse.get());    return newDst.get();}// ------------------------------ ReadModifyResolveNode -----------------------------------ReadModifyResolveNode::~ReadModifyResolveNode(){    NodeReleaser::releaseAllNodes(this);}void ReadModifyResolveNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_right);}// FIXME: should this be moved to be a method on BytecodeGenerator?static ALWAYS_INLINE RegisterID* emitReadModifyAssignment(BytecodeGenerator& generator, RegisterID* dst, RegisterID* src1, RegisterID* src2, Operator oper, OperandTypes types){    OpcodeID opcodeID;    switch (oper) {        case OpMultEq:            opcodeID = op_mul;            break;        case OpDivEq:            opcodeID = op_div;            break;        case OpPlusEq:            opcodeID = op_add;            break;        case OpMinusEq:            opcodeID = op_sub;            break;        case OpLShift:            opcodeID = op_lshift;            break;        case OpRShift:            opcodeID = op_rshift;            break;        case OpURShift:            opcodeID = op_urshift;            break;        case OpAndEq:            opcodeID = op_bitand;            break;        case OpXOrEq:            opcodeID = op_bitxor;            break;        case OpOrEq:            opcodeID = op_bitor;            break;        case OpModEq:            opcodeID = op_mod;            break;        default:            ASSERT_NOT_REACHED();            return dst;    }        return generator.emitBinaryOp(opcodeID, dst, src1, src2, types);}RegisterID* ReadModifyResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (RegisterID* local = generator.registerFor(m_ident)) {        if (generator.isLocalConstant(m_ident)) {            RegisterID* src2 = generator.emitNode(m_right.get());            return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));        }                if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right->isPure(generator))) {            RefPtr<RegisterID> result = generator.newTemporary();            generator.emitMove(result.get(), local);            RegisterID* src2 = generator.emitNode(m_right.get());            emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));            generator.emitMove(local, result.get());            return generator.moveToDestinationIfNeeded(dst, result.get());        }                RegisterID* src2 = generator.emitNode(m_right.get());        RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));        return generator.moveToDestinationIfNeeded(dst, result);    }    int index = 0;    size_t depth = 0;    JSObject* globalObject = 0;    if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) {        RefPtr<RegisterID> src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject);        RegisterID* src2 = generator.emitNode(m_right.get());        RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));        generator.emitPutScopedVar(depth, index, result, globalObject);        return result;    }    RefPtr<RegisterID> src1 = generator.tempDestination(dst);    generator.emitExpressionInfo(divot() - startOffset() + m_ident.size(), m_ident.size(), 0);    RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), m_ident);    RegisterID* src2 = generator.emitNode(m_right.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));    return generator.emitPutById(base.get(), m_ident, result);}// ------------------------------ AssignResolveNode -----------------------------------AssignResolveNode::~AssignResolveNode(){    NodeReleaser::releaseAllNodes(this);}void AssignResolveNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_right);}RegisterID* AssignResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    if (RegisterID* local = generator.registerFor(m_ident)) {        if (generator.isLocalConstant(m_ident))            return generator.emitNode(dst, m_right.get());                RegisterID* result = generator.emitNode(local, m_right.get());        return generator.moveToDestinationIfNeeded(dst, result);    }    int index = 0;    size_t depth = 0;    JSObject* globalObject = 0;    if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) {        if (dst == generator.ignoredResult())            dst = 0;        RegisterID* value = generator.emitNode(dst, m_right.get());        generator.emitPutScopedVar(depth, index, value, globalObject);        return value;    }    RefPtr<RegisterID> base = generator.emitResolveBase(generator.newTemporary(), m_ident);    if (dst == generator.ignoredResult())        dst = 0;    RegisterID* value = generator.emitNode(dst, m_right.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    return generator.emitPutById(base.get(), m_ident, value);}// ------------------------------ AssignDotNode -----------------------------------AssignDotNode::~AssignDotNode(){    NodeReleaser::releaseAllNodes(this);}void AssignDotNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);    releaser.release(m_right);}RegisterID* AssignDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right->isPure(generator));    RefPtr<RegisterID> value = generator.destinationForAssignResult(dst);    RegisterID* result = generator.emitNode(value.get(), m_right.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitPutById(base.get(), m_ident, result);    return generator.moveToDestinationIfNeeded(dst, result);}// ------------------------------ ReadModifyDotNode -----------------------------------ReadModifyDotNode::~ReadModifyDotNode(){    NodeReleaser::releaseAllNodes(this);}void ReadModifyDotNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);    releaser.release(m_right);}RegisterID* ReadModifyDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right->isPure(generator));    generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset);    RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);    RegisterID* change = generator.emitNode(m_right.get());    RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    return generator.emitPutById(base.get(), m_ident, updatedValue);}// ------------------------------ AssignErrorNode -----------------------------------AssignErrorNode::~AssignErrorNode(){    NodeReleaser::releaseAllNodes(this);}void AssignErrorNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_left);    releaser.release(m_right);}RegisterID* AssignErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*){    return emitThrowError(generator, ReferenceError, "Left side of assignment is not a reference.");}// ------------------------------ AssignBracketNode -----------------------------------AssignBracketNode::~AssignBracketNode(){    NodeReleaser::releaseAllNodes(this);}void AssignBracketNode::releaseNodes(NodeReleaser& releaser){    releaser.release(m_base);    releaser.release(m_subscript);    releaser.release(m_right);}RegisterID* AssignBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript->isPure(generator) && m_right->isPure(generator));    RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right->isPure(generator));    RefPtr<RegisterID> value = generator.destinationForAssignResult(dst);    RegisterID* result = generator.emitNode(value.get(), m_right.get());    generator.emitExpressionInfo(divot(), startOffset(), endOffset());    generator.emitPutByVal(base.get(), property.get(), result);    return generator.moveToDestinationIfNeeded(dst, result);}// ------------------------------ ReadModifyBracketNode -----------------------------------ReadModifyBracketNode::~ReadModifyBracketNode()

⌨️ 快捷键说明

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