📄 nodes.cpp
字号:
void ArrayNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_element);}RegisterID* ArrayNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ // FIXME: Should we put all of this code into emitNewArray? unsigned length = 0; ElementNode* firstPutElement; for (firstPutElement = m_element.get(); firstPutElement; firstPutElement = firstPutElement->next()) { if (firstPutElement->elision()) break; ++length; } if (!firstPutElement && !m_elision) return generator.emitNewArray(generator.finalDestination(dst), m_element.get()); RefPtr<RegisterID> array = generator.emitNewArray(generator.tempDestination(dst), m_element.get()); for (ElementNode* n = firstPutElement; n; n = n->next()) { RegisterID* value = generator.emitNode(n->value()); length += n->elision(); generator.emitPutByIndex(array.get(), length++, value); } if (m_elision) { RegisterID* value = generator.emitLoad(0, jsNumber(generator.globalData(), m_elision + length)); generator.emitPutById(array.get(), generator.propertyNames().length, value); } return generator.moveToDestinationIfNeeded(dst, array.get());}// ------------------------------ PropertyNode ----------------------------PropertyNode::~PropertyNode(){ NodeReleaser::releaseAllNodes(this);}void PropertyNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_assign);}// ------------------------------ ObjectLiteralNode ----------------------------ObjectLiteralNode::~ObjectLiteralNode(){ NodeReleaser::releaseAllNodes(this);}void ObjectLiteralNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_list);}RegisterID* ObjectLiteralNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ if (!m_list) { if (dst == generator.ignoredResult()) return 0; return generator.emitNewObject(generator.finalDestination(dst)); } return generator.emitNode(dst, m_list.get());}// ------------------------------ PropertyListNode -----------------------------PropertyListNode::~PropertyListNode(){ NodeReleaser::releaseAllNodes(this);}void PropertyListNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_node); releaser.release(m_next);}RegisterID* PropertyListNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RefPtr<RegisterID> newObj = generator.tempDestination(dst); generator.emitNewObject(newObj.get()); for (PropertyListNode* p = this; p; p = p->m_next.get()) { RegisterID* value = generator.emitNode(p->m_node->m_assign.get()); switch (p->m_node->m_type) { case PropertyNode::Constant: { generator.emitPutById(newObj.get(), p->m_node->name(), value); break; } case PropertyNode::Getter: { generator.emitPutGetter(newObj.get(), p->m_node->name(), value); break; } case PropertyNode::Setter: { generator.emitPutSetter(newObj.get(), p->m_node->name(), value); break; } default: ASSERT_NOT_REACHED(); } } return generator.moveToDestinationIfNeeded(dst, newObj.get());}// ------------------------------ BracketAccessorNode --------------------------------BracketAccessorNode::~BracketAccessorNode(){ NodeReleaser::releaseAllNodes(this);}void BracketAccessorNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_base); releaser.release(m_subscript);}RegisterID* BracketAccessorNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript->isPure(generator)); RegisterID* property = generator.emitNode(m_subscript.get()); generator.emitExpressionInfo(divot(), startOffset(), endOffset()); return generator.emitGetByVal(generator.finalDestination(dst), base.get(), property);}// ------------------------------ DotAccessorNode --------------------------------DotAccessorNode::~DotAccessorNode(){ NodeReleaser::releaseAllNodes(this);}void DotAccessorNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_base);}RegisterID* DotAccessorNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RegisterID* base = generator.emitNode(m_base.get()); generator.emitExpressionInfo(divot(), startOffset(), endOffset()); return generator.emitGetById(generator.finalDestination(dst), base, m_ident);}// ------------------------------ ArgumentListNode -----------------------------ArgumentListNode::~ArgumentListNode(){ NodeReleaser::releaseAllNodes(this);}void ArgumentListNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_next); releaser.release(m_expr);}RegisterID* ArgumentListNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ ASSERT(m_expr); return generator.emitNode(dst, m_expr.get());}// ------------------------------ ArgumentsNode -----------------------------ArgumentsNode::~ArgumentsNode(){ NodeReleaser::releaseAllNodes(this);}void ArgumentsNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_listNode);}// ------------------------------ NewExprNode ----------------------------------NewExprNode::~NewExprNode(){ NodeReleaser::releaseAllNodes(this);}void NewExprNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_expr); releaser.release(m_args);}RegisterID* NewExprNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); return generator.emitConstruct(generator.finalDestination(dst), func.get(), m_args.get(), divot(), startOffset(), endOffset());}// ------------------------------ EvalFunctionCallNode ----------------------------------EvalFunctionCallNode::~EvalFunctionCallNode(){ NodeReleaser::releaseAllNodes(this);}void EvalFunctionCallNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_args);}RegisterID* EvalFunctionCallNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RefPtr<RegisterID> func = generator.tempDestination(dst); RefPtr<RegisterID> thisRegister = generator.newTemporary(); generator.emitExpressionInfo(divot() - startOffset() + 4, 4, 0); generator.emitResolveWithBase(thisRegister.get(), func.get(), generator.propertyNames().eval); return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());}// ------------------------------ FunctionCallValueNode ----------------------------------FunctionCallValueNode::~FunctionCallValueNode(){ NodeReleaser::releaseAllNodes(this);}void FunctionCallValueNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_expr); releaser.release(m_args);}RegisterID* FunctionCallValueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());}// ------------------------------ FunctionCallResolveNode ----------------------------------FunctionCallResolveNode::~FunctionCallResolveNode(){ NodeReleaser::releaseAllNodes(this);}void FunctionCallResolveNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_args);}RegisterID* FunctionCallResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) { RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); return generator.emitCall(generator.finalDestination(dst, thisRegister.get()), local.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); } int index = 0; size_t depth = 0; JSObject* globalObject = 0; if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) { RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); } RefPtr<RegisterID> func = generator.newTemporary(); RefPtr<RegisterID> thisRegister = generator.newTemporary(); int identifierStart = divot() - startOffset(); generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); generator.emitResolveFunction(thisRegister.get(), func.get(), m_ident); return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());}// ------------------------------ FunctionCallBracketNode ----------------------------------FunctionCallBracketNode::~FunctionCallBracketNode(){ NodeReleaser::releaseAllNodes(this);}void FunctionCallBracketNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_base); releaser.release(m_subscript); releaser.release(m_args);}RegisterID* FunctionCallBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ RefPtr<RegisterID> base = generator.emitNode(m_base.get()); RegisterID* property = generator.emitNode(m_subscript.get()); generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); RefPtr<RegisterID> function = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property); RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get()); return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());}// ------------------------------ FunctionCallDotNode ----------------------------------FunctionCallDotNode::~FunctionCallDotNode(){ NodeReleaser::releaseAllNodes(this);}void FunctionCallDotNode::releaseNodes(NodeReleaser& releaser){ releaser.release(m_base); releaser.release(m_args);}RegisterID* FunctionCallDotNode::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> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get()); return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());}// ------------------------------ PostfixResolveNode ----------------------------------static RegisterID* emitPreIncOrDec(BytecodeGenerator& generator, RegisterID* srcDst, Operator oper){ return (oper == OpPlusPlus) ? generator.emitPreInc(srcDst) : generator.emitPreDec(srcDst);}static RegisterID* emitPostIncOrDec(BytecodeGenerator& generator, RegisterID* dst, RegisterID* srcDst, Operator oper){ return (oper == OpPlusPlus) ? generator.emitPostInc(dst, srcDst) : generator.emitPostDec(dst, srcDst);}RegisterID* PostfixResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst){ if (RegisterID* local = generator.registerFor(m_ident)) { if (generator.isLocalConstant(m_ident)) { if (dst == generator.ignoredResult()) return 0; return generator.emitToJSNumber(generator.finalDestination(dst), local); } if (dst == generator.ignoredResult()) return emitPreIncOrDec(generator, local, m_operator); return emitPostIncOrDec(generator, generator.finalDestination(dst), local, m_operator); } int index = 0; size_t depth = 0; JSObject* globalObject = 0; if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) { RefPtr<RegisterID> value = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); 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.emitPutScopedVar(depth, index, value.get(), globalObject); return oldValue; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -