• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef INCLUDE_V8_SCRIPT_H_
6 #define INCLUDE_V8_SCRIPT_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include <memory>
12 #include <vector>
13 
14 #include "v8-data.h"          // NOLINT(build/include_directory)
15 #include "v8-local-handle.h"  // NOLINT(build/include_directory)
16 #include "v8-maybe.h"         // NOLINT(build/include_directory)
17 #include "v8-message.h"       // NOLINT(build/include_directory)
18 #include "v8config.h"         // NOLINT(build/include_directory)
19 
20 namespace v8 {
21 
22 class Function;
23 class Object;
24 class PrimitiveArray;
25 class Script;
26 
27 namespace internal {
28 class BackgroundDeserializeTask;
29 struct ScriptStreamingData;
30 }  // namespace internal
31 
32 /**
33  * A container type that holds relevant metadata for module loading.
34  *
35  * This is passed back to the embedder as part of
36  * HostImportModuleDynamicallyCallback for module loading.
37  */
38 class V8_EXPORT ScriptOrModule {
39  public:
40   /**
41    * The name that was passed by the embedder as ResourceName to the
42    * ScriptOrigin. This can be either a v8::String or v8::Undefined.
43    */
44   Local<Value> GetResourceName();
45 
46   /**
47    * The options that were passed by the embedder as HostDefinedOptions to
48    * the ScriptOrigin.
49    */
50   V8_DEPRECATED("Use HostDefinedOptions")
51   Local<PrimitiveArray> GetHostDefinedOptions();
52   Local<Data> HostDefinedOptions();
53 };
54 
55 /**
56  * A compiled JavaScript script, not yet tied to a Context.
57  */
58 class V8_EXPORT UnboundScript {
59  public:
60   /**
61    * Binds the script to the currently entered context.
62    */
63   Local<Script> BindToCurrentContext();
64 
65   int GetId() const;
66   Local<Value> GetScriptName();
67 
68   /**
69    * Data read from magic sourceURL comments.
70    */
71   Local<Value> GetSourceURL();
72   /**
73    * Data read from magic sourceMappingURL comments.
74    */
75   Local<Value> GetSourceMappingURL();
76 
77   /**
78    * Returns zero based line number of the code_pos location in the script.
79    * -1 will be returned if no information available.
80    */
81   int GetLineNumber(int code_pos);
82 
83   static const int kNoScriptId = 0;
84 };
85 
86 /**
87  * A compiled JavaScript module, not yet tied to a Context.
88  */
89 class V8_EXPORT UnboundModuleScript : public Data {
90   // Only used as a container for code caching.
91 };
92 
93 /**
94  * A location in JavaScript source.
95  */
96 class V8_EXPORT Location {
97  public:
GetLineNumber()98   int GetLineNumber() { return line_number_; }
GetColumnNumber()99   int GetColumnNumber() { return column_number_; }
100 
Location(int line_number,int column_number)101   Location(int line_number, int column_number)
102       : line_number_(line_number), column_number_(column_number) {}
103 
104  private:
105   int line_number_;
106   int column_number_;
107 };
108 
109 class V8_EXPORT ModuleRequest : public Data {
110  public:
111   /**
112    * Returns the module specifier for this ModuleRequest.
113    */
114   Local<String> GetSpecifier() const;
115 
116   /**
117    * Returns the source code offset of this module request.
118    * Use Module::SourceOffsetToLocation to convert this to line/column numbers.
119    */
120   int GetSourceOffset() const;
121 
122   /**
123    * Contains the import assertions for this request in the form:
124    * [key1, value1, source_offset1, key2, value2, source_offset2, ...].
125    * The keys and values are of type v8::String, and the source offsets are of
126    * type Int32. Use Module::SourceOffsetToLocation to convert the source
127    * offsets to Locations with line/column numbers.
128    *
129    * All assertions present in the module request will be supplied in this
130    * list, regardless of whether they are supported by the host. Per
131    * https://tc39.es/proposal-import-assertions/#sec-hostgetsupportedimportassertions,
132    * hosts are expected to ignore assertions that they do not support (as
133    * opposed to, for example, triggering an error if an unsupported assertion is
134    * present).
135    */
136   Local<FixedArray> GetImportAssertions() const;
137 
138   V8_INLINE static ModuleRequest* Cast(Data* data);
139 
140  private:
141   static void CheckCast(Data* obj);
142 };
143 
144 /**
145  * A compiled JavaScript module.
146  */
147 class V8_EXPORT Module : public Data {
148  public:
149   /**
150    * The different states a module can be in.
151    *
152    * This corresponds to the states used in ECMAScript except that "evaluated"
153    * is split into kEvaluated and kErrored, indicating success and failure,
154    * respectively.
155    */
156   enum Status {
157     kUninstantiated,
158     kInstantiating,
159     kInstantiated,
160     kEvaluating,
161     kEvaluated,
162     kErrored
163   };
164 
165   /**
166    * Returns the module's current status.
167    */
168   Status GetStatus() const;
169 
170   /**
171    * For a module in kErrored status, this returns the corresponding exception.
172    */
173   Local<Value> GetException() const;
174 
175   /**
176    * Returns the ModuleRequests for this module.
177    */
178   Local<FixedArray> GetModuleRequests() const;
179 
180   /**
181    * For the given source text offset in this module, returns the corresponding
182    * Location with line and column numbers.
183    */
184   Location SourceOffsetToLocation(int offset) const;
185 
186   /**
187    * Returns the identity hash for this object.
188    */
189   int GetIdentityHash() const;
190 
191   using ResolveModuleCallback = MaybeLocal<Module> (*)(
192       Local<Context> context, Local<String> specifier,
193       Local<FixedArray> import_assertions, Local<Module> referrer);
194 
195   /**
196    * Instantiates the module and its dependencies.
197    *
198    * Returns an empty Maybe<bool> if an exception occurred during
199    * instantiation. (In the case where the callback throws an exception, that
200    * exception is propagated.)
201    */
202   V8_WARN_UNUSED_RESULT Maybe<bool> InstantiateModule(
203       Local<Context> context, ResolveModuleCallback callback);
204 
205   /**
206    * Evaluates the module and its dependencies.
207    *
208    * If status is kInstantiated, run the module's code and return a Promise
209    * object. On success, set status to kEvaluated and resolve the Promise with
210    * the completion value; on failure, set status to kErrored and reject the
211    * Promise with the error.
212    *
213    * If IsGraphAsync() is false, the returned Promise is settled.
214    */
215   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Evaluate(Local<Context> context);
216 
217   /**
218    * Returns the namespace object of this module.
219    *
220    * The module's status must be at least kInstantiated.
221    */
222   Local<Value> GetModuleNamespace();
223 
224   /**
225    * Returns the corresponding context-unbound module script.
226    *
227    * The module must be unevaluated, i.e. its status must not be kEvaluating,
228    * kEvaluated or kErrored.
229    */
230   Local<UnboundModuleScript> GetUnboundModuleScript();
231 
232   /**
233    * Returns the underlying script's id.
234    *
235    * The module must be a SourceTextModule and must not have a kErrored status.
236    */
237   int ScriptId() const;
238 
239   /**
240    * Returns whether this module or any of its requested modules is async,
241    * i.e. contains top-level await.
242    *
243    * The module's status must be at least kInstantiated.
244    */
245   bool IsGraphAsync() const;
246 
247   /**
248    * Returns whether the module is a SourceTextModule.
249    */
250   bool IsSourceTextModule() const;
251 
252   /**
253    * Returns whether the module is a SyntheticModule.
254    */
255   bool IsSyntheticModule() const;
256 
257   /*
258    * Callback defined in the embedder.  This is responsible for setting
259    * the module's exported values with calls to SetSyntheticModuleExport().
260    * The callback must return a resolved Promise to indicate success (where no
261    * exception was thrown) and return an empy MaybeLocal to indicate falure
262    * (where an exception was thrown).
263    */
264   using SyntheticModuleEvaluationSteps =
265       MaybeLocal<Value> (*)(Local<Context> context, Local<Module> module);
266 
267   /**
268    * Creates a new SyntheticModule with the specified export names, where
269    * evaluation_steps will be executed upon module evaluation.
270    * export_names must not contain duplicates.
271    * module_name is used solely for logging/debugging and doesn't affect module
272    * behavior.
273    */
274   static Local<Module> CreateSyntheticModule(
275       Isolate* isolate, Local<String> module_name,
276       const std::vector<Local<String>>& export_names,
277       SyntheticModuleEvaluationSteps evaluation_steps);
278 
279   /**
280    * Set this module's exported value for the name export_name to the specified
281    * export_value. This method must be called only on Modules created via
282    * CreateSyntheticModule.  An error will be thrown if export_name is not one
283    * of the export_names that were passed in that CreateSyntheticModule call.
284    * Returns Just(true) on success, Nothing<bool>() if an error was thrown.
285    */
286   V8_WARN_UNUSED_RESULT Maybe<bool> SetSyntheticModuleExport(
287       Isolate* isolate, Local<String> export_name, Local<Value> export_value);
288 
289   V8_INLINE static Module* Cast(Data* data);
290 
291  private:
292   static void CheckCast(Data* obj);
293 };
294 
295 /**
296  * A compiled JavaScript script, tied to a Context which was active when the
297  * script was compiled.
298  */
299 class V8_EXPORT Script {
300  public:
301   /**
302    * A shorthand for ScriptCompiler::Compile().
303    */
304   static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile(
305       Local<Context> context, Local<String> source,
306       ScriptOrigin* origin = nullptr);
307 
308   /**
309    * Runs the script returning the resulting value. It will be run in the
310    * context in which it was created (ScriptCompiler::CompileBound or
311    * UnboundScript::BindToCurrentContext()).
312    */
313   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Run(Local<Context> context);
314   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Run(Local<Context> context,
315                                               Local<Data> host_defined_options);
316 
317   /**
318    * Returns the corresponding context-unbound script.
319    */
320   Local<UnboundScript> GetUnboundScript();
321 
322   /**
323    * The name that was passed by the embedder as ResourceName to the
324    * ScriptOrigin. This can be either a v8::String or v8::Undefined.
325    */
326   Local<Value> GetResourceName();
327 };
328 
329 enum class ScriptType { kClassic, kModule };
330 
331 /**
332  * For compiling scripts.
333  */
334 class V8_EXPORT ScriptCompiler {
335  public:
336   class ConsumeCodeCacheTask;
337 
338   /**
339    * Compilation data that the embedder can cache and pass back to speed up
340    * future compilations. The data is produced if the CompilerOptions passed to
341    * the compilation functions in ScriptCompiler contains produce_data_to_cache
342    * = true. The data to cache can then can be retrieved from
343    * UnboundScript.
344    */
345   struct V8_EXPORT CachedData {
346     enum BufferPolicy { BufferNotOwned, BufferOwned };
347 
CachedDataCachedData348     CachedData()
349         : data(nullptr),
350           length(0),
351           rejected(false),
352           buffer_policy(BufferNotOwned) {}
353 
354     // If buffer_policy is BufferNotOwned, the caller keeps the ownership of
355     // data and guarantees that it stays alive until the CachedData object is
356     // destroyed. If the policy is BufferOwned, the given data will be deleted
357     // (with delete[]) when the CachedData object is destroyed.
358     CachedData(const uint8_t* data, int length,
359                BufferPolicy buffer_policy = BufferNotOwned);
360     ~CachedData();
361     // TODO(marja): Async compilation; add constructors which take a callback
362     // which will be called when V8 no longer needs the data.
363     const uint8_t* data;
364     int length;
365     bool rejected;
366     BufferPolicy buffer_policy;
367 
368     // Prevent copying.
369     CachedData(const CachedData&) = delete;
370     CachedData& operator=(const CachedData&) = delete;
371   };
372 
373   /**
374    * Source code which can be then compiled to a UnboundScript or Script.
375    */
376   class Source {
377    public:
378     // Source takes ownership of both CachedData and CodeCacheConsumeTask.
379     // The caller *must* ensure that the cached data is from a trusted source.
380     V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin,
381                      CachedData* cached_data = nullptr,
382                      ConsumeCodeCacheTask* consume_cache_task = nullptr);
383     // Source takes ownership of both CachedData and CodeCacheConsumeTask.
384     V8_INLINE explicit Source(
385         Local<String> source_string, CachedData* cached_data = nullptr,
386         ConsumeCodeCacheTask* consume_cache_task = nullptr);
387     V8_INLINE ~Source() = default;
388 
389     // Ownership of the CachedData or its buffers is *not* transferred to the
390     // caller. The CachedData object is alive as long as the Source object is
391     // alive.
392     V8_INLINE const CachedData* GetCachedData() const;
393 
394     V8_INLINE const ScriptOriginOptions& GetResourceOptions() const;
395 
396    private:
397     friend class ScriptCompiler;
398 
399     Local<String> source_string;
400 
401     // Origin information
402     Local<Value> resource_name;
403     int resource_line_offset;
404     int resource_column_offset;
405     ScriptOriginOptions resource_options;
406     Local<Value> source_map_url;
407     Local<Data> host_defined_options;
408 
409     // Cached data from previous compilation (if a kConsume*Cache flag is
410     // set), or hold newly generated cache data (kProduce*Cache flags) are
411     // set when calling a compile method.
412     std::unique_ptr<CachedData> cached_data;
413     std::unique_ptr<ConsumeCodeCacheTask> consume_cache_task;
414   };
415 
416   /**
417    * For streaming incomplete script data to V8. The embedder should implement a
418    * subclass of this class.
419    */
420   class V8_EXPORT ExternalSourceStream {
421    public:
422     virtual ~ExternalSourceStream() = default;
423 
424     /**
425      * V8 calls this to request the next chunk of data from the embedder. This
426      * function will be called on a background thread, so it's OK to block and
427      * wait for the data, if the embedder doesn't have data yet. Returns the
428      * length of the data returned. When the data ends, GetMoreData should
429      * return 0. Caller takes ownership of the data.
430      *
431      * When streaming UTF-8 data, V8 handles multi-byte characters split between
432      * two data chunks, but doesn't handle multi-byte characters split between
433      * more than two data chunks. The embedder can avoid this problem by always
434      * returning at least 2 bytes of data.
435      *
436      * When streaming UTF-16 data, V8 does not handle characters split between
437      * two data chunks. The embedder has to make sure that chunks have an even
438      * length.
439      *
440      * If the embedder wants to cancel the streaming, they should make the next
441      * GetMoreData call return 0. V8 will interpret it as end of data (and most
442      * probably, parsing will fail). The streaming task will return as soon as
443      * V8 has parsed the data it received so far.
444      */
445     virtual size_t GetMoreData(const uint8_t** src) = 0;
446   };
447 
448   /**
449    * Source code which can be streamed into V8 in pieces. It will be parsed
450    * while streaming and compiled after parsing has completed. StreamedSource
451    * must be kept alive while the streaming task is run (see ScriptStreamingTask
452    * below).
453    */
454   class V8_EXPORT StreamedSource {
455    public:
456     enum Encoding { ONE_BYTE, TWO_BYTE, UTF8, WINDOWS_1252 };
457 
458     StreamedSource(std::unique_ptr<ExternalSourceStream> source_stream,
459                    Encoding encoding);
460     ~StreamedSource();
461 
impl()462     internal::ScriptStreamingData* impl() const { return impl_.get(); }
463 
464     // Prevent copying.
465     StreamedSource(const StreamedSource&) = delete;
466     StreamedSource& operator=(const StreamedSource&) = delete;
467 
468    private:
469     std::unique_ptr<internal::ScriptStreamingData> impl_;
470   };
471 
472   /**
473    * A streaming task which the embedder must run on a background thread to
474    * stream scripts into V8. Returned by ScriptCompiler::StartStreaming.
475    */
476   class V8_EXPORT ScriptStreamingTask final {
477    public:
478     void Run();
479 
480    private:
481     friend class ScriptCompiler;
482 
ScriptStreamingTask(internal::ScriptStreamingData * data)483     explicit ScriptStreamingTask(internal::ScriptStreamingData* data)
484         : data_(data) {}
485 
486     internal::ScriptStreamingData* data_;
487   };
488 
489   /**
490    * A task which the embedder must run on a background thread to
491    * consume a V8 code cache. Returned by
492    * ScriptCompiler::StarConsumingCodeCache.
493    */
494   class V8_EXPORT ConsumeCodeCacheTask final {
495    public:
496     ~ConsumeCodeCacheTask();
497 
498     void Run();
499 
500    private:
501     friend class ScriptCompiler;
502 
503     explicit ConsumeCodeCacheTask(
504         std::unique_ptr<internal::BackgroundDeserializeTask> impl);
505 
506     std::unique_ptr<internal::BackgroundDeserializeTask> impl_;
507   };
508 
509   enum CompileOptions {
510     kNoCompileOptions = 0,
511     kConsumeCodeCache,
512     kEagerCompile
513   };
514 
515   /**
516    * The reason for which we are not requesting or providing a code cache.
517    */
518   enum NoCacheReason {
519     kNoCacheNoReason = 0,
520     kNoCacheBecauseCachingDisabled,
521     kNoCacheBecauseNoResource,
522     kNoCacheBecauseInlineScript,
523     kNoCacheBecauseModule,
524     kNoCacheBecauseStreamingSource,
525     kNoCacheBecauseInspector,
526     kNoCacheBecauseScriptTooSmall,
527     kNoCacheBecauseCacheTooCold,
528     kNoCacheBecauseV8Extension,
529     kNoCacheBecauseExtensionModule,
530     kNoCacheBecausePacScript,
531     kNoCacheBecauseInDocumentWrite,
532     kNoCacheBecauseResourceWithNoCacheHandler,
533     kNoCacheBecauseDeferredProduceCodeCache
534   };
535 
536   /**
537    * Compiles the specified script (context-independent).
538    * Cached data as part of the source object can be optionally produced to be
539    * consumed later to speed up compilation of identical source scripts.
540    *
541    * Note that when producing cached data, the source must point to NULL for
542    * cached data. When consuming cached data, the cached data must have been
543    * produced by the same version of V8, and the embedder needs to ensure the
544    * cached data is the correct one for the given script.
545    *
546    * \param source Script source code.
547    * \return Compiled script object (context independent; for running it must be
548    *   bound to a context).
549    */
550   static V8_WARN_UNUSED_RESULT MaybeLocal<UnboundScript> CompileUnboundScript(
551       Isolate* isolate, Source* source,
552       CompileOptions options = kNoCompileOptions,
553       NoCacheReason no_cache_reason = kNoCacheNoReason);
554 
555   /**
556    * Compiles the specified script (bound to current context).
557    *
558    * \param source Script source code.
559    * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
560    *   using pre_data speeds compilation if it's done multiple times.
561    *   Owned by caller, no references are kept when this function returns.
562    * \return Compiled script object, bound to the context that was active
563    *   when this function was called. When run it will always use this
564    *   context.
565    */
566   static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile(
567       Local<Context> context, Source* source,
568       CompileOptions options = kNoCompileOptions,
569       NoCacheReason no_cache_reason = kNoCacheNoReason);
570 
571   /**
572    * Returns a task which streams script data into V8, or NULL if the script
573    * cannot be streamed. The user is responsible for running the task on a
574    * background thread and deleting it. When ran, the task starts parsing the
575    * script, and it will request data from the StreamedSource as needed. When
576    * ScriptStreamingTask::Run exits, all data has been streamed and the script
577    * can be compiled (see Compile below).
578    *
579    * This API allows to start the streaming with as little data as possible, and
580    * the remaining data (for example, the ScriptOrigin) is passed to Compile.
581    */
582   static ScriptStreamingTask* StartStreaming(
583       Isolate* isolate, StreamedSource* source,
584       ScriptType type = ScriptType::kClassic);
585 
586   static ConsumeCodeCacheTask* StartConsumingCodeCache(
587       Isolate* isolate, std::unique_ptr<CachedData> source);
588 
589   /**
590    * Compiles a streamed script (bound to current context).
591    *
592    * This can only be called after the streaming has finished
593    * (ScriptStreamingTask has been run). V8 doesn't construct the source string
594    * during streaming, so the embedder needs to pass the full source here.
595    */
596   static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile(
597       Local<Context> context, StreamedSource* source,
598       Local<String> full_source_string, const ScriptOrigin& origin);
599 
600   /**
601    * Return a version tag for CachedData for the current V8 version & flags.
602    *
603    * This value is meant only for determining whether a previously generated
604    * CachedData instance is still valid; the tag has no other meaing.
605    *
606    * Background: The data carried by CachedData may depend on the exact
607    *   V8 version number or current compiler flags. This means that when
608    *   persisting CachedData, the embedder must take care to not pass in
609    *   data from another V8 version, or the same version with different
610    *   features enabled.
611    *
612    *   The easiest way to do so is to clear the embedder's cache on any
613    *   such change.
614    *
615    *   Alternatively, this tag can be stored alongside the cached data and
616    *   compared when it is being used.
617    */
618   static uint32_t CachedDataVersionTag();
619 
620   /**
621    * Compile an ES module, returning a Module that encapsulates
622    * the compiled code.
623    *
624    * Corresponds to the ParseModule abstract operation in the
625    * ECMAScript specification.
626    */
627   static V8_WARN_UNUSED_RESULT MaybeLocal<Module> CompileModule(
628       Isolate* isolate, Source* source,
629       CompileOptions options = kNoCompileOptions,
630       NoCacheReason no_cache_reason = kNoCacheNoReason);
631 
632   /**
633    * Compiles a streamed module script.
634    *
635    * This can only be called after the streaming has finished
636    * (ScriptStreamingTask has been run). V8 doesn't construct the source string
637    * during streaming, so the embedder needs to pass the full source here.
638    */
639   static V8_WARN_UNUSED_RESULT MaybeLocal<Module> CompileModule(
640       Local<Context> context, StreamedSource* v8_source,
641       Local<String> full_source_string, const ScriptOrigin& origin);
642 
643   /**
644    * Compile a function for a given context. This is equivalent to running
645    *
646    * with (obj) {
647    *   return function(args) { ... }
648    * }
649    *
650    * It is possible to specify multiple context extensions (obj in the above
651    * example).
652    */
653   static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunctionInContext(
654       Local<Context> context, Source* source, size_t arguments_count,
655       Local<String> arguments[], size_t context_extension_count,
656       Local<Object> context_extensions[],
657       CompileOptions options = kNoCompileOptions,
658       NoCacheReason no_cache_reason = kNoCacheNoReason,
659       Local<ScriptOrModule>* script_or_module_out = nullptr);
660   static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunction(
661       Local<Context> context, Source* source, size_t arguments_count = 0,
662       Local<String> arguments[] = nullptr, size_t context_extension_count = 0,
663       Local<Object> context_extensions[] = nullptr,
664       CompileOptions options = kNoCompileOptions,
665       NoCacheReason no_cache_reason = kNoCacheNoReason);
666 
667   /**
668    * Creates and returns code cache for the specified unbound_script.
669    * This will return nullptr if the script cannot be serialized. The
670    * CachedData returned by this function should be owned by the caller.
671    */
672   static CachedData* CreateCodeCache(Local<UnboundScript> unbound_script);
673 
674   /**
675    * Creates and returns code cache for the specified unbound_module_script.
676    * This will return nullptr if the script cannot be serialized. The
677    * CachedData returned by this function should be owned by the caller.
678    */
679   static CachedData* CreateCodeCache(
680       Local<UnboundModuleScript> unbound_module_script);
681 
682   /**
683    * Creates and returns code cache for the specified function that was
684    * previously produced by CompileFunction.
685    * This will return nullptr if the script cannot be serialized. The
686    * CachedData returned by this function should be owned by the caller.
687    */
688   static CachedData* CreateCodeCacheForFunction(Local<Function> function);
689 
690  private:
691   static V8_WARN_UNUSED_RESULT MaybeLocal<UnboundScript> CompileUnboundInternal(
692       Isolate* isolate, Source* source, CompileOptions options,
693       NoCacheReason no_cache_reason);
694 
695   static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunctionInternal(
696       Local<Context> context, Source* source, size_t arguments_count,
697       Local<String> arguments[], size_t context_extension_count,
698       Local<Object> context_extensions[], CompileOptions options,
699       NoCacheReason no_cache_reason,
700       Local<ScriptOrModule>* script_or_module_out);
701 };
702 
Source(Local<String> string,const ScriptOrigin & origin,CachedData * data,ConsumeCodeCacheTask * consume_cache_task)703 ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
704                                CachedData* data,
705                                ConsumeCodeCacheTask* consume_cache_task)
706     : source_string(string),
707       resource_name(origin.ResourceName()),
708       resource_line_offset(origin.LineOffset()),
709       resource_column_offset(origin.ColumnOffset()),
710       resource_options(origin.Options()),
711       source_map_url(origin.SourceMapUrl()),
712       host_defined_options(origin.GetHostDefinedOptions()),
713       cached_data(data),
714       consume_cache_task(consume_cache_task) {}
715 
Source(Local<String> string,CachedData * data,ConsumeCodeCacheTask * consume_cache_task)716 ScriptCompiler::Source::Source(Local<String> string, CachedData* data,
717                                ConsumeCodeCacheTask* consume_cache_task)
718     : source_string(string),
719       cached_data(data),
720       consume_cache_task(consume_cache_task) {}
721 
GetCachedData()722 const ScriptCompiler::CachedData* ScriptCompiler::Source::GetCachedData()
723     const {
724   return cached_data.get();
725 }
726 
GetResourceOptions()727 const ScriptOriginOptions& ScriptCompiler::Source::GetResourceOptions() const {
728   return resource_options;
729 }
730 
Cast(Data * data)731 ModuleRequest* ModuleRequest::Cast(Data* data) {
732 #ifdef V8_ENABLE_CHECKS
733   CheckCast(data);
734 #endif
735   return reinterpret_cast<ModuleRequest*>(data);
736 }
737 
Cast(Data * data)738 Module* Module::Cast(Data* data) {
739 #ifdef V8_ENABLE_CHECKS
740   CheckCast(data);
741 #endif
742   return reinterpret_cast<Module*>(data);
743 }
744 
745 }  // namespace v8
746 
747 #endif  // INCLUDE_V8_SCRIPT_H_
748