JavaScriptCore:
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Oct 2008 06:44:37 +0000 (06:44 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Oct 2008 06:44:37 +0000 (06:44 +0000)
2008-10-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler and Cameron Zwarich.

        Preliminary step toward dynamic recompilation: Standardized and
        simplified the parsing interface.

        The main goal in this patch is to make it easy to ask for a duplicate
        compilation, and get back a duplicate result -- same source URL, same
        debugger / profiler ID, same toString behavior, etc.

        The basic unit of compilation and evaluation is now SourceCode, which
        encompasses a SourceProvider, a range in that provider, and a starting
        line number.

        A SourceProvider now encompasses a source URL, and *is* a source ID,
        since a pointer is a unique identifier.

        * API/JSBase.cpp:
        (JSEvaluateScript):
        (JSCheckScriptSyntax): Provide a SourceCode to the Interpreter, since
        other APIs are no longer supported.

        * VM/CodeBlock.h:
        (JSC::EvalCodeCache::get): Provide a SourceCode to the Interpreter, since
        other APIs are no longer supported.
        (JSC::CodeBlock::CodeBlock): ASSERT something that used to be ASSERTed
        by our caller -- this is a better bottleneck.

        * VM/CodeGenerator.cpp:
        (JSC::CodeGenerator::CodeGenerator): Updated for the fact that
        FunctionBodyNode's parameters are no longer a WTF::Vector.

        * kjs/Arguments.cpp:
        (JSC::Arguments::Arguments): ditto

        * kjs/DebuggerCallFrame.cpp:
        (JSC::DebuggerCallFrame::evaluate): Provide a SourceCode to the Parser,
        since other APIs are no longer supported.

        * kjs/FunctionConstructor.cpp:
        (JSC::constructFunction): Provide a SourceCode to the Parser, since
        other APIs are no longer supported. Adopt FunctionBodyNode's new
        "finishParsing" API.

        * kjs/JSFunction.cpp:
        (JSC::JSFunction::lengthGetter):
        (JSC::JSFunction::getParameterName): Updated for the fact that
        FunctionBodyNode's parameters are no longer a wtf::Vector.

        * kjs/JSFunction.h: Nixed some cruft.

        * kjs/JSGlobalObjectFunctions.cpp:
        (JSC::globalFuncEval): Provide a SourceCode to the Parser, since
        other APIs are no longer supported.

        * kjs/Parser.cpp:
        (JSC::Parser::parse): Require a SourceCode argument, instead of a bunch
        of broken out parameters. Stop tracking sourceId as an integer, since we
        use the SourceProvider pointer for this now. Don't clamp the
        startingLineNumber, since SourceCode does that now.

        * kjs/Parser.h:
        (JSC::Parser::parse): Standardized the parsing interface to require a
        SourceCode.

        * kjs/Shell.cpp:
        (functionRun):
        (functionLoad):
        (prettyPrintScript):
        (runWithScripts):
        (runInteractive): Provide a SourceCode to the Interpreter, since
        other APIs are no longer supported.

        * kjs/SourceProvider.h:
        (JSC::SourceProvider::SourceProvider):
        (JSC::SourceProvider::url):
        (JSC::SourceProvider::asId):
        (JSC::UStringSourceProvider::create):
        (JSC::UStringSourceProvider::UStringSourceProvider): Added new
        responsibilities described above.

        * kjs/SourceRange.h:
        (JSC::SourceCode::SourceCode):
        (JSC::SourceCode::toString):
        (JSC::SourceCode::provider):
        (JSC::SourceCode::firstLine):
        (JSC::SourceCode::data):
        (JSC::SourceCode::length): Added new responsibilities described above.
        Renamed SourceRange to SourceCode, based on review feedback. Added
        a makeSource function for convenience.

        * kjs/debugger.h: Provide a SourceCode to the client, since other APIs
        are no longer supported.

        * kjs/grammar.y: Provide startingLineNumber when creating a SourceCode.

        * kjs/debugger.h: Treat sourceId as intptr_t to avoid loss of precision
        on 64bit platforms.

        * kjs/interpreter.cpp:
        (JSC::Interpreter::checkSyntax):
        (JSC::Interpreter::evaluate):
        * kjs/interpreter.h: Require a SourceCode instead of broken out arguments.

        * kjs/lexer.cpp:
        (JSC::Lexer::setCode):
        * kjs/lexer.h:
        (JSC::Lexer::sourceRange): Fold together the SourceProvider and line number
        into a SourceCode. Fixed a bug where the Lexer would accidentally keep
        alive the last SourceProvider forever.

        * kjs/nodes.cpp:
        (JSC::ScopeNode::ScopeNode):
        (JSC::ProgramNode::ProgramNode):
        (JSC::ProgramNode::create):
        (JSC::EvalNode::EvalNode):
        (JSC::EvalNode::generateCode):
        (JSC::EvalNode::create):
        (JSC::FunctionBodyNode::FunctionBodyNode):
        (JSC::FunctionBodyNode::finishParsing):
        (JSC::FunctionBodyNode::create):
        (JSC::FunctionBodyNode::generateCode):
        (JSC::ProgramNode::generateCode):
        (JSC::FunctionBodyNode::paramString):
        * kjs/nodes.h:
        (JSC::ScopeNode::):
        (JSC::ScopeNode::sourceId):
        (JSC::FunctionBodyNode::):
        (JSC::FunctionBodyNode::parameterCount):
        (JSC::FuncExprNode::):
        (JSC::FuncDeclNode::): Store a SourceCode in all ScopeNodes, since
        SourceCode is now responsible for tracking URL, ID, etc. Streamlined
        some ad hoc FunctionBodyNode fixups into a "finishParsing" function, to
        help make clear what you need to do in order to finish parsing a
        FunctionBodyNode.

        * wtf/Vector.h:
        (WTF::::releaseBuffer): Don't ASSERT that releaseBuffer() is only called
        when buffer is not 0, since FunctionBodyNode is more than happy
        to get back a 0 buffer, and other functions like RefPtr::release() allow
        for 0, too.

JavaScriptGlue:

2008-10-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler and Cameron Zwarich.

        * JSRun.cpp:
        (JSRun::Evaluate):
        (JSRun::CheckSyntax): Provide a SourceCode to the Interpreter, since
        other APIs are no longer supported.

WebCore:

2008-10-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler and Cameron Zwarich.

        Updated for JavaScriptCore API changes: use a SourceCode instead of
        broken out parameters; treat sourceId as intptr_t.

        * ForwardingHeaders/kjs/SourceRange.h: Copied from ForwardingHeaders/kjs/SourceProvider.h.
        * bindings/js/JSXMLHttpRequestCustom.cpp:
        (WebCore::JSXMLHttpRequest::send):
        * bindings/js/ScriptController.cpp:
        (WebCore::ScriptController::evaluate):
        * bindings/js/StringSourceProvider.h:
        (WebCore::StringSourceProvider::create):
        (WebCore::StringSourceProvider::StringSourceProvider):

        (WebCore::makeSource): Added a makeSource function for convenience.

        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject evaluateWebScript:]):
        * bridge/NP_jsobject.cpp:
        (_NPN_Evaluate):
        * bridge/jni/jni_jsobject.mm:
        (JavaJSObject::call):
        (JavaJSObject::eval):
        (JavaJSObject::getMember):
        (JavaJSObject::setMember):
        (JavaJSObject::removeMember):

        * bridge/jni/jni_runtime.h:
        (JSC::Bindings::JavaString::operator UString): Replaced the explicit
        ustring() function with an implicit operator because this class already
        holds a UString::rep.

        * page/Console.cpp:
        (WebCore::retrieveLastCaller):
        (WebCore::Console::trace):
        * page/InspectorController.cpp:
        (WebCore::jsStringRef):
        (WebCore::InspectorController::addBreakpoint):
        (WebCore::InspectorController::removeBreakpoint):
        (WebCore::InspectorController::didParseSource):
        (WebCore::InspectorController::failedToParseSource):
        * page/InspectorController.h:
        * page/JavaScriptCallFrame.cpp:
        (WebCore::JavaScriptCallFrame::JavaScriptCallFrame):
        * page/JavaScriptCallFrame.h:
        (WebCore::JavaScriptCallFrame::create):
        (WebCore::JavaScriptCallFrame::sourceIdentifier):
        (WebCore::JavaScriptCallFrame::update):
        * page/JavaScriptDebugListener.h:
        * page/JavaScriptDebugServer.cpp:
        (WebCore::JavaScriptDebugServer::addBreakpoint):
        (WebCore::JavaScriptDebugServer::removeBreakpoint):
        (WebCore::JavaScriptDebugServer::hasBreakpoint):
        (WebCore::dispatchDidParseSource):
        (WebCore::dispatchFailedToParseSource):
        (WebCore::JavaScriptDebugServer::sourceParsed):
        (WebCore::JavaScriptDebugServer::callEvent):
        (WebCore::JavaScriptDebugServer::atStatement):
        (WebCore::JavaScriptDebugServer::returnEvent):
        (WebCore::JavaScriptDebugServer::exception):
        (WebCore::JavaScriptDebugServer::willExecuteProgram):
        (WebCore::JavaScriptDebugServer::didExecuteProgram):
        (WebCore::JavaScriptDebugServer::didReachBreakpoint):
        * page/JavaScriptDebugServer.h:
        * page/inspector/ScriptsPanel.js: Renamed internal uses of sourceId and
        sourceIdentifier to sourceID.

WebKit/mac:

2008-10-01  Geoffrey Garen  <ggaren@apple.com>

        Reviewed by Darin Adler and Cameron Zwarich.

        Updated for JavaScriptCore API changes: use a SourceCode instead of
        broken out parameters; treat sourceId as intptr_t.

        We still treat sourceId as int in some cases because of DashCode. See
        <rdar://problem/6263293> WebScriptDebugDelegate should use intptr_t for
        sourceId, not int.

        * WebView/WebScriptDebugger.h:
        * WebView/WebScriptDebugger.mm:
        (toNSString):
        (WebScriptDebugger::sourceParsed):
        (WebScriptDebugger::callEvent):
        (WebScriptDebugger::atStatement):
        (WebScriptDebugger::returnEvent):
        (WebScriptDebugger::exception):
        (WebScriptDebugger::willExecuteProgram):
        (WebScriptDebugger::didExecuteProgram):
        (WebScriptDebugger::didReachBreakpoint):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37184 268f45cc-cd09-0410-ab3c-d52691b4dbfc

55 files changed:
JavaScriptCore/API/JSBase.cpp
JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.exp
JavaScriptCore/VM/CodeBlock.h
JavaScriptCore/VM/CodeGenerator.cpp
JavaScriptCore/VM/ExceptionHelpers.cpp
JavaScriptCore/VM/Machine.cpp
JavaScriptCore/VM/Machine.h
JavaScriptCore/kjs/Arguments.h
JavaScriptCore/kjs/DebuggerCallFrame.cpp
JavaScriptCore/kjs/Error.cpp
JavaScriptCore/kjs/Error.h
JavaScriptCore/kjs/FunctionConstructor.cpp
JavaScriptCore/kjs/JSFunction.cpp
JavaScriptCore/kjs/JSFunction.h
JavaScriptCore/kjs/JSGlobalObjectFunctions.cpp
JavaScriptCore/kjs/Parser.cpp
JavaScriptCore/kjs/Parser.h
JavaScriptCore/kjs/Shell.cpp
JavaScriptCore/kjs/SourceProvider.h
JavaScriptCore/kjs/SourceRange.h
JavaScriptCore/kjs/debugger.h
JavaScriptCore/kjs/grammar.y
JavaScriptCore/kjs/interpreter.cpp
JavaScriptCore/kjs/interpreter.h
JavaScriptCore/kjs/lexer.cpp
JavaScriptCore/kjs/lexer.h
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/nodes.h
JavaScriptCore/profiler/ProfileGenerator.cpp
JavaScriptCore/wtf/Vector.h
JavaScriptGlue/ChangeLog
JavaScriptGlue/JSRun.cpp
WebCore/ChangeLog
WebCore/ForwardingHeaders/kjs/SourceRange.h [new file with mode: 0644]
WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
WebCore/bindings/js/ScriptController.cpp
WebCore/bindings/js/StringSourceProvider.h
WebCore/bindings/objc/WebScriptObject.mm
WebCore/bridge/NP_jsobject.cpp
WebCore/bridge/jni/jni_jsobject.mm
WebCore/bridge/jni/jni_runtime.h
WebCore/page/Console.cpp
WebCore/page/InspectorController.cpp
WebCore/page/InspectorController.h
WebCore/page/JavaScriptCallFrame.cpp
WebCore/page/JavaScriptCallFrame.h
WebCore/page/JavaScriptDebugListener.h
WebCore/page/JavaScriptDebugServer.cpp
WebCore/page/JavaScriptDebugServer.h
WebCore/page/inspector/CallStackSidebarPane.js
WebCore/page/inspector/ScriptsPanel.js
WebKit/mac/ChangeLog
WebKit/mac/WebView/WebScriptDebugger.h
WebKit/mac/WebView/WebScriptDebugger.mm

index c65ab8f..bf3f816 100644 (file)
@@ -30,6 +30,7 @@
 #include "APICast.h"
 #include "completion.h"
 #include "OpaqueJSString.h"
+#include "SourceRange.h"
 #include <kjs/ExecState.h>
 #include <kjs/InitializeThreading.h>
 #include <kjs/interpreter.h>
@@ -49,7 +50,8 @@ JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef th
 
     // Interpreter::evaluate sets "this" to the global object if it is NULL
     JSGlobalObject* globalObject = exec->dynamicGlobalObject();
-    Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), sourceURL->ustring(), startingLineNumber, script->ustring(), jsThisObject);
+    SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber);
+    Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), source, jsThisObject);
 
     if (completion.complType() == Throw) {
         if (exception)
@@ -70,7 +72,8 @@ bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourc
     exec->globalData().heap->registerThread();
     JSLock lock(exec);
 
-    Completion completion = Interpreter::checkSyntax(exec->dynamicGlobalObject()->globalExec(), sourceURL->ustring(), startingLineNumber, script->ustring());
+    SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber);
+    Completion completion = Interpreter::checkSyntax(exec->dynamicGlobalObject()->globalExec(), source);
     if (completion.complType() == Throw) {
         if (exception)
             *exception = toRef(completion.value());
index f8fb2fb..15a45a5 100644 (file)
@@ -1,3 +1,146 @@
+2008-10-01  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Darin Adler and Cameron Zwarich.
+
+        Preliminary step toward dynamic recompilation: Standardized and
+        simplified the parsing interface.
+        
+        The main goal in this patch is to make it easy to ask for a duplicate
+        compilation, and get back a duplicate result -- same source URL, same
+        debugger / profiler ID, same toString behavior, etc.
+        
+        The basic unit of compilation and evaluation is now SourceCode, which
+        encompasses a SourceProvider, a range in that provider, and a starting
+        line number.
+
+        A SourceProvider now encompasses a source URL, and *is* a source ID,
+        since a pointer is a unique identifier.
+
+        * API/JSBase.cpp:
+        (JSEvaluateScript):
+        (JSCheckScriptSyntax): Provide a SourceCode to the Interpreter, since
+        other APIs are no longer supported.
+        
+        * VM/CodeBlock.h:
+        (JSC::EvalCodeCache::get): Provide a SourceCode to the Interpreter, since
+        other APIs are no longer supported.
+        (JSC::CodeBlock::CodeBlock): ASSERT something that used to be ASSERTed
+        by our caller -- this is a better bottleneck.
+
+        * VM/CodeGenerator.cpp:
+        (JSC::CodeGenerator::CodeGenerator): Updated for the fact that
+        FunctionBodyNode's parameters are no longer a WTF::Vector.
+
+        * kjs/Arguments.cpp:
+        (JSC::Arguments::Arguments): ditto
+
+        * kjs/DebuggerCallFrame.cpp:
+        (JSC::DebuggerCallFrame::evaluate): Provide a SourceCode to the Parser,
+        since other APIs are no longer supported.
+
+        * kjs/FunctionConstructor.cpp:
+        (JSC::constructFunction): Provide a SourceCode to the Parser, since
+        other APIs are no longer supported. Adopt FunctionBodyNode's new
+        "finishParsing" API.
+
+        * kjs/JSFunction.cpp:
+        (JSC::JSFunction::lengthGetter):
+        (JSC::JSFunction::getParameterName): Updated for the fact that
+        FunctionBodyNode's parameters are no longer a wtf::Vector.
+
+        * kjs/JSFunction.h: Nixed some cruft.
+
+        * kjs/JSGlobalObjectFunctions.cpp:
+        (JSC::globalFuncEval): Provide a SourceCode to the Parser, since
+        other APIs are no longer supported. 
+
+        * kjs/Parser.cpp:
+        (JSC::Parser::parse): Require a SourceCode argument, instead of a bunch
+        of broken out parameters. Stop tracking sourceId as an integer, since we
+        use the SourceProvider pointer for this now. Don't clamp the
+        startingLineNumber, since SourceCode does that now.
+
+        * kjs/Parser.h:
+        (JSC::Parser::parse): Standardized the parsing interface to require a
+        SourceCode.
+
+        * kjs/Shell.cpp:
+        (functionRun):
+        (functionLoad):
+        (prettyPrintScript):
+        (runWithScripts):
+        (runInteractive): Provide a SourceCode to the Interpreter, since
+        other APIs are no longer supported.
+
+        * kjs/SourceProvider.h:
+        (JSC::SourceProvider::SourceProvider):
+        (JSC::SourceProvider::url):
+        (JSC::SourceProvider::asId):
+        (JSC::UStringSourceProvider::create):
+        (JSC::UStringSourceProvider::UStringSourceProvider): Added new
+        responsibilities described above.
+
+        * kjs/SourceRange.h:
+        (JSC::SourceCode::SourceCode):
+        (JSC::SourceCode::toString):
+        (JSC::SourceCode::provider):
+        (JSC::SourceCode::firstLine):
+        (JSC::SourceCode::data):
+        (JSC::SourceCode::length): Added new responsibilities described above.
+        Renamed SourceRange to SourceCode, based on review feedback. Added
+        a makeSource function for convenience.
+
+        * kjs/debugger.h: Provide a SourceCode to the client, since other APIs
+        are no longer supported.
+
+        * kjs/grammar.y: Provide startingLineNumber when creating a SourceCode.
+
+        * kjs/debugger.h: Treat sourceId as intptr_t to avoid loss of precision
+        on 64bit platforms.
+
+        * kjs/interpreter.cpp:
+        (JSC::Interpreter::checkSyntax):
+        (JSC::Interpreter::evaluate):
+        * kjs/interpreter.h: Require a SourceCode instead of broken out arguments.
+
+        * kjs/lexer.cpp:
+        (JSC::Lexer::setCode):
+        * kjs/lexer.h:
+        (JSC::Lexer::sourceRange): Fold together the SourceProvider and line number
+        into a SourceCode. Fixed a bug where the Lexer would accidentally keep
+        alive the last SourceProvider forever.
+
+        * kjs/nodes.cpp:
+        (JSC::ScopeNode::ScopeNode):
+        (JSC::ProgramNode::ProgramNode):
+        (JSC::ProgramNode::create):
+        (JSC::EvalNode::EvalNode):
+        (JSC::EvalNode::generateCode):
+        (JSC::EvalNode::create):
+        (JSC::FunctionBodyNode::FunctionBodyNode):
+        (JSC::FunctionBodyNode::finishParsing):
+        (JSC::FunctionBodyNode::create):
+        (JSC::FunctionBodyNode::generateCode):
+        (JSC::ProgramNode::generateCode):
+        (JSC::FunctionBodyNode::paramString):
+        * kjs/nodes.h:
+        (JSC::ScopeNode::):
+        (JSC::ScopeNode::sourceId):
+        (JSC::FunctionBodyNode::):
+        (JSC::FunctionBodyNode::parameterCount):
+        (JSC::FuncExprNode::):
+        (JSC::FuncDeclNode::): Store a SourceCode in all ScopeNodes, since
+        SourceCode is now responsible for tracking URL, ID, etc. Streamlined
+        some ad hoc FunctionBodyNode fixups into a "finishParsing" function, to
+        help make clear what you need to do in order to finish parsing a
+        FunctionBodyNode.
+
+        * wtf/Vector.h:
+        (WTF::::releaseBuffer): Don't ASSERT that releaseBuffer() is only called
+        when buffer is not 0, since FunctionBodyNode is more than happy
+        to get back a 0 buffer, and other functions like RefPtr::release() allow
+        for 0, too.
+
 2008-10-01  Cameron Zwarich  <zwarich@apple.com>
 
         Reviewed by Maciej Stachowiak.
index 7a15183..f7792fd 100644 (file)
@@ -98,17 +98,16 @@ __ZN3JSC10Identifier5equalEPKNS_7UString3RepEPKc
 __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE
 __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc
 __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE
-__ZN3JSC11Interpreter11checkSyntaxEPNS_9ExecStateERKNS_7UStringEiS5_
+__ZN3JSC11Interpreter11checkSyntaxEPNS_9ExecStateERKNS_10SourceCodeE
 __ZN3JSC11Interpreter21shouldPrintExceptionsEv
 __ZN3JSC11Interpreter24setShouldPrintExceptionsEb
-__ZN3JSC11Interpreter8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_7UStringEiN3WTF10PassRefPtrINS_14SourceProviderEEEPNS_7JSValueE
-__ZN3JSC11Interpreter8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_7UStringEiS7_PNS_7JSValueE
+__ZN3JSC11Interpreter8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeEPNS_7JSValueE
 __ZN3JSC11JSImmediate12nonInlineNaNEv
 __ZN3JSC11JSImmediate8toObjectEPKNS_7JSValueEPNS_9ExecStateE
 __ZN3JSC11JSImmediate8toStringEPKNS_7JSValueE
 __ZN3JSC11JSImmediate9prototypeEPKNS_7JSValueEPNS_9ExecStateE
 __ZN3JSC11ProfileNode4sortEPFbRKN3WTF6RefPtrIS0_EES5_E
-__ZN3JSC11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEEPNS_14SourceProviderEbbbi
+__ZN3JSC11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEERKNS_10SourceCodeEbbbi
 __ZN3JSC11PropertyMap3putERKNS_10IdentifierEPNS_7JSValueEjbPNS_8JSObjectERNS_15PutPropertySlotERPS5_
 __ZN3JSC11PropertyMap9getOffsetERKNS_10IdentifierERj
 __ZN3JSC11PropertyMapD1Ev
@@ -200,7 +199,7 @@ __ZN3JSC6JSLock4lockEb
 __ZN3JSC6JSLock6unlockEb
 __ZN3JSC6JSLock9lockCountEv
 __ZN3JSC6JSLockC1EPNS_9ExecStateE
-__ZN3JSC6Parser5parseEPNS_9ExecStateERKNS_7UStringEiN3WTF10PassRefPtrINS_14SourceProviderEEEPiSA_PS3_
+__ZN3JSC6Parser5parseEPNS_9ExecStateEPiPNS_7UStringE
 __ZN3JSC6strtodEPKcPPc
 __ZN3JSC7ArgList10slowAppendEPNS_7JSValueE
 __ZN3JSC7CStringD1Ev
@@ -317,7 +316,7 @@ __ZNK3JSC7JSValue16toUInt32SlowCaseEPNS_9ExecStateERb
 __ZNK3JSC7JSValue7toFloatEPNS_9ExecStateE
 __ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE
 __ZNK3JSC7Machine14retrieveCallerEPNS_9ExecStateEPNS_16InternalFunctionE
-__ZNK3JSC7Machine18retrieveLastCallerEPNS_9ExecStateERiS3_RNS_7UStringERPNS_7JSValueE
+__ZNK3JSC7Machine18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERPNS_7JSValueE
 __ZNK3JSC7UString10UTF8StringEb
 __ZNK3JSC7UString14toStrictUInt32EPb
 __ZNK3JSC7UString5asciiEv
index 98514b2..8638fc2 100644 (file)
@@ -155,16 +155,16 @@ namespace JSC {
                 evalNode = cacheMap.get(evalSource.rep());
 
             if (!evalNode) {
-                int sourceId;
                 int errLine;
                 UString errMsg;
                 
-                evalNode = exec->parser()->parse<EvalNode>(exec, UString(), 1, UStringSourceProvider::create(evalSource), &sourceId, &errLine, &errMsg);
+                SourceCode source = makeSource(evalSource);
+                evalNode = exec->parser()->parse<EvalNode>(exec, source, &errLine, &errMsg);
                 if (evalNode) {
                     if (evalSource.size() < maxCacheableSourceLength && (*scopeChain->begin())->isVariableObject() && cacheMap.size() < maxCacheEntries)
                         cacheMap.set(evalSource.rep(), evalNode);
                 } else {
-                    exceptionValue = Error::create(exec, SyntaxError, errMsg, errLine, sourceId, NULL);
+                    exceptionValue = Error::create(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), NULL);
                     return 0;
                 }
             }
@@ -196,6 +196,7 @@ namespace JSC {
             , source(source_)
             , sourceOffset(sourceOffset_)
         {
+            ASSERT(source);
         }
 
         ~CodeBlock();
index d1b4532..0234a74 100644 (file)
@@ -312,16 +312,17 @@ CodeGenerator::CodeGenerator(FunctionBodyNode* functionBody, const Debugger* deb
     for (size_t i = 0; i < varStack.size(); ++i)
         addVar(varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant);
 
-    Vector<Identifier>& parameters = functionBody->parameters();
-    m_nextParameter = -RegisterFile::CallFrameHeaderSize - parameters.size() - 1;
-    m_parameters.resize(1 + parameters.size()); // reserve space for "this"
+    const Identifier* parameters = functionBody->parameters();
+    size_t parameterCount = functionBody->parameterCount();
+    m_nextParameter = -RegisterFile::CallFrameHeaderSize - parameterCount - 1;
+    m_parameters.resize(1 + parameterCount); // reserve space for "this"
 
     // Add "this" as a parameter
     m_thisRegister.setIndex(m_nextParameter);
     ++m_nextParameter;
     ++m_codeBlock->numParameters;
     
-    for (size_t i = 0; i < parameters.size(); ++i)
+    for (size_t i = 0; i < parameterCount; ++i)
         addParameter(parameters[i]);
 
     allocateConstants(functionBody->neededConstants());
index 2cb1ecb..3d6c877 100644 (file)
@@ -95,7 +95,7 @@ JSValue* createUndefinedVariableError(ExecState* exec, const Identifier& ident,
     int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset);
     UString message = "Can't find variable: ";
     message.append(ident.ustring());
-    JSObject* exception = Error::create(exec, ReferenceError, message, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+    JSObject* exception = Error::create(exec, ReferenceError, message, line, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());
     exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete);
@@ -159,7 +159,7 @@ JSObject* createInvalidParamError(ExecState* exec, const char* op, JSValue* valu
     int divotPoint = 0;
     int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset);
     UString errorMessage = createErrorMessage(exec, codeBlock, line, divotPoint, divotPoint + endOffset, value, message);
-    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());
     exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete);
@@ -180,7 +180,7 @@ JSObject* createNotAConstructorError(ExecState* exec, JSValue* value, const Inst
         startPoint++;
     
     UString errorMessage = createErrorMessage(exec, codeBlock, line, startPoint, divotPoint, value, "not a constructor");
-    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());
     exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete);
@@ -194,7 +194,7 @@ JSValue* createNotAFunctionError(ExecState* exec, JSValue* value, const Instruct
     int divotPoint = 0;
     int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset);
     UString errorMessage = createErrorMessage(exec, codeBlock, line, divotPoint - startOffset, divotPoint, value, "not a function");
-    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());    
+    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());    
     exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete);
@@ -218,7 +218,7 @@ JSObject* createNotAnObjectError(ExecState* exec, JSNotAnObjectErrorStub* error,
     int divotPoint = 0;
     int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset);
     UString errorMessage = createErrorMessage(exec, codeBlock, line, divotPoint - startOffset, divotPoint, error->isNull() ? jsNull() : jsUndefined(), "not an object");
-    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+    JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());
     exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete);
     exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete);
index db72062..2ecb4a1 100644 (file)
@@ -786,9 +786,9 @@ NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionVa
     if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) {
         DebuggerCallFrame debuggerCallFrame(exec, exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
         if (r[RegisterFile::Callee].jsValue(exec))
-            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->lastLine());
+            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->lastLine());
         else
-            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->lastLine());
+            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->lastLine());
     }
 
     if (Profiler* profiler = *Profiler::enabledProfilerReference()) {
@@ -851,7 +851,7 @@ NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue*& exc
                     exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete);
                 } else
                     exception->putWithAttributes(exec, Identifier(exec, "line"), jsNumber(exec, codeBlock->lineNumberForVPC(vPC)), ReadOnly | DontDelete);
-                exception->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, codeBlock->ownerNode->sourceId()), ReadOnly | DontDelete);
+                exception->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, codeBlock->ownerNode->sourceID()), ReadOnly | DontDelete);
                 exception->putWithAttributes(exec, Identifier(exec, "sourceURL"), jsOwnedString(exec, codeBlock->ownerNode->sourceURL()), ReadOnly | DontDelete);
             }
             
@@ -867,7 +867,7 @@ NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue*& exc
     if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) {
         ScopeChainNode* scopeChain = this->scopeChain(r);
         DebuggerCallFrame debuggerCallFrame(exec, exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
-        debugger->exception(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->lineNumberForVPC(vPC));
+        debugger->exception(debuggerCallFrame, codeBlock->ownerNode->sourceID(), codeBlock->lineNumberForVPC(vPC));
     }
 
     // Calculate an exception handler vPC, unwinding call frames as necessary.
@@ -1106,22 +1106,22 @@ NEVER_INLINE void Machine::debug(ExecState* exec, Register* r, DebugHookID debug
 
     switch (debugHookID) {
         case DidEnterCallFrame:
-            debugger->callEvent(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine);
+            debugger->callEvent(debuggerCallFrame, codeBlock->ownerNode->sourceID(), firstLine);
             return;
         case WillLeaveCallFrame:
-            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceId(), lastLine);
+            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceID(), lastLine);
             return;
         case WillExecuteStatement:
-            debugger->atStatement(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine);
+            debugger->atStatement(debuggerCallFrame, codeBlock->ownerNode->sourceID(), firstLine);
             return;
         case WillExecuteProgram:
-            debugger->willExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine);
+            debugger->willExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceID(), firstLine);
             return;
         case DidExecuteProgram:
-            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), lastLine);
+            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceID(), lastLine);
             return;
         case DidReachBreakpoint:
-            debugger->didReachBreakpoint(debuggerCallFrame, codeBlock->ownerNode->sourceId(), lastLine);
+            debugger->didReachBreakpoint(debuggerCallFrame, codeBlock->ownerNode->sourceID(), lastLine);
             return;
     }
 }
@@ -3728,7 +3728,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         int message = (++vPC)->u.operand;
 
         CodeBlock* codeBlock = this->codeBlock(r);
-        r[dst] = Error::create(exec, (ErrorType)type, codeBlock->unexpectedConstants[message]->toString(exec), codeBlock->lineNumberForVPC(vPC), codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+        r[dst] = Error::create(exec, (ErrorType)type, codeBlock->unexpectedConstants[message]->toString(exec), codeBlock->lineNumberForVPC(vPC), codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());
 
         ++vPC;
         NEXT_OPCODE;
@@ -3903,7 +3903,7 @@ JSValue* Machine::retrieveCaller(ExecState* exec, InternalFunction* function) co
     return caller;
 }
 
-void Machine::retrieveLastCaller(ExecState* exec, int& lineNumber, int& sourceId, UString& sourceURL, JSValue*& function) const
+void Machine::retrieveLastCaller(ExecState* exec, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValue*& function) const
 {
     function = 0;
     lineNumber = -1;
@@ -3920,7 +3920,7 @@ void Machine::retrieveLastCaller(ExecState* exec, int& lineNumber, int& sourceId
 
     Instruction* vPC = vPCForPC(callerCodeBlock, r[RegisterFile::ReturnPC].v());
     lineNumber = callerCodeBlock->lineNumberForVPC(vPC - 1);
-    sourceId = callerCodeBlock->ownerNode->sourceId();
+    sourceID = callerCodeBlock->ownerNode->sourceID();
     sourceURL = callerCodeBlock->ownerNode->sourceURL();
 
     JSValue* caller = callerR[RegisterFile::Callee].getJSValue();
@@ -5658,7 +5658,7 @@ JSValue* Machine::cti_op_new_error(CTI_ARGS)
     JSValue* message = ARG_src2;
     unsigned lineNumber = ARG_int3;
 
-    return Error::create(exec, static_cast<ErrorType>(type), message->toString(exec), lineNumber, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+    return Error::create(exec, static_cast<ErrorType>(type), message->toString(exec), lineNumber, codeBlock->ownerNode->sourceID(), codeBlock->ownerNode->sourceURL());
 }
 
 void Machine::cti_op_debug(CTI_ARGS)
index 778805b..1ce2075 100644 (file)
@@ -101,7 +101,7 @@ namespace JSC {
 
         JSValue* retrieveArguments(ExecState*, JSFunction*) const;
         JSValue* retrieveCaller(ExecState*, InternalFunction*) const;
-        void retrieveLastCaller(ExecState* exec, int& lineNumber, int& sourceId, UString& sourceURL, JSValue*& function) const;
+        void retrieveLastCaller(ExecState* exec, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValue*& function) const;
         
         static ScopeChainNode* scopeChain(const Register* r) { return r[RegisterFile::ScopeChain].scopeChain(); }
         static CodeBlock* codeBlock(const Register* r) { return r[RegisterFile::CodeBlock].codeBlock(); }
index 988c214..565d519 100644 (file)
@@ -89,7 +89,7 @@ namespace JSC {
         int numArguments;
         exec->machine()->getArgumentsData(callFrame, callee, firstParameterIndex, argv, numArguments);
 
-        d->numParameters = callee->numParameters();
+        d->numParameters = callee->m_body->parameterCount();
         d->firstParameterIndex = firstParameterIndex;
         d->numArguments = numArguments;
 
index 3237451..40defe2 100644 (file)
@@ -70,13 +70,12 @@ JSValue* DebuggerCallFrame::evaluate(const UString& script, JSValue*& exception)
 
     ExecState newExec(m_scopeChain->globalObject(), m_registers);
 
-    int sourceId;
     int errLine;
     UString errMsg;
-    RefPtr<SourceProvider> sourceProvider = UStringSourceProvider::create(script);
-    RefPtr<EvalNode> evalNode = newExec.parser()->parse<EvalNode>(&newExec, UString(), 1, sourceProvider, &sourceId, &errLine, &errMsg);
+    SourceCode source = makeSource(script);
+    RefPtr<EvalNode> evalNode = newExec.parser()->parse<EvalNode>(&newExec, source, &errLine, &errMsg);
     if (!evalNode)
-        return Error::create(&newExec, SyntaxError, errMsg, errLine, sourceId, 0);
+        return Error::create(&newExec, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url());
 
     return newExec.machine()->execute(evalNode.get(), &newExec, thisObject(), m_scopeChain, &exception);
 }
index 88b6401..5e21c8e 100644 (file)
@@ -37,7 +37,7 @@ const char* expressionBeginOffsetPropertyName = "expressionBeginOffset";
 const char* expressionCaretOffsetPropertyName = "expressionCaretOffset";
 const char* expressionEndOffsetPropertyName = "expressionEndOffset";
 
-JSObject* Error::create(ExecState* exec, ErrorType type, const UString& message, int lineNumber, int sourceId, const UString& sourceURL)
+JSObject* Error::create(ExecState* exec, ErrorType type, const UString& message, int lineNumber, intptr_t sourceID, const UString& sourceURL)
 {
     JSObject* constructor;
     const char* name;
@@ -83,8 +83,8 @@ JSObject* Error::create(ExecState* exec, ErrorType type, const UString& message,
 
     if (lineNumber != -1)
         error->putWithAttributes(exec, Identifier(exec, "line"), jsNumber(exec, lineNumber), ReadOnly | DontDelete);
-    if (sourceId != -1)
-        error->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceId), ReadOnly | DontDelete);
+    if (sourceID != -1)
+        error->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceID), ReadOnly | DontDelete);
     if (!sourceURL.isNull())
         error->putWithAttributes(exec, Identifier(exec, "sourceURL"), jsString(exec, sourceURL), ReadOnly | DontDelete);
 
@@ -117,9 +117,9 @@ JSObject* throwError(ExecState* exec, ErrorType type, const char* message)
     return error;
 }
 
-JSObject* throwError(ExecState* exec, ErrorType type, const UString& message, int line, int sourceId, const UString& sourceURL)
+JSObject* throwError(ExecState* exec, ErrorType type, const UString& message, int line, intptr_t sourceID, const UString& sourceURL)
 {
-    JSObject* error = Error::create(exec, type, message, line, sourceId, sourceURL);
+    JSObject* error = Error::create(exec, type, message, line, sourceID, sourceURL);
     exec->setException(error);
     return error;
 }
index 0af8752..8d73eb4 100644 (file)
@@ -49,11 +49,11 @@ namespace JSC {
     
     class Error {
     public:
-        static JSObject* create(ExecState*, ErrorType, const UString& message, int lineNumber, int sourceId, const UString& sourceURL);
+        static JSObject* create(ExecState*, ErrorType, const UString& message, int lineNumber, intptr_t sourceID, const UString& sourceURL);
         static JSObject* create(ExecState*, ErrorType, const char* message);
     };
 
-    JSObject* throwError(ExecState*, ErrorType, const UString& message, int lineNumber, int sourceId, const UString& sourceURL);
+    JSObject* throwError(ExecState*, ErrorType, const UString& message, int lineNumber, intptr_t sourceID, const UString& sourceURL);
     JSObject* throwError(ExecState*, ErrorType, const UString& message);
     JSObject* throwError(ExecState*, ErrorType, const char* message);
     JSObject* throwError(ExecState*, ErrorType);
index 058135f..b04e0be 100644 (file)
@@ -84,28 +84,23 @@ JSObject* constructFunction(ExecState* exec, const ArgList& args, const Identifi
     }
 
     // parse the source code
-    int sourceId;
     int errLine;
     UString errMsg;
-    RefPtr<SourceProvider> source = UStringSourceProvider::create(body);
-    RefPtr<FunctionBodyNode> functionBody = exec->parser()->parse<FunctionBodyNode>(exec, sourceURL, lineNumber, source, &sourceId, &errLine, &errMsg);
+    SourceCode source = makeSource(body, sourceURL, lineNumber);
+    RefPtr<FunctionBodyNode> functionBody = exec->parser()->parse<FunctionBodyNode>(exec, source, &errLine, &errMsg);
 
     // No program node == syntax error - throw a syntax error
     if (!functionBody)
         // We can't return a Completion(Throw) here, so just set the exception
         // and return it
-        return throwError(exec, SyntaxError, errMsg, errLine, sourceId, sourceURL);
-    
-    functionBody->setSource(SourceRange(source, 0, source->length()));
-    ScopeChain scopeChain(exec->lexicalGlobalObject(), exec->globalThisValue());
-
-    JSFunction* function = new (exec) JSFunction(exec, functionName, functionBody.get(), scopeChain.node());
+        return throwError(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url());
 
     // parse parameter list. throw syntax error on illegal identifiers
     int len = p.size();
     const UChar* c = p.data();
-    int i = 0, params = 0;
+    int i = 0;
     UString param;
+    Vector<Identifier> parameters;
     while (i < len) {
         while (*c == ' ' && i < len)
             c++, i++;
@@ -119,19 +114,22 @@ JSObject* constructFunction(ExecState* exec, const ArgList& args, const Identifi
             while (i < len && *c == ' ')
                 c++, i++;
             if (i == len) {
-                functionBody->parameters().append(Identifier(exec, param));
-                params++;
+                parameters.append(Identifier(exec, param));
                 break;
             } else if (*c == ',') {
-                functionBody->parameters().append(Identifier(exec, param));
-                params++;
+                parameters.append(Identifier(exec, param));
                 c++, i++;
                 continue;
             } // else error
         }
         return throwError(exec, SyntaxError, "Syntax error in parameter list");
     }
-  
+    size_t count = parameters.size();
+    functionBody->finishParsing(source, parameters.releaseBuffer(), count);
+
+    ScopeChain scopeChain(exec->lexicalGlobalObject(), exec->globalThisValue());
+    JSFunction* function = new (exec) JSFunction(exec, functionName, functionBody.get(), scopeChain.node());
+
     JSObject* prototype = constructEmptyObject(exec);
     prototype->putDirect(exec->propertyNames().constructor, function, DontEnum);
     function->putDirect(exec->propertyNames().prototype, prototype, DontDelete);
index 9f60d7c..83a6191 100644 (file)
@@ -85,7 +85,7 @@ JSValue* JSFunction::callerGetter(ExecState* exec, const Identifier&, const Prop
 JSValue* JSFunction::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot)
 {
     JSFunction* thisObj = static_cast<JSFunction*>(slot.slotBase());
-    return jsNumber(exec, thisObj->m_body->parameters().size());
+    return jsNumber(exec, thisObj->m_body->parameterCount());
 }
 
 bool JSFunction::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
@@ -131,15 +131,15 @@ bool JSFunction::deleteProperty(ExecState* exec, const Identifier& propertyName)
  */
 const Identifier& JSFunction::getParameterName(int index)
 {
-    Vector<Identifier>& parameters = m_body->parameters();
+    const Identifier* parameters = m_body->parameters();
 
-    if (static_cast<size_t>(index) >= m_body->parameters().size())
+    if (static_cast<size_t>(index) >= m_body->parameterCount())
         return m_scopeChain.globalObject()->globalData()->propertyNames->nullIdentifier;
   
     const Identifier& name = parameters[index];
 
     // Are there any subsequent parameters with the same name?
-    size_t size = parameters.size();
+    size_t size = m_body->parameterCount();
     for (size_t i = index + 1; i < size; ++i) {
         if (parameters[i] == name)
             return m_scopeChain.globalObject()->globalData()->propertyNames->nullIdentifier;
index f68e88e..2484c2b 100644 (file)
@@ -56,11 +56,6 @@ namespace JSC {
         // due to a later parameter with the same name.
         const Identifier& getParameterName(int index);
 
-        unsigned numParameters() const
-        {
-            return m_body->parameters().size();
-        }
-
         void setScope(const ScopeChain& scopeChain) { m_scopeChain = scopeChain; }
         ScopeChain& scope() { return m_scopeChain; }
 
index 7eba1f8..dc25377 100644 (file)
@@ -282,14 +282,14 @@ JSValue* globalFuncEval(ExecState* exec, JSObject* function, JSValue* thisValue,
 
     UString s = x->toString(exec);
 
-    int sourceId;
     int errLine;
     UString errMsg;
 
-    RefPtr<EvalNode> evalNode = exec->parser()->parse<EvalNode>(exec, UString(), 1, UStringSourceProvider::create(s), &sourceId, &errLine, &errMsg);
+    SourceCode source = makeSource(s);
+    RefPtr<EvalNode> evalNode = exec->parser()->parse<EvalNode>(exec, source, &errLine, &errMsg);
 
     if (!evalNode)
-        return throwError(exec, SyntaxError, errMsg, errLine, sourceId, NULL);
+        return throwError(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), NULL);
 
     return exec->machine()->execute(evalNode.get(), exec, thisObject, globalObject->globalScopeChain().node(), exec->exceptionSlot());
 }
index 488a286..3ccb69f 100644 (file)
@@ -32,24 +32,13 @@ extern int kjsyyparse(void*);
 
 namespace JSC {
 
-Parser::Parser()
-    : m_sourceId(0)
-{
-}
-
-void Parser::parse(ExecState* exec, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> prpSource,
-                   int* sourceId, int* errLine, UString* errMsg)
+void Parser::parse(ExecState* exec, int* errLine, UString* errMsg)
 {
     ASSERT(!m_sourceElements);
 
-    int defaultSourceId;
     int defaultErrLine;
     UString defaultErrMsg;
 
-    RefPtr<SourceProvider> source = prpSource;
-
-    if (!sourceId)
-        sourceId = &defaultSourceId;
     if (!errLine)
         errLine = &defaultErrLine;
     if (!errMsg)
@@ -59,12 +48,7 @@ void Parser::parse(ExecState* exec, const UString& sourceURL, int startingLineNu
     *errMsg = 0;
 
     Lexer& lexer = *exec->lexer();
-
-    if (startingLineNumber <= 0)
-        startingLineNumber = 1;
-
-    lexer.setCode(startingLineNumber, source);
-    *sourceId = ++m_sourceId;
+    lexer.setCode(*m_source);
 
     int parseError = kjsyyparse(&exec->globalData());
     bool lexError = lexer.sawError();
@@ -79,7 +63,7 @@ void Parser::parse(ExecState* exec, const UString& sourceURL, int startingLineNu
     }
 
     if (Debugger* debugger = exec->dynamicGlobalObject()->debugger())
-        debugger->sourceParsed(exec, *sourceId, sourceURL, *source, startingLineNumber, *errLine, *errMsg);
+        debugger->sourceParsed(exec, *m_source, *errLine, *errMsg);
 }
 
 void Parser::didFinishParsing(SourceElements* sourceElements, ParserRefCountedData<DeclarationStacks::VarStack>* varStack, 
index a0cadd6..f669090 100644 (file)
@@ -48,25 +48,18 @@ namespace JSC {
 
     class Parser : Noncopyable {
     public:
-        template <class ParsedNode>
-        PassRefPtr<ParsedNode> parse(ExecState*, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source,
-                                     int* sourceId = 0, int* errLine = 0, UString* errMsg = 0);
-
-        UString sourceURL() const { return m_sourceURL; }
-        int sourceId() const { return m_sourceId; }
+        template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, PassRefPtr<SourceProvider>, int* errLine = 0, UString* errMsg = 0);
+        template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, const SourceCode&, int* errLine = 0, UString* errMsg = 0);
 
         void didFinishParsing(SourceElements*, ParserRefCountedData<DeclarationStacks::VarStack>*, 
                               ParserRefCountedData<DeclarationStacks::FunctionStack>*, bool usesEval, bool needsClosure, bool usesArguments, int lastLine, int numConstants);
 
     private:
         friend class JSGlobalData;
-        Parser();
 
-        void parse(ExecState*, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source,
-                   int* sourceId, int* errLine, UString* errMsg);
+        void parse(ExecState*, int* errLine, UString* errMsg);
 
-        UString m_sourceURL;
-        int m_sourceId;
+        const SourceCode* m_source;
         RefPtr<SourceElements> m_sourceElements;
         RefPtr<ParserRefCountedData<DeclarationStacks::VarStack> > m_varDeclarations;
         RefPtr<ParserRefCountedData<DeclarationStacks::FunctionStack> > m_funcDeclarations;
@@ -77,31 +70,29 @@ namespace JSC {
         int m_numConstants;
     };
 
-    template <class ParsedNode>
-    PassRefPtr<ParsedNode> Parser::parse(ExecState* exec, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source,
-                                         int* sourceId, int* errLine, UString* errMsg)
+    template <class ParsedNode> PassRefPtr<ParsedNode> Parser::parse(ExecState* exec, const SourceCode& source, int* errLine, UString* errMsg)
     {
-        m_sourceURL = sourceURL;
-        RefPtr<SourceProvider> sourceProvider = source;
-        parse(exec, sourceURL, startingLineNumber, sourceProvider.get(), sourceId, errLine, errMsg);
-        if (!m_sourceElements) {
-            m_sourceURL = UString();
-            return 0;
+        m_source = &source;
+        parse(exec, errLine, errMsg);
+        RefPtr<ParsedNode> result;
+        if (m_sourceElements) {
+            result = ParsedNode::create(&exec->globalData(),
+                                         m_sourceElements.get(),
+                                         m_varDeclarations ? &m_varDeclarations->data : 0, 
+                                         m_funcDeclarations ? &m_funcDeclarations->data : 0,
+                                         *m_source,
+                                         m_usesEval,
+                                         m_needsClosure,
+                                         m_usesArguments,
+                                         m_numConstants);
+            result->setLoc(m_source->firstLine(), m_lastLine);
         }
-        RefPtr<ParsedNode> node = ParsedNode::create(&exec->globalData(),
-                                                     m_sourceElements.release().get(),
-                                                     m_varDeclarations ? &m_varDeclarations->data : 0, 
-                                                     m_funcDeclarations ? &m_funcDeclarations->data : 0,
-                                                     sourceProvider.get(),
-                                                     m_usesEval,
-                                                     m_needsClosure,
-                                                     m_usesArguments,
-                                                     m_numConstants);
+
+        m_source = 0;
+        m_sourceElements = 0;
         m_varDeclarations = 0;
         m_funcDeclarations = 0;
-        m_sourceURL = UString();
-        node->setLoc(startingLineNumber, m_lastLine);
-        return node.release();
+        return result.release();
     }
 
 } // namespace JSC
index c986990..e18d8e2 100644 (file)
@@ -234,7 +234,7 @@ JSValue* functionRun(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
     JSGlobalObject* globalObject = exec->lexicalGlobalObject();
 
     stopWatch.start();
-    Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 1, script.data());
+    Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(script.data(), fileName));
     stopWatch.stop();
 
     return jsNumber(globalObject->globalExec(), stopWatch.getElapsedMS());
@@ -248,7 +248,7 @@ JSValue* functionLoad(ExecState* exec, JSObject*, JSValue*, const ArgList& args)
         return throwError(exec, GeneralError, "Could not open file.");
 
     JSGlobalObject* globalObject = exec->lexicalGlobalObject();
-    Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 1, script.data());
+    Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(script.data(), fileName));
 
     return jsUndefined();
 }
@@ -319,8 +319,7 @@ static bool prettyPrintScript(ExecState* exec, const UString& fileName, const Ve
 {
     int errLine = 0;
     UString errMsg;
-    UString scriptUString(script.data());
-    RefPtr<ProgramNode> programNode = exec->parser()->parse<ProgramNode>(exec, fileName, 1, UStringSourceProvider::create(scriptUString), 0, &errLine, &errMsg);
+    RefPtr<ProgramNode> programNode = exec->parser()->parse<ProgramNode>(exec, makeSource(script.data(), fileName), &errLine, &errMsg);
     if (!programNode) {
         fprintf(stderr, "%s:%d: %s.\n", fileName.UTF8String().c_str(), errLine, errMsg.UTF8String().c_str());
         return false;
@@ -353,7 +352,7 @@ static bool runWithScripts(GlobalObject* globalObject, const Vector<UString>& fi
         if (prettyPrint)
             prettyPrintScript(globalObject->globalExec(), fileName, script);
         else {
-            Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), fileName, 1, script.data());
+            Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(script.data(), fileName));
             success = success && completion.complType() != Throw;
             if (dump) {
                 if (completion.complType() == Throw)
@@ -383,7 +382,7 @@ static void runInteractive(GlobalObject* globalObject)
             break;
         if (line[0])
             add_history(line);
-        Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), interpreterName, 1, line);
+        Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(line, interpreterName));
         free(line);
 #else
         puts(interactivePrompt);
@@ -396,7 +395,7 @@ static void runInteractive(GlobalObject* globalObject)
             line.append(c);
         }
         line.append('\0');
-        Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), interpreterName, 1, line.data());
+        Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(line.data(), interpreterName));
 #endif
         if (completion.complType() == Throw)
             printf("Exception: %s\n", completion.value()->toString(globalObject->globalExec()).ascii());
index d823799..755a10f 100644 (file)
@@ -36,17 +36,28 @@ namespace JSC {
 
     class SourceProvider : public RefCounted<SourceProvider> {
     public:
+        SourceProvider(const UString& url)
+            : m_url(url)
+        {
+        }
         virtual ~SourceProvider() { }
+
         virtual UString getRange(int start, int end) const = 0;
         virtual const UChar* data() const = 0;
         virtual int length() const = 0;
+        
+        const UString& url() { return m_url; }
+        intptr_t asID() { return reinterpret_cast<intptr_t>(this); }
+
+    private:
+        UString m_url;
     };
 
     class UStringSourceProvider : public SourceProvider {
     public:
-        static PassRefPtr<UStringSourceProvider> create(const UString& source)
+        static PassRefPtr<UStringSourceProvider> create(const UString& source, const UString& url)
         {
-            return adoptRef(new UStringSourceProvider(source));
+            return adoptRef(new UStringSourceProvider(source, url));
         }
 
         UString getRange(int start, int end) const { return m_source.substr(start, end - start); }
@@ -54,14 +65,15 @@ namespace JSC {
         int length() const { return m_source.size(); }
 
     private:
-        UStringSourceProvider(const UString& source)
-            : m_source(source)
+        UStringSourceProvider(const UString& source, const UString& url)
+            : SourceProvider(url)
+            , m_source(source)
         {
         }
 
         UString m_source;
     };
-
+    
 } // namespace JSC
 
 #endif // SourceProvider_h
index 28e9be3..d69f189 100644 (file)
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef SourceRange_h
-#define SourceRange_h
+#ifndef SourceCode_h
+#define SourceCode_h
+
+// FIXME: Rename this file to "SourceCode.h"
 
 #include "SourceProvider.h"
 #include <wtf/RefPtr.h>
 
 namespace JSC {
 
-    class SourceRange {
+    class SourceCode {
     public:
-        SourceRange(PassRefPtr<SourceProvider> provider, int start, int end)
-            : m_sourceProvider(provider)
-            , m_startChar(start)
-            , m_endChar(end)
+        SourceCode()
+            : m_startChar(0)
+            , m_endChar(0)
+            , m_firstLine(0)
+        {
+        }
+
+        SourceCode(PassRefPtr<SourceProvider> provider, int firstLine = 1)
+            : m_provider(provider)
+            , m_startChar(0)
+            , m_endChar(m_provider->length())
+            , m_firstLine(std::max(firstLine, 1))
         {
         }
 
-        SourceRange()
+        SourceCode(PassRefPtr<SourceProvider> provider, int start, int end, int firstLine)
+            : m_provider(provider)
+            , m_startChar(start)
+            , m_endChar(end)
+            , m_firstLine(std::max(firstLine, 1))
         {
         }
 
         UString toString() const
         {
-            if (!m_sourceProvider)
+            if (!m_provider)
                 return UString();
-            return m_sourceProvider->getRange(m_startChar, m_endChar);
+            return m_provider->getRange(m_startChar, m_endChar);
         }
         
-        SourceProvider* sourceProvider() const { return m_sourceProvider.get(); }
+        SourceProvider* provider() const { return m_provider.get(); }
+        int firstLine() const { return m_firstLine; }
         int startOffset() const { return m_startChar; }
+        const UChar* data() const { return m_provider->data() + m_startChar; }
+        int length() const { return m_endChar - m_startChar; }
+
     private:
-        RefPtr<SourceProvider> m_sourceProvider;
+        RefPtr<SourceProvider> m_provider;
         int m_startChar;
         int m_endChar;
+        int m_firstLine;
     };
 
+    inline SourceCode makeSource(const UString& source, const UString& url = UString(), int firstLine = 1)
+    {
+        return SourceCode(UStringSourceProvider::create(source, url), firstLine);
+    }
+
 } // namespace JSC
 
-#endif // SourceRange_h
+#endif // SourceCode_h
index e2a5e66..4a6a9b3 100644 (file)
@@ -29,7 +29,7 @@ namespace JSC {
     class DebuggerCallFrame;
     class ExecState;
     class JSGlobalObject;
-    class SourceProvider;
+    class SourceCode;
     class UString;
 
     class Debugger {
@@ -40,16 +40,15 @@ namespace JSC {
         void attach(JSGlobalObject*);
         void detach(JSGlobalObject*);
 
-        virtual void sourceParsed(ExecState*, int sourceId, const UString& sourceURL,
-                                  const SourceProvider&, int startingLineNumber, int errorLine, const UString& errorMsg) = 0;
-        virtual void exception(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
-        virtual void atStatement(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
-        virtual void callEvent(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
-        virtual void returnEvent(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
+        virtual void sourceParsed(ExecState*, const SourceCode&, int errorLine, const UString& errorMsg) = 0;
+        virtual void exception(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
+        virtual void atStatement(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
+        virtual void callEvent(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
+        virtual void returnEvent(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
 
-        virtual void willExecuteProgram(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
-        virtual void didExecuteProgram(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
-        virtual void didReachBreakpoint(const DebuggerCallFrame&, int sourceId, int lineno) = 0;
+        virtual void willExecuteProgram(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
+        virtual void didExecuteProgram(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
+        virtual void didReachBreakpoint(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0;
 
     private:
         HashSet<JSGlobalObject*> m_globalObjects;
index f164cbe..60f84cb 100644 (file)
@@ -66,7 +66,7 @@ using namespace std;
 static ExpressionNode* makeAssignNode(void*, ExpressionNode* loc, Operator, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end);
 static ExpressionNode* makePrefixNode(void*, ExpressionNode* expr, Operator, int start, int divot, int end);
 static ExpressionNode* makePostfixNode(void*, ExpressionNode* expr, Operator, int start, int divot, int end);
-static PropertyNode* makeGetterOrSetterPropertyNode(void*, const Identifier &getOrSet, const Identifier& name, ParameterNode*, FunctionBodyNode*, const SourceRange&);
+static PropertyNode* makeGetterOrSetterPropertyNode(void*, const Identifier &getOrSet, const Identifier& name, ParameterNode*, FunctionBodyNode*, const SourceCode&);
 static ExpressionNodeInfo makeFunctionCallNode(void*, ExpressionNodeInfo func, ArgumentsNodeInfo, int start, int divot, int end);
 static ExpressionNode* makeTypeOfNode(void*, ExpressionNode*);
 static ExpressionNode* makeDeleteNode(void*, ExpressionNode*, int start, int divot, int end);
@@ -312,9 +312,9 @@ Property:
     IDENT ':' AssignmentExpr            { $$ = createNodeFeatureInfo<PropertyNode*>(new PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_featureInfo, $3.m_numConstants); }
   | STRING ':' AssignmentExpr           { $$ = createNodeFeatureInfo<PropertyNode*>(new PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_featureInfo, $3.m_numConstants); }
   | NUMBER ':' AssignmentExpr           { $$ = createNodeFeatureInfo<PropertyNode*>(new PropertyNode(GLOBAL_DATA, Identifier(GLOBAL_DATA, UString::from($1)), $3.m_node, PropertyNode::Constant), $3.m_featureInfo, $3.m_numConstants); }
-  | IDENT IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE    { $$ = createNodeFeatureInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, 0, $6, LEXER->sourceRange($5, $7)), ClosureFeature, 0); DBG($6, @5, @7); if (!$$.m_node) YYABORT; }
+  | IDENT IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE    { $$ = createNodeFeatureInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, 0, $6, LEXER->sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); DBG($6, @5, @7); if (!$$.m_node) YYABORT; }
   | IDENT IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
-                                        { $$ = createNodeFeatureInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, $4.m_node.head, $7, LEXER->sourceRange($6, $8)), $4.m_featureInfo | ClosureFeature, 0); $7->setUsesArguments($7->usesArguments() | (($4.m_featureInfo & ArgumentsFeature) != 0)); DBG($7, @6, @8); if (!$$.m_node) YYABORT; }
+                                        { $$ = createNodeFeatureInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, $4.m_node.head, $7, LEXER->sourceCode($6, $8, @6.first_line)), $4.m_featureInfo | ClosureFeature, 0); $7->setUsesArguments($7->usesArguments() | (($4.m_featureInfo & ArgumentsFeature) != 0)); DBG($7, @6, @8); if (!$$.m_node) YYABORT; }
 ;
 
 PropertyList:
@@ -1157,16 +1157,16 @@ DebuggerStatement:
 ;
 
 FunctionDeclaration:
-    FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $6, LEXER->sourceRange($5, $7)), ((*$2 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | ClosureFeature, 0); DBG($6, @5, @7); }
+    FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $6, LEXER->sourceCode($5, $7, @5.first_line)), ((*$2 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | ClosureFeature, 0); DBG($6, @5, @7); }
   | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
-      { $$ = createNodeFeatureInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $7, LEXER->sourceRange($6, $8), $4.m_node.head), ((*$2 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $4.m_featureInfo | ClosureFeature, 0); $7->setUsesArguments($7->usesArguments() | (($4.m_featureInfo & ArgumentsFeature) != 0)); DBG($7, @6, @8); }
+      { $$ = createNodeFeatureInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $7, LEXER->sourceCode($6, $8, @6.first_line), $4.m_node.head), ((*$2 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $4.m_featureInfo | ClosureFeature, 0); $7->setUsesArguments($7->usesArguments() | (($4.m_featureInfo & ArgumentsFeature) != 0)); DBG($7, @6, @8); }
 ;
 
 FunctionExpr:
-    FUNCTION '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA->propertyNames->nullIdentifier, $5, LEXER->sourceRange($4, $6)), ClosureFeature, 0); DBG($5, @4, @6); }
-    | FUNCTION '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA->propertyNames->nullIdentifier, $6, LEXER->sourceRange($5, $7), $3.m_node.head), $3.m_featureInfo | ClosureFeature, 0); $6->setUsesArguments($6->usesArguments() | (($3.m_featureInfo & ArgumentsFeature) != 0)); DBG($6, @5, @7); }
-  | FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, *$2, $6, LEXER->sourceRange($5, $7)), ClosureFeature, 0); DBG($6, @5, @7); }
-  | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, *$2, $7, LEXER->sourceRange($6, $8), $4.m_node.head), $4.m_featureInfo | ClosureFeature, 0); $7->setUsesArguments($7->usesArguments() | (($4.m_featureInfo & ArgumentsFeature) != 0)); DBG($7, @6, @8); }
+    FUNCTION '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA->propertyNames->nullIdentifier, $5, LEXER->sourceCode($4, $6, @4.first_line)), ClosureFeature, 0); DBG($5, @4, @6); }
+    | FUNCTION '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA->propertyNames->nullIdentifier, $6, LEXER->sourceCode($5, $7, @5.first_line), $3.m_node.head), $3.m_featureInfo | ClosureFeature, 0); $6->setUsesArguments($6->usesArguments() | (($3.m_featureInfo & ArgumentsFeature) != 0)); DBG($6, @5, @7); }
+  | FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, *$2, $6, LEXER->sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); DBG($6, @5, @7); }
+  | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, *$2, $7, LEXER->sourceCode($6, $8, @6.first_line), $4.m_node.head), $4.m_featureInfo | ClosureFeature, 0); $7->setUsesArguments($7->usesArguments() | (($4.m_featureInfo & ArgumentsFeature) != 0)); DBG($7, @6, @8); }
 ;
 
 FormalParameterList:
@@ -1358,7 +1358,7 @@ static ExpressionNode* makeDeleteNode(void* globalPtr, ExpressionNode* expr, int
     return new DeleteDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), divot, divot - start, end - divot);
 }
 
-static PropertyNode* makeGetterOrSetterPropertyNode(void* globalPtr, const Identifier& getOrSet, const Identifier& name, ParameterNode* params, FunctionBodyNode* body, const SourceRange& source)
+static PropertyNode* makeGetterOrSetterPropertyNode(void* globalPtr, const Identifier& getOrSet, const Identifier& name, ParameterNode* params, FunctionBodyNode* body, const SourceCode& source)
 {
     PropertyNode::Type type;
     if (getOrSet == "get")
index e5b9cec..cd5c157 100644 (file)
 
 namespace JSC {
 
-Completion Interpreter::checkSyntax(ExecState* exec, const UString& sourceURL, int startingLineNumber, const UString& code)
-{
-    return checkSyntax(exec, sourceURL, startingLineNumber, UStringSourceProvider::create(code));
-}
-
-Completion Interpreter::checkSyntax(ExecState* exec, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source)
+Completion Interpreter::checkSyntax(ExecState* exec, const SourceCode& source)
 {
     JSLock lock(exec);
 
     int errLine;
     UString errMsg;
 
-    RefPtr<ProgramNode> progNode = exec->parser()->parse<ProgramNode>(exec, sourceURL, startingLineNumber, source, 0, &errLine, &errMsg);
+    RefPtr<ProgramNode> progNode = exec->parser()->parse<ProgramNode>(exec, source, &errLine, &errMsg);
     if (!progNode)
-        return Completion(Throw, Error::create(exec, SyntaxError, errMsg, errLine, 0, sourceURL));
+        return Completion(Throw, Error::create(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url()));
     return Completion(Normal);
 }
 
-Completion Interpreter::evaluate(ExecState* exec, ScopeChain& scopeChain, const UString& sourceURL, int startingLineNumber, const UString& code, JSValue* thisV)
-{
-    return evaluate(exec, scopeChain, sourceURL, startingLineNumber, UStringSourceProvider::create(code), thisV);
-}
-
-Completion Interpreter::evaluate(ExecState* exec, ScopeChain& scopeChain, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source, JSValue* thisValue)
+Completion Interpreter::evaluate(ExecState* exec, ScopeChain& scopeChain, const SourceCode& source, JSValue* thisValue)
 {
     JSLock lock(exec);
     
-    // parse the source code
-    int sourceId;
     int errLine;
     UString errMsg;
+    RefPtr<ProgramNode> programNode = exec->parser()->parse<ProgramNode>(exec, source, &errLine, &errMsg);
 
-    RefPtr<ProgramNode> programNode = exec->parser()->parse<ProgramNode>(exec, sourceURL, startingLineNumber, source, &sourceId, &errLine, &errMsg);
-
-    // no program node means a syntax error occurred
     if (!programNode)
-        return Completion(Throw, Error::create(exec, SyntaxError, errMsg, errLine, sourceId, sourceURL));
+        return Completion(Throw, Error::create(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url()));
 
     JSObject* thisObj = (!thisValue || thisValue->isUndefinedOrNull()) ? exec->dynamicGlobalObject() : thisValue->toObject(exec);
 
index dce6926..300160f 100644 (file)
@@ -32,7 +32,7 @@ namespace JSC {
   class ExecState;
   class JSValue;
   class ScopeChain;
-  class SourceProvider;
+  class SourceCode;
   class UString;
   
   class Interpreter {
@@ -44,8 +44,7 @@ namespace JSC {
      * @return A normal completion if there were no syntax errors in the code, 
      * otherwise a throw completion with the syntax error as its value.
      */
-    static Completion checkSyntax(ExecState*, const UString& sourceURL, int startingLineNumber, const UString& code);
-    static Completion checkSyntax(ExecState*, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source);
+    static Completion checkSyntax(ExecState*, const SourceCode&);
 
     /**
      * Evaluates the supplied ECMAScript code.
@@ -62,8 +61,7 @@ namespace JSC {
      * execution. This should either be jsNull() or an Object.
      * @return A completion object representing the result of the execution.
      */
-    static Completion evaluate(ExecState*, ScopeChain&, const UString& sourceURL, int startingLineNumber, const UString& code, JSValue* thisV = 0);
-    static Completion evaluate(ExecState*, ScopeChain&, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider>, JSValue* thisV = 0);
+    static Completion evaluate(ExecState*, ScopeChain&, const SourceCode&, JSValue* thisV = 0);
     
     static bool shouldPrintExceptions();
     static void setShouldPrintExceptions(bool);
index 00e8083..7313b12 100644 (file)
@@ -92,9 +92,9 @@ Lexer::~Lexer()
     m_mainTable.deleteTable();
 }
 
-void Lexer::setCode(int startingLineNumber, PassRefPtr<SourceProvider> source)
+void Lexer::setCode(const SourceCode& source)
 {
-    yylineno = startingLineNumber;
+    yylineno = source.firstLine();
     m_restrKeyword = false;
     m_delimited = false;
     m_eatNextIdentifier = false;
@@ -102,9 +102,9 @@ void Lexer::setCode(int startingLineNumber, PassRefPtr<SourceProvider> source)
     m_lastToken = -1;
 
     m_position = 0;
-    m_source = source;
-    m_code = m_source->data();
-    m_length = m_source->length();
+    m_source = &source;
+    m_code = source.data();
+    m_length = source.length();
     m_skipLF = false;
     m_skipCR = false;
     m_error = false;
index f9237f7..e49c400 100644 (file)
@@ -35,7 +35,7 @@ namespace JSC {
 
     class Lexer : Noncopyable {
     public:
-        void setCode(int startingLineNumber, PassRefPtr<SourceProvider> source);
+        void setCode(const SourceCode&);
         int lex(void* lvalp, void* llocp);
 
         int lineNo() const { return yylineno; }
@@ -88,7 +88,7 @@ namespace JSC {
         bool sawError() const { return m_error; }
 
         void clear();
-        SourceRange sourceRange(int openBrace, int closeBrace) { return SourceRange(m_source, openBrace + 1, closeBrace); }
+        SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace + 1, closeBrace, firstLine); }
 
     private:
         friend class JSGlobalData;
@@ -131,7 +131,7 @@ namespace JSC {
 
         State m_state;
         unsigned int m_position;
-        RefPtr<SourceProvider> m_source;
+        const SourceCode* m_source;
         const UChar* m_code;
         unsigned int m_length;
         int m_atLineStart;
index c767446..01cc15e 100644 (file)
@@ -1698,10 +1698,9 @@ RegisterID* TryNode::emitCode(CodeGenerator& generator, RegisterID* dst)
 
 // ------------------------------ ScopeNode -----------------------------
 
-ScopeNode::ScopeNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
+ScopeNode::ScopeNode(JSGlobalData* globalData, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
     : BlockNode(globalData, children)
-    , m_sourceURL(globalData->parser->sourceURL())
-    , m_sourceId(globalData->parser->sourceId())
+    , m_source(source)
     , m_usesEval(usesEval)
     , m_needsClosure(needsClosure)
     , m_usesArguments(usesArguments)
@@ -1717,22 +1716,20 @@ ScopeNode::ScopeNode(JSGlobalData* globalData, SourceElements* children, VarStac
 
 // ------------------------------ ProgramNode -----------------------------
 
-ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
-    : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
-    , m_sourceProvider(sourceProvider)
+ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
+    : ScopeNode(globalData, source, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
 {
 }
 
-ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
+ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
 {
-    return new ProgramNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure, usesArguments, numConstants);
+    return new ProgramNode(globalData, children, varStack, funcStack, source, usesEval, needsClosure, usesArguments, numConstants);
 }
 
 // ------------------------------ EvalNode -----------------------------
 
-EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
-    : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
-    , m_sourceProvider(sourceProvider)
+EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
+    : ScopeNode(globalData, source, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
 {
 }
 
@@ -1755,26 +1752,48 @@ void EvalNode::generateCode(ScopeChainNode* scopeChainNode)
     JSGlobalObject* globalObject = scopeChain.globalObject();
 
     SymbolTable symbolTable;
-    ASSERT(m_sourceProvider);
-    m_code.set(new EvalCodeBlock(this, globalObject, m_sourceProvider));
+    m_code.set(new EvalCodeBlock(this, globalObject, source().provider()));
 
     CodeGenerator generator(this, globalObject->debugger(), scopeChain, &symbolTable, m_code.get());
     generator.generate();
 }
 
-EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
+EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
 {
-    return new EvalNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure, usesArguments, numConstants);
+    return new EvalNode(globalData, children, varStack, funcStack, source, usesEval, needsClosure, usesArguments, numConstants);
 }
 
 // ------------------------------ FunctionBodyNode -----------------------------
 
 FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
-    : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
+    : ScopeNode(globalData, SourceCode(), children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
+    , m_parameters(0)
     , m_refCount(0)
 {
 }
 
+FunctionBodyNode::~FunctionBodyNode()
+{
+    if (m_parameters)
+        fastFree(m_parameters);
+}
+
+void FunctionBodyNode::finishParsing(const SourceCode& source, ParameterNode* firstParameter)
+{
+    Vector<Identifier> parameters;
+    for (ParameterNode* parameter = firstParameter; parameter; parameter = parameter->nextParam())
+        parameters.append(parameter->ident());
+    size_t count = parameters.size();
+    finishParsing(source, parameters.releaseBuffer(), count);
+}
+
+void FunctionBodyNode::finishParsing(const SourceCode& source, Identifier* parameters, size_t parameterCount)
+{
+    setSource(source);
+    m_parameters = parameters;
+    m_parameterCount = parameterCount;
+}
+
 void FunctionBodyNode::mark()
 {
     if (m_code)
@@ -1786,7 +1805,7 @@ FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceEleme
     return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants);
 }
 
-FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
+FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
 {
     return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants);
 }
@@ -1796,8 +1815,7 @@ void FunctionBodyNode::generateCode(ScopeChainNode* scopeChainNode)
     ScopeChain scopeChain(scopeChainNode);
     JSGlobalObject* globalObject = scopeChain.globalObject();
 
-    ASSERT(m_source.sourceProvider());
-    m_code.set(new CodeBlock(this, FunctionCode, m_source.sourceProvider(), m_source.startOffset()));
+    m_code.set(new CodeBlock(this, FunctionCode, source().provider(), source().startOffset()));
 
     CodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_symbolTable, m_code.get());
     generator.generate();
@@ -1833,8 +1851,7 @@ void ProgramNode::generateCode(ScopeChainNode* scopeChainNode)
     ScopeChain scopeChain(scopeChainNode);
     JSGlobalObject* globalObject = scopeChain.globalObject();
     
-    ASSERT(m_sourceProvider);
-    m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject, m_sourceProvider));
+    m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject, source().provider()));
     
     CodeGenerator generator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get(), m_varStack, m_functionStack);
     generator.generate();
@@ -1843,11 +1860,10 @@ void ProgramNode::generateCode(ScopeChainNode* scopeChainNode)
 UString FunctionBodyNode::paramString() const
 {
     UString s("");
-    size_t count = m_parameters.size();
-    for (size_t pos = 0; pos < count; ++pos) {
+    for (size_t pos = 0; pos < m_parameterCount; ++pos) {
         if (!s.isEmpty())
             s += ", ";
-        s += m_parameters[pos].ustring();
+        s += parameters()[pos].ustring();
     }
 
     return s;
@@ -1855,12 +1871,6 @@ UString FunctionBodyNode::paramString() const
 
 // ------------------------------ FuncDeclNode ---------------------------------
 
-void FuncDeclNode::addParams()
-{
-    for (ParameterNode* p = m_parameter.get(); p; p = p->nextParam())
-        m_body->parameters().append(p->ident());
-}
-
 JSFunction* FuncDeclNode::makeFunction(ExecState* exec, ScopeChainNode* scopeChain)
 {
     JSFunction* func = new (exec) JSFunction(exec, m_ident, m_body.get(), scopeChain);
@@ -1906,11 +1916,4 @@ JSFunction* FuncExprNode::makeFunction(ExecState* exec, ScopeChainNode* scopeCha
     return func;
 }
 
-// ECMA 13
-void FuncExprNode::addParams()
-{
-    for (ParameterNode* p = m_parameter.get(); p; p = p->nextParam())
-        m_body->parameters().append(p->ident());
-}
-
 } // namespace JSC
index 728a7e0..2bf6fed 100644 (file)
@@ -2167,12 +2167,15 @@ namespace JSC {
 
     class ScopeNode : public BlockNode {
     public:
-        ScopeNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        ScopeNode(JSGlobalData*, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
 
-        int sourceId() const JSC_FAST_CALL { return m_sourceId; }
-        const UString& sourceURL() const JSC_FAST_CALL { return m_sourceURL; }
         virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
         
+        void setSource(const SourceCode& source) { m_source = source; }
+        const SourceCode& source() const { return m_source; }
+        const UString& sourceURL() const JSC_FAST_CALL { return m_source.provider()->url(); }
+        intptr_t sourceID() const { return m_source.provider()->asID(); }
+
         bool usesEval() const { return m_usesEval; }
         bool needsClosure() const { return m_needsClosure; }
         bool usesArguments() const { return m_usesArguments; }
@@ -2193,8 +2196,7 @@ namespace JSC {
         FunctionStack m_functionStack;
 
     private:
-        UString m_sourceURL;
-        int m_sourceId;
+        SourceCode m_source;
         bool m_usesEval;
         bool m_needsClosure;
         bool m_usesArguments;
@@ -2203,7 +2205,7 @@ namespace JSC {
 
     class ProgramNode : public ScopeNode {
     public:
-        static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
 
         ProgramCodeBlock& byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
         {
@@ -2213,7 +2215,7 @@ namespace JSC {
         }
 
     private:
-        ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
 
         void generateCode(ScopeChainNode*) JSC_FAST_CALL;
         virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
@@ -2221,14 +2223,12 @@ namespace JSC {
         Vector<size_t> m_varIndexes; // Storage indexes belonging to the nodes in m_varStack. (Recorded to avoid double lookup.)
         Vector<size_t> m_functionIndexes; // Storage indexes belonging to the nodes in m_functionStack. (Recorded to avoid double lookup.)
 
-        RefPtr<SourceProvider> m_sourceProvider;
-
         OwnPtr<ProgramCodeBlock> m_code;
     };
 
     class EvalNode : public ScopeNode {
     public:
-        static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
 
         EvalCodeBlock& byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
         {
@@ -2238,22 +2238,22 @@ namespace JSC {
         }
 
     private:
-        EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
 
         void generateCode(ScopeChainNode*) JSC_FAST_CALL;
         virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
         
-        RefPtr<SourceProvider> m_sourceProvider;
-
         OwnPtr<EvalCodeBlock> m_code;
     };
 
     class FunctionBodyNode : public ScopeNode {
     public:
-        static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
         static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
+        ~FunctionBodyNode();
 
-        Vector<Identifier>& parameters() JSC_FAST_CALL { return m_parameters; }
+        const Identifier* parameters() const JSC_FAST_CALL { return m_parameters; }
+        size_t parameterCount() { return m_parameterCount; }
         UString paramString() const JSC_FAST_CALL;
 
         virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
@@ -2276,8 +2276,10 @@ namespace JSC {
 
         void mark();
 
-        void setSource(const SourceRange& source) { m_source = source; } 
-        UString toSourceString() const JSC_FAST_CALL { return UString("{") + m_source.toString() + UString("}"); }
+        void finishParsing(const SourceCode&, ParameterNode*);
+        void finishParsing(const SourceCode&, Identifier* parameters, size_t parameterCount);
+        
+        UString toSourceString() const JSC_FAST_CALL { return UString("{") + source().toString() + UString("}"); }
 
         // These objects are ref/deref'd a lot in the scope chain, so this is a faster ref/deref.
         // If the virtual machine changes so this doesn't happen as much we can change back.
@@ -2298,24 +2300,23 @@ namespace JSC {
 
     private:
         void generateCode(ScopeChainNode*) JSC_FAST_CALL;
-        
-        Vector<Identifier> m_parameters;
+
+        Identifier* m_parameters;
+        size_t m_parameterCount;
         SymbolTable m_symbolTable;
         OwnPtr<CodeBlock> m_code;
-        SourceRange m_source;
         unsigned m_refCount;
     };
 
     class FuncExprNode : public ExpressionNode {
     public:
-        FuncExprNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceRange& source, ParameterNode* parameter = 0) JSC_FAST_CALL
+        FuncExprNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0) JSC_FAST_CALL
             : ExpressionNode(globalData)
             , m_ident(ident)
             , m_parameter(parameter)
             , m_body(body)
         {
-            addParams();
-            m_body->setSource(source);
+            m_body->finishParsing(source, m_parameter.get());
         }
 
         virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
@@ -2327,8 +2328,6 @@ namespace JSC {
         FunctionBodyNode* body() { return m_body.get(); }
 
     private:
-        void addParams() JSC_FAST_CALL;
-
         // Used for streamTo
         friend class PropertyNode;
         Identifier m_ident;
@@ -2338,14 +2337,13 @@ namespace JSC {
 
     class FuncDeclNode : public StatementNode {
     public:
-        FuncDeclNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceRange& source, ParameterNode* parameter = 0) JSC_FAST_CALL
+        FuncDeclNode(JSGlobalData* globalData, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0) JSC_FAST_CALL
             : StatementNode(globalData)
             , m_ident(ident)
             , m_parameter(parameter)
             , m_body(body)
         {
-            addParams();
-            m_body->setSource(source);
+            m_body->finishParsing(source, m_parameter.get());
         }
 
         virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
@@ -2358,8 +2356,6 @@ namespace JSC {
         FunctionBodyNode* body() { return m_body.get(); }
 
     private:
-        void addParams() JSC_FAST_CALL;
-
         RefPtr<ParameterNode> m_parameter;
         RefPtr<FunctionBodyNode> m_body;
     };
index 91c836a..5802f5c 100644 (file)
@@ -57,7 +57,7 @@ ProfileGenerator::ProfileGenerator(const UString& title, ExecState* originatingE
 void ProfileGenerator::addParentForConsoleStart(ExecState* exec)
 {
     int lineNumber;
-    int sourceID;
+    intptr_t sourceID;
     UString sourceURL;
     JSValue* function;
 
index 0d52a5d..64862ae 100644 (file)
@@ -890,7 +890,6 @@ namespace WTF {
             buffer = static_cast<T*>(fastMalloc(bytes));
             memcpy(buffer, data(), bytes);
         }
-        ASSERT(buffer);
         m_size = 0;
         return buffer;
     }
index 2c358af..270f495 100644 (file)
@@ -1,3 +1,12 @@
+2008-10-01  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Darin Adler and Cameron Zwarich.
+
+        * JSRun.cpp:
+        (JSRun::Evaluate):
+        (JSRun::CheckSyntax): Provide a SourceCode to the Interpreter, since
+        other APIs are no longer supported.
+
 2008-09-29  Geoffrey Garen  <ggaren@apple.com>
 
         Not reviewed.
index eeb4d98..3858012 100644 (file)
@@ -30,6 +30,7 @@
 #include "JSRun.h"
 
 #include <JavaScriptCore/completion.h>
+#include <JavaScriptCore/SourceRange.h>
 
 JSRun::JSRun(CFStringRef source, JSFlags inFlags)
     :   JSBase(kJSRunTypeID),
@@ -60,10 +61,10 @@ JSGlobalObject* JSRun::GlobalObject() const
 
 Completion JSRun::Evaluate()
 {
-    return Interpreter::evaluate(fGlobalObject->globalExec(), fGlobalObject->globalScopeChain(), UString(), 0, fSource);
+    return Interpreter::evaluate(fGlobalObject->globalExec(), fGlobalObject->globalScopeChain(), makeSource(fSource));
 }
 
 bool JSRun::CheckSyntax()
 {
-    return Interpreter::checkSyntax(fGlobalObject->globalExec(), UString(), 0, fSource).complType() != Throw;
+    return Interpreter::checkSyntax(fGlobalObject->globalExec(), makeSource(fSource)).complType() != Throw;
 }
index a69d3e5..87f4e32 100644 (file)
@@ -1,3 +1,72 @@
+2008-10-01  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Darin Adler and Cameron Zwarich.
+
+        Updated for JavaScriptCore API changes: use a SourceCode instead of
+        broken out parameters; treat sourceId as intptr_t.
+
+        * ForwardingHeaders/kjs/SourceRange.h: Copied from ForwardingHeaders/kjs/SourceProvider.h.
+        * bindings/js/JSXMLHttpRequestCustom.cpp:
+        (WebCore::JSXMLHttpRequest::send):
+        * bindings/js/ScriptController.cpp:
+        (WebCore::ScriptController::evaluate):
+        * bindings/js/StringSourceProvider.h:
+        (WebCore::StringSourceProvider::create):
+        (WebCore::StringSourceProvider::StringSourceProvider):
+
+        (WebCore::makeSource): Added a makeSource function for convenience.
+
+        * bindings/objc/WebScriptObject.mm:
+        (-[WebScriptObject evaluateWebScript:]):
+        * bridge/NP_jsobject.cpp:
+        (_NPN_Evaluate):
+        * bridge/jni/jni_jsobject.mm:
+        (JavaJSObject::call):
+        (JavaJSObject::eval):
+        (JavaJSObject::getMember):
+        (JavaJSObject::setMember):
+        (JavaJSObject::removeMember):
+
+        * bridge/jni/jni_runtime.h:
+        (JSC::Bindings::JavaString::operator UString): Replaced the explicit
+        ustring() function with an implicit operator because this class already
+        holds a UString::rep.
+
+        * page/Console.cpp:
+        (WebCore::retrieveLastCaller):
+        (WebCore::Console::trace):
+        * page/InspectorController.cpp:
+        (WebCore::jsStringRef):
+        (WebCore::InspectorController::addBreakpoint):
+        (WebCore::InspectorController::removeBreakpoint):
+        (WebCore::InspectorController::didParseSource):
+        (WebCore::InspectorController::failedToParseSource):
+        * page/InspectorController.h:
+        * page/JavaScriptCallFrame.cpp:
+        (WebCore::JavaScriptCallFrame::JavaScriptCallFrame):
+        * page/JavaScriptCallFrame.h:
+        (WebCore::JavaScriptCallFrame::create):
+        (WebCore::JavaScriptCallFrame::sourceIdentifier):
+        (WebCore::JavaScriptCallFrame::update):
+        * page/JavaScriptDebugListener.h:
+        * page/JavaScriptDebugServer.cpp:
+        (WebCore::JavaScriptDebugServer::addBreakpoint):
+        (WebCore::JavaScriptDebugServer::removeBreakpoint):
+        (WebCore::JavaScriptDebugServer::hasBreakpoint):
+        (WebCore::dispatchDidParseSource):
+        (WebCore::dispatchFailedToParseSource):
+        (WebCore::JavaScriptDebugServer::sourceParsed):
+        (WebCore::JavaScriptDebugServer::callEvent):
+        (WebCore::JavaScriptDebugServer::atStatement):
+        (WebCore::JavaScriptDebugServer::returnEvent):
+        (WebCore::JavaScriptDebugServer::exception):
+        (WebCore::JavaScriptDebugServer::willExecuteProgram):
+        (WebCore::JavaScriptDebugServer::didExecuteProgram):
+        (WebCore::JavaScriptDebugServer::didReachBreakpoint):
+        * page/JavaScriptDebugServer.h:
+        * page/inspector/ScriptsPanel.js: Renamed internal uses of sourceId and 
+        sourceIdentifier to sourceID.
+
 2008-10-01  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Geoffrey Garen.
diff --git a/WebCore/ForwardingHeaders/kjs/SourceRange.h b/WebCore/ForwardingHeaders/kjs/SourceRange.h
new file mode 100644 (file)
index 0000000..78b0ced
--- /dev/null
@@ -0,0 +1 @@
+#include <JavaScriptCore/SourceRange.h>
index 49f2dee..ab74542 100644 (file)
@@ -150,7 +150,7 @@ JSValue* JSXMLHttpRequest::send(ExecState* exec, const ArgList& args)
     }
 
     int signedLineNumber;
-    int sourceID;
+    intptr_t sourceID;
     UString sourceURL;
     JSValue* function;
     exec->machine()->retrieveLastCaller(exec, signedLineNumber, sourceID, sourceURL, function);
index 89f6f85..43a83f1 100644 (file)
@@ -109,7 +109,7 @@ JSValue* ScriptController::evaluate(const String& sourceURL, int baseLine, const
     m_frame->keepAlive();
 
     m_windowShell->window()->startTimeoutCheck();
-    Completion comp = Interpreter::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(), sourceURL, baseLine, StringSourceProvider::create(str), m_windowShell);
+    Completion comp = Interpreter::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(), makeSource(str, sourceURL, baseLine), m_windowShell);
     m_windowShell->window()->stopTimeoutCheck();
 
     if (comp.complType() == Normal || comp.complType() == ReturnValue) {
index f005488..d075741 100644 (file)
 #ifndef StringSourceProvider_h
 #define StringSourceProvider_h
 
-#include <kjs/SourceProvider.h>
+#include <kjs/SourceRange.h>
 
 namespace WebCore {
 
     class StringSourceProvider : public JSC::SourceProvider {
     public:
-        static PassRefPtr<StringSourceProvider> create(const String& source) { return adoptRef(new StringSourceProvider(source)); }
+        static PassRefPtr<StringSourceProvider> create(const String& source, const String& url) { return adoptRef(new StringSourceProvider(source, url)); }
 
         JSC::UString getRange(int start, int end) const { return JSC::UString(m_source.characters() + start, end - start); }
         const UChar* data() const { return m_source.characters(); }
         int length() const { return m_source.length(); }
 
     private:
-        StringSourceProvider(const String& source) : m_source(source) {}
+        StringSourceProvider(const String& source, const String& url)
+            : SourceProvider(url)
+            , m_source(source)
+        {
+        }
+        
         String m_source;
     };
 
-
+    inline JSC::SourceCode makeSource(const String& source, const JSC::UString& url = JSC::UString(), int firstLine = 1)
+    {
+        return JSC::SourceCode(StringSourceProvider::create(source, url), firstLine);
+    }
 }
 
 #endif
index adeea7f..1365b51 100644 (file)
 #import "JSDOMWindow.h"
 #import "JSDOMWindowCustom.h"
 #import "PlatformString.h"
+#import "StringSourceProvider.h"
 #import "WebCoreObjCExtras.h"
 #import "objc_instance.h"
-#import "runtime_root.h"
 #import "runtime.h"
 #import "runtime_object.h"
+#import "runtime_root.h"
 #import <JavaScriptCore/APICast.h>
 #import <kjs/ExecState.h>
 #import <kjs/JSGlobalObject.h>
@@ -329,7 +330,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root
     JSLock lock(false);
     
     [self _rootObject]->globalObject()->startTimeoutCheck();
-    Completion completion = Interpreter::evaluate([self _rootObject]->globalObject()->globalExec(), [self _rootObject]->globalObject()->globalScopeChain(), UString(), 1, String(script));
+    Completion completion = Interpreter::evaluate([self _rootObject]->globalObject()->globalExec(), [self _rootObject]->globalObject()->globalScopeChain(), makeSource(String(script)));
     [self _rootObject]->globalObject()->stopTimeoutCheck();
     ComplType type = completion.complType();
     
index a120f23..3691658 100644 (file)
@@ -30,6 +30,7 @@
 #include "NP_jsobject.h"
 
 #include "PlatformString.h"
+#include "StringSourceProvider.h"
 #include "c_utility.h"
 #include "npruntime_impl.h"
 #include "npruntime_priv.h"
 #include <kjs/JSGlobalObject.h>
 #include <kjs/JSLock.h>
 #include <kjs/PropertyNameArray.h>
+#include <kjs/SourceRange.h>
 #include <kjs/completion.h>
 #include <kjs/interpreter.h>
 
 using WebCore::String;
+using WebCore::StringSourceProvider;
 using namespace JSC;
 using namespace JSC::Bindings;
 
@@ -197,7 +200,7 @@ bool _NPN_Evaluate(NPP, NPObject* o, NPString* s, NPVariant* variant)
         JSLock lock(false);
         String scriptString = convertNPStringToUTF16(s);
         rootObject->globalObject()->startTimeoutCheck();
-        Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), UString(), 1, scriptString);
+        Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), makeSource(scriptString));
         rootObject->globalObject()->stopTimeoutCheck();
         ComplType type = completion.complType();
         
index 595c702..41d393c 100644 (file)
@@ -41,6 +41,7 @@
 #include <kjs/completion.h>
 #include <kjs/interpreter.h>
 #include <wtf/Assertions.h>
+#include <kjs/SourceProvider.h>
 
 using WebCore::Frame;
 
@@ -291,7 +292,7 @@ jobject JavaJSObject::call(jstring methodName, jobjectArray args) const
     ExecState* exec = rootObject->globalObject()->globalExec();
     JSLock lock(false);
     
-    Identifier identifier(exec, JavaString(methodName).ustring());
+    Identifier identifier(exec, JavaString(methodName));
     JSValue* function = _imp->get(exec, identifier);
     CallData callData;
     CallType callType = function->getCallData(callData);
@@ -321,7 +322,7 @@ jobject JavaJSObject::eval(jstring script) const
         return 0;
 
     rootObject->globalObject()->startTimeoutCheck();
-    Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), UString(), 1, JavaString(script).ustring());
+    Completion completion = Interpreter::evaluate(rootObject->globalObject()->globalExec(), rootObject->globalObject()->globalScopeChain(), makeSource(JavaString(script)));
     rootObject->globalObject()->stopTimeoutCheck();
     ComplType type = completion.complType();
     
@@ -346,7 +347,7 @@ jobject JavaJSObject::getMember(jstring memberName) const
     ExecState* exec = rootObject->globalObject()->globalExec();
     
     JSLock lock(false);
-    JSValue* result = _imp->get(exec, Identifier(exec, JavaString(memberName).ustring()));
+    JSValue* result = _imp->get(exec, Identifier(exec, JavaString(memberName)));
 
     return convertValueToJObject(result);
 }
@@ -363,7 +364,7 @@ void JavaJSObject::setMember(jstring memberName, jobject value) const
 
     JSLock lock(false);
     PutPropertySlot slot;
-    _imp->put(exec, Identifier(exec, JavaString(memberName).ustring()), convertJObjectToValue(exec, value), slot);
+    _imp->put(exec, Identifier(exec, JavaString(memberName)), convertJObjectToValue(exec, value), slot);
 }
 
 
@@ -377,7 +378,7 @@ void JavaJSObject::removeMember(jstring memberName) const
 
     ExecState* exec = rootObject->globalObject()->globalExec();
     JSLock lock(false);
-    _imp->deleteProperty(exec, Identifier(exec, JavaString(memberName).ustring()));
+    _imp->deleteProperty(exec, Identifier(exec, JavaString(memberName)));
 }
 
 
index 59aa3b7..45b3565 100644 (file)
@@ -84,7 +84,7 @@ public:
     }
     const jchar *uchars() const { return (const jchar *)_rep->data(); }
     int length() const { return _rep->size(); }
-    UString ustring() const { return UString(_rep); }
+    operator UString() const { return UString(_rep); }
 
 private:
     RefPtr<UString::Rep> _rep;
index 62ce51d..c4ca20b 100644 (file)
@@ -147,11 +147,11 @@ static void printToStandardOut(MessageLevel level, ExecState* exec, const ArgLis
 static inline void retrieveLastCaller(ExecState* exec, KURL& url, unsigned& lineNumber)
 {
     int signedLineNumber;
-    int sourceIdentifer;
+    intptr_t sourceID;
     UString urlString;
     JSValue* function;
 
-    exec->machine()->retrieveLastCaller(exec, signedLineNumber, sourceIdentifer, urlString, function);
+    exec->machine()->retrieveLastCaller(exec, signedLineNumber, sourceID, urlString, function);
 
     url = KURL(urlString);
     lineNumber = (signedLineNumber >= 0 ? signedLineNumber : 0);
@@ -283,11 +283,11 @@ void Console::trace(ExecState* exec)
         return;
 
     int signedLineNumber;
-    int sourceIdentifer;
+    intptr_t sourceID;
     UString urlString;
     JSValue* func;
 
-    exec->machine()->retrieveLastCaller(exec, signedLineNumber, sourceIdentifer, urlString, func);
+    exec->machine()->retrieveLastCaller(exec, signedLineNumber, sourceID, urlString, func);
 
     ArgList args;
     while (!func->isNull()) {
index 5d11f7a..f4800c7 100644 (file)
@@ -94,7 +94,7 @@ static JSRetainPtr<JSStringRef> jsStringRef(const char* str)
     return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithUTF8CString(str));
 }
 
-static JSRetainPtr<JSStringRef> jsStringRef(const SourceProvider& str)
+static JSRetainPtr<JSStringRef> jsStringRef(const SourceCode& str)
 {
     return JSRetainPtr<JSStringRef>(Adopt, JSStringCreateWithCharacters(str.data(), str.length()));
 }
@@ -2392,12 +2392,12 @@ void InspectorController::stepOutOfFunctionInDebugger()
     JavaScriptDebugServer::shared().stepOutOfFunction();
 }
 
-void InspectorController::addBreakpoint(int sourceID, unsigned lineNumber)
+void InspectorController::addBreakpoint(intptr_t sourceID, unsigned lineNumber)
 {
     JavaScriptDebugServer::shared().addBreakpoint(sourceID, lineNumber);
 }
 
-void InspectorController::removeBreakpoint(int sourceID, unsigned lineNumber)
+void InspectorController::removeBreakpoint(intptr_t sourceID, unsigned lineNumber)
 {
     JavaScriptDebugServer::shared().removeBreakpoint(sourceID, lineNumber);
 }
@@ -2570,28 +2570,28 @@ bool InspectorController::handleException(JSContextRef context, JSValueRef excep
 
 // JavaScriptDebugListener functions
 
-void InspectorController::didParseSource(ExecState* exec, const SourceProvider& source, int startingLineNumber, const UString& sourceURL, int sourceID)
+void InspectorController::didParseSource(ExecState* exec, const SourceCode& source)
 {
-    JSValueRef sourceIDValue = JSValueMakeNumber(m_scriptContext, sourceID);
-    JSValueRef sourceURLValue = JSValueMakeString(m_scriptContext, jsStringRef(sourceURL).get());
+    JSValueRef sourceIDValue = JSValueMakeNumber(m_scriptContext, source.provider()->asID());
+    JSValueRef sourceURLValue = JSValueMakeString(m_scriptContext, jsStringRef(source.provider()->url()).get());
     JSValueRef sourceValue = JSValueMakeString(m_scriptContext, jsStringRef(source).get());
-    JSValueRef startingLineNumberValue = JSValueMakeNumber(m_scriptContext, startingLineNumber);
+    JSValueRef firstLineValue = JSValueMakeNumber(m_scriptContext, source.firstLine());
 
     JSValueRef exception = 0;
-    JSValueRef arguments[] = { sourceIDValue, sourceURLValue, sourceValue, startingLineNumberValue };
+    JSValueRef arguments[] = { sourceIDValue, sourceURLValue, sourceValue, firstLineValue };
     callFunction(m_scriptContext, m_scriptObject, "parsedScriptSource", 4, arguments, exception);
 }
 
-void InspectorController::failedToParseSource(ExecState* exec, const SourceProvider& source, int startingLineNumber, const UString& sourceURL, int errorLine, const UString& errorMessage)
+void InspectorController::failedToParseSource(ExecState* exec, const SourceCode& source, int errorLine, const UString& errorMessage)
 {
-    JSValueRef sourceURLValue = JSValueMakeString(m_scriptContext, jsStringRef(sourceURL).get());
+    JSValueRef sourceURLValue = JSValueMakeString(m_scriptContext, jsStringRef(source.provider()->url()).get());
     JSValueRef sourceValue = JSValueMakeString(m_scriptContext, jsStringRef(source.data()).get());
-    JSValueRef startingLineNumberValue = JSValueMakeNumber(m_scriptContext, startingLineNumber);
+    JSValueRef firstLineValue = JSValueMakeNumber(m_scriptContext, source.firstLine());
     JSValueRef errorLineValue = JSValueMakeNumber(m_scriptContext, errorLine);
     JSValueRef errorMessageValue = JSValueMakeString(m_scriptContext, jsStringRef(errorMessage).get());
 
     JSValueRef exception = 0;
-    JSValueRef arguments[] = { sourceURLValue, sourceValue, startingLineNumberValue, errorLineValue, errorMessageValue };
+    JSValueRef arguments[] = { sourceURLValue, sourceValue, firstLineValue, errorLineValue, errorMessageValue };
     callFunction(m_scriptContext, m_scriptObject, "failedToParseScriptSource", 5, arguments, exception);
 }
 
index b4c2d1b..fd062dc 100644 (file)
@@ -166,8 +166,8 @@ public:
 
     JavaScriptCallFrame* currentCallFrame() const;
 
-    void addBreakpoint(int sourceID, unsigned lineNumber);
-    void removeBreakpoint(int sourceID, unsigned lineNumber);
+    void addBreakpoint(intptr_t sourceID, unsigned lineNumber);
+    void removeBreakpoint(intptr_t sourceID, unsigned lineNumber);
 
     bool pauseOnExceptions();
     void setPauseOnExceptions(bool pause);
@@ -224,8 +224,8 @@ private:
 
     void showWindow();
 
-    virtual void didParseSource(JSC::ExecState*, const JSC::SourceProvider& source, int startingLineNumber, const JSC::UString& sourceURL, int sourceID);
-    virtual void failedToParseSource(JSC::ExecState*, const JSC::SourceProvider& source, int startingLineNumber, const JSC::UString& sourceURL, int errorLine, const JSC::UString& errorMessage);
+    virtual void didParseSource(JSC::ExecState*, const JSC::SourceCode&);
+    virtual void failedToParseSource(JSC::ExecState*, const JSC::SourceCode&, int errorLine, const JSC::UString& errorMessage);
     virtual void didPause();
 
     Page* m_inspectedPage;
index 6fef6d3..64bf47d 100644 (file)
@@ -38,7 +38,7 @@ using namespace JSC;
 
 namespace WebCore {
 
-JavaScriptCallFrame::JavaScriptCallFrame(const DebuggerCallFrame& debuggerCallFrame, PassRefPtr<JavaScriptCallFrame> caller, int sourceID, int line)
+JavaScriptCallFrame::JavaScriptCallFrame(const DebuggerCallFrame& debuggerCallFrame, PassRefPtr<JavaScriptCallFrame> caller, intptr_t sourceID, int line)
     : m_debuggerCallFrame(debuggerCallFrame)
     , m_caller(caller)
     , m_sourceID(sourceID)
index 0d98e3d..76c11ed 100644 (file)
@@ -37,7 +37,7 @@ namespace WebCore {
 
     class JavaScriptCallFrame : public RefCounted<JavaScriptCallFrame> {
     public:
-        static PassRefPtr<JavaScriptCallFrame> create(const JSC::DebuggerCallFrame& debuggerCallFrame, PassRefPtr<JavaScriptCallFrame> caller, int sourceID, int line)
+        static PassRefPtr<JavaScriptCallFrame> create(const JSC::DebuggerCallFrame& debuggerCallFrame, PassRefPtr<JavaScriptCallFrame> caller, intptr_t sourceID, int line)
         {
             return adoptRef(new JavaScriptCallFrame(debuggerCallFrame, caller, sourceID, line));
         }
@@ -47,9 +47,9 @@ namespace WebCore {
 
         JavaScriptCallFrame* caller();
 
-        int sourceIdentifier() const { return m_sourceID; }
+        intptr_t sourceID() const { return m_sourceID; }
         int line() const { return m_line; }
-        void update(const JSC::DebuggerCallFrame& debuggerCallFrame, int sourceID, int line)
+        void update(const JSC::DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int line)
         {
             m_debuggerCallFrame = debuggerCallFrame;
             m_line = line;
@@ -64,7 +64,7 @@ namespace WebCore {
         JSC::JSValue* evaluate(const JSC::UString& script, JSC::JSValue*& exception) const;
         
     private:
-        JavaScriptCallFrame(const JSC::DebuggerCallFrame&, PassRefPtr<JavaScriptCallFrame> caller, int sourceID, int line);
+        JavaScriptCallFrame(const JSC::DebuggerCallFrame&, PassRefPtr<JavaScriptCallFrame> caller, intptr_t sourceID, int line);
 
         JSC::DebuggerCallFrame m_debuggerCallFrame;
         RefPtr<JavaScriptCallFrame> m_caller;
index f183cab..8fd2678 100644 (file)
@@ -32,7 +32,7 @@
 namespace JSC {
     class DebuggerCallFrame;
     class ExecState;
-    class SourceProvider;
+    class SourceCode;
     class UString;
 }
 
@@ -45,8 +45,8 @@ namespace WebCore {
     public:
         virtual ~JavaScriptDebugListener() { }
 
-        virtual void didParseSource(JSC::ExecState*, const JSC::SourceProvider& source, int startingLineNumber, const JSC::UString& sourceURL, int sourceID) = 0;
-        virtual void failedToParseSource(JSC::ExecState*, const JSC::SourceProvider& source, int startingLineNumber, const JSC::UString& sourceURL, int errorLine, const JSC::UString& errorMessage) = 0;
+        virtual void didParseSource(JSC::ExecState*, const JSC::SourceCode& source) = 0;
+        virtual void failedToParseSource(JSC::ExecState*, const JSC::SourceCode& source, int errorLine, const JSC::UString& errorMessage) = 0;
         virtual void didPause() = 0;
     };
 
index 49d2bbb..4743900 100644 (file)
@@ -150,7 +150,7 @@ bool JavaScriptDebugServer::hasListenersInterestedInPage(Page* page)
     return m_pageListenersMap.contains(page);
 }
 
-void JavaScriptDebugServer::addBreakpoint(int sourceID, unsigned lineNumber)
+void JavaScriptDebugServer::addBreakpoint(intptr_t sourceID, unsigned lineNumber)
 {
     HashSet<unsigned>* lines = m_breakpoints.get(sourceID);
     if (!lines) {
@@ -161,7 +161,7 @@ void JavaScriptDebugServer::addBreakpoint(int sourceID, unsigned lineNumber)
     lines->add(lineNumber);
 }
 
-void JavaScriptDebugServer::removeBreakpoint(int sourceID, unsigned lineNumber)
+void JavaScriptDebugServer::removeBreakpoint(intptr_t sourceID, unsigned lineNumber)
 {
     HashSet<unsigned>* lines = m_breakpoints.get(sourceID);
     if (!lines)
@@ -176,7 +176,7 @@ void JavaScriptDebugServer::removeBreakpoint(int sourceID, unsigned lineNumber)
     delete lines;
 }
 
-bool JavaScriptDebugServer::hasBreakpoint(int sourceID, unsigned lineNumber) const
+bool JavaScriptDebugServer::hasBreakpoint(intptr_t sourceID, unsigned lineNumber) const
 {
     HashSet<unsigned>* lines = m_breakpoints.get(sourceID);
     if (!lines)
@@ -243,20 +243,20 @@ JavaScriptCallFrame* JavaScriptDebugServer::currentCallFrame()
     return m_currentCallFrame.get();
 }
 
-static void dispatchDidParseSource(const ListenerSet& listeners, ExecState* exec, const JSC::SourceProvider& source, int startingLineNumber, const String& sourceURL, int sourceID)
+static void dispatchDidParseSource(const ListenerSet& listeners, ExecState* exec, const JSC::SourceCode& source)
 {
     Vector<JavaScriptDebugListener*> copy;
     copyToVector(listeners, copy);
     for (size_t i = 0; i < copy.size(); ++i)
-        copy[i]->didParseSource(exec, source, startingLineNumber, sourceURL, sourceID);
+        copy[i]->didParseSource(exec, source);
 }
 
-static void dispatchFailedToParseSource(const ListenerSet& listeners, ExecState* exec, const SourceProvider& source, int startingLineNumber, const String& sourceURL, int errorLine, const String& errorMessage)
+static void dispatchFailedToParseSource(const ListenerSet& listeners, ExecState* exec, const SourceCode& source, int errorLine, const String& errorMessage)
 {
     Vector<JavaScriptDebugListener*> copy;
     copyToVector(listeners, copy);
     for (size_t i = 0; i < copy.size(); ++i)
-        copy[i]->failedToParseSource(exec, source, startingLineNumber, sourceURL, errorLine, errorMessage);
+        copy[i]->failedToParseSource(exec, source, errorLine, errorMessage);
 }
 
 static Page* toPage(JSGlobalObject* globalObject)
@@ -268,7 +268,7 @@ static Page* toPage(JSGlobalObject* globalObject)
     return frame ? frame->page() : 0;
 }
 
-void JavaScriptDebugServer::sourceParsed(ExecState* exec, int sourceID, const UString& sourceURL, const SourceProvider& source, int startingLineNumber, int errorLine, const UString& errorMessage)
+void JavaScriptDebugServer::sourceParsed(ExecState* exec, const SourceCode& source, int errorLine, const UString& errorMessage)
 {
     if (m_callingListeners)
         return;
@@ -285,17 +285,17 @@ void JavaScriptDebugServer::sourceParsed(ExecState* exec, int sourceID, const US
 
     if (!m_listeners.isEmpty()) {
         if (isError)
-            dispatchFailedToParseSource(m_listeners, exec, source, startingLineNumber, sourceURL, errorLine, errorMessage);
+            dispatchFailedToParseSource(m_listeners, exec, source, errorLine, errorMessage);
         else
-            dispatchDidParseSource(m_listeners, exec, source, startingLineNumber, sourceURL, sourceID);
+            dispatchDidParseSource(m_listeners, exec, source);
     }
 
     if (ListenerSet* pageListeners = m_pageListenersMap.get(page)) {
         ASSERT(!pageListeners->isEmpty());
         if (isError)
-            dispatchFailedToParseSource(*pageListeners, exec, source, startingLineNumber, sourceURL, errorLine, errorMessage);
+            dispatchFailedToParseSource(*pageListeners, exec, source, errorLine, errorMessage);
         else
-            dispatchDidParseSource(*pageListeners, exec, source, startingLineNumber, sourceURL, sourceID);
+            dispatchDidParseSource(*pageListeners, exec, source);
     }
 
     m_callingListeners = false;
@@ -400,7 +400,7 @@ void JavaScriptDebugServer::pauseIfNeeded(Page* page)
 
     bool pauseNow = m_pauseOnNextStatement;
     pauseNow |= (m_pauseOnCallFrame == m_currentCallFrame);
-    pauseNow |= (m_currentCallFrame->line() > 0 && hasBreakpoint(m_currentCallFrame->sourceIdentifier(), m_currentCallFrame->line()));
+    pauseNow |= (m_currentCallFrame->line() > 0 && hasBreakpoint(m_currentCallFrame->sourceID(), m_currentCallFrame->line()));
     if (!pauseNow)
         return;
 
@@ -424,7 +424,7 @@ void JavaScriptDebugServer::pauseIfNeeded(Page* page)
     m_paused = false;
 }
 
-void JavaScriptDebugServer::callEvent(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::callEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
@@ -433,7 +433,7 @@ void JavaScriptDebugServer::callEvent(const DebuggerCallFrame& debuggerCallFrame
     pauseIfNeeded(toPage(debuggerCallFrame.dynamicGlobalObject()));
 }
 
-void JavaScriptDebugServer::atStatement(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::atStatement(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
@@ -446,7 +446,7 @@ void JavaScriptDebugServer::atStatement(const DebuggerCallFrame& debuggerCallFra
     pauseIfNeeded(toPage(debuggerCallFrame.dynamicGlobalObject()));
 }
 
-void JavaScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
@@ -464,7 +464,7 @@ void JavaScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFra
     m_currentCallFrame = m_currentCallFrame->caller();
 }
 
-void JavaScriptDebugServer::exception(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::exception(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
@@ -480,7 +480,7 @@ void JavaScriptDebugServer::exception(const DebuggerCallFrame& debuggerCallFrame
     pauseIfNeeded(toPage(debuggerCallFrame.dynamicGlobalObject()));
 }
 
-void JavaScriptDebugServer::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
@@ -489,7 +489,7 @@ void JavaScriptDebugServer::willExecuteProgram(const DebuggerCallFrame& debugger
     pauseIfNeeded(toPage(debuggerCallFrame.dynamicGlobalObject()));
 }
 
-void JavaScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
@@ -507,7 +507,7 @@ void JavaScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerC
     m_currentCallFrame = m_currentCallFrame->caller();
 }
 
-void JavaScriptDebugServer::didReachBreakpoint(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void JavaScriptDebugServer::didReachBreakpoint(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_paused)
         return;
index 5e72813..395fc12 100644 (file)
@@ -59,9 +59,9 @@ namespace WebCore {
         void addListener(JavaScriptDebugListener*, Page*);
         void removeListener(JavaScriptDebugListener*, Page*);
 
-        void addBreakpoint(int sourceID, unsigned lineNumber);
-        void removeBreakpoint(int sourceID, unsigned lineNumber);
-        bool hasBreakpoint(int sourceID, unsigned lineNumber) const;
+        void addBreakpoint(intptr_t sourceID, unsigned lineNumber);
+        void removeBreakpoint(intptr_t sourceID, unsigned lineNumber);
+        bool hasBreakpoint(intptr_t sourceID, unsigned lineNumber) const;
         void clearBreakpoints();
 
         bool pauseOnExceptions() const { return m_pauseOnExceptions; }
@@ -95,14 +95,14 @@ namespace WebCore {
         void dispatchFunctionToListeners(JavaScriptExecutionCallback, Page*);
         void pauseIfNeeded(Page*);
 
-        virtual void sourceParsed(JSC::ExecState*, int sourceID, const JSC::UString& sourceURL, const JSC::SourceProvider& source, int startingLineNumber, int errorLine, const JSC::UString& errorMsg);
-        virtual void callEvent(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-        virtual void atStatement(const JSC::DebuggerCallFrame&, int sourceID, int firstLine);
-        virtual void returnEvent(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-        virtual void exception(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-        virtual void willExecuteProgram(const JSC::DebuggerCallFrame&, int sourceId, int lineno);
-        virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, int sourceId, int lineno);
-        virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, int sourceId, int lineno);
+        virtual void sourceParsed(JSC::ExecState*, const JSC::SourceCode&, int errorLine, const JSC::UString& errorMsg);
+        virtual void callEvent(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+        virtual void atStatement(const JSC::DebuggerCallFrame&, intptr_t sourceID, int firstLine);
+        virtual void returnEvent(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+        virtual void exception(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+        virtual void willExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
+        virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
+        virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
 
         typedef HashMap<Page*, ListenerSet*> PageListenersMap;
         PageListenersMap m_pageListenersMap;
@@ -115,7 +115,7 @@ namespace WebCore {
         JavaScriptCallFrame* m_pauseOnCallFrame;
         RefPtr<JavaScriptCallFrame> m_currentCallFrame;
         HashMap<RefPtr<Frame>, PausedTimeouts*> m_pausedTimeouts;
-        HashMap<int, HashSet<unsigned>*> m_breakpoints;
+        HashMap<intptr_t, HashSet<unsigned>*> m_breakpoints;
     };
 
 } // namespace WebCore
index eb72104..a2c8bed 100644 (file)
@@ -58,7 +58,7 @@ WebInspector.CallStackSidebarPane.prototype = {
                 break;
             }
 
-            scriptOrResource = sourceIDMap[callFrame.sourceIdentifier];
+            scriptOrResource = sourceIDMap[callFrame.sourceID];
             subtitle = WebInspector.displayNameForURL(scriptOrResource.sourceURL || scriptOrResource.url);
 
             if (callFrame.line > 0) {
index 466826f..1ddfbbb 100644 (file)
@@ -206,8 +206,8 @@ WebInspector.ScriptsPanel.prototype = {
         // Hide any views that are visible that are not this panel's current visible view.
         // This can happen when a ResourceView is visible in the Resources panel then switched
         // to the this panel.
-        for (var sourceIdentifier in this._sourceIDMap) {
-            var scriptOrResource = this._sourceIDMap[sourceIdentifier];
+        for (var sourceID in this._sourceIDMap) {
+            var scriptOrResource = this._sourceIDMap[sourceID];
             var view = this._sourceViewForScriptOrResource(scriptOrResource);
             if (!view || view === this.visibleView)
                 continue;
@@ -225,8 +225,8 @@ WebInspector.ScriptsPanel.prototype = {
             views.push(visibleView);
         }
 
-        for (var sourceIdentifier in this._sourceIDMap) {
-            var scriptOrResource = this._sourceIDMap[sourceIdentifier];
+        for (var sourceID in this._sourceIDMap) {
+            var scriptOrResource = this._sourceIDMap[sourceID];
             var view = this._sourceViewForScriptOrResource(scriptOrResource);
             if (!view.performSearch || view.alreadySearching)
                 continue;
@@ -601,7 +601,7 @@ WebInspector.ScriptsPanel.prototype = {
 
         this.sidebarPanes.scopechain.update(currentFrame);
 
-        var scriptOrResource = this._sourceIDMap[currentFrame.sourceIdentifier];
+        var scriptOrResource = this._sourceIDMap[currentFrame.sourceID];
         this._showScriptOrResource(scriptOrResource, currentFrame.line);
 
         this._executionSourceFrame = this._sourceFrameForScriptOrResource(scriptOrResource);
index 6cdcef3..832bf06 100644 (file)
@@ -1,3 +1,26 @@
+2008-10-01  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Darin Adler and Cameron Zwarich.
+
+        Updated for JavaScriptCore API changes: use a SourceCode instead of
+        broken out parameters; treat sourceId as intptr_t.
+        
+        We still treat sourceId as int in some cases because of DashCode. See
+        <rdar://problem/6263293> WebScriptDebugDelegate should use intptr_t for
+        sourceId, not int.
+
+        * WebView/WebScriptDebugger.h:
+        * WebView/WebScriptDebugger.mm:
+        (toNSString):
+        (WebScriptDebugger::sourceParsed):
+        (WebScriptDebugger::callEvent):
+        (WebScriptDebugger::atStatement):
+        (WebScriptDebugger::returnEvent):
+        (WebScriptDebugger::exception):
+        (WebScriptDebugger::willExecuteProgram):
+        (WebScriptDebugger::didExecuteProgram):
+        (WebScriptDebugger::didReachBreakpoint):
+
 2008-10-01  David Hyatt  <hyatt@apple.com>
 
         Move prohibitsScrolling from the Frame to the ScrollView.
index 3dda0c2..9256784 100644 (file)
@@ -51,14 +51,14 @@ class WebScriptDebugger : public JSC::Debugger {
 public:
     WebScriptDebugger(JSC::JSGlobalObject*);
 
-    virtual void sourceParsed(JSC::ExecState*, int sourceID, const JSC::UString& sourceURL, const JSC::SourceProvider& source, int lineNumber, int errorLine, const JSC::UString& errorMsg);
-    virtual void callEvent(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-    virtual void atStatement(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-    virtual void returnEvent(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-    virtual void exception(const JSC::DebuggerCallFrame&, int sourceID, int lineNumber);
-    virtual void willExecuteProgram(const JSC::DebuggerCallFrame&, int sourceId, int lineno);
-    virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, int sourceId, int lineno);
-    virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, int sourceId, int lineno);
+    virtual void sourceParsed(JSC::ExecState*, const JSC::SourceCode&, int errorLine, const JSC::UString& errorMsg);
+    virtual void callEvent(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+    virtual void atStatement(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+    virtual void returnEvent(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+    virtual void exception(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
+    virtual void willExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
+    virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
+    virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
 
 private:
     bool m_callingDelegate;
index e120e48..dafad4a 100644 (file)
@@ -55,7 +55,7 @@ NSString *toNSString(const UString& s)
     return [NSString stringWithCharacters:reinterpret_cast<const unichar*>(s.data()) length:s.size()];
 }
 
-NSString *toNSString(const SourceProvider& s)
+NSString *toNSString(const SourceCode& s)
 {
     if (!s.length())
         return nil;
@@ -85,7 +85,7 @@ WebScriptDebugger::WebScriptDebugger(JSGlobalObject* globalObject)
 }
 
 // callbacks - relay to delegate
-void WebScriptDebugger::sourceParsed(ExecState* exec, int sourceID, const UString& url, const SourceProvider& source, int lineNumber, int errorLine, const UString& errorMsg)
+void WebScriptDebugger::sourceParsed(ExecState* exec, const SourceCode& source, int errorLine, const UString& errorMsg)
 {
     if (m_callingDelegate)
         return;
@@ -93,18 +93,18 @@ void WebScriptDebugger::sourceParsed(ExecState* exec, int sourceID, const UStrin
     m_callingDelegate = true;
 
     NSString *nsSource = toNSString(source);
-    NSURL *nsURL = toNSURL(url);
+    NSURL *nsURL = toNSURL(source.provider()->url());
 
     WebFrame *webFrame = toWebFrame(exec->dynamicGlobalObject());
     WebView *webView = [webFrame webView];
     if (errorLine == -1) {
-        [[webView _scriptDebugDelegateForwarder] webView:webView didParseSource:nsSource baseLineNumber:lineNumber fromURL:nsURL sourceId:sourceID forWebFrame:webFrame];
-        [[webView _scriptDebugDelegateForwarder] webView:webView didParseSource:nsSource fromURL:[nsURL absoluteString] sourceId:sourceID forWebFrame:webFrame]; // deprecated delegate method
+        [[webView _scriptDebugDelegateForwarder] webView:webView didParseSource:nsSource baseLineNumber:source.firstLine() fromURL:nsURL sourceId:static_cast<int>(source.provider()->asID()) forWebFrame:webFrame];
+        [[webView _scriptDebugDelegateForwarder] webView:webView didParseSource:nsSource fromURL:[nsURL absoluteString] sourceId:static_cast<int>(source.provider()->asID()) forWebFrame:webFrame]; // deprecated delegate method
     } else {
         NSString* nsErrorMessage = toNSString(errorMsg);
         NSDictionary *info = [[NSDictionary alloc] initWithObjectsAndKeys:nsErrorMessage, WebScriptErrorDescriptionKey, [NSNumber numberWithUnsignedInt:errorLine], WebScriptErrorLineNumberKey, nil];
         NSError *error = [[NSError alloc] initWithDomain:WebScriptErrorDomain code:WebScriptGeneralErrorCode userInfo:info];
-        [[webView _scriptDebugDelegateForwarder] webView:webView failedToParseSource:nsSource baseLineNumber:lineNumber fromURL:nsURL withError:error forWebFrame:webFrame];
+        [[webView _scriptDebugDelegateForwarder] webView:webView failedToParseSource:nsSource baseLineNumber:source.firstLine() fromURL:nsURL withError:error forWebFrame:webFrame];
         [error release];
         [info release];
     }
@@ -112,7 +112,7 @@ void WebScriptDebugger::sourceParsed(ExecState* exec, int sourceID, const UStrin
     m_callingDelegate = false;
 }
 
-void WebScriptDebugger::callEvent(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void WebScriptDebugger::callEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_callingDelegate)
         return;
@@ -124,12 +124,12 @@ void WebScriptDebugger::callEvent(const DebuggerCallFrame& debuggerCallFrame, in
     m_topCallFrame.adoptNS([[WebScriptCallFrame alloc] _initWithGlobalObject:core(webFrame)->script()->windowScriptObject() caller:m_topCallFrame.get() debuggerCallFrame:debuggerCallFrame]);
 
     WebView *webView = [webFrame webView];
-    [[webView _scriptDebugDelegateForwarder] webView:webView didEnterCallFrame:m_topCallFrame.get() sourceId:sourceID line:lineNumber forWebFrame:webFrame];
+    [[webView _scriptDebugDelegateForwarder] webView:webView didEnterCallFrame:m_topCallFrame.get() sourceId:static_cast<int>(sourceID) line:lineNumber forWebFrame:webFrame];
 
     m_callingDelegate = false;
 }
 
-void WebScriptDebugger::atStatement(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void WebScriptDebugger::atStatement(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_callingDelegate)
         return;
@@ -140,12 +140,12 @@ void WebScriptDebugger::atStatement(const DebuggerCallFrame& debuggerCallFrame,
     WebView *webView = [webFrame webView];
 
     [m_topCallFrame.get() _setDebuggerCallFrame:debuggerCallFrame];
-    [[webView _scriptDebugDelegateForwarder] webView:webView willExecuteStatement:m_topCallFrame.get() sourceId:sourceID line:lineNumber forWebFrame:webFrame];
+    [[webView _scriptDebugDelegateForwarder] webView:webView willExecuteStatement:m_topCallFrame.get() sourceId:static_cast<int>(sourceID) line:lineNumber forWebFrame:webFrame];
 
     m_callingDelegate = false;
 }
 
-void WebScriptDebugger::returnEvent(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void WebScriptDebugger::returnEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_callingDelegate)
         return;
@@ -156,7 +156,7 @@ void WebScriptDebugger::returnEvent(const DebuggerCallFrame& debuggerCallFrame,
     WebView *webView = [webFrame webView];
 
     [m_topCallFrame.get() _setDebuggerCallFrame:debuggerCallFrame];
-    [[webView _scriptDebugDelegateForwarder] webView:webView willLeaveCallFrame:m_topCallFrame.get() sourceId:sourceID line:lineNumber forWebFrame:webFrame];
+    [[webView _scriptDebugDelegateForwarder] webView:webView willLeaveCallFrame:m_topCallFrame.get() sourceId:static_cast<int>(sourceID) line:lineNumber forWebFrame:webFrame];
 
     [m_topCallFrame.get() _clearDebuggerCallFrame];
     m_topCallFrame = [m_topCallFrame.get() caller];
@@ -164,7 +164,7 @@ void WebScriptDebugger::returnEvent(const DebuggerCallFrame& debuggerCallFrame,
     m_callingDelegate = false;
 }
 
-void WebScriptDebugger::exception(const DebuggerCallFrame& debuggerCallFrame, int sourceID, int lineNumber)
+void WebScriptDebugger::exception(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
 {
     if (m_callingDelegate)
         return;
@@ -175,20 +175,20 @@ void WebScriptDebugger::exception(const DebuggerCallFrame& debuggerCallFrame, in
     WebView *webView = [webFrame webView];
     [m_topCallFrame.get() _setDebuggerCallFrame:debuggerCallFrame];
 
-    [[webView _scriptDebugDelegateForwarder] webView:webView exceptionWasRaised:m_topCallFrame.get() sourceId:sourceID line:lineNumber forWebFrame:webFrame];
+    [[webView _scriptDebugDelegateForwarder] webView:webView exceptionWasRaised:m_topCallFrame.get() sourceId:static_cast<int>(sourceID) line:lineNumber forWebFrame:webFrame];
 
     m_callingDelegate = false;
 }
 
-void WebScriptDebugger::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, int sourceId, int lineno)
+void WebScriptDebugger::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineno)
 {
 }
 
-void WebScriptDebugger::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, int sourceId, int lineno)
+void WebScriptDebugger::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineno)
 {
 }
 
-void WebScriptDebugger::didReachBreakpoint(const DebuggerCallFrame&, int, int)
+void WebScriptDebugger::didReachBreakpoint(const DebuggerCallFrame&, intptr_t, int)
 {
     return;
 }