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