diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/API/JSScriptRef.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/API/JSScriptRef.cpp')
-rw-r--r-- | Source/JavaScriptCore/API/JSScriptRef.cpp | 84 |
1 files changed, 47 insertions, 37 deletions
diff --git a/Source/JavaScriptCore/API/JSScriptRef.cpp b/Source/JavaScriptCore/API/JSScriptRef.cpp index 9277001d2..791738b95 100644 --- a/Source/JavaScriptCore/API/JSScriptRef.cpp +++ b/Source/JavaScriptCore/API/JSScriptRef.cpp @@ -26,13 +26,13 @@ #include "config.h" #include "APICast.h" -#include "APIShims.h" #include "Completion.h" +#include "Exception.h" #include "JSBasePrivate.h" #include "VM.h" #include "JSScriptRefPrivate.h" #include "OpaqueJSString.h" -#include "Operations.h" +#include "JSCInlines.h" #include "Parser.h" #include "SourceCode.h" #include "SourceProvider.h" @@ -41,43 +41,51 @@ using namespace JSC; struct OpaqueJSScript : public SourceProvider { public: - static WTF::PassRefPtr<OpaqueJSScript> create(VM* vm, const String& url, int startingLineNumber, const String& source) + static WTF::Ref<OpaqueJSScript> create(VM& vm, const SourceOrigin& sourceOrigin, const String& url, int startingLineNumber, const String& source) { - return WTF::adoptRef(new OpaqueJSScript(vm, url, startingLineNumber, source)); + return WTF::adoptRef(*new OpaqueJSScript(vm, sourceOrigin, url, startingLineNumber, source)); } - virtual const String& source() const override + unsigned hash() const override { - return m_source; + return m_source.get().hash(); } - VM* vm() const { return m_vm; } + StringView source() const override + { + return m_source.get(); + } + + VM& vm() const { return m_vm; } private: - OpaqueJSScript(VM* vm, const String& url, int startingLineNumber, const String& source) - : SourceProvider(url, TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first())) + OpaqueJSScript(VM& vm, const SourceOrigin& sourceOrigin, const String& url, int startingLineNumber, const String& source) + : SourceProvider(sourceOrigin, url, TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber()), SourceProviderSourceType::Program) , m_vm(vm) - , m_source(source) + , m_source(source.isNull() ? *StringImpl::empty() : *source.impl()) { } virtual ~OpaqueJSScript() { } - VM* m_vm; - String m_source; + VM& m_vm; + Ref<StringImpl> m_source; }; -static bool parseScript(VM* vm, const SourceCode& source, ParserError& error) +static bool parseScript(VM& vm, const SourceCode& source, ParserError& error) { - return JSC::parse<JSC::ProgramNode>(vm, source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error); + return !!JSC::parse<JSC::ProgramNode>( + &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin, + JSParserStrictMode::NotStrict, JSParserScriptMode::Classic, SourceParseMode::ProgramMode, SuperBinding::NotNeeded, + error); } extern "C" { JSScriptRef JSScriptCreateReferencingImmortalASCIIText(JSContextGroupRef contextGroup, JSStringRef url, int startingLineNumber, const char* source, size_t length, JSStringRef* errorMessage, int* errorLine) { - VM* vm = toJS(contextGroup); - APIEntryShim entryShim(vm); + auto& vm = *toJS(contextGroup); + JSLockHolder locker(&vm); for (size_t i = 0; i < length; i++) { if (!isASCII(source[i])) return 0; @@ -85,67 +93,69 @@ JSScriptRef JSScriptCreateReferencingImmortalASCIIText(JSContextGroupRef context startingLineNumber = std::max(1, startingLineNumber); - RefPtr<OpaqueJSScript> result = OpaqueJSScript::create(vm, url->string(), startingLineNumber, String(StringImpl::createFromLiteral(source, length))); + auto sourceURLString = url ? url->string() : String(); + auto result = OpaqueJSScript::create(vm, SourceOrigin { sourceURLString }, sourceURLString, startingLineNumber, String(StringImpl::createFromLiteral(source, length))); ParserError error; - if (!parseScript(vm, SourceCode(result), error)) { + if (!parseScript(vm, SourceCode(result.copyRef()), error)) { if (errorMessage) - *errorMessage = OpaqueJSString::create(error.m_message).leakRef(); + *errorMessage = OpaqueJSString::create(error.message()).leakRef(); if (errorLine) - *errorLine = error.m_line; - return 0; + *errorLine = error.line(); + return nullptr; } - return result.release().leakRef(); + return &result.leakRef(); } JSScriptRef JSScriptCreateFromString(JSContextGroupRef contextGroup, JSStringRef url, int startingLineNumber, JSStringRef source, JSStringRef* errorMessage, int* errorLine) { - VM* vm = toJS(contextGroup); - APIEntryShim entryShim(vm); + auto& vm = *toJS(contextGroup); + JSLockHolder locker(&vm); startingLineNumber = std::max(1, startingLineNumber); - RefPtr<OpaqueJSScript> result = OpaqueJSScript::create(vm, url->string(), startingLineNumber, source->string()); + auto sourceURLString = url ? url->string() : String(); + auto result = OpaqueJSScript::create(vm, SourceOrigin { sourceURLString }, sourceURLString, startingLineNumber, source->string()); ParserError error; - if (!parseScript(vm, SourceCode(result), error)) { + if (!parseScript(vm, SourceCode(result.copyRef()), error)) { if (errorMessage) - *errorMessage = OpaqueJSString::create(error.m_message).leakRef(); + *errorMessage = OpaqueJSString::create(error.message()).leakRef(); if (errorLine) - *errorLine = error.m_line; - return 0; + *errorLine = error.line(); + return nullptr; } - return result.release().leakRef(); + return &result.leakRef(); } void JSScriptRetain(JSScriptRef script) { - APIEntryShim entryShim(script->vm()); + JSLockHolder locker(&script->vm()); script->ref(); } void JSScriptRelease(JSScriptRef script) { - APIEntryShim entryShim(script->vm()); + JSLockHolder locker(&script->vm()); script->deref(); } JSValueRef JSScriptEvaluate(JSContextRef context, JSScriptRef script, JSValueRef thisValueRef, JSValueRef* exception) { ExecState* exec = toJS(context); - APIEntryShim entryShim(exec); - if (script->vm() != &exec->vm()) { + JSLockHolder locker(exec); + if (&script->vm() != &exec->vm()) { RELEASE_ASSERT_NOT_REACHED(); return 0; } - JSValue internalException; + NakedPtr<Exception> internalException; JSValue thisValue = thisValueRef ? toJS(exec, thisValueRef) : jsUndefined(); - JSValue result = evaluate(exec, SourceCode(script), thisValue, &internalException); + JSValue result = evaluate(exec, SourceCode(*script), thisValue, internalException); if (internalException) { if (exception) - *exception = toRef(exec, internalException); + *exception = toRef(exec, internalException->value()); return 0; } ASSERT(result); |