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

📄 nodes.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
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 + -