Reviewed by Anders.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Mar 2006 10:21:48 +0000 (10:21 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Mar 2006 10:21:48 +0000 (10:21 +0000)
commit857138c5a842d5a7ae6825f116968c26c4890e61
treef25c4761919fc007e9660af12024ea8272b37e04
parent6e3d95330d55a74a1813715b6b20b24cb1b394c3
    Reviewed by Anders.

        - KJS::Node and KJS::StatementNode are bigger than they need to be
        http://bugzilla.opendarwin.org/show_bug.cgi?id=7775

        The memory usage of Node was reduced by 2 machine words per node:

        - sourceURL was removed and only kept on FunctionBodyNode. The
        source URL can only be distinct per function or top-level program node,
        and you always have one.

        - refcount was removed and kept in a separate hashtable when
        greater than 1. newNodes set represents floating nodes with
        refcount of 0. This helps because almost all nodes have a refcount of 1
        for almost all of their lifetime.

        * bindings/runtime_method.cpp:
        (RuntimeMethod::RuntimeMethod): Pass null body, added FIXME.
        * kjs/Parser.cpp:
        (KJS::clearNewNodes): New nodes are tracked in nodes.cpp now, but still clear
        them at the appropriate time.
        * kjs/context.h:
        (KJS::ContextImp::currentBody): added; used to retrieve source URL and sid
        for current code.
        (KJS::ContextImp::pushIteration): moved here from LabelStack
        (KJS::ContextImp::popIteration): ditto
        (KJS::ContextImp::inIteration): ditto
        (KJS::ContextImp::pushSwitch): ditto
        (KJS::ContextImp::popSwitch): ditto
        (KJS::ContextImp::inSwitch): ditto
        * kjs/function.cpp:
        (KJS::FunctionImp::FunctionImp): Add FunctionBodyNode* parameter.
        (KJS::FunctionImp::callAsFunction): Pass body to ContextImp.
        (KJS::FunctionImp::argumentsGetter): _context renamed to m_context.
        (KJS::DeclaredFunctionImp::DeclaredFunctionImp): Pass body to superclass
        constructor.
        (KJS::GlobalFuncImp::callAsFunction): Pass progNode as body for ContextImp in
        eval.
        * kjs/function.h: Move body field from DeclaredFunctionImp to
        FunctionImp.
        * kjs/grammar.y: Change DBG; statements no longer have a sourceid.
        * kjs/internal.cpp:
        (KJS::ContextImp::ContextImp): Initialize new m_currentBody, m_iterationDepth
        and m_switchDepth data members. New FunctionBodyNode* parameter - the
        function body provides source URL and SourceId.
        (KJS::InterpreterImp::mark): Use exception() function, not _exception directly.
        (KJS::InterpreterImp::evaluate): Pass progNode to ContextImp constructor
        to use as the body.
        * kjs/internal.h:
        (KJS::LabelStack::LabelStack): Remove iteration depth and switch depth;
        statement label stacks don't need these and it bloats their size. Put them
        in the ContextImp instead.
        * kjs/interpreter.cpp:
        (KJS::ExecState::lexicalInterpreter): Renamed _context to m_context.
        * kjs/interpreter.h:
        (KJS::ExecState::dynamicInterpreter): Renamed _context to m_context.
        (KJS::ExecState::context): ditto
        (KJS::ExecState::setException): Renamed _exception to m_exception
        (KJS::ExecState::clearException): ditto
        (KJS::ExecState::exception): ditto
        (KJS::ExecState::hadException): ditto
        (KJS::ExecState::ExecState): ditto both above renames
        * kjs/nodes.cpp:
        (Node::Node): Removed initialization of line, source URL and refcount. Add to
        local newNodes set instead of involving parser.
        (Node::ref): Instead of managing refcount directly, story refcount over 1 in a
        HashCountedSet, and keep a separate HashSet of "floating" nodes with refcount
        0.
        (Node::deref): ditto
        (Node::refcount): ditto
        (Node::clearNewNodes): Destroy anything left in the new nodes set.
        (currentSourceId): Inline helper to get sourceId from function body via context.
        (currentSourceURL): ditto for sourceURL.
        (Node::createErrorCompletion): use new helper
        (Node::throwError): ditto
        (Node::setExceptionDetailsIfNeeded): ditto
        (StatementNode::StatementNode): remove initialization of l0 and sid, rename
        l1 to m_lastLine.
        (StatementNode::setLoc): Set own m_lastLine and Node's m_line.
        (StatementNode::hitStatement): Get sid, first line, last line in the proper new ways.
        (StatListNode::StatListNode): updated for setLoc changes
        (BlockNode::BlockNode): ditto
        (DoWhileNode::execute): excpect iteraton counts on ContextImp, not LabelStack
        (WhileNode::execute): ditto
        (ForNode::execute): ditto
        (ForInNode::execute): ditto
        (ContinueNode::execute): excpect inIteration on ContextImp, not LabelStack
        (BreakNode::execute): excpect inIteration and inSwitch on ContextImp, not LabelStack
        (SwitchNode::execute): expect switch counts on ContextImp, not LabelStack
        (FunctionBodyNode::FunctionBodyNode): update for new setLoc
        (FunctionBodyNode::processFuncDecl): reindent
        (SourceElementsNode::SourceElementsNode): update for new setLoc
        * kjs/nodes.h:
        (KJS::Node::lineNo): Renamed _line to m_line
        (KJS::StatementNode::firstLine): Use lineNo()
        (KJS::StatementNode::lastLine): Renamed l1 to m_lastLine
        (KJS::FunctionBodyNode::sourceId): added
        (KJS::FunctionBodyNode::sourceURL): added
        * kjs/testkjs.cpp:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@13304 268f45cc-cd09-0410-ab3c-d52691b4dbfc
13 files changed:
JavaScriptCore/ChangeLog
JavaScriptCore/bindings/runtime_method.cpp
JavaScriptCore/kjs/Parser.cpp
JavaScriptCore/kjs/context.h
JavaScriptCore/kjs/function.cpp
JavaScriptCore/kjs/function.h
JavaScriptCore/kjs/grammar.y
JavaScriptCore/kjs/internal.cpp
JavaScriptCore/kjs/internal.h
JavaScriptCore/kjs/interpreter.cpp
JavaScriptCore/kjs/interpreter.h
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/nodes.h