1// Copyright 2014 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 V8_EXECUTION_EXECUTION_H_
6#define V8_EXECUTION_EXECUTION_H_
7
8#include "src/common/globals.h"
9
10namespace v8 {
11namespace internal {
12
13class MicrotaskQueue;
14
15template <typename T>
16class Handle;
17
18class Execution final : public AllStatic {
19 public:
20  // Whether to report pending messages, or keep them pending on the isolate.
21  enum class MessageHandling { kReport, kKeepPending };
22  enum class Target { kCallable, kRunMicrotasks };
23
24  // Call a function (that is not a script), the caller supplies a receiver and
25  // an array of arguments.
26  // When the function called is not in strict mode, receiver is
27  // converted to an object.
28  V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static MaybeHandle<Object> Call(
29      Isolate* isolate, Handle<Object> callable, Handle<Object> receiver,
30      int argc, Handle<Object> argv[]);
31  // Run a script. For JSFunctions that are not scripts, use Execution::Call.
32  // Depending on the script, the host_defined_options might not be used but the
33  // caller has to provide it at all times.
34  V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static MaybeHandle<Object> CallScript(
35      Isolate* isolate, Handle<JSFunction> callable, Handle<Object> receiver,
36      Handle<Object> host_defined_options);
37
38  V8_WARN_UNUSED_RESULT static MaybeHandle<Object> CallBuiltin(
39      Isolate* isolate, Handle<JSFunction> builtin, Handle<Object> receiver,
40      int argc, Handle<Object> argv[]);
41
42  // Construct object from function, the caller supplies an array of
43  // arguments.
44  V8_WARN_UNUSED_RESULT static MaybeHandle<Object> New(
45      Isolate* isolate, Handle<Object> constructor, int argc,
46      Handle<Object> argv[]);
47  V8_WARN_UNUSED_RESULT static MaybeHandle<Object> New(
48      Isolate* isolate, Handle<Object> constructor, Handle<Object> new_target,
49      int argc, Handle<Object> argv[]);
50
51  // Call a function, just like Call(), but handle don't report exceptions
52  // externally.
53  // The return value is either the result of calling the function (if no
54  // exception occurred), or an empty handle.
55  // If message_handling is MessageHandling::kReport, exceptions (except for
56  // termination exceptions) will be stored in exception_out (if not a
57  // nullptr).
58  V8_EXPORT_PRIVATE static MaybeHandle<Object> TryCall(
59      Isolate* isolate, Handle<Object> callable, Handle<Object> receiver,
60      int argc, Handle<Object> argv[], MessageHandling message_handling,
61      MaybeHandle<Object>* exception_out, bool reschedule_terminate = true);
62  // Same as Execute::TryCall but for scripts which need an explicit
63  // host-defined options object. See Execution:CallScript
64  V8_EXPORT_PRIVATE static MaybeHandle<Object> TryCallScript(
65      Isolate* isolate, Handle<JSFunction> script_function,
66      Handle<Object> receiver, Handle<FixedArray> host_defined_options,
67      MessageHandling message_handling, MaybeHandle<Object>* exception_out,
68      bool reschedule_terminate = true);
69
70  // Convenience method for performing RunMicrotasks
71  static MaybeHandle<Object> TryRunMicrotasks(
72      Isolate* isolate, MicrotaskQueue* microtask_queue,
73      MaybeHandle<Object>* exception_out);
74
75#if V8_ENABLE_WEBASSEMBLY
76  // Call a Wasm function identified by {wasm_call_target} through the
77  // provided {wrapper_code}, which must match the function's signature.
78  // Upon return, either isolate->has_pending_exception() is true, or
79  // the function's return values are in {packed_args}.
80  V8_EXPORT_PRIVATE static void CallWasm(Isolate* isolate,
81                                         Handle<CodeT> wrapper_code,
82                                         Address wasm_call_target,
83                                         Handle<Object> object_ref,
84                                         Address packed_args);
85#endif  // V8_ENABLE_WEBASSEMBLY
86};
87
88}  // namespace internal
89}  // namespace v8
90
91#endif  // V8_EXECUTION_EXECUTION_H_
92