libv8 7.3.492.27.1-universal-darwin-16 → 8.4.255.0-universal-darwin-16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/lib/libv8/version.rb +1 -1
  3. data/vendor/v8/include/cppgc/allocation.h +124 -0
  4. data/vendor/v8/include/cppgc/garbage-collected.h +192 -0
  5. data/vendor/v8/include/cppgc/heap.h +50 -0
  6. data/vendor/v8/include/cppgc/internal/accessors.h +26 -0
  7. data/vendor/v8/include/cppgc/internal/api-constants.h +44 -0
  8. data/vendor/v8/include/cppgc/internal/compiler-specific.h +26 -0
  9. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +90 -0
  10. data/vendor/v8/include/cppgc/internal/gc-info.h +43 -0
  11. data/vendor/v8/include/cppgc/internal/logging.h +50 -0
  12. data/vendor/v8/include/cppgc/internal/persistent-node.h +109 -0
  13. data/vendor/v8/include/cppgc/internal/pointer-policies.h +133 -0
  14. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +31 -0
  15. data/vendor/v8/include/cppgc/liveness-broker.h +50 -0
  16. data/vendor/v8/include/cppgc/macros.h +26 -0
  17. data/vendor/v8/include/cppgc/member.h +206 -0
  18. data/vendor/v8/include/cppgc/persistent.h +304 -0
  19. data/vendor/v8/include/cppgc/platform.h +31 -0
  20. data/vendor/v8/include/cppgc/prefinalizer.h +54 -0
  21. data/vendor/v8/include/cppgc/source-location.h +59 -0
  22. data/vendor/v8/include/cppgc/trace-trait.h +67 -0
  23. data/vendor/v8/include/cppgc/type-traits.h +109 -0
  24. data/vendor/v8/include/cppgc/visitor.h +137 -0
  25. data/vendor/v8/include/libplatform/libplatform.h +13 -19
  26. data/vendor/v8/include/libplatform/v8-tracing.h +50 -15
  27. data/vendor/v8/include/v8-fast-api-calls.h +412 -0
  28. data/vendor/v8/include/v8-inspector-protocol.h +4 -4
  29. data/vendor/v8/include/v8-inspector.h +60 -29
  30. data/vendor/v8/include/v8-internal.h +98 -82
  31. data/vendor/v8/include/v8-platform.h +181 -42
  32. data/vendor/v8/include/v8-profiler.h +162 -224
  33. data/vendor/v8/include/v8-util.h +1 -13
  34. data/vendor/v8/include/v8-version-string.h +1 -1
  35. data/vendor/v8/include/v8-version.h +4 -4
  36. data/vendor/v8/include/v8-wasm-trap-handler-posix.h +1 -1
  37. data/vendor/v8/include/v8-wasm-trap-handler-win.h +1 -1
  38. data/vendor/v8/include/v8.h +1990 -611
  39. data/vendor/v8/include/v8config.h +129 -48
  40. data/vendor/v8/out.gn/libv8/obj/libv8_libbase.a +0 -0
  41. data/vendor/v8/out.gn/libv8/obj/libv8_libplatform.a +0 -0
  42. data/vendor/v8/out.gn/libv8/obj/libv8_monolith.a +0 -0
  43. data/vendor/v8/out.gn/libv8/obj/third_party/icu/libicui18n.a +0 -0
  44. data/vendor/v8/out.gn/libv8/obj/third_party/icu/libicuuc.a +0 -0
  45. data/vendor/v8/out.gn/libv8/obj/third_party/zlib/google/libcompression_utils_portable.a +0 -0
  46. data/vendor/v8/out.gn/libv8/obj/third_party/zlib/libchrome_zlib.a +0 -0
  47. metadata +34 -8
  48. data/vendor/v8/include/v8-testing.h +0 -48
@@ -5,9 +5,9 @@
5
5
  #ifndef V8_V8_INSPECTOR_PROTOCOL_H_
6
6
  #define V8_V8_INSPECTOR_PROTOCOL_H_
7
7
 
8
- #include "inspector/Debugger.h" // NOLINT(build/include)
9
- #include "inspector/Runtime.h" // NOLINT(build/include)
10
- #include "inspector/Schema.h" // NOLINT(build/include)
11
- #include "v8-inspector.h" // NOLINT(build/include)
8
+ #include "inspector/Debugger.h" // NOLINT(build/include_directory)
9
+ #include "inspector/Runtime.h" // NOLINT(build/include_directory)
10
+ #include "inspector/Schema.h" // NOLINT(build/include_directory)
11
+ #include "v8-inspector.h" // NOLINT(build/include_directory)
12
12
 
13
13
  #endif // V8_V8_INSPECTOR_PROTOCOL_H_
@@ -9,8 +9,9 @@
9
9
  #include <cctype>
10
10
 
11
11
  #include <memory>
12
+ #include <unordered_map>
12
13
 
13
- #include "v8.h" // NOLINT(build/include)
14
+ #include "v8.h" // NOLINT(build/include_directory)
14
15
 
15
16
  namespace v8_inspector {
16
17
 
@@ -24,6 +25,7 @@ namespace Runtime {
24
25
  namespace API {
25
26
  class RemoteObject;
26
27
  class StackTrace;
28
+ class StackTraceId;
27
29
  }
28
30
  }
29
31
  namespace Schema {
@@ -63,15 +65,15 @@ class V8_EXPORT StringView {
63
65
  class V8_EXPORT StringBuffer {
64
66
  public:
65
67
  virtual ~StringBuffer() = default;
66
- virtual const StringView& string() = 0;
68
+ virtual StringView string() const = 0;
67
69
  // This method copies contents.
68
- static std::unique_ptr<StringBuffer> create(const StringView&);
70
+ static std::unique_ptr<StringBuffer> create(StringView);
69
71
  };
70
72
 
71
73
  class V8_EXPORT V8ContextInfo {
72
74
  public:
73
75
  V8ContextInfo(v8::Local<v8::Context> context, int contextGroupId,
74
- const StringView& humanReadableName)
76
+ StringView humanReadableName)
75
77
  : context(context),
76
78
  contextGroupId(contextGroupId),
77
79
  humanReadableName(humanReadableName),
@@ -87,7 +89,6 @@ class V8_EXPORT V8ContextInfo {
87
89
 
88
90
  static int executionContextId(v8::Local<v8::Context> context);
89
91
 
90
- private:
91
92
  // Disallow copying and allocating this one.
92
93
  enum NotNullTagEnum { NotNullLiteral };
93
94
  void* operator new(size_t) = delete;
@@ -110,6 +111,8 @@ class V8_EXPORT V8StackTrace {
110
111
  virtual ~V8StackTrace() = default;
111
112
  virtual std::unique_ptr<protocol::Runtime::API::StackTrace>
112
113
  buildInspectorObject() const = 0;
114
+ virtual std::unique_ptr<protocol::Runtime::API::StackTrace>
115
+ buildInspectorObject(int maxAsyncDepth) const = 0;
113
116
  virtual std::unique_ptr<StringBuffer> toString() const = 0;
114
117
 
115
118
  // Safe to pass between threads, drops async chain.
@@ -129,35 +132,36 @@ class V8_EXPORT V8InspectorSession {
129
132
  virtual void addInspectedObject(std::unique_ptr<Inspectable>) = 0;
130
133
 
131
134
  // Dispatching protocol messages.
132
- static bool canDispatchMethod(const StringView& method);
133
- virtual void dispatchProtocolMessage(const StringView& message) = 0;
134
- virtual std::unique_ptr<StringBuffer> stateJSON() = 0;
135
+ static bool canDispatchMethod(StringView method);
136
+ virtual void dispatchProtocolMessage(StringView message) = 0;
137
+ virtual std::vector<uint8_t> state() = 0;
135
138
  virtual std::vector<std::unique_ptr<protocol::Schema::API::Domain>>
136
139
  supportedDomains() = 0;
137
140
 
138
141
  // Debugger actions.
139
- virtual void schedulePauseOnNextStatement(const StringView& breakReason,
140
- const StringView& breakDetails) = 0;
142
+ virtual void schedulePauseOnNextStatement(StringView breakReason,
143
+ StringView breakDetails) = 0;
141
144
  virtual void cancelPauseOnNextStatement() = 0;
142
- virtual void breakProgram(const StringView& breakReason,
143
- const StringView& breakDetails) = 0;
145
+ virtual void breakProgram(StringView breakReason,
146
+ StringView breakDetails) = 0;
144
147
  virtual void setSkipAllPauses(bool) = 0;
145
- virtual void resume() = 0;
148
+ virtual void resume(bool setTerminateOnResume = false) = 0;
146
149
  virtual void stepOver() = 0;
147
150
  virtual std::vector<std::unique_ptr<protocol::Debugger::API::SearchMatch>>
148
- searchInTextByLines(const StringView& text, const StringView& query,
149
- bool caseSensitive, bool isRegex) = 0;
151
+ searchInTextByLines(StringView text, StringView query, bool caseSensitive,
152
+ bool isRegex) = 0;
150
153
 
151
154
  // Remote objects.
152
155
  virtual std::unique_ptr<protocol::Runtime::API::RemoteObject> wrapObject(
153
- v8::Local<v8::Context>, v8::Local<v8::Value>, const StringView& groupName,
156
+ v8::Local<v8::Context>, v8::Local<v8::Value>, StringView groupName,
154
157
  bool generatePreview) = 0;
155
158
 
156
159
  virtual bool unwrapObject(std::unique_ptr<StringBuffer>* error,
157
- const StringView& objectId, v8::Local<v8::Value>*,
160
+ StringView objectId, v8::Local<v8::Value>*,
158
161
  v8::Local<v8::Context>*,
159
162
  std::unique_ptr<StringBuffer>* objectGroup) = 0;
160
- virtual void releaseObjectGroup(const StringView&) = 0;
163
+ virtual void releaseObjectGroup(StringView) = 0;
164
+ virtual void triggerPreciseCoverageDeltaUpdate(StringView occassion) = 0;
161
165
  };
162
166
 
163
167
  class V8_EXPORT V8InspectorClient {
@@ -228,12 +232,20 @@ class V8_EXPORT V8InspectorClient {
228
232
  struct V8_EXPORT V8StackTraceId {
229
233
  uintptr_t id;
230
234
  std::pair<int64_t, int64_t> debugger_id;
235
+ bool should_pause = false;
231
236
 
232
237
  V8StackTraceId();
238
+ V8StackTraceId(const V8StackTraceId&) = default;
233
239
  V8StackTraceId(uintptr_t id, const std::pair<int64_t, int64_t> debugger_id);
240
+ V8StackTraceId(uintptr_t id, const std::pair<int64_t, int64_t> debugger_id,
241
+ bool should_pause);
242
+ explicit V8StackTraceId(StringView);
243
+ V8StackTraceId& operator=(const V8StackTraceId&) = default;
244
+ V8StackTraceId& operator=(V8StackTraceId&&) noexcept = default;
234
245
  ~V8StackTraceId() = default;
235
246
 
236
247
  bool IsInvalid() const;
248
+ std::unique_ptr<StringBuffer> ToString();
237
249
  };
238
250
 
239
251
  class V8_EXPORT V8Inspector {
@@ -252,26 +264,26 @@ class V8_EXPORT V8Inspector {
252
264
  virtual void idleFinished() = 0;
253
265
 
254
266
  // Async stack traces instrumentation.
255
- virtual void asyncTaskScheduled(const StringView& taskName, void* task,
267
+ virtual void asyncTaskScheduled(StringView taskName, void* task,
256
268
  bool recurring) = 0;
257
269
  virtual void asyncTaskCanceled(void* task) = 0;
258
270
  virtual void asyncTaskStarted(void* task) = 0;
259
271
  virtual void asyncTaskFinished(void* task) = 0;
260
272
  virtual void allAsyncTasksCanceled() = 0;
261
273
 
262
- virtual V8StackTraceId storeCurrentStackTrace(
263
- const StringView& description) = 0;
274
+ virtual V8StackTraceId storeCurrentStackTrace(StringView description) = 0;
264
275
  virtual void externalAsyncTaskStarted(const V8StackTraceId& parent) = 0;
265
276
  virtual void externalAsyncTaskFinished(const V8StackTraceId& parent) = 0;
266
277
 
267
278
  // Exceptions instrumentation.
268
- virtual unsigned exceptionThrown(
269
- v8::Local<v8::Context>, const StringView& message,
270
- v8::Local<v8::Value> exception, const StringView& detailedMessage,
271
- const StringView& url, unsigned lineNumber, unsigned columnNumber,
272
- std::unique_ptr<V8StackTrace>, int scriptId) = 0;
279
+ virtual unsigned exceptionThrown(v8::Local<v8::Context>, StringView message,
280
+ v8::Local<v8::Value> exception,
281
+ StringView detailedMessage, StringView url,
282
+ unsigned lineNumber, unsigned columnNumber,
283
+ std::unique_ptr<V8StackTrace>,
284
+ int scriptId) = 0;
273
285
  virtual void exceptionRevoked(v8::Local<v8::Context>, unsigned exceptionId,
274
- const StringView& message) = 0;
286
+ StringView message) = 0;
275
287
 
276
288
  // Connection.
277
289
  class V8_EXPORT Channel {
@@ -282,13 +294,32 @@ class V8_EXPORT V8Inspector {
282
294
  virtual void sendNotification(std::unique_ptr<StringBuffer> message) = 0;
283
295
  virtual void flushProtocolNotifications() = 0;
284
296
  };
285
- virtual std::unique_ptr<V8InspectorSession> connect(
286
- int contextGroupId, Channel*, const StringView& state) = 0;
297
+ virtual std::unique_ptr<V8InspectorSession> connect(int contextGroupId,
298
+ Channel*,
299
+ StringView state) = 0;
287
300
 
288
301
  // API methods.
289
302
  virtual std::unique_ptr<V8StackTrace> createStackTrace(
290
303
  v8::Local<v8::StackTrace>) = 0;
291
304
  virtual std::unique_ptr<V8StackTrace> captureStackTrace(bool fullStack) = 0;
305
+
306
+ // Performance counters.
307
+ class V8_EXPORT Counters : public std::enable_shared_from_this<Counters> {
308
+ public:
309
+ explicit Counters(v8::Isolate* isolate);
310
+ ~Counters();
311
+ const std::unordered_map<std::string, int>& getCountersMap() const {
312
+ return m_countersMap;
313
+ }
314
+
315
+ private:
316
+ static int* getCounterPtr(const char* name);
317
+
318
+ v8::Isolate* m_isolate;
319
+ std::unordered_map<std::string, int> m_countersMap;
320
+ };
321
+
322
+ virtual std::shared_ptr<Counters> enableCounters() = 0;
292
323
  };
293
324
 
294
325
  } // namespace v8_inspector
@@ -7,10 +7,11 @@
7
7
 
8
8
  #include <stddef.h>
9
9
  #include <stdint.h>
10
+ #include <string.h>
10
11
  #include <type_traits>
11
12
 
12
- #include "v8-version.h" // NOLINT(build/include)
13
- #include "v8config.h" // NOLINT(build/include)
13
+ #include "v8-version.h" // NOLINT(build/include_directory)
14
+ #include "v8config.h" // NOLINT(build/include_directory)
14
15
 
15
16
  namespace v8 {
16
17
 
@@ -29,9 +30,8 @@ static const Address kNullAddress = 0;
29
30
  * Configuration of tagging scheme.
30
31
  */
31
32
  const int kApiSystemPointerSize = sizeof(void*);
32
- const int kApiTaggedSize = kApiSystemPointerSize;
33
33
  const int kApiDoubleSize = sizeof(double);
34
- const int kApiIntSize = sizeof(int);
34
+ const int kApiInt32Size = sizeof(int32_t);
35
35
  const int kApiInt64Size = sizeof(int64_t);
36
36
 
37
37
  // Tag information for HeapObject.
@@ -48,28 +48,32 @@ const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
48
48
  template <size_t tagged_ptr_size>
49
49
  struct SmiTagging;
50
50
 
51
+ constexpr intptr_t kIntptrAllBitsSet = intptr_t{-1};
52
+ constexpr uintptr_t kUintptrAllBitsSet =
53
+ static_cast<uintptr_t>(kIntptrAllBitsSet);
54
+
51
55
  // Smi constants for systems where tagged pointer is a 32-bit value.
52
56
  template <>
53
57
  struct SmiTagging<4> {
54
58
  enum { kSmiShiftSize = 0, kSmiValueSize = 31 };
59
+
60
+ static constexpr intptr_t kSmiMinValue =
61
+ static_cast<intptr_t>(kUintptrAllBitsSet << (kSmiValueSize - 1));
62
+ static constexpr intptr_t kSmiMaxValue = -(kSmiMinValue + 1);
63
+
55
64
  V8_INLINE static int SmiToInt(const internal::Address value) {
56
65
  int shift_bits = kSmiTagSize + kSmiShiftSize;
57
- // Shift down (requires >> to be sign extending).
58
- return static_cast<int>(static_cast<intptr_t>(value)) >> shift_bits;
66
+ // Truncate and shift down (requires >> to be sign extending).
67
+ return static_cast<int32_t>(static_cast<uint32_t>(value)) >> shift_bits;
59
68
  }
60
69
  V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
61
- // To be representable as an tagged small integer, the two
62
- // most-significant bits of 'value' must be either 00 or 11 due to
63
- // sign-extension. To check this we add 01 to the two
64
- // most-significant bits, and check if the most-significant bit is 0.
65
- //
66
- // CAUTION: The original code below:
67
- // bool result = ((value + 0x40000000) & 0x80000000) == 0;
68
- // may lead to incorrect results according to the C language spec, and
69
- // in fact doesn't work correctly with gcc4.1.1 in some cases: The
70
- // compiler may produce undefined results in case of signed integer
71
- // overflow. The computation must be done w/ unsigned ints.
72
- return static_cast<uintptr_t>(value) + 0x40000000U < 0x80000000U;
70
+ // Is value in range [kSmiMinValue, kSmiMaxValue].
71
+ // Use unsigned operations in order to avoid undefined behaviour in case of
72
+ // signed integer overflow.
73
+ return (static_cast<uintptr_t>(value) -
74
+ static_cast<uintptr_t>(kSmiMinValue)) <=
75
+ (static_cast<uintptr_t>(kSmiMaxValue) -
76
+ static_cast<uintptr_t>(kSmiMinValue));
73
77
  }
74
78
  };
75
79
 
@@ -77,6 +81,11 @@ struct SmiTagging<4> {
77
81
  template <>
78
82
  struct SmiTagging<8> {
79
83
  enum { kSmiShiftSize = 31, kSmiValueSize = 32 };
84
+
85
+ static constexpr intptr_t kSmiMinValue =
86
+ static_cast<intptr_t>(kUintptrAllBitsSet << (kSmiValueSize - 1));
87
+ static constexpr intptr_t kSmiMaxValue = -(kSmiMinValue + 1);
88
+
80
89
  V8_INLINE static int SmiToInt(const internal::Address value) {
81
90
  int shift_bits = kSmiTagSize + kSmiShiftSize;
82
91
  // Shift down and throw away top 32 bits.
@@ -88,22 +97,31 @@ struct SmiTagging<8> {
88
97
  }
89
98
  };
90
99
 
91
- #if defined(V8_COMPRESS_POINTERS)
100
+ #ifdef V8_COMPRESS_POINTERS
92
101
  static_assert(
93
102
  kApiSystemPointerSize == kApiInt64Size,
94
103
  "Pointer compression can be enabled only for 64-bit architectures");
104
+ const int kApiTaggedSize = kApiInt32Size;
105
+ #else
106
+ const int kApiTaggedSize = kApiSystemPointerSize;
95
107
  #endif
96
108
 
97
- #if defined(V8_COMPRESS_POINTERS) || defined(V8_31BIT_SMIS_ON_64BIT_ARCH)
98
- typedef SmiTagging<kApiIntSize> PlatformSmiTagging;
109
+ constexpr bool PointerCompressionIsEnabled() {
110
+ return kApiTaggedSize != kApiSystemPointerSize;
111
+ }
112
+
113
+ #ifdef V8_31BIT_SMIS_ON_64BIT_ARCH
114
+ using PlatformSmiTagging = SmiTagging<kApiInt32Size>;
99
115
  #else
100
- typedef SmiTagging<kApiSystemPointerSize> PlatformSmiTagging;
116
+ using PlatformSmiTagging = SmiTagging<kApiTaggedSize>;
101
117
  #endif
102
118
 
119
+ // TODO(ishell): Consinder adding kSmiShiftBits = kSmiShiftSize + kSmiTagSize
120
+ // since it's used much more often than the inividual constants.
103
121
  const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
104
122
  const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
105
- const int kSmiMinValue = (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1);
106
- const int kSmiMaxValue = -(kSmiMinValue + 1);
123
+ const int kSmiMinValue = static_cast<int>(PlatformSmiTagging::kSmiMinValue);
124
+ const int kSmiMaxValue = static_cast<int>(PlatformSmiTagging::kSmiMaxValue);
107
125
  constexpr bool SmiValuesAre31Bits() { return kSmiValueSize == 31; }
108
126
  constexpr bool SmiValuesAre32Bits() { return kSmiValueSize == 32; }
109
127
 
@@ -122,23 +140,16 @@ class Internals {
122
140
  // These values match non-compiler-dependent values defined within
123
141
  // the implementation of v8.
124
142
  static const int kHeapObjectMapOffset = 0;
125
- static const int kMapInstanceTypeOffset = 1 * kApiTaggedSize + kApiIntSize;
126
- static const int kStringResourceOffset = 1 * kApiTaggedSize + 2 * kApiIntSize;
143
+ static const int kMapInstanceTypeOffset = 1 * kApiTaggedSize + kApiInt32Size;
144
+ static const int kStringResourceOffset =
145
+ 1 * kApiTaggedSize + 2 * kApiInt32Size;
127
146
 
128
147
  static const int kOddballKindOffset = 4 * kApiTaggedSize + kApiDoubleSize;
129
- static const int kForeignAddressOffset = kApiTaggedSize;
130
148
  static const int kJSObjectHeaderSize = 3 * kApiTaggedSize;
131
- static const int kJSObjectHeaderSizeForEmbedderFields =
132
- (kJSObjectHeaderSize + kApiSystemPointerSize - 1) &
133
- -kApiSystemPointerSize;
134
149
  static const int kFixedArrayHeaderSize = 2 * kApiTaggedSize;
135
150
  static const int kEmbedderDataArrayHeaderSize = 2 * kApiTaggedSize;
136
- static const int kEmbedderDataSlotSize =
137
- #ifdef V8_COMPRESS_POINTERS
138
- 2 *
139
- #endif
140
- kApiSystemPointerSize;
141
- static const int kNativeContextEmbedderDataOffset = 7 * kApiTaggedSize;
151
+ static const int kEmbedderDataSlotSize = kApiSystemPointerSize;
152
+ static const int kNativeContextEmbedderDataOffset = 6 * kApiTaggedSize;
142
153
  static const int kFullStringRepresentationMask = 0x0f;
143
154
  static const int kStringEncodingMask = 0x8;
144
155
  static const int kExternalTwoByteRepresentationTag = 0x02;
@@ -146,15 +157,22 @@ class Internals {
146
157
 
147
158
  static const uint32_t kNumIsolateDataSlots = 4;
148
159
 
160
+ // IsolateData layout guarantees.
149
161
  static const int kIsolateEmbedderDataOffset = 0;
150
162
  static const int kExternalMemoryOffset =
151
- kNumIsolateDataSlots * kApiTaggedSize;
163
+ kNumIsolateDataSlots * kApiSystemPointerSize;
152
164
  static const int kExternalMemoryLimitOffset =
153
165
  kExternalMemoryOffset + kApiInt64Size;
154
- static const int kExternalMemoryAtLastMarkCompactOffset =
166
+ static const int kExternalMemoryLowSinceMarkCompactOffset =
155
167
  kExternalMemoryLimitOffset + kApiInt64Size;
168
+ static const int kIsolateFastCCallCallerFpOffset =
169
+ kExternalMemoryLowSinceMarkCompactOffset + kApiInt64Size;
170
+ static const int kIsolateFastCCallCallerPcOffset =
171
+ kIsolateFastCCallCallerFpOffset + kApiSystemPointerSize;
172
+ static const int kIsolateStackGuardOffset =
173
+ kIsolateFastCCallCallerPcOffset + kApiSystemPointerSize;
156
174
  static const int kIsolateRootsOffset =
157
- kExternalMemoryAtLastMarkCompactOffset + kApiInt64Size;
175
+ kIsolateStackGuardOffset + 7 * kApiSystemPointerSize;
158
176
 
159
177
  static const int kUndefinedValueRootIndex = 4;
160
178
  static const int kTheHoleValueRootIndex = 5;
@@ -163,18 +181,15 @@ class Internals {
163
181
  static const int kFalseValueRootIndex = 8;
164
182
  static const int kEmptyStringRootIndex = 9;
165
183
 
166
- static const int kNodeClassIdOffset = 1 * kApiTaggedSize;
167
- static const int kNodeFlagsOffset = 1 * kApiTaggedSize + 3;
184
+ static const int kNodeClassIdOffset = 1 * kApiSystemPointerSize;
185
+ static const int kNodeFlagsOffset = 1 * kApiSystemPointerSize + 3;
168
186
  static const int kNodeStateMask = 0x7;
169
187
  static const int kNodeStateIsWeakValue = 2;
170
188
  static const int kNodeStateIsPendingValue = 3;
171
- static const int kNodeStateIsNearDeathValue = 4;
172
- static const int kNodeIsIndependentShift = 3;
173
- static const int kNodeIsActiveShift = 4;
174
189
 
175
- static const int kFirstNonstringType = 0x80;
176
- static const int kOddballType = 0x83;
177
- static const int kForeignType = 0x87;
190
+ static const int kFirstNonstringType = 0x40;
191
+ static const int kOddballType = 0x43;
192
+ static const int kForeignType = 0x46;
178
193
  static const int kJSSpecialApiObjectType = 0x410;
179
194
  static const int kJSApiObjectType = 0x420;
180
195
  static const int kJSObjectType = 0x421;
@@ -182,6 +197,12 @@ class Internals {
182
197
  static const int kUndefinedOddballKind = 5;
183
198
  static const int kNullOddballKind = 3;
184
199
 
200
+ // Constants used by PropertyCallbackInfo to check if we should throw when an
201
+ // error occurs.
202
+ static const int kThrowOnError = 0;
203
+ static const int kDontThrow = 1;
204
+ static const int kInferShouldThrowMode = 2;
205
+
185
206
  // Soft limit for AdjustAmountofExternalAllocatedMemory. Trigger an
186
207
  // incremental GC once the external memory reaches this limit.
187
208
  static constexpr int kExternalAllocationSoftLimit = 64 * 1024 * 1024;
@@ -273,15 +294,26 @@ class Internals {
273
294
  V8_INLINE static T ReadRawField(internal::Address heap_object_ptr,
274
295
  int offset) {
275
296
  internal::Address addr = heap_object_ptr + offset - kHeapObjectTag;
297
+ #ifdef V8_COMPRESS_POINTERS
298
+ if (sizeof(T) > kApiTaggedSize) {
299
+ // TODO(ishell, v8:8875): When pointer compression is enabled 8-byte size
300
+ // fields (external pointers, doubles and BigInt data) are only
301
+ // kTaggedSize aligned so we have to use unaligned pointer friendly way of
302
+ // accessing them in order to avoid undefined behavior in C++ code.
303
+ T r;
304
+ memcpy(&r, reinterpret_cast<void*>(addr), sizeof(T));
305
+ return r;
306
+ }
307
+ #endif
276
308
  return *reinterpret_cast<const T*>(addr);
277
309
  }
278
310
 
279
311
  V8_INLINE static internal::Address ReadTaggedPointerField(
280
312
  internal::Address heap_object_ptr, int offset) {
281
313
  #ifdef V8_COMPRESS_POINTERS
282
- int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
314
+ uint32_t value = ReadRawField<uint32_t>(heap_object_ptr, offset);
283
315
  internal::Address root = GetRootFromOnHeapAddress(heap_object_ptr);
284
- return root + static_cast<internal::Address>(static_cast<intptr_t>(value));
316
+ return root + static_cast<internal::Address>(static_cast<uintptr_t>(value));
285
317
  #else
286
318
  return ReadRawField<internal::Address>(heap_object_ptr, offset);
287
319
  #endif
@@ -290,52 +322,27 @@ class Internals {
290
322
  V8_INLINE static internal::Address ReadTaggedSignedField(
291
323
  internal::Address heap_object_ptr, int offset) {
292
324
  #ifdef V8_COMPRESS_POINTERS
293
- int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
294
- return static_cast<internal::Address>(static_cast<intptr_t>(value));
295
- #else
296
- return ReadRawField<internal::Address>(heap_object_ptr, offset);
297
- #endif
298
- }
299
-
300
- V8_INLINE static internal::Address ReadTaggedAnyField(
301
- internal::Address heap_object_ptr, int offset) {
302
- #ifdef V8_COMPRESS_POINTERS
303
- int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
304
- internal::Address root_mask = static_cast<internal::Address>(
305
- -static_cast<intptr_t>(value & kSmiTagMask));
306
- internal::Address root_or_zero =
307
- root_mask & GetRootFromOnHeapAddress(heap_object_ptr);
308
- return root_or_zero +
309
- static_cast<internal::Address>(static_cast<intptr_t>(value));
325
+ uint32_t value = ReadRawField<uint32_t>(heap_object_ptr, offset);
326
+ return static_cast<internal::Address>(static_cast<uintptr_t>(value));
310
327
  #else
311
328
  return ReadRawField<internal::Address>(heap_object_ptr, offset);
312
329
  #endif
313
330
  }
314
331
 
315
332
  #ifdef V8_COMPRESS_POINTERS
333
+ // See v8:7703 or src/ptr-compr.* for details about pointer compression.
316
334
  static constexpr size_t kPtrComprHeapReservationSize = size_t{1} << 32;
317
- static constexpr size_t kPtrComprIsolateRootBias =
318
- kPtrComprHeapReservationSize / 2;
319
335
  static constexpr size_t kPtrComprIsolateRootAlignment = size_t{1} << 32;
320
336
 
321
337
  V8_INLINE static internal::Address GetRootFromOnHeapAddress(
322
338
  internal::Address addr) {
323
- return (addr + kPtrComprIsolateRootBias) &
324
- -static_cast<intptr_t>(kPtrComprIsolateRootAlignment);
339
+ return addr & -static_cast<intptr_t>(kPtrComprIsolateRootAlignment);
325
340
  }
326
341
 
327
- #else
328
-
329
- template <typename T>
330
- V8_INLINE static T ReadEmbedderData(const v8::Context* context, int index) {
331
- typedef internal::Address A;
332
- typedef internal::Internals I;
333
- A ctx = *reinterpret_cast<const A*>(context);
334
- A embedder_data =
335
- I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
336
- int value_offset =
337
- I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
338
- return I::ReadRawField<T>(embedder_data, value_offset);
342
+ V8_INLINE static internal::Address DecompressTaggedAnyField(
343
+ internal::Address heap_object_ptr, uint32_t value) {
344
+ internal::Address root = GetRootFromOnHeapAddress(heap_object_ptr);
345
+ return root + static_cast<internal::Address>(static_cast<uintptr_t>(value));
339
346
  }
340
347
  #endif // V8_COMPRESS_POINTERS
341
348
  };
@@ -367,6 +374,15 @@ V8_INLINE void PerformCastCheck(T* data) {
367
374
  // that's guaranteed to never be in ReadOnlySpace.
368
375
  V8_EXPORT internal::Isolate* IsolateFromNeverReadOnlySpaceObject(Address obj);
369
376
 
377
+ // Returns if we need to throw when an error occurs. This infers the language
378
+ // mode based on the current context and the closure. This returns true if the
379
+ // language mode is strict.
380
+ V8_EXPORT bool ShouldThrowOnError(v8::internal::Isolate* isolate);
381
+
382
+ // A base class for backing stores, which is needed due to vagaries of
383
+ // how static casts work with std::shared_ptr.
384
+ class BackingStoreBase {};
385
+
370
386
  } // namespace internal
371
387
  } // namespace v8
372
388