09ad16834b0afb7be9f314afc2f250ad82edb5e5
[WebKit-https.git] / Source / JavaScriptCore / parser / SourceProvider.h
1 /*
2  * Copyright (C) 2008, 2009, 2012, 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #pragma once
30
31 #include "SourceOrigin.h"
32 #include <wtf/RefCounted.h>
33 #include <wtf/URL.h>
34 #include <wtf/text/TextPosition.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace JSC {
38
39     enum class SourceProviderSourceType : uint8_t {
40         Program,
41         Module,
42         WebAssembly,
43     };
44
45     class SourceProvider : public RefCounted<SourceProvider> {
46     public:
47         static const intptr_t nullID = 1;
48         
49         JS_EXPORT_PRIVATE SourceProvider(const SourceOrigin&, URL&&, const TextPosition& startPosition, SourceProviderSourceType);
50
51         JS_EXPORT_PRIVATE virtual ~SourceProvider();
52
53         virtual unsigned hash() const = 0;
54         virtual StringView source() const = 0;
55         StringView getRange(int start, int end) const
56         {
57             return source().substring(start, end - start);
58         }
59
60         const SourceOrigin& sourceOrigin() const { return m_sourceOrigin; }
61         const URL& url() const { return m_url; }
62         const String& sourceURL() const { return m_sourceURLDirective; }
63         const String& sourceMappingURL() const { return m_sourceMappingURLDirective; }
64
65         TextPosition startPosition() const { return m_startPosition; }
66         SourceProviderSourceType sourceType() const { return m_sourceType; }
67
68         intptr_t asID()
69         {
70             if (!m_id)
71                 getID();
72             return m_id;
73         }
74
75         void setSourceURLDirective(const String& sourceURL) { m_sourceURLDirective = sourceURL; }
76         void setSourceMappingURLDirective(const String& sourceMappingURL) { m_sourceMappingURLDirective = sourceMappingURL; }
77
78     private:
79         JS_EXPORT_PRIVATE void getID();
80
81         SourceProviderSourceType m_sourceType;
82         URL m_url;
83         SourceOrigin m_sourceOrigin;
84         String m_sourceURLDirective;
85         String m_sourceMappingURLDirective;
86         TextPosition m_startPosition;
87         uintptr_t m_id { 0 };
88     };
89
90     class StringSourceProvider : public SourceProvider {
91     public:
92         static Ref<StringSourceProvider> create(const String& source, const SourceOrigin& sourceOrigin, URL&& url, const TextPosition& startPosition = TextPosition(), SourceProviderSourceType sourceType = SourceProviderSourceType::Program)
93         {
94             return adoptRef(*new StringSourceProvider(source, sourceOrigin, WTFMove(url), startPosition, sourceType));
95         }
96         
97         unsigned hash() const override
98         {
99             return m_source.get().hash();
100         }
101
102         StringView source() const override
103         {
104             return m_source.get();
105         }
106
107     private:
108         StringSourceProvider(const String& source, const SourceOrigin& sourceOrigin, URL&& url, const TextPosition& startPosition, SourceProviderSourceType sourceType)
109             : SourceProvider(sourceOrigin, WTFMove(url), startPosition, sourceType)
110             , m_source(source.isNull() ? *StringImpl::empty() : *source.impl())
111         {
112         }
113
114         Ref<StringImpl> m_source;
115     };
116     
117 #if ENABLE(WEBASSEMBLY)
118     class WebAssemblySourceProvider : public SourceProvider {
119     public:
120         static Ref<WebAssemblySourceProvider> create(Vector<uint8_t>&& data, const SourceOrigin& sourceOrigin, URL&& url)
121         {
122             return adoptRef(*new WebAssemblySourceProvider(WTFMove(data), sourceOrigin, WTFMove(url)));
123         }
124
125         unsigned hash() const override
126         {
127             return m_source.impl()->hash();
128         }
129
130         StringView source() const override
131         {
132             return m_source;
133         }
134
135         const Vector<uint8_t>& data() const
136         {
137             return m_data;
138         }
139
140     private:
141         WebAssemblySourceProvider(Vector<uint8_t>&& data, const SourceOrigin& sourceOrigin, URL&& url)
142             : SourceProvider(sourceOrigin, WTFMove(url), TextPosition(), SourceProviderSourceType::WebAssembly)
143             , m_source("[WebAssembly source]")
144             , m_data(WTFMove(data))
145         {
146         }
147
148         String m_source;
149         Vector<uint8_t> m_data;
150     };
151 #endif
152
153 } // namespace JSC