diff options
Diffstat (limited to 'Source/JavaScriptCore/parser/SourceProvider.h')
-rw-r--r-- | Source/JavaScriptCore/parser/SourceProvider.h | 99 |
1 files changed, 76 insertions, 23 deletions
diff --git a/Source/JavaScriptCore/parser/SourceProvider.h b/Source/JavaScriptCore/parser/SourceProvider.h index 72c0de41e..2e68e8202 100644 --- a/Source/JavaScriptCore/parser/SourceProvider.h +++ b/Source/JavaScriptCore/parser/SourceProvider.h @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * 3. Neither the name of Apple Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * @@ -26,37 +26,46 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SourceProvider_h -#define SourceProvider_h +#pragma once -#include <wtf/PassOwnPtr.h> +#include "SourceOrigin.h" #include <wtf/RefCounted.h> #include <wtf/text/TextPosition.h> #include <wtf/text/WTFString.h> namespace JSC { + enum class SourceProviderSourceType { + Program, + Module, + WebAssembly, + }; + class SourceProvider : public RefCounted<SourceProvider> { public: static const intptr_t nullID = 1; - JS_EXPORT_PRIVATE SourceProvider(const String& url, const TextPosition& startPosition); + JS_EXPORT_PRIVATE SourceProvider(const SourceOrigin&, const String& url, const TextPosition& startPosition, SourceProviderSourceType); JS_EXPORT_PRIVATE virtual ~SourceProvider(); - virtual const String& source() const = 0; - String getRange(int start, int end) const + virtual unsigned hash() const = 0; + virtual StringView source() const = 0; + StringView getRange(int start, int end) const { - return source().substringSharingImpl(start, end - start); + return source().substring(start, end - start); } - const String& url() { return m_url; } + const SourceOrigin& sourceOrigin() const { return m_sourceOrigin; } + const String& url() const { return m_url; } + const String& sourceURL() const { return m_sourceURLDirective; } + const String& sourceMappingURL() const { return m_sourceMappingURLDirective; } + TextPosition startPosition() const { return m_startPosition; } + SourceProviderSourceType sourceType() const { return m_sourceType; } + intptr_t asID() { - ASSERT(this); - if (!this) // Be defensive in release mode. - return nullID; if (!m_id) getID(); return m_id; @@ -65,39 +74,83 @@ namespace JSC { bool isValid() const { return m_validated; } void setValid() { m_validated = true; } - private: + void setSourceURLDirective(const String& sourceURL) { m_sourceURLDirective = sourceURL; } + void setSourceMappingURLDirective(const String& sourceMappingURL) { m_sourceMappingURLDirective = sourceMappingURL; } + private: JS_EXPORT_PRIVATE void getID(); - Vector<size_t>& lineStarts(); + SourceOrigin m_sourceOrigin; String m_url; + String m_sourceURLDirective; + String m_sourceMappingURLDirective; TextPosition m_startPosition; + SourceProviderSourceType m_sourceType; bool m_validated : 1; uintptr_t m_id : sizeof(uintptr_t) * 8 - 1; }; class StringSourceProvider : public SourceProvider { public: - static PassRefPtr<StringSourceProvider> create(const String& source, const String& url, const TextPosition& startPosition = TextPosition::minimumPosition()) + static Ref<StringSourceProvider> create(const String& source, const SourceOrigin& sourceOrigin, const String& url, const TextPosition& startPosition = TextPosition(), SourceProviderSourceType sourceType = SourceProviderSourceType::Program) + { + return adoptRef(*new StringSourceProvider(source, sourceOrigin, url, startPosition, sourceType)); + } + + unsigned hash() const override + { + return m_source.get().hash(); + } + + StringView source() const override { - return adoptRef(new StringSourceProvider(source, url, startPosition)); + return m_source.get(); } - virtual const String& source() const override + private: + StringSourceProvider(const String& source, const SourceOrigin& sourceOrigin, const String& url, const TextPosition& startPosition, SourceProviderSourceType sourceType) + : SourceProvider(sourceOrigin, url, startPosition, sourceType) + , m_source(source.isNull() ? *StringImpl::empty() : *source.impl()) + { + } + + Ref<StringImpl> m_source; + }; + +#if ENABLE(WEBASSEMBLY) + class WebAssemblySourceProvider : public SourceProvider { + public: + static Ref<WebAssemblySourceProvider> create(const Vector<uint8_t>& data, const SourceOrigin& sourceOrigin, const String& url) + { + return adoptRef(*new WebAssemblySourceProvider(data, sourceOrigin, url)); + } + + unsigned hash() const override + { + return m_source.impl()->hash(); + } + + StringView source() const override { return m_source; } + const Vector<uint8_t>& data() const + { + return m_data; + } + private: - StringSourceProvider(const String& source, const String& url, const TextPosition& startPosition) - : SourceProvider(url, startPosition) - , m_source(source) + WebAssemblySourceProvider(const Vector<uint8_t>& data, const SourceOrigin& sourceOrigin, const String& url) + : SourceProvider(sourceOrigin, url, TextPosition(), SourceProviderSourceType::WebAssembly) + , m_source("[WebAssembly source]") + , m_data(data) { } String m_source; + Vector<uint8_t> m_data; }; - -} // namespace JSC +#endif -#endif // SourceProvider_h +} // namespace JSC |