📄 nodes.cpp
字号:
{ 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 + -