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_MESSAGE_H_
6 #define INCLUDE_V8_MESSAGE_H_
7 
8 #include <stdio.h>
9 
10 #include <iosfwd>
11 
12 #include "v8-local-handle.h"  // NOLINT(build/include_directory)
13 #include "v8-maybe.h"         // NOLINT(build/include_directory)
14 #include "v8-primitive.h"     // NOLINT(build/include_directory)
15 #include "v8config.h"         // NOLINT(build/include_directory)
16 
17 namespace v8 {
18 
19 class Integer;
20 class PrimitiveArray;
21 class StackTrace;
22 class String;
23 class Value;
24 
25 /**
26  * The optional attributes of ScriptOrigin.
27  */
28 class ScriptOriginOptions {
29  public:
ScriptOriginOptions(bool is_shared_cross_origin = false, bool is_opaque = false, bool is_wasm = false, bool is_module = false)30   V8_INLINE ScriptOriginOptions(bool is_shared_cross_origin = false,
31                                 bool is_opaque = false, bool is_wasm = false,
32                                 bool is_module = false)
33       : flags_((is_shared_cross_origin ? kIsSharedCrossOrigin : 0) |
34                (is_wasm ? kIsWasm : 0) | (is_opaque ? kIsOpaque : 0) |
35                (is_module ? kIsModule : 0)) {}
ScriptOriginOptions(int flags)36   V8_INLINE ScriptOriginOptions(int flags)
37       : flags_(flags &
38                (kIsSharedCrossOrigin | kIsOpaque | kIsWasm | kIsModule)) {}
39 
IsSharedCrossOrigin() const40   bool IsSharedCrossOrigin() const {
41     return (flags_ & kIsSharedCrossOrigin) != 0;
42   }
IsOpaque() const43   bool IsOpaque() const { return (flags_ & kIsOpaque) != 0; }
IsWasm() const44   bool IsWasm() const { return (flags_ & kIsWasm) != 0; }
IsModule() const45   bool IsModule() const { return (flags_ & kIsModule) != 0; }
46 
Flags() const47   int Flags() const { return flags_; }
48 
49  private:
50   enum {
51     kIsSharedCrossOrigin = 1,
52     kIsOpaque = 1 << 1,
53     kIsWasm = 1 << 2,
54     kIsModule = 1 << 3
55   };
56   const int flags_;
57 };
58 
59 /**
60  * The origin, within a file, of a script.
61  */
62 class V8_EXPORT ScriptOrigin {
63  public:
ScriptOrigin(Isolate* isolate, Local<Value> resource_name, int resource_line_offset = 0, int resource_column_offset = 0, bool resource_is_shared_cross_origin = false, int script_id = -1, Local<Value> source_map_url = Local<Value>(), bool resource_is_opaque = false, bool is_wasm = false, bool is_module = false, Local<Data> host_defined_options = Local<Data>())64   V8_INLINE ScriptOrigin(Isolate* isolate, Local<Value> resource_name,
65                          int resource_line_offset = 0,
66                          int resource_column_offset = 0,
67                          bool resource_is_shared_cross_origin = false,
68                          int script_id = -1,
69                          Local<Value> source_map_url = Local<Value>(),
70                          bool resource_is_opaque = false, bool is_wasm = false,
71                          bool is_module = false,
72                          Local<Data> host_defined_options = Local<Data>())
73       : v8_isolate_(isolate),
74         resource_name_(resource_name),
75         resource_line_offset_(resource_line_offset),
76         resource_column_offset_(resource_column_offset),
77         options_(resource_is_shared_cross_origin, resource_is_opaque, is_wasm,
78                  is_module),
79         script_id_(script_id),
80         source_map_url_(source_map_url),
81         host_defined_options_(host_defined_options) {
82     VerifyHostDefinedOptions();
83   }
84 
85   V8_INLINE Local<Value> ResourceName() const;
86   V8_INLINE int LineOffset() const;
87   V8_INLINE int ColumnOffset() const;
88   V8_INLINE int ScriptId() const;
89   V8_INLINE Local<Value> SourceMapUrl() const;
90   V8_INLINE Local<Data> GetHostDefinedOptions() const;
Options() const91   V8_INLINE ScriptOriginOptions Options() const { return options_; }
92 
93  private:
94   void VerifyHostDefinedOptions() const;
95   Isolate* v8_isolate_;
96   Local<Value> resource_name_;
97   int resource_line_offset_;
98   int resource_column_offset_;
99   ScriptOriginOptions options_;
100   int script_id_;
101   Local<Value> source_map_url_;
102   Local<Data> host_defined_options_;
103 };
104 
105 /**
106  * An error message.
107  */
108 class V8_EXPORT Message {
109  public:
110   Local<String> Get() const;
111 
112   /**
113    * Return the isolate to which the Message belongs.
114    */
115   Isolate* GetIsolate() const;
116 
117   V8_WARN_UNUSED_RESULT MaybeLocal<String> GetSource(
118       Local<Context> context) const;
119   V8_WARN_UNUSED_RESULT MaybeLocal<String> GetSourceLine(
120       Local<Context> context) const;
121 
122   /**
123    * Returns the origin for the script from where the function causing the
124    * error originates.
125    */
126   ScriptOrigin GetScriptOrigin() const;
127 
128   /**
129    * Returns the resource name for the script from where the function causing
130    * the error originates.
131    */
132   Local<Value> GetScriptResourceName() const;
133 
134   /**
135    * Exception stack trace. By default stack traces are not captured for
136    * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows
137    * to change this option.
138    */
139   Local<StackTrace> GetStackTrace() const;
140 
141   /**
142    * Returns the number, 1-based, of the line where the error occurred.
143    */
144   V8_WARN_UNUSED_RESULT Maybe<int> GetLineNumber(Local<Context> context) const;
145 
146   /**
147    * Returns the index within the script of the first character where
148    * the error occurred.
149    */
150   int GetStartPosition() const;
151 
152   /**
153    * Returns the index within the script of the last character where
154    * the error occurred.
155    */
156   int GetEndPosition() const;
157 
158   /**
159    * Returns the Wasm function index where the error occurred. Returns -1 if
160    * message is not from a Wasm script.
161    */
162   int GetWasmFunctionIndex() const;
163 
164   /**
165    * Returns the error level of the message.
166    */
167   int ErrorLevel() const;
168 
169   /**
170    * Returns the index within the line of the first character where
171    * the error occurred.
172    */
173   int GetStartColumn() const;
174   V8_WARN_UNUSED_RESULT Maybe<int> GetStartColumn(Local<Context> context) const;
175 
176   /**
177    * Returns the index within the line of the last character where
178    * the error occurred.
179    */
180   int GetEndColumn() const;
181   V8_WARN_UNUSED_RESULT Maybe<int> GetEndColumn(Local<Context> context) const;
182 
183   /**
184    * Passes on the value set by the embedder when it fed the script from which
185    * this Message was generated to V8.
186    */
187   bool IsSharedCrossOrigin() const;
188   bool IsOpaque() const;
189 
190   static void PrintCurrentStackTrace(Isolate* isolate, std::ostream& out);
191 
192   static const int kNoLineNumberInfo = 0;
193   static const int kNoColumnInfo = 0;
194   static const int kNoScriptIdInfo = 0;
195   static const int kNoWasmFunctionIndexInfo = -1;
196 };
197 
ResourceName() const198 Local<Value> ScriptOrigin::ResourceName() const { return resource_name_; }
199 
GetHostDefinedOptions() const200 Local<Data> ScriptOrigin::GetHostDefinedOptions() const {
201   return host_defined_options_;
202 }
203 
LineOffset() const204 int ScriptOrigin::LineOffset() const { return resource_line_offset_; }
205 
ColumnOffset() const206 int ScriptOrigin::ColumnOffset() const { return resource_column_offset_; }
207 
ScriptId() const208 int ScriptOrigin::ScriptId() const { return script_id_; }
209 
SourceMapUrl() const210 Local<Value> ScriptOrigin::SourceMapUrl() const { return source_map_url_; }
211 
212 }  // namespace v8
213 
214 #endif  // INCLUDE_V8_MESSAGE_H_
215