libv8 3.11.8.13-amd64-freebsd-9 → 3.16.14.3-amd64-freebsd-9
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/libv8/arch.rb +10 -2
- data/lib/libv8/version.rb +1 -1
- data/vendor/v8/include/v8-debug.h +9 -1
- data/vendor/v8/include/v8-preparser.h +4 -3
- data/vendor/v8/include/v8-profiler.h +25 -25
- data/vendor/v8/include/v8-testing.h +4 -3
- data/vendor/v8/include/v8.h +994 -540
- data/vendor/v8/out/x64.release/obj.target/tools/gyp/libpreparser_lib.a +0 -0
- data/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a +0 -0
- data/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_nosnapshot.a +0 -0
- data/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_snapshot.a +0 -0
- metadata +21 -20
data/ext/libv8/arch.rb
CHANGED
@@ -20,6 +20,7 @@ module Libv8
|
|
20
20
|
Object.const_defined?(:RUBY_ENGINE) && RUBY_ENGINE == "rbx"
|
21
21
|
end
|
22
22
|
|
23
|
+
# TODO fix false positive on 64-bit ARM
|
23
24
|
def x64?
|
24
25
|
if rubinius?
|
25
26
|
x86_64_from_build_cpu || x86_64_from_arch_flag
|
@@ -28,8 +29,15 @@ module Libv8
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
32
|
+
def arm?
|
33
|
+
RbConfig::MAKEFILE_CONFIG['build_cpu'] =~ /^arm/
|
34
|
+
end
|
35
|
+
|
31
36
|
def libv8_arch
|
32
|
-
|
37
|
+
if arm? then "arm"
|
38
|
+
elsif x64? then "x64"
|
39
|
+
else "ia32"
|
40
|
+
end
|
33
41
|
end
|
34
42
|
end
|
35
|
-
end
|
43
|
+
end
|
data/lib/libv8/version.rb
CHANGED
@@ -321,7 +321,7 @@ class EXPORT Debug {
|
|
321
321
|
* \endcode
|
322
322
|
*/
|
323
323
|
static Local<Value> Call(v8::Handle<v8::Function> fun,
|
324
|
-
|
324
|
+
Handle<Value> data = Handle<Value>());
|
325
325
|
|
326
326
|
/**
|
327
327
|
* Returns a mirror object for the given object.
|
@@ -388,6 +388,14 @@ class EXPORT Debug {
|
|
388
388
|
* to change.
|
389
389
|
*/
|
390
390
|
static Local<Context> GetDebugContext();
|
391
|
+
|
392
|
+
|
393
|
+
/**
|
394
|
+
* Enable/disable LiveEdit functionality for the given Isolate
|
395
|
+
* (default Isolate if not provided). V8 will abort if LiveEdit is
|
396
|
+
* unexpectedly used. LiveEdit is enabled by default.
|
397
|
+
*/
|
398
|
+
static void SetLiveEditEnabled(bool enable, Isolate* isolate = NULL);
|
391
399
|
};
|
392
400
|
|
393
401
|
|
@@ -55,11 +55,12 @@
|
|
55
55
|
// Setup for Linux shared library export. There is no need to distinguish
|
56
56
|
// between building or using the V8 shared library, but we should not
|
57
57
|
// export symbols when we are building a static library.
|
58
|
-
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
58
|
+
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
|
59
|
+
(__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
|
59
60
|
#define V8EXPORT __attribute__ ((visibility("default")))
|
60
|
-
#else
|
61
|
+
#else
|
61
62
|
#define V8EXPORT
|
62
|
-
#endif
|
63
|
+
#endif
|
63
64
|
|
64
65
|
#endif // _WIN32
|
65
66
|
|
@@ -50,11 +50,12 @@
|
|
50
50
|
|
51
51
|
// Setup for Linux shared library export. See v8.h in this directory for
|
52
52
|
// information on how to build/use V8 as shared library.
|
53
|
-
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
53
|
+
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
|
54
|
+
(__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
|
54
55
|
#define V8EXPORT __attribute__ ((visibility("default")))
|
55
|
-
#else
|
56
|
+
#else
|
56
57
|
#define V8EXPORT
|
57
|
-
#endif
|
58
|
+
#endif
|
58
59
|
|
59
60
|
#endif // _WIN32
|
60
61
|
|
@@ -280,32 +281,12 @@ class V8EXPORT HeapGraphNode {
|
|
280
281
|
/** Returns node's own size, in bytes. */
|
281
282
|
int GetSelfSize() const;
|
282
283
|
|
283
|
-
/**
|
284
|
-
* Returns node's retained size, in bytes. That is, self + sizes of
|
285
|
-
* the objects that are reachable only from this object. In other
|
286
|
-
* words, the size of memory that will be reclaimed having this node
|
287
|
-
* collected.
|
288
|
-
*/
|
289
|
-
int GetRetainedSize() const;
|
290
|
-
|
291
284
|
/** Returns child nodes count of the node. */
|
292
285
|
int GetChildrenCount() const;
|
293
286
|
|
294
287
|
/** Retrieves a child by index. */
|
295
288
|
const HeapGraphEdge* GetChild(int index) const;
|
296
289
|
|
297
|
-
/** Returns retainer nodes count of the node. */
|
298
|
-
int GetRetainersCount() const;
|
299
|
-
|
300
|
-
/** Returns a retainer by index. */
|
301
|
-
const HeapGraphEdge* GetRetainer(int index) const;
|
302
|
-
|
303
|
-
/**
|
304
|
-
* Returns a dominator node. This is the node that participates in every
|
305
|
-
* path from the snapshot root to the current node.
|
306
|
-
*/
|
307
|
-
const HeapGraphNode* GetDominatorNode() const;
|
308
|
-
|
309
290
|
/**
|
310
291
|
* Finds and returns a value from the heap corresponding to this node,
|
311
292
|
* if the value is still reachable.
|
@@ -425,6 +406,20 @@ class V8EXPORT HeapProfiler {
|
|
425
406
|
*/
|
426
407
|
static const SnapshotObjectId kUnknownObjectId = 0;
|
427
408
|
|
409
|
+
/**
|
410
|
+
* Callback interface for retrieving user friendly names of global objects.
|
411
|
+
*/
|
412
|
+
class ObjectNameResolver {
|
413
|
+
public:
|
414
|
+
/**
|
415
|
+
* Returns name to be used in the heap snapshot for given node. Returned
|
416
|
+
* string must stay alive until snapshot collection is completed.
|
417
|
+
*/
|
418
|
+
virtual const char* GetName(Handle<Object> object) = 0;
|
419
|
+
protected:
|
420
|
+
virtual ~ObjectNameResolver() {}
|
421
|
+
};
|
422
|
+
|
428
423
|
/**
|
429
424
|
* Takes a heap snapshot and returns it. Title may be an empty string.
|
430
425
|
* See HeapSnapshot::Type for types description.
|
@@ -432,7 +427,8 @@ class V8EXPORT HeapProfiler {
|
|
432
427
|
static const HeapSnapshot* TakeSnapshot(
|
433
428
|
Handle<String> title,
|
434
429
|
HeapSnapshot::Type type = HeapSnapshot::kFull,
|
435
|
-
ActivityControl* control = NULL
|
430
|
+
ActivityControl* control = NULL,
|
431
|
+
ObjectNameResolver* global_object_name_resolver = NULL);
|
436
432
|
|
437
433
|
/**
|
438
434
|
* Starts tracking of heap objects population statistics. After calling
|
@@ -448,11 +444,12 @@ class V8EXPORT HeapProfiler {
|
|
448
444
|
* reports updates for all previous time intervals via the OutputStream
|
449
445
|
* object. Updates on each time interval are provided as a stream of the
|
450
446
|
* HeapStatsUpdate structure instances.
|
447
|
+
* The return value of the function is the last seen heap object Id.
|
451
448
|
*
|
452
449
|
* StartHeapObjectsTracking must be called before the first call to this
|
453
450
|
* method.
|
454
451
|
*/
|
455
|
-
static
|
452
|
+
static SnapshotObjectId PushHeapObjectsStats(OutputStream* stream);
|
456
453
|
|
457
454
|
/**
|
458
455
|
* Stops tracking of heap objects population statistics, cleans up all
|
@@ -481,6 +478,9 @@ class V8EXPORT HeapProfiler {
|
|
481
478
|
|
482
479
|
/** Returns the number of currently existing persistent handles. */
|
483
480
|
static int GetPersistentHandleCount();
|
481
|
+
|
482
|
+
/** Returns memory used for profiler internal data and snapshots. */
|
483
|
+
static size_t GetMemorySizeUsedByProfiler();
|
484
484
|
};
|
485
485
|
|
486
486
|
|
@@ -50,11 +50,12 @@
|
|
50
50
|
|
51
51
|
// Setup for Linux shared library export. See v8.h in this directory for
|
52
52
|
// information on how to build/use V8 as shared library.
|
53
|
-
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
53
|
+
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
|
54
|
+
(__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
|
54
55
|
#define V8EXPORT __attribute__ ((visibility("default")))
|
55
|
-
#else
|
56
|
+
#else
|
56
57
|
#define V8EXPORT
|
57
|
-
#endif
|
58
|
+
#endif
|
58
59
|
|
59
60
|
#endif // _WIN32
|
60
61
|
|
data/vendor/v8/include/v8.h
CHANGED
@@ -38,6 +38,9 @@
|
|
38
38
|
#ifndef V8_H_
|
39
39
|
#define V8_H_
|
40
40
|
|
41
|
+
// TODO(svenpanne) Remove me when the Chrome bindings are adapted.
|
42
|
+
#define V8_DISABLE_DEPRECATIONS 1
|
43
|
+
|
41
44
|
#include "v8stdint.h"
|
42
45
|
|
43
46
|
#ifdef _WIN32
|
@@ -63,18 +66,35 @@
|
|
63
66
|
#else // _WIN32
|
64
67
|
|
65
68
|
// Setup for Linux shared library export.
|
66
|
-
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
69
|
+
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
|
70
|
+
(__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
|
67
71
|
#ifdef BUILDING_V8_SHARED
|
68
72
|
#define V8EXPORT __attribute__ ((visibility("default")))
|
69
73
|
#else
|
70
74
|
#define V8EXPORT
|
71
75
|
#endif
|
72
|
-
#else
|
76
|
+
#else
|
73
77
|
#define V8EXPORT
|
74
|
-
#endif
|
78
|
+
#endif
|
75
79
|
|
76
80
|
#endif // _WIN32
|
77
81
|
|
82
|
+
#if defined(__GNUC__) && !defined(DEBUG)
|
83
|
+
#define V8_INLINE(declarator) inline __attribute__((always_inline)) declarator
|
84
|
+
#elif defined(_MSC_VER) && !defined(DEBUG)
|
85
|
+
#define V8_INLINE(declarator) __forceinline declarator
|
86
|
+
#else
|
87
|
+
#define V8_INLINE(declarator) inline declarator
|
88
|
+
#endif
|
89
|
+
|
90
|
+
#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS
|
91
|
+
#define V8_DEPRECATED(declarator) declarator __attribute__ ((deprecated))
|
92
|
+
#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS
|
93
|
+
#define V8_DEPRECATED(declarator) __declspec(deprecated) declarator
|
94
|
+
#else
|
95
|
+
#define V8_DEPRECATED(declarator) declarator
|
96
|
+
#endif
|
97
|
+
|
78
98
|
/**
|
79
99
|
* The v8 JavaScript engine.
|
80
100
|
*/
|
@@ -100,6 +120,7 @@ class Function;
|
|
100
120
|
class Date;
|
101
121
|
class ImplementationUtilities;
|
102
122
|
class Signature;
|
123
|
+
class AccessorSignature;
|
103
124
|
template <class T> class Handle;
|
104
125
|
template <class T> class Local;
|
105
126
|
template <class T> class Persistent;
|
@@ -136,6 +157,10 @@ class Isolate;
|
|
136
157
|
typedef void (*WeakReferenceCallback)(Persistent<Value> object,
|
137
158
|
void* parameter);
|
138
159
|
|
160
|
+
// TODO(svenpanne) Temporary definition until Chrome is in sync.
|
161
|
+
typedef void (*NearDeathCallback)(Isolate* isolate,
|
162
|
+
Persistent<Value> object,
|
163
|
+
void* parameter);
|
139
164
|
|
140
165
|
// --- Handles ---
|
141
166
|
|
@@ -174,12 +199,12 @@ template <class T> class Handle {
|
|
174
199
|
/**
|
175
200
|
* Creates an empty handle.
|
176
201
|
*/
|
177
|
-
|
202
|
+
V8_INLINE(Handle()) : val_(0) {}
|
178
203
|
|
179
204
|
/**
|
180
205
|
* Creates a new handle for the specified value.
|
181
206
|
*/
|
182
|
-
|
207
|
+
V8_INLINE(explicit Handle(T* val)) : val_(val) {}
|
183
208
|
|
184
209
|
/**
|
185
210
|
* Creates a handle for the contents of the specified handle. This
|
@@ -191,7 +216,7 @@ template <class T> class Handle {
|
|
191
216
|
* Handle<String> to a variable declared as Handle<Value>, is legal
|
192
217
|
* because String is a subclass of Value.
|
193
218
|
*/
|
194
|
-
template <class S>
|
219
|
+
template <class S> V8_INLINE(Handle(Handle<S> that))
|
195
220
|
: val_(reinterpret_cast<T*>(*that)) {
|
196
221
|
/**
|
197
222
|
* This check fails when trying to convert between incompatible
|
@@ -204,16 +229,16 @@ template <class T> class Handle {
|
|
204
229
|
/**
|
205
230
|
* Returns true if the handle is empty.
|
206
231
|
*/
|
207
|
-
|
232
|
+
V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
|
208
233
|
|
209
234
|
/**
|
210
235
|
* Sets the handle to be empty. IsEmpty() will then return true.
|
211
236
|
*/
|
212
|
-
|
237
|
+
V8_INLINE(void Clear()) { val_ = 0; }
|
213
238
|
|
214
|
-
|
239
|
+
V8_INLINE(T* operator->() const) { return val_; }
|
215
240
|
|
216
|
-
|
241
|
+
V8_INLINE(T* operator*() const) { return val_; }
|
217
242
|
|
218
243
|
/**
|
219
244
|
* Checks whether two handles are the same.
|
@@ -221,7 +246,7 @@ template <class T> class Handle {
|
|
221
246
|
* to which they refer are identical.
|
222
247
|
* The handles' references are not checked.
|
223
248
|
*/
|
224
|
-
template <class S>
|
249
|
+
template <class S> V8_INLINE(bool operator==(Handle<S> that) const) {
|
225
250
|
internal::Object** a = reinterpret_cast<internal::Object**>(**this);
|
226
251
|
internal::Object** b = reinterpret_cast<internal::Object**>(*that);
|
227
252
|
if (a == 0) return b == 0;
|
@@ -235,11 +260,11 @@ template <class T> class Handle {
|
|
235
260
|
* the objects to which they refer are different.
|
236
261
|
* The handles' references are not checked.
|
237
262
|
*/
|
238
|
-
template <class S>
|
263
|
+
template <class S> V8_INLINE(bool operator!=(Handle<S> that) const) {
|
239
264
|
return !operator==(that);
|
240
265
|
}
|
241
266
|
|
242
|
-
template <class S> static
|
267
|
+
template <class S> V8_INLINE(static Handle<T> Cast(Handle<S> that)) {
|
243
268
|
#ifdef V8_ENABLE_CHECKS
|
244
269
|
// If we're going to perform the type check then we have to check
|
245
270
|
// that the handle isn't empty before doing the checked cast.
|
@@ -248,7 +273,7 @@ template <class T> class Handle {
|
|
248
273
|
return Handle<T>(T::Cast(*that));
|
249
274
|
}
|
250
275
|
|
251
|
-
template <class S>
|
276
|
+
template <class S> V8_INLINE(Handle<S> As()) {
|
252
277
|
return Handle<S>::Cast(*this);
|
253
278
|
}
|
254
279
|
|
@@ -266,8 +291,8 @@ template <class T> class Handle {
|
|
266
291
|
*/
|
267
292
|
template <class T> class Local : public Handle<T> {
|
268
293
|
public:
|
269
|
-
|
270
|
-
template <class S>
|
294
|
+
V8_INLINE(Local());
|
295
|
+
template <class S> V8_INLINE(Local(Local<S> that))
|
271
296
|
: Handle<T>(reinterpret_cast<T*>(*that)) {
|
272
297
|
/**
|
273
298
|
* This check fails when trying to convert between incompatible
|
@@ -276,8 +301,8 @@ template <class T> class Local : public Handle<T> {
|
|
276
301
|
*/
|
277
302
|
TYPE_CHECK(T, S);
|
278
303
|
}
|
279
|
-
template <class S>
|
280
|
-
template <class S> static
|
304
|
+
template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
|
305
|
+
template <class S> V8_INLINE(static Local<T> Cast(Local<S> that)) {
|
281
306
|
#ifdef V8_ENABLE_CHECKS
|
282
307
|
// If we're going to perform the type check then we have to check
|
283
308
|
// that the handle isn't empty before doing the checked cast.
|
@@ -286,15 +311,17 @@ template <class T> class Local : public Handle<T> {
|
|
286
311
|
return Local<T>(T::Cast(*that));
|
287
312
|
}
|
288
313
|
|
289
|
-
template <class S>
|
314
|
+
template <class S> V8_INLINE(Local<S> As()) {
|
290
315
|
return Local<S>::Cast(*this);
|
291
316
|
}
|
292
317
|
|
293
|
-
/**
|
294
|
-
*
|
295
|
-
*
|
318
|
+
/**
|
319
|
+
* Create a local handle for the content of another handle.
|
320
|
+
* The referee is kept alive by the local handle even when
|
321
|
+
* the original handle is destroyed/disposed.
|
296
322
|
*/
|
297
|
-
|
323
|
+
V8_INLINE(static Local<T> New(Handle<T> that));
|
324
|
+
V8_INLINE(static Local<T> New(Isolate* isolate, Handle<T> that));
|
298
325
|
};
|
299
326
|
|
300
327
|
|
@@ -321,7 +348,7 @@ template <class T> class Persistent : public Handle<T> {
|
|
321
348
|
* Creates an empty persistent handle that doesn't point to any
|
322
349
|
* storage cell.
|
323
350
|
*/
|
324
|
-
|
351
|
+
V8_INLINE(Persistent());
|
325
352
|
|
326
353
|
/**
|
327
354
|
* Creates a persistent handle for the same storage cell as the
|
@@ -334,7 +361,7 @@ template <class T> class Persistent : public Handle<T> {
|
|
334
361
|
* Persistent<String> to a variable declared as Persistent<Value>,
|
335
362
|
* is allowed as String is a subclass of Value.
|
336
363
|
*/
|
337
|
-
template <class S>
|
364
|
+
template <class S> V8_INLINE(Persistent(Persistent<S> that))
|
338
365
|
: Handle<T>(reinterpret_cast<T*>(*that)) {
|
339
366
|
/**
|
340
367
|
* This check fails when trying to convert between incompatible
|
@@ -344,16 +371,16 @@ template <class T> class Persistent : public Handle<T> {
|
|
344
371
|
TYPE_CHECK(T, S);
|
345
372
|
}
|
346
373
|
|
347
|
-
template <class S>
|
374
|
+
template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { }
|
348
375
|
|
349
376
|
/**
|
350
377
|
* "Casts" a plain handle which is known to be a persistent handle
|
351
378
|
* to a persistent handle.
|
352
379
|
*/
|
353
|
-
template <class S> explicit
|
380
|
+
template <class S> explicit V8_INLINE(Persistent(Handle<S> that))
|
354
381
|
: Handle<T>(*that) { }
|
355
382
|
|
356
|
-
template <class S> static
|
383
|
+
template <class S> V8_INLINE(static Persistent<T> Cast(Persistent<S> that)) {
|
357
384
|
#ifdef V8_ENABLE_CHECKS
|
358
385
|
// If we're going to perform the type check then we have to check
|
359
386
|
// that the handle isn't empty before doing the checked cast.
|
@@ -362,15 +389,20 @@ template <class T> class Persistent : public Handle<T> {
|
|
362
389
|
return Persistent<T>(T::Cast(*that));
|
363
390
|
}
|
364
391
|
|
365
|
-
template <class S>
|
392
|
+
template <class S> V8_INLINE(Persistent<S> As()) {
|
366
393
|
return Persistent<S>::Cast(*this);
|
367
394
|
}
|
368
395
|
|
396
|
+
/** Deprecated. Use Isolate version instead. */
|
397
|
+
V8_DEPRECATED(static Persistent<T> New(Handle<T> that));
|
398
|
+
|
369
399
|
/**
|
370
|
-
* Creates a new persistent handle for an existing local or
|
371
|
-
* persistent handle.
|
400
|
+
* Creates a new persistent handle for an existing local or persistent handle.
|
372
401
|
*/
|
373
|
-
|
402
|
+
V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that));
|
403
|
+
|
404
|
+
/** Deprecated. Use Isolate version instead. */
|
405
|
+
V8_DEPRECATED(void Dispose());
|
374
406
|
|
375
407
|
/**
|
376
408
|
* Releases the storage cell referenced by this persistent handle.
|
@@ -378,43 +410,87 @@ template <class T> class Persistent : public Handle<T> {
|
|
378
410
|
* This handle's reference, and any other references to the storage
|
379
411
|
* cell remain and IsEmpty will still return false.
|
380
412
|
*/
|
381
|
-
|
413
|
+
V8_INLINE(void Dispose(Isolate* isolate));
|
414
|
+
|
415
|
+
/** Deprecated. Use Isolate version instead. */
|
416
|
+
V8_DEPRECATED(void MakeWeak(void* parameters,
|
417
|
+
WeakReferenceCallback callback));
|
382
418
|
|
383
419
|
/**
|
384
420
|
* Make the reference to this object weak. When only weak handles
|
385
421
|
* refer to the object, the garbage collector will perform a
|
386
|
-
* callback to the given V8::
|
422
|
+
* callback to the given V8::NearDeathCallback function, passing
|
387
423
|
* it the object reference and the given parameters.
|
388
424
|
*/
|
389
|
-
|
425
|
+
V8_INLINE(void MakeWeak(Isolate* isolate,
|
426
|
+
void* parameters,
|
427
|
+
NearDeathCallback callback));
|
428
|
+
|
429
|
+
/** Deprecated. Use Isolate version instead. */
|
430
|
+
V8_DEPRECATED(void ClearWeak());
|
390
431
|
|
391
|
-
/** Clears the weak reference to this object
|
392
|
-
|
432
|
+
/** Clears the weak reference to this object. */
|
433
|
+
V8_INLINE(void ClearWeak(Isolate* isolate));
|
434
|
+
|
435
|
+
/** Deprecated. Use Isolate version instead. */
|
436
|
+
V8_DEPRECATED(void MarkIndependent());
|
393
437
|
|
394
438
|
/**
|
395
|
-
* Marks the reference to this object independent. Garbage collector
|
396
|
-
*
|
397
|
-
*
|
398
|
-
*
|
399
|
-
* or followed by a global GC epilogue callback.
|
439
|
+
* Marks the reference to this object independent. Garbage collector is free
|
440
|
+
* to ignore any object groups containing this object. Weak callback for an
|
441
|
+
* independent handle should not assume that it will be preceded by a global
|
442
|
+
* GC prologue callback or followed by a global GC epilogue callback.
|
400
443
|
*/
|
401
|
-
|
444
|
+
V8_INLINE(void MarkIndependent(Isolate* isolate));
|
445
|
+
|
446
|
+
/** Deprecated. Use Isolate version instead. */
|
447
|
+
V8_DEPRECATED(void MarkPartiallyDependent());
|
402
448
|
|
403
449
|
/**
|
404
|
-
*
|
450
|
+
* Marks the reference to this object partially dependent. Partially dependent
|
451
|
+
* handles only depend on other partially dependent handles and these
|
452
|
+
* dependencies are provided through object groups. It provides a way to build
|
453
|
+
* smaller object groups for young objects that represent only a subset of all
|
454
|
+
* external dependencies. This mark is automatically cleared after each
|
455
|
+
* garbage collection.
|
405
456
|
*/
|
406
|
-
|
457
|
+
V8_INLINE(void MarkPartiallyDependent(Isolate* isolate));
|
458
|
+
|
459
|
+
/** Deprecated. Use Isolate version instead. */
|
460
|
+
V8_DEPRECATED(bool IsIndependent() const);
|
461
|
+
|
462
|
+
/** Returns true if this handle was previously marked as independent. */
|
463
|
+
V8_INLINE(bool IsIndependent(Isolate* isolate) const);
|
464
|
+
|
465
|
+
/** Deprecated. Use Isolate version instead. */
|
466
|
+
V8_DEPRECATED(bool IsNearDeath() const);
|
467
|
+
|
468
|
+
/** Checks if the handle holds the only reference to an object. */
|
469
|
+
V8_INLINE(bool IsNearDeath(Isolate* isolate) const);
|
470
|
+
|
471
|
+
/** Deprecated. Use Isolate version instead. */
|
472
|
+
V8_DEPRECATED(bool IsWeak() const);
|
473
|
+
|
474
|
+
/** Returns true if the handle's reference is weak. */
|
475
|
+
V8_INLINE(bool IsWeak(Isolate* isolate) const);
|
476
|
+
|
477
|
+
/** Deprecated. Use Isolate version instead. */
|
478
|
+
V8_DEPRECATED(void SetWrapperClassId(uint16_t class_id));
|
407
479
|
|
408
480
|
/**
|
409
|
-
*
|
481
|
+
* Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface
|
482
|
+
* description in v8-profiler.h for details.
|
410
483
|
*/
|
411
|
-
|
484
|
+
V8_INLINE(void SetWrapperClassId(Isolate* isolate, uint16_t class_id));
|
485
|
+
|
486
|
+
/** Deprecated. Use Isolate version instead. */
|
487
|
+
V8_DEPRECATED(uint16_t WrapperClassId() const);
|
412
488
|
|
413
489
|
/**
|
414
|
-
*
|
415
|
-
*
|
490
|
+
* Returns the class ID previously assigned to this handle or 0 if no class ID
|
491
|
+
* was previously assigned.
|
416
492
|
*/
|
417
|
-
|
493
|
+
V8_INLINE(uint16_t WrapperClassId(Isolate* isolate) const);
|
418
494
|
|
419
495
|
private:
|
420
496
|
friend class ImplementationUtilities;
|
@@ -457,12 +533,14 @@ class V8EXPORT HandleScope {
|
|
457
533
|
* Creates a new handle with the given value.
|
458
534
|
*/
|
459
535
|
static internal::Object** CreateHandle(internal::Object* value);
|
536
|
+
static internal::Object** CreateHandle(internal::Isolate* isolate,
|
537
|
+
internal::Object* value);
|
460
538
|
// Faster version, uses HeapObject to obtain the current Isolate.
|
461
539
|
static internal::Object** CreateHandle(internal::HeapObject* value);
|
462
540
|
|
463
541
|
private:
|
464
|
-
// Make it
|
465
|
-
//
|
542
|
+
// Make it hard to create heap-allocated or illegal handle scopes by
|
543
|
+
// disallowing certain operations.
|
466
544
|
HandleScope(const HandleScope&);
|
467
545
|
void operator=(const HandleScope&);
|
468
546
|
void* operator new(size_t size);
|
@@ -475,7 +553,7 @@ class V8EXPORT HandleScope {
|
|
475
553
|
internal::Object** next;
|
476
554
|
internal::Object** limit;
|
477
555
|
int level;
|
478
|
-
|
556
|
+
V8_INLINE(void Initialize()) {
|
479
557
|
next = limit = NULL;
|
480
558
|
level = 0;
|
481
559
|
}
|
@@ -568,16 +646,16 @@ class V8EXPORT ScriptData { // NOLINT
|
|
568
646
|
*/
|
569
647
|
class ScriptOrigin {
|
570
648
|
public:
|
571
|
-
|
649
|
+
V8_INLINE(ScriptOrigin(
|
572
650
|
Handle<Value> resource_name,
|
573
651
|
Handle<Integer> resource_line_offset = Handle<Integer>(),
|
574
|
-
Handle<Integer> resource_column_offset = Handle<Integer>())
|
652
|
+
Handle<Integer> resource_column_offset = Handle<Integer>()))
|
575
653
|
: resource_name_(resource_name),
|
576
654
|
resource_line_offset_(resource_line_offset),
|
577
655
|
resource_column_offset_(resource_column_offset) { }
|
578
|
-
|
579
|
-
|
580
|
-
|
656
|
+
V8_INLINE(Handle<Value> ResourceName() const);
|
657
|
+
V8_INLINE(Handle<Integer> ResourceLineOffset() const);
|
658
|
+
V8_INLINE(Handle<Integer> ResourceColumnOffset() const);
|
581
659
|
private:
|
582
660
|
Handle<Value> resource_name_;
|
583
661
|
Handle<Integer> resource_line_offset_;
|
@@ -859,173 +937,179 @@ class V8EXPORT StackFrame {
|
|
859
937
|
/**
|
860
938
|
* The superclass of all JavaScript values and objects.
|
861
939
|
*/
|
862
|
-
class Value : public Data {
|
940
|
+
class V8EXPORT Value : public Data {
|
863
941
|
public:
|
864
942
|
/**
|
865
943
|
* Returns true if this value is the undefined value. See ECMA-262
|
866
944
|
* 4.3.10.
|
867
945
|
*/
|
868
|
-
|
946
|
+
V8_INLINE(bool IsUndefined() const);
|
869
947
|
|
870
948
|
/**
|
871
949
|
* Returns true if this value is the null value. See ECMA-262
|
872
950
|
* 4.3.11.
|
873
951
|
*/
|
874
|
-
|
952
|
+
V8_INLINE(bool IsNull() const);
|
875
953
|
|
876
954
|
/**
|
877
955
|
* Returns true if this value is true.
|
878
956
|
*/
|
879
|
-
|
957
|
+
bool IsTrue() const;
|
880
958
|
|
881
959
|
/**
|
882
960
|
* Returns true if this value is false.
|
883
961
|
*/
|
884
|
-
|
962
|
+
bool IsFalse() const;
|
885
963
|
|
886
964
|
/**
|
887
965
|
* Returns true if this value is an instance of the String type.
|
888
966
|
* See ECMA-262 8.4.
|
889
967
|
*/
|
890
|
-
|
968
|
+
V8_INLINE(bool IsString() const);
|
891
969
|
|
892
970
|
/**
|
893
971
|
* Returns true if this value is a function.
|
894
972
|
*/
|
895
|
-
|
973
|
+
bool IsFunction() const;
|
896
974
|
|
897
975
|
/**
|
898
976
|
* Returns true if this value is an array.
|
899
977
|
*/
|
900
|
-
|
978
|
+
bool IsArray() const;
|
901
979
|
|
902
980
|
/**
|
903
981
|
* Returns true if this value is an object.
|
904
982
|
*/
|
905
|
-
|
983
|
+
bool IsObject() const;
|
906
984
|
|
907
985
|
/**
|
908
986
|
* Returns true if this value is boolean.
|
909
987
|
*/
|
910
|
-
|
988
|
+
bool IsBoolean() const;
|
911
989
|
|
912
990
|
/**
|
913
991
|
* Returns true if this value is a number.
|
914
992
|
*/
|
915
|
-
|
993
|
+
bool IsNumber() const;
|
916
994
|
|
917
995
|
/**
|
918
996
|
* Returns true if this value is external.
|
919
997
|
*/
|
920
|
-
|
998
|
+
bool IsExternal() const;
|
921
999
|
|
922
1000
|
/**
|
923
1001
|
* Returns true if this value is a 32-bit signed integer.
|
924
1002
|
*/
|
925
|
-
|
1003
|
+
bool IsInt32() const;
|
926
1004
|
|
927
1005
|
/**
|
928
1006
|
* Returns true if this value is a 32-bit unsigned integer.
|
929
1007
|
*/
|
930
|
-
|
1008
|
+
bool IsUint32() const;
|
931
1009
|
|
932
1010
|
/**
|
933
1011
|
* Returns true if this value is a Date.
|
934
1012
|
*/
|
935
|
-
|
1013
|
+
bool IsDate() const;
|
936
1014
|
|
937
1015
|
/**
|
938
1016
|
* Returns true if this value is a Boolean object.
|
939
1017
|
*/
|
940
|
-
|
1018
|
+
bool IsBooleanObject() const;
|
941
1019
|
|
942
1020
|
/**
|
943
1021
|
* Returns true if this value is a Number object.
|
944
1022
|
*/
|
945
|
-
|
1023
|
+
bool IsNumberObject() const;
|
946
1024
|
|
947
1025
|
/**
|
948
1026
|
* Returns true if this value is a String object.
|
949
1027
|
*/
|
950
|
-
|
1028
|
+
bool IsStringObject() const;
|
951
1029
|
|
952
1030
|
/**
|
953
1031
|
* Returns true if this value is a NativeError.
|
954
1032
|
*/
|
955
|
-
|
1033
|
+
bool IsNativeError() const;
|
956
1034
|
|
957
1035
|
/**
|
958
1036
|
* Returns true if this value is a RegExp.
|
959
1037
|
*/
|
960
|
-
|
1038
|
+
bool IsRegExp() const;
|
961
1039
|
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
1040
|
+
Local<Boolean> ToBoolean() const;
|
1041
|
+
Local<Number> ToNumber() const;
|
1042
|
+
Local<String> ToString() const;
|
1043
|
+
Local<String> ToDetailString() const;
|
1044
|
+
Local<Object> ToObject() const;
|
1045
|
+
Local<Integer> ToInteger() const;
|
1046
|
+
Local<Uint32> ToUint32() const;
|
1047
|
+
Local<Int32> ToInt32() const;
|
970
1048
|
|
971
1049
|
/**
|
972
1050
|
* Attempts to convert a string to an array index.
|
973
1051
|
* Returns an empty handle if the conversion fails.
|
974
1052
|
*/
|
975
|
-
|
1053
|
+
Local<Uint32> ToArrayIndex() const;
|
976
1054
|
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
1055
|
+
bool BooleanValue() const;
|
1056
|
+
double NumberValue() const;
|
1057
|
+
int64_t IntegerValue() const;
|
1058
|
+
uint32_t Uint32Value() const;
|
1059
|
+
int32_t Int32Value() const;
|
982
1060
|
|
983
1061
|
/** JS == */
|
984
|
-
|
985
|
-
|
1062
|
+
bool Equals(Handle<Value> that) const;
|
1063
|
+
bool StrictEquals(Handle<Value> that) const;
|
986
1064
|
|
987
1065
|
private:
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
1066
|
+
V8_INLINE(bool QuickIsUndefined() const);
|
1067
|
+
V8_INLINE(bool QuickIsNull() const);
|
1068
|
+
V8_INLINE(bool QuickIsString() const);
|
1069
|
+
bool FullIsUndefined() const;
|
1070
|
+
bool FullIsNull() const;
|
1071
|
+
bool FullIsString() const;
|
994
1072
|
};
|
995
1073
|
|
996
1074
|
|
997
1075
|
/**
|
998
1076
|
* The superclass of primitive values. See ECMA-262 4.3.2.
|
999
1077
|
*/
|
1000
|
-
class Primitive : public Value { };
|
1078
|
+
class V8EXPORT Primitive : public Value { };
|
1001
1079
|
|
1002
1080
|
|
1003
1081
|
/**
|
1004
1082
|
* A primitive boolean value (ECMA-262, 4.3.14). Either the true
|
1005
1083
|
* or false value.
|
1006
1084
|
*/
|
1007
|
-
class Boolean : public Primitive {
|
1085
|
+
class V8EXPORT Boolean : public Primitive {
|
1008
1086
|
public:
|
1009
|
-
|
1010
|
-
static
|
1087
|
+
bool Value() const;
|
1088
|
+
V8_INLINE(static Handle<Boolean> New(bool value));
|
1011
1089
|
};
|
1012
1090
|
|
1013
1091
|
|
1014
1092
|
/**
|
1015
1093
|
* A JavaScript string value (ECMA-262, 4.3.17).
|
1016
1094
|
*/
|
1017
|
-
class String : public Primitive {
|
1095
|
+
class V8EXPORT String : public Primitive {
|
1018
1096
|
public:
|
1097
|
+
enum Encoding {
|
1098
|
+
UNKNOWN_ENCODING = 0x1,
|
1099
|
+
TWO_BYTE_ENCODING = 0x0,
|
1100
|
+
ASCII_ENCODING = 0x4,
|
1101
|
+
ONE_BYTE_ENCODING = 0x4
|
1102
|
+
};
|
1019
1103
|
/**
|
1020
1104
|
* Returns the number of characters in this string.
|
1021
1105
|
*/
|
1022
|
-
|
1106
|
+
int Length() const;
|
1023
1107
|
|
1024
1108
|
/**
|
1025
1109
|
* Returns the number of bytes in the UTF-8 encoded
|
1026
1110
|
* representation of this string.
|
1027
1111
|
*/
|
1028
|
-
|
1112
|
+
int Utf8Length() const;
|
1029
1113
|
|
1030
1114
|
/**
|
1031
1115
|
* A fast conservative check for non-ASCII characters. May
|
@@ -1033,7 +1117,12 @@ class String : public Primitive {
|
|
1033
1117
|
* false you can be sure that all characters are in the range
|
1034
1118
|
* 0-127.
|
1035
1119
|
*/
|
1036
|
-
|
1120
|
+
bool MayContainNonAscii() const;
|
1121
|
+
|
1122
|
+
/**
|
1123
|
+
* Returns whether this string contains only one byte data.
|
1124
|
+
*/
|
1125
|
+
bool IsOneByte() const;
|
1037
1126
|
|
1038
1127
|
/**
|
1039
1128
|
* Write the contents of the string to an external buffer.
|
@@ -1063,40 +1152,46 @@ class String : public Primitive {
|
|
1063
1152
|
enum WriteOptions {
|
1064
1153
|
NO_OPTIONS = 0,
|
1065
1154
|
HINT_MANY_WRITES_EXPECTED = 1,
|
1066
|
-
NO_NULL_TERMINATION = 2
|
1155
|
+
NO_NULL_TERMINATION = 2,
|
1156
|
+
PRESERVE_ASCII_NULL = 4
|
1067
1157
|
};
|
1068
1158
|
|
1069
1159
|
// 16-bit character codes.
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1160
|
+
int Write(uint16_t* buffer,
|
1161
|
+
int start = 0,
|
1162
|
+
int length = -1,
|
1163
|
+
int options = NO_OPTIONS) const;
|
1074
1164
|
// ASCII characters.
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1165
|
+
int WriteAscii(char* buffer,
|
1166
|
+
int start = 0,
|
1167
|
+
int length = -1,
|
1168
|
+
int options = NO_OPTIONS) const;
|
1169
|
+
// One byte characters.
|
1170
|
+
int WriteOneByte(uint8_t* buffer,
|
1171
|
+
int start = 0,
|
1172
|
+
int length = -1,
|
1173
|
+
int options = NO_OPTIONS) const;
|
1079
1174
|
// UTF-8 encoded characters.
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1175
|
+
int WriteUtf8(char* buffer,
|
1176
|
+
int length = -1,
|
1177
|
+
int* nchars_ref = NULL,
|
1178
|
+
int options = NO_OPTIONS) const;
|
1084
1179
|
|
1085
1180
|
/**
|
1086
1181
|
* A zero length string.
|
1087
1182
|
*/
|
1088
|
-
|
1089
|
-
|
1183
|
+
static v8::Local<v8::String> Empty();
|
1184
|
+
V8_INLINE(static v8::Local<v8::String> Empty(Isolate* isolate));
|
1090
1185
|
|
1091
1186
|
/**
|
1092
1187
|
* Returns true if the string is external
|
1093
1188
|
*/
|
1094
|
-
|
1189
|
+
bool IsExternal() const;
|
1095
1190
|
|
1096
1191
|
/**
|
1097
1192
|
* Returns true if the string is both external and ASCII
|
1098
1193
|
*/
|
1099
|
-
|
1194
|
+
bool IsExternalAscii() const;
|
1100
1195
|
|
1101
1196
|
class V8EXPORT ExternalStringResourceBase { // NOLINT
|
1102
1197
|
public:
|
@@ -1177,44 +1272,48 @@ class String : public Primitive {
|
|
1177
1272
|
ExternalAsciiStringResource() {}
|
1178
1273
|
};
|
1179
1274
|
|
1275
|
+
typedef ExternalAsciiStringResource ExternalOneByteStringResource;
|
1276
|
+
|
1277
|
+
/**
|
1278
|
+
* If the string is an external string, return the ExternalStringResourceBase
|
1279
|
+
* regardless of the encoding, otherwise return NULL. The encoding of the
|
1280
|
+
* string is returned in encoding_out.
|
1281
|
+
*/
|
1282
|
+
V8_INLINE(ExternalStringResourceBase* GetExternalStringResourceBase(
|
1283
|
+
Encoding* encoding_out) const);
|
1284
|
+
|
1180
1285
|
/**
|
1181
1286
|
* Get the ExternalStringResource for an external string. Returns
|
1182
1287
|
* NULL if IsExternal() doesn't return true.
|
1183
1288
|
*/
|
1184
|
-
|
1289
|
+
V8_INLINE(ExternalStringResource* GetExternalStringResource() const);
|
1185
1290
|
|
1186
1291
|
/**
|
1187
1292
|
* Get the ExternalAsciiStringResource for an external ASCII string.
|
1188
1293
|
* Returns NULL if IsExternalAscii() doesn't return true.
|
1189
1294
|
*/
|
1190
|
-
|
1191
|
-
const;
|
1295
|
+
const ExternalAsciiStringResource* GetExternalAsciiStringResource() const;
|
1192
1296
|
|
1193
|
-
static
|
1297
|
+
V8_INLINE(static String* Cast(v8::Value* obj));
|
1194
1298
|
|
1195
1299
|
/**
|
1196
1300
|
* Allocates a new string from either UTF-8 encoded or ASCII data.
|
1197
|
-
* The second parameter 'length' gives the buffer length.
|
1198
|
-
*
|
1199
|
-
* be careful to supply the length parameter.
|
1200
|
-
* If it is not given, the function calls
|
1201
|
-
* 'strlen' to determine the buffer length, it might be
|
1202
|
-
* wrong if 'data' contains a null character.
|
1301
|
+
* The second parameter 'length' gives the buffer length. If omitted,
|
1302
|
+
* the function calls 'strlen' to determine the buffer length.
|
1203
1303
|
*/
|
1204
|
-
|
1304
|
+
static Local<String> New(const char* data, int length = -1);
|
1205
1305
|
|
1206
1306
|
/** Allocates a new string from 16-bit character codes.*/
|
1207
|
-
|
1307
|
+
static Local<String> New(const uint16_t* data, int length = -1);
|
1208
1308
|
|
1209
1309
|
/** Creates a symbol. Returns one if it exists already.*/
|
1210
|
-
|
1310
|
+
static Local<String> NewSymbol(const char* data, int length = -1);
|
1211
1311
|
|
1212
1312
|
/**
|
1213
1313
|
* Creates a new string by concatenating the left and the right strings
|
1214
1314
|
* passed in as parameters.
|
1215
1315
|
*/
|
1216
|
-
|
1217
|
-
Handle<String> right);
|
1316
|
+
static Local<String> Concat(Handle<String> left, Handle<String> right);
|
1218
1317
|
|
1219
1318
|
/**
|
1220
1319
|
* Creates a new external string using the data defined in the given
|
@@ -1224,7 +1323,7 @@ class String : public Primitive {
|
|
1224
1323
|
* should the underlying buffer be deallocated or modified except through the
|
1225
1324
|
* destructor of the external string resource.
|
1226
1325
|
*/
|
1227
|
-
|
1326
|
+
static Local<String> NewExternal(ExternalStringResource* resource);
|
1228
1327
|
|
1229
1328
|
/**
|
1230
1329
|
* Associate an external string resource with this string by transforming it
|
@@ -1235,7 +1334,7 @@ class String : public Primitive {
|
|
1235
1334
|
* The string is not modified if the operation fails. See NewExternal for
|
1236
1335
|
* information on the lifetime of the resource.
|
1237
1336
|
*/
|
1238
|
-
|
1337
|
+
bool MakeExternal(ExternalStringResource* resource);
|
1239
1338
|
|
1240
1339
|
/**
|
1241
1340
|
* Creates a new external string using the ASCII data defined in the given
|
@@ -1244,8 +1343,8 @@ class String : public Primitive {
|
|
1244
1343
|
* this function should not otherwise delete or modify the resource. Neither
|
1245
1344
|
* should the underlying buffer be deallocated or modified except through the
|
1246
1345
|
* destructor of the external string resource.
|
1247
|
-
*/
|
1248
|
-
|
1346
|
+
*/
|
1347
|
+
static Local<String> NewExternal(ExternalAsciiStringResource* resource);
|
1249
1348
|
|
1250
1349
|
/**
|
1251
1350
|
* Associate an external string resource with this string by transforming it
|
@@ -1256,20 +1355,18 @@ class String : public Primitive {
|
|
1256
1355
|
* The string is not modified if the operation fails. See NewExternal for
|
1257
1356
|
* information on the lifetime of the resource.
|
1258
1357
|
*/
|
1259
|
-
|
1358
|
+
bool MakeExternal(ExternalAsciiStringResource* resource);
|
1260
1359
|
|
1261
1360
|
/**
|
1262
1361
|
* Returns true if this string can be made external.
|
1263
1362
|
*/
|
1264
|
-
|
1363
|
+
bool CanMakeExternal();
|
1265
1364
|
|
1266
1365
|
/** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/
|
1267
|
-
|
1268
|
-
int length = -1);
|
1366
|
+
static Local<String> NewUndetectable(const char* data, int length = -1);
|
1269
1367
|
|
1270
1368
|
/** Creates an undetectable string from the supplied 16-bit character codes.*/
|
1271
|
-
|
1272
|
-
int length = -1);
|
1369
|
+
static Local<String> NewUndetectable(const uint16_t* data, int length = -1);
|
1273
1370
|
|
1274
1371
|
/**
|
1275
1372
|
* Converts an object to a UTF-8-encoded character array. Useful if
|
@@ -1340,59 +1437,63 @@ class String : public Primitive {
|
|
1340
1437
|
};
|
1341
1438
|
|
1342
1439
|
private:
|
1343
|
-
|
1344
|
-
|
1440
|
+
void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
|
1441
|
+
Encoding encoding) const;
|
1442
|
+
void VerifyExternalStringResource(ExternalStringResource* val) const;
|
1443
|
+
static void CheckCast(v8::Value* obj);
|
1345
1444
|
};
|
1346
1445
|
|
1347
1446
|
|
1348
1447
|
/**
|
1349
1448
|
* A JavaScript number value (ECMA-262, 4.3.20)
|
1350
1449
|
*/
|
1351
|
-
class Number : public Primitive {
|
1450
|
+
class V8EXPORT Number : public Primitive {
|
1352
1451
|
public:
|
1353
|
-
|
1354
|
-
|
1355
|
-
static
|
1452
|
+
double Value() const;
|
1453
|
+
static Local<Number> New(double value);
|
1454
|
+
V8_INLINE(static Number* Cast(v8::Value* obj));
|
1356
1455
|
private:
|
1357
|
-
|
1358
|
-
|
1456
|
+
Number();
|
1457
|
+
static void CheckCast(v8::Value* obj);
|
1359
1458
|
};
|
1360
1459
|
|
1361
1460
|
|
1362
1461
|
/**
|
1363
1462
|
* A JavaScript value representing a signed integer.
|
1364
1463
|
*/
|
1365
|
-
class Integer : public Number {
|
1464
|
+
class V8EXPORT Integer : public Number {
|
1366
1465
|
public:
|
1367
|
-
|
1368
|
-
|
1369
|
-
|
1370
|
-
static
|
1466
|
+
static Local<Integer> New(int32_t value);
|
1467
|
+
static Local<Integer> NewFromUnsigned(uint32_t value);
|
1468
|
+
static Local<Integer> New(int32_t value, Isolate*);
|
1469
|
+
static Local<Integer> NewFromUnsigned(uint32_t value, Isolate*);
|
1470
|
+
int64_t Value() const;
|
1471
|
+
V8_INLINE(static Integer* Cast(v8::Value* obj));
|
1371
1472
|
private:
|
1372
|
-
|
1373
|
-
|
1473
|
+
Integer();
|
1474
|
+
static void CheckCast(v8::Value* obj);
|
1374
1475
|
};
|
1375
1476
|
|
1376
1477
|
|
1377
1478
|
/**
|
1378
1479
|
* A JavaScript value representing a 32-bit signed integer.
|
1379
1480
|
*/
|
1380
|
-
class Int32 : public Integer {
|
1481
|
+
class V8EXPORT Int32 : public Integer {
|
1381
1482
|
public:
|
1382
|
-
|
1483
|
+
int32_t Value() const;
|
1383
1484
|
private:
|
1384
|
-
|
1485
|
+
Int32();
|
1385
1486
|
};
|
1386
1487
|
|
1387
1488
|
|
1388
1489
|
/**
|
1389
1490
|
* A JavaScript value representing a 32-bit unsigned integer.
|
1390
1491
|
*/
|
1391
|
-
class Uint32 : public Integer {
|
1492
|
+
class V8EXPORT Uint32 : public Integer {
|
1392
1493
|
public:
|
1393
|
-
|
1494
|
+
uint32_t Value() const;
|
1394
1495
|
private:
|
1395
|
-
|
1496
|
+
Uint32();
|
1396
1497
|
};
|
1397
1498
|
|
1398
1499
|
|
@@ -1453,14 +1554,13 @@ enum AccessControl {
|
|
1453
1554
|
/**
|
1454
1555
|
* A JavaScript object (ECMA-262, 4.3.3)
|
1455
1556
|
*/
|
1456
|
-
class Object : public Value {
|
1557
|
+
class V8EXPORT Object : public Value {
|
1457
1558
|
public:
|
1458
|
-
|
1459
|
-
|
1460
|
-
|
1559
|
+
bool Set(Handle<Value> key,
|
1560
|
+
Handle<Value> value,
|
1561
|
+
PropertyAttribute attribs = None);
|
1461
1562
|
|
1462
|
-
|
1463
|
-
Handle<Value> value);
|
1563
|
+
bool Set(uint32_t index, Handle<Value> value);
|
1464
1564
|
|
1465
1565
|
// Sets a local property on this object bypassing interceptors and
|
1466
1566
|
// overriding accessors or read-only properties.
|
@@ -1470,41 +1570,41 @@ class Object : public Value {
|
|
1470
1570
|
// will only be returned if the interceptor doesn't return a value.
|
1471
1571
|
//
|
1472
1572
|
// Note also that this only works for named properties.
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1573
|
+
bool ForceSet(Handle<Value> key,
|
1574
|
+
Handle<Value> value,
|
1575
|
+
PropertyAttribute attribs = None);
|
1476
1576
|
|
1477
|
-
|
1577
|
+
Local<Value> Get(Handle<Value> key);
|
1478
1578
|
|
1479
|
-
|
1579
|
+
Local<Value> Get(uint32_t index);
|
1480
1580
|
|
1481
1581
|
/**
|
1482
1582
|
* Gets the property attributes of a property which can be None or
|
1483
1583
|
* any combination of ReadOnly, DontEnum and DontDelete. Returns
|
1484
1584
|
* None when the property doesn't exist.
|
1485
1585
|
*/
|
1486
|
-
|
1586
|
+
PropertyAttribute GetPropertyAttributes(Handle<Value> key);
|
1487
1587
|
|
1488
1588
|
// TODO(1245389): Replace the type-specific versions of these
|
1489
1589
|
// functions with generic ones that accept a Handle<Value> key.
|
1490
|
-
|
1590
|
+
bool Has(Handle<String> key);
|
1491
1591
|
|
1492
|
-
|
1592
|
+
bool Delete(Handle<String> key);
|
1493
1593
|
|
1494
1594
|
// Delete a property on this object bypassing interceptors and
|
1495
1595
|
// ignoring dont-delete attributes.
|
1496
|
-
|
1596
|
+
bool ForceDelete(Handle<Value> key);
|
1497
1597
|
|
1498
|
-
|
1598
|
+
bool Has(uint32_t index);
|
1499
1599
|
|
1500
|
-
|
1600
|
+
bool Delete(uint32_t index);
|
1501
1601
|
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1602
|
+
bool SetAccessor(Handle<String> name,
|
1603
|
+
AccessorGetter getter,
|
1604
|
+
AccessorSetter setter = 0,
|
1605
|
+
Handle<Value> data = Handle<Value>(),
|
1606
|
+
AccessControl settings = DEFAULT,
|
1607
|
+
PropertyAttribute attribute = None);
|
1508
1608
|
|
1509
1609
|
/**
|
1510
1610
|
* Returns an array containing the names of the enumerable properties
|
@@ -1512,93 +1612,107 @@ class Object : public Value {
|
|
1512
1612
|
* array returned by this method contains the same values as would
|
1513
1613
|
* be enumerated by a for-in statement over this object.
|
1514
1614
|
*/
|
1515
|
-
|
1615
|
+
Local<Array> GetPropertyNames();
|
1516
1616
|
|
1517
1617
|
/**
|
1518
1618
|
* This function has the same functionality as GetPropertyNames but
|
1519
1619
|
* the returned array doesn't contain the names of properties from
|
1520
1620
|
* prototype objects.
|
1521
1621
|
*/
|
1522
|
-
|
1622
|
+
Local<Array> GetOwnPropertyNames();
|
1523
1623
|
|
1524
1624
|
/**
|
1525
1625
|
* Get the prototype object. This does not skip objects marked to
|
1526
1626
|
* be skipped by __proto__ and it does not consult the security
|
1527
1627
|
* handler.
|
1528
1628
|
*/
|
1529
|
-
|
1629
|
+
Local<Value> GetPrototype();
|
1530
1630
|
|
1531
1631
|
/**
|
1532
1632
|
* Set the prototype object. This does not skip objects marked to
|
1533
1633
|
* be skipped by __proto__ and it does not consult the security
|
1534
1634
|
* handler.
|
1535
1635
|
*/
|
1536
|
-
|
1636
|
+
bool SetPrototype(Handle<Value> prototype);
|
1537
1637
|
|
1538
1638
|
/**
|
1539
1639
|
* Finds an instance of the given function template in the prototype
|
1540
1640
|
* chain.
|
1541
1641
|
*/
|
1542
|
-
|
1543
|
-
Handle<FunctionTemplate> tmpl);
|
1642
|
+
Local<Object> FindInstanceInPrototypeChain(Handle<FunctionTemplate> tmpl);
|
1544
1643
|
|
1545
1644
|
/**
|
1546
1645
|
* Call builtin Object.prototype.toString on this object.
|
1547
1646
|
* This is different from Value::ToString() that may call
|
1548
1647
|
* user-defined toString function. This one does not.
|
1549
1648
|
*/
|
1550
|
-
|
1649
|
+
Local<String> ObjectProtoToString();
|
1650
|
+
|
1651
|
+
/**
|
1652
|
+
* Returns the function invoked as a constructor for this object.
|
1653
|
+
* May be the null value.
|
1654
|
+
*/
|
1655
|
+
Local<Value> GetConstructor();
|
1551
1656
|
|
1552
1657
|
/**
|
1553
1658
|
* Returns the name of the function invoked as a constructor for this object.
|
1554
1659
|
*/
|
1555
|
-
|
1660
|
+
Local<String> GetConstructorName();
|
1556
1661
|
|
1557
1662
|
/** Gets the number of internal fields for this Object. */
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1663
|
+
int InternalFieldCount();
|
1664
|
+
|
1665
|
+
/** Gets the value from an internal field. */
|
1666
|
+
V8_INLINE(Local<Value> GetInternalField(int index));
|
1667
|
+
|
1561
1668
|
/** Sets the value in an internal field. */
|
1562
|
-
|
1669
|
+
void SetInternalField(int index, Handle<Value> value);
|
1563
1670
|
|
1564
|
-
/**
|
1565
|
-
|
1671
|
+
/**
|
1672
|
+
* Gets a 2-byte-aligned native pointer from an internal field. This field
|
1673
|
+
* must have been set by SetAlignedPointerInInternalField, everything else
|
1674
|
+
* leads to undefined behavior.
|
1675
|
+
*/
|
1676
|
+
V8_INLINE(void* GetAlignedPointerFromInternalField(int index));
|
1566
1677
|
|
1567
|
-
/**
|
1568
|
-
|
1678
|
+
/**
|
1679
|
+
* Sets a 2-byte-aligned native pointer in an internal field. To retrieve such
|
1680
|
+
* a field, GetAlignedPointerFromInternalField must be used, everything else
|
1681
|
+
* leads to undefined behavior.
|
1682
|
+
*/
|
1683
|
+
void SetAlignedPointerInInternalField(int index, void* value);
|
1569
1684
|
|
1570
1685
|
// Testers for local properties.
|
1571
|
-
|
1572
|
-
|
1573
|
-
|
1574
|
-
|
1686
|
+
bool HasOwnProperty(Handle<String> key);
|
1687
|
+
bool HasRealNamedProperty(Handle<String> key);
|
1688
|
+
bool HasRealIndexedProperty(uint32_t index);
|
1689
|
+
bool HasRealNamedCallbackProperty(Handle<String> key);
|
1575
1690
|
|
1576
1691
|
/**
|
1577
1692
|
* If result.IsEmpty() no real property was located in the prototype chain.
|
1578
1693
|
* This means interceptors in the prototype chain are not called.
|
1579
1694
|
*/
|
1580
|
-
|
1581
|
-
Handle<String> key);
|
1695
|
+
Local<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key);
|
1582
1696
|
|
1583
1697
|
/**
|
1584
1698
|
* If result.IsEmpty() no real property was located on the object or
|
1585
1699
|
* in the prototype chain.
|
1586
1700
|
* This means interceptors in the prototype chain are not called.
|
1587
1701
|
*/
|
1588
|
-
|
1702
|
+
Local<Value> GetRealNamedProperty(Handle<String> key);
|
1589
1703
|
|
1590
1704
|
/** Tests for a named lookup interceptor.*/
|
1591
|
-
|
1705
|
+
bool HasNamedLookupInterceptor();
|
1592
1706
|
|
1593
1707
|
/** Tests for an index lookup interceptor.*/
|
1594
|
-
|
1708
|
+
bool HasIndexedLookupInterceptor();
|
1595
1709
|
|
1596
1710
|
/**
|
1597
1711
|
* Turns on access check on the object if the object is an instance of
|
1598
1712
|
* a template that has access check callbacks. If an object has no
|
1599
1713
|
* access check info, the object cannot be accessed by anyone.
|
1600
1714
|
*/
|
1601
|
-
|
1715
|
+
void TurnOnAccessCheck();
|
1602
1716
|
|
1603
1717
|
/**
|
1604
1718
|
* Returns the identity hash for this object. The current implementation
|
@@ -1607,7 +1721,7 @@ class Object : public Value {
|
|
1607
1721
|
* The return value will never be 0. Also, it is not guaranteed to be
|
1608
1722
|
* unique.
|
1609
1723
|
*/
|
1610
|
-
|
1724
|
+
int GetIdentityHash();
|
1611
1725
|
|
1612
1726
|
/**
|
1613
1727
|
* Access hidden properties on JavaScript objects. These properties are
|
@@ -1615,9 +1729,9 @@ class Object : public Value {
|
|
1615
1729
|
* C++ API. Hidden properties introduced by V8 internally (for example the
|
1616
1730
|
* identity hash) are prefixed with "v8::".
|
1617
1731
|
*/
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1732
|
+
bool SetHiddenValue(Handle<String> key, Handle<Value> value);
|
1733
|
+
Local<Value> GetHiddenValue(Handle<String> key);
|
1734
|
+
bool DeleteHiddenValue(Handle<String> key);
|
1621
1735
|
|
1622
1736
|
/**
|
1623
1737
|
* Returns true if this is an instance of an api function (one
|
@@ -1626,18 +1740,18 @@ class Object : public Value {
|
|
1626
1740
|
* conservative and may return true for objects that haven't actually
|
1627
1741
|
* been modified.
|
1628
1742
|
*/
|
1629
|
-
|
1743
|
+
bool IsDirty();
|
1630
1744
|
|
1631
1745
|
/**
|
1632
1746
|
* Clone this object with a fast but shallow copy. Values will point
|
1633
1747
|
* to the same values as the original object.
|
1634
1748
|
*/
|
1635
|
-
|
1749
|
+
Local<Object> Clone();
|
1636
1750
|
|
1637
1751
|
/**
|
1638
1752
|
* Returns the context in which the object was created.
|
1639
1753
|
*/
|
1640
|
-
|
1754
|
+
Local<Context> CreationContext();
|
1641
1755
|
|
1642
1756
|
/**
|
1643
1757
|
* Set the backing store of the indexed properties to be managed by the
|
@@ -1646,10 +1760,10 @@ class Object : public Value {
|
|
1646
1760
|
* Note: The embedding program still owns the data and needs to ensure that
|
1647
1761
|
* the backing store is preserved while V8 has a reference.
|
1648
1762
|
*/
|
1649
|
-
|
1650
|
-
|
1651
|
-
|
1652
|
-
|
1763
|
+
void SetIndexedPropertiesToPixelData(uint8_t* data, int length);
|
1764
|
+
bool HasIndexedPropertiesInPixelData();
|
1765
|
+
uint8_t* GetIndexedPropertiesPixelData();
|
1766
|
+
int GetIndexedPropertiesPixelDataLength();
|
1653
1767
|
|
1654
1768
|
/**
|
1655
1769
|
* Set the backing store of the indexed properties to be managed by the
|
@@ -1658,93 +1772,83 @@ class Object : public Value {
|
|
1658
1772
|
* Note: The embedding program still owns the data and needs to ensure that
|
1659
1773
|
* the backing store is preserved while V8 has a reference.
|
1660
1774
|
*/
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1664
|
-
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
V8EXPORT int GetIndexedPropertiesExternalArrayDataLength();
|
1775
|
+
void SetIndexedPropertiesToExternalArrayData(void* data,
|
1776
|
+
ExternalArrayType array_type,
|
1777
|
+
int number_of_elements);
|
1778
|
+
bool HasIndexedPropertiesInExternalArrayData();
|
1779
|
+
void* GetIndexedPropertiesExternalArrayData();
|
1780
|
+
ExternalArrayType GetIndexedPropertiesExternalArrayDataType();
|
1781
|
+
int GetIndexedPropertiesExternalArrayDataLength();
|
1669
1782
|
|
1670
1783
|
/**
|
1671
1784
|
* Checks whether a callback is set by the
|
1672
1785
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
1673
1786
|
* When an Object is callable this method returns true.
|
1674
1787
|
*/
|
1675
|
-
|
1788
|
+
bool IsCallable();
|
1676
1789
|
|
1677
1790
|
/**
|
1678
1791
|
* Call an Object as a function if a callback is set by the
|
1679
1792
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
1680
1793
|
*/
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1794
|
+
Local<Value> CallAsFunction(Handle<Object> recv,
|
1795
|
+
int argc,
|
1796
|
+
Handle<Value> argv[]);
|
1684
1797
|
|
1685
1798
|
/**
|
1686
1799
|
* Call an Object as a constructor if a callback is set by the
|
1687
1800
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
1688
1801
|
* Note: This method behaves like the Function::NewInstance method.
|
1689
1802
|
*/
|
1690
|
-
|
1691
|
-
Handle<Value> argv[]);
|
1803
|
+
Local<Value> CallAsConstructor(int argc, Handle<Value> argv[]);
|
1692
1804
|
|
1693
|
-
|
1694
|
-
static
|
1805
|
+
static Local<Object> New();
|
1806
|
+
V8_INLINE(static Object* Cast(Value* obj));
|
1695
1807
|
|
1696
1808
|
private:
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
/**
|
1703
|
-
* If quick access to the internal field is possible this method
|
1704
|
-
* returns the value. Otherwise an empty handle is returned.
|
1705
|
-
*/
|
1706
|
-
inline Local<Value> UncheckedGetInternalField(int index);
|
1809
|
+
Object();
|
1810
|
+
static void CheckCast(Value* obj);
|
1811
|
+
Local<Value> SlowGetInternalField(int index);
|
1812
|
+
void* SlowGetAlignedPointerFromInternalField(int index);
|
1707
1813
|
};
|
1708
1814
|
|
1709
1815
|
|
1710
1816
|
/**
|
1711
1817
|
* An instance of the built-in array constructor (ECMA-262, 15.4.2).
|
1712
1818
|
*/
|
1713
|
-
class Array : public Object {
|
1819
|
+
class V8EXPORT Array : public Object {
|
1714
1820
|
public:
|
1715
|
-
|
1821
|
+
uint32_t Length() const;
|
1716
1822
|
|
1717
1823
|
/**
|
1718
1824
|
* Clones an element at index |index|. Returns an empty
|
1719
1825
|
* handle if cloning fails (for any reason).
|
1720
1826
|
*/
|
1721
|
-
|
1827
|
+
Local<Object> CloneElementAt(uint32_t index);
|
1722
1828
|
|
1723
1829
|
/**
|
1724
1830
|
* Creates a JavaScript array with the given length. If the length
|
1725
1831
|
* is negative the returned array will have length 0.
|
1726
1832
|
*/
|
1727
|
-
|
1833
|
+
static Local<Array> New(int length = 0);
|
1728
1834
|
|
1729
|
-
static
|
1835
|
+
V8_INLINE(static Array* Cast(Value* obj));
|
1730
1836
|
private:
|
1731
|
-
|
1732
|
-
|
1837
|
+
Array();
|
1838
|
+
static void CheckCast(Value* obj);
|
1733
1839
|
};
|
1734
1840
|
|
1735
1841
|
|
1736
1842
|
/**
|
1737
1843
|
* A JavaScript function object (ECMA-262, 15.3).
|
1738
1844
|
*/
|
1739
|
-
class Function : public Object {
|
1845
|
+
class V8EXPORT Function : public Object {
|
1740
1846
|
public:
|
1741
|
-
|
1742
|
-
|
1743
|
-
|
1744
|
-
|
1745
|
-
|
1746
|
-
V8EXPORT void SetName(Handle<String> name);
|
1747
|
-
V8EXPORT Handle<Value> GetName() const;
|
1847
|
+
Local<Object> NewInstance() const;
|
1848
|
+
Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
|
1849
|
+
Local<Value> Call(Handle<Object> recv, int argc, Handle<Value> argv[]);
|
1850
|
+
void SetName(Handle<String> name);
|
1851
|
+
Handle<Value> GetName() const;
|
1748
1852
|
|
1749
1853
|
/**
|
1750
1854
|
* Name inferred from variable or property assignment of this function.
|
@@ -1752,43 +1856,43 @@ class Function : public Object {
|
|
1752
1856
|
* in an OO style, where many functions are anonymous but are assigned
|
1753
1857
|
* to object properties.
|
1754
1858
|
*/
|
1755
|
-
|
1859
|
+
Handle<Value> GetInferredName() const;
|
1756
1860
|
|
1757
1861
|
/**
|
1758
1862
|
* Returns zero based line number of function body and
|
1759
1863
|
* kLineOffsetNotFound if no information available.
|
1760
1864
|
*/
|
1761
|
-
|
1865
|
+
int GetScriptLineNumber() const;
|
1762
1866
|
/**
|
1763
1867
|
* Returns zero based column number of function body and
|
1764
1868
|
* kLineOffsetNotFound if no information available.
|
1765
1869
|
*/
|
1766
|
-
|
1767
|
-
|
1768
|
-
|
1769
|
-
static
|
1770
|
-
|
1870
|
+
int GetScriptColumnNumber() const;
|
1871
|
+
Handle<Value> GetScriptId() const;
|
1872
|
+
ScriptOrigin GetScriptOrigin() const;
|
1873
|
+
V8_INLINE(static Function* Cast(Value* obj));
|
1874
|
+
static const int kLineOffsetNotFound;
|
1771
1875
|
|
1772
1876
|
private:
|
1773
|
-
|
1774
|
-
|
1877
|
+
Function();
|
1878
|
+
static void CheckCast(Value* obj);
|
1775
1879
|
};
|
1776
1880
|
|
1777
1881
|
|
1778
1882
|
/**
|
1779
1883
|
* An instance of the built-in Date constructor (ECMA-262, 15.9).
|
1780
1884
|
*/
|
1781
|
-
class Date : public Object {
|
1885
|
+
class V8EXPORT Date : public Object {
|
1782
1886
|
public:
|
1783
|
-
|
1887
|
+
static Local<Value> New(double time);
|
1784
1888
|
|
1785
1889
|
/**
|
1786
1890
|
* A specialization of Value::NumberValue that is more efficient
|
1787
1891
|
* because we know the structure of this object.
|
1788
1892
|
*/
|
1789
|
-
|
1893
|
+
double NumberValue() const;
|
1790
1894
|
|
1791
|
-
static
|
1895
|
+
V8_INLINE(static Date* Cast(v8::Value* obj));
|
1792
1896
|
|
1793
1897
|
/**
|
1794
1898
|
* Notification that the embedder has changed the time zone,
|
@@ -1802,74 +1906,74 @@ class Date : public Object {
|
|
1802
1906
|
* This API should not be called more than needed as it will
|
1803
1907
|
* negatively impact the performance of date operations.
|
1804
1908
|
*/
|
1805
|
-
|
1909
|
+
static void DateTimeConfigurationChangeNotification();
|
1806
1910
|
|
1807
1911
|
private:
|
1808
|
-
|
1912
|
+
static void CheckCast(v8::Value* obj);
|
1809
1913
|
};
|
1810
1914
|
|
1811
1915
|
|
1812
1916
|
/**
|
1813
1917
|
* A Number object (ECMA-262, 4.3.21).
|
1814
1918
|
*/
|
1815
|
-
class NumberObject : public Object {
|
1919
|
+
class V8EXPORT NumberObject : public Object {
|
1816
1920
|
public:
|
1817
|
-
|
1921
|
+
static Local<Value> New(double value);
|
1818
1922
|
|
1819
1923
|
/**
|
1820
1924
|
* Returns the Number held by the object.
|
1821
1925
|
*/
|
1822
|
-
|
1926
|
+
double NumberValue() const;
|
1823
1927
|
|
1824
|
-
static
|
1928
|
+
V8_INLINE(static NumberObject* Cast(v8::Value* obj));
|
1825
1929
|
|
1826
1930
|
private:
|
1827
|
-
|
1931
|
+
static void CheckCast(v8::Value* obj);
|
1828
1932
|
};
|
1829
1933
|
|
1830
1934
|
|
1831
1935
|
/**
|
1832
1936
|
* A Boolean object (ECMA-262, 4.3.15).
|
1833
1937
|
*/
|
1834
|
-
class BooleanObject : public Object {
|
1938
|
+
class V8EXPORT BooleanObject : public Object {
|
1835
1939
|
public:
|
1836
|
-
|
1940
|
+
static Local<Value> New(bool value);
|
1837
1941
|
|
1838
1942
|
/**
|
1839
1943
|
* Returns the Boolean held by the object.
|
1840
1944
|
*/
|
1841
|
-
|
1945
|
+
bool BooleanValue() const;
|
1842
1946
|
|
1843
|
-
static
|
1947
|
+
V8_INLINE(static BooleanObject* Cast(v8::Value* obj));
|
1844
1948
|
|
1845
1949
|
private:
|
1846
|
-
|
1950
|
+
static void CheckCast(v8::Value* obj);
|
1847
1951
|
};
|
1848
1952
|
|
1849
1953
|
|
1850
1954
|
/**
|
1851
1955
|
* A String object (ECMA-262, 4.3.18).
|
1852
1956
|
*/
|
1853
|
-
class StringObject : public Object {
|
1957
|
+
class V8EXPORT StringObject : public Object {
|
1854
1958
|
public:
|
1855
|
-
|
1959
|
+
static Local<Value> New(Handle<String> value);
|
1856
1960
|
|
1857
1961
|
/**
|
1858
1962
|
* Returns the String held by the object.
|
1859
1963
|
*/
|
1860
|
-
|
1964
|
+
Local<String> StringValue() const;
|
1861
1965
|
|
1862
|
-
static
|
1966
|
+
V8_INLINE(static StringObject* Cast(v8::Value* obj));
|
1863
1967
|
|
1864
1968
|
private:
|
1865
|
-
|
1969
|
+
static void CheckCast(v8::Value* obj);
|
1866
1970
|
};
|
1867
1971
|
|
1868
1972
|
|
1869
1973
|
/**
|
1870
1974
|
* An instance of the built-in RegExp constructor (ECMA-262, 15.10).
|
1871
1975
|
*/
|
1872
|
-
class RegExp : public Object {
|
1976
|
+
class V8EXPORT RegExp : public Object {
|
1873
1977
|
public:
|
1874
1978
|
/**
|
1875
1979
|
* Regular expression flag bits. They can be or'ed to enable a set
|
@@ -1892,51 +1996,37 @@ class RegExp : public Object {
|
|
1892
1996
|
* static_cast<RegExp::Flags>(kGlobal | kMultiline))
|
1893
1997
|
* is equivalent to evaluating "/foo/gm".
|
1894
1998
|
*/
|
1895
|
-
|
1896
|
-
Flags flags);
|
1999
|
+
static Local<RegExp> New(Handle<String> pattern, Flags flags);
|
1897
2000
|
|
1898
2001
|
/**
|
1899
2002
|
* Returns the value of the source property: a string representing
|
1900
2003
|
* the regular expression.
|
1901
2004
|
*/
|
1902
|
-
|
2005
|
+
Local<String> GetSource() const;
|
1903
2006
|
|
1904
2007
|
/**
|
1905
2008
|
* Returns the flags bit field.
|
1906
2009
|
*/
|
1907
|
-
|
2010
|
+
Flags GetFlags() const;
|
1908
2011
|
|
1909
|
-
static
|
2012
|
+
V8_INLINE(static RegExp* Cast(v8::Value* obj));
|
1910
2013
|
|
1911
2014
|
private:
|
1912
|
-
|
2015
|
+
static void CheckCast(v8::Value* obj);
|
1913
2016
|
};
|
1914
2017
|
|
1915
2018
|
|
1916
2019
|
/**
|
1917
|
-
* A JavaScript value that wraps a C++ void*.
|
1918
|
-
*
|
1919
|
-
* objects.
|
1920
|
-
*
|
1921
|
-
* The Wrap function V8 will return the most optimal Value object wrapping the
|
1922
|
-
* C++ void*. The type of the value is not guaranteed to be an External object
|
1923
|
-
* and no assumptions about its type should be made. To access the wrapped
|
1924
|
-
* value Unwrap should be used, all other operations on that object will lead
|
1925
|
-
* to unpredictable results.
|
2020
|
+
* A JavaScript value that wraps a C++ void*. This type of value is mainly used
|
2021
|
+
* to associate C++ data structures with JavaScript objects.
|
1926
2022
|
*/
|
1927
|
-
class External : public Value {
|
2023
|
+
class V8EXPORT External : public Value {
|
1928
2024
|
public:
|
1929
|
-
|
1930
|
-
static
|
1931
|
-
|
1932
|
-
V8EXPORT static Local<External> New(void* value);
|
1933
|
-
static inline External* Cast(Value* obj);
|
1934
|
-
V8EXPORT void* Value() const;
|
2025
|
+
static Local<External> New(void* value);
|
2026
|
+
V8_INLINE(static External* Cast(Value* obj));
|
2027
|
+
void* Value() const;
|
1935
2028
|
private:
|
1936
|
-
|
1937
|
-
V8EXPORT static void CheckCast(v8::Value* obj);
|
1938
|
-
static inline void* QuickUnwrap(Handle<v8::Value> obj);
|
1939
|
-
V8EXPORT static void* FullUnwrap(Handle<v8::Value> obj);
|
2029
|
+
static void CheckCast(v8::Value* obj);
|
1940
2030
|
};
|
1941
2031
|
|
1942
2032
|
|
@@ -1951,7 +2041,7 @@ class V8EXPORT Template : public Data {
|
|
1951
2041
|
/** Adds a property to each instance created by this template.*/
|
1952
2042
|
void Set(Handle<String> name, Handle<Data> value,
|
1953
2043
|
PropertyAttribute attributes = None);
|
1954
|
-
|
2044
|
+
V8_INLINE(void Set(const char* name, Handle<Data> value));
|
1955
2045
|
private:
|
1956
2046
|
Template();
|
1957
2047
|
|
@@ -1966,16 +2056,16 @@ class V8EXPORT Template : public Data {
|
|
1966
2056
|
* including the receiver, the number and values of arguments, and
|
1967
2057
|
* the holder of the function.
|
1968
2058
|
*/
|
1969
|
-
class Arguments {
|
2059
|
+
class V8EXPORT Arguments {
|
1970
2060
|
public:
|
1971
|
-
|
1972
|
-
|
1973
|
-
|
1974
|
-
|
1975
|
-
|
1976
|
-
|
1977
|
-
|
1978
|
-
|
2061
|
+
V8_INLINE(int Length() const);
|
2062
|
+
V8_INLINE(Local<Value> operator[](int i) const);
|
2063
|
+
V8_INLINE(Local<Function> Callee() const);
|
2064
|
+
V8_INLINE(Local<Object> This() const);
|
2065
|
+
V8_INLINE(Local<Object> Holder() const);
|
2066
|
+
V8_INLINE(bool IsConstructCall() const);
|
2067
|
+
V8_INLINE(Local<Value> Data() const);
|
2068
|
+
V8_INLINE(Isolate* GetIsolate() const);
|
1979
2069
|
|
1980
2070
|
private:
|
1981
2071
|
static const int kIsolateIndex = 0;
|
@@ -1984,10 +2074,10 @@ class Arguments {
|
|
1984
2074
|
static const int kHolderIndex = -3;
|
1985
2075
|
|
1986
2076
|
friend class ImplementationUtilities;
|
1987
|
-
|
2077
|
+
V8_INLINE(Arguments(internal::Object** implicit_args,
|
1988
2078
|
internal::Object** values,
|
1989
2079
|
int length,
|
1990
|
-
bool is_construct_call);
|
2080
|
+
bool is_construct_call));
|
1991
2081
|
internal::Object** implicit_args_;
|
1992
2082
|
internal::Object** values_;
|
1993
2083
|
int length_;
|
@@ -2001,12 +2091,12 @@ class Arguments {
|
|
2001
2091
|
*/
|
2002
2092
|
class V8EXPORT AccessorInfo {
|
2003
2093
|
public:
|
2004
|
-
|
2094
|
+
V8_INLINE(AccessorInfo(internal::Object** args))
|
2005
2095
|
: args_(args) { }
|
2006
|
-
|
2007
|
-
|
2008
|
-
|
2009
|
-
|
2096
|
+
V8_INLINE(Isolate* GetIsolate() const);
|
2097
|
+
V8_INLINE(Local<Value> Data() const);
|
2098
|
+
V8_INLINE(Local<Object> This() const);
|
2099
|
+
V8_INLINE(Local<Object> Holder() const);
|
2010
2100
|
|
2011
2101
|
private:
|
2012
2102
|
internal::Object** args_;
|
@@ -2224,7 +2314,8 @@ class V8EXPORT FunctionTemplate : public Template {
|
|
2224
2314
|
static Local<FunctionTemplate> New(
|
2225
2315
|
InvocationCallback callback = 0,
|
2226
2316
|
Handle<Value> data = Handle<Value>(),
|
2227
|
-
Handle<Signature> signature = Handle<Signature>()
|
2317
|
+
Handle<Signature> signature = Handle<Signature>(),
|
2318
|
+
int length = 0);
|
2228
2319
|
/** Returns the unique function instance in the current execution context.*/
|
2229
2320
|
Local<Function> GetFunction();
|
2230
2321
|
|
@@ -2236,6 +2327,9 @@ class V8EXPORT FunctionTemplate : public Template {
|
|
2236
2327
|
void SetCallHandler(InvocationCallback callback,
|
2237
2328
|
Handle<Value> data = Handle<Value>());
|
2238
2329
|
|
2330
|
+
/** Set the predefined length property for the FunctionTemplate. */
|
2331
|
+
void SetLength(int length);
|
2332
|
+
|
2239
2333
|
/** Get the InstanceTemplate. */
|
2240
2334
|
Local<ObjectTemplate> InstanceTemplate();
|
2241
2335
|
|
@@ -2248,7 +2342,6 @@ class V8EXPORT FunctionTemplate : public Template {
|
|
2248
2342
|
*/
|
2249
2343
|
Local<ObjectTemplate> PrototypeTemplate();
|
2250
2344
|
|
2251
|
-
|
2252
2345
|
/**
|
2253
2346
|
* Set the class name of the FunctionTemplate. This is used for
|
2254
2347
|
* printing objects created with the function created from the
|
@@ -2289,7 +2382,8 @@ class V8EXPORT FunctionTemplate : public Template {
|
|
2289
2382
|
AccessorSetter setter,
|
2290
2383
|
Handle<Value> data,
|
2291
2384
|
AccessControl settings,
|
2292
|
-
PropertyAttribute attributes
|
2385
|
+
PropertyAttribute attributes,
|
2386
|
+
Handle<AccessorSignature> signature);
|
2293
2387
|
void SetNamedInstancePropertyHandler(NamedPropertyGetter getter,
|
2294
2388
|
NamedPropertySetter setter,
|
2295
2389
|
NamedPropertyQuery query,
|
@@ -2347,13 +2441,20 @@ class V8EXPORT ObjectTemplate : public Template {
|
|
2347
2441
|
* cross-context access.
|
2348
2442
|
* \param attribute The attributes of the property for which an accessor
|
2349
2443
|
* is added.
|
2444
|
+
* \param signature The signature describes valid receivers for the accessor
|
2445
|
+
* and is used to perform implicit instance checks against them. If the
|
2446
|
+
* receiver is incompatible (i.e. is not an instance of the constructor as
|
2447
|
+
* defined by FunctionTemplate::HasInstance()), an implicit TypeError is
|
2448
|
+
* thrown and no callback is invoked.
|
2350
2449
|
*/
|
2351
2450
|
void SetAccessor(Handle<String> name,
|
2352
2451
|
AccessorGetter getter,
|
2353
2452
|
AccessorSetter setter = 0,
|
2354
2453
|
Handle<Value> data = Handle<Value>(),
|
2355
2454
|
AccessControl settings = DEFAULT,
|
2356
|
-
PropertyAttribute attribute = None
|
2455
|
+
PropertyAttribute attribute = None,
|
2456
|
+
Handle<AccessorSignature> signature =
|
2457
|
+
Handle<AccessorSignature>());
|
2357
2458
|
|
2358
2459
|
/**
|
2359
2460
|
* Sets a named property handler on the object template.
|
@@ -2457,8 +2558,8 @@ class V8EXPORT ObjectTemplate : public Template {
|
|
2457
2558
|
|
2458
2559
|
|
2459
2560
|
/**
|
2460
|
-
* A Signature specifies which receivers and arguments
|
2461
|
-
*
|
2561
|
+
* A Signature specifies which receivers and arguments are valid
|
2562
|
+
* parameters to a function.
|
2462
2563
|
*/
|
2463
2564
|
class V8EXPORT Signature : public Data {
|
2464
2565
|
public:
|
@@ -2471,6 +2572,19 @@ class V8EXPORT Signature : public Data {
|
|
2471
2572
|
};
|
2472
2573
|
|
2473
2574
|
|
2575
|
+
/**
|
2576
|
+
* An AccessorSignature specifies which receivers are valid parameters
|
2577
|
+
* to an accessor callback.
|
2578
|
+
*/
|
2579
|
+
class V8EXPORT AccessorSignature : public Data {
|
2580
|
+
public:
|
2581
|
+
static Local<AccessorSignature> New(Handle<FunctionTemplate> receiver =
|
2582
|
+
Handle<FunctionTemplate>());
|
2583
|
+
private:
|
2584
|
+
AccessorSignature();
|
2585
|
+
};
|
2586
|
+
|
2587
|
+
|
2474
2588
|
/**
|
2475
2589
|
* A utility for determining the type of objects based on the template
|
2476
2590
|
* they were constructed from.
|
@@ -2550,7 +2664,7 @@ void V8EXPORT RegisterExtension(Extension* extension);
|
|
2550
2664
|
*/
|
2551
2665
|
class V8EXPORT DeclareExtension {
|
2552
2666
|
public:
|
2553
|
-
|
2667
|
+
V8_INLINE(DeclareExtension(Extension* extension)) {
|
2554
2668
|
RegisterExtension(extension);
|
2555
2669
|
}
|
2556
2670
|
};
|
@@ -2564,10 +2678,10 @@ Handle<Primitive> V8EXPORT Null();
|
|
2564
2678
|
Handle<Boolean> V8EXPORT True();
|
2565
2679
|
Handle<Boolean> V8EXPORT False();
|
2566
2680
|
|
2567
|
-
|
2568
|
-
|
2569
|
-
|
2570
|
-
|
2681
|
+
V8_INLINE(Handle<Primitive> Undefined(Isolate* isolate));
|
2682
|
+
V8_INLINE(Handle<Primitive> Null(Isolate* isolate));
|
2683
|
+
V8_INLINE(Handle<Boolean> True(Isolate* isolate));
|
2684
|
+
V8_INLINE(Handle<Boolean> False(Isolate* isolate));
|
2571
2685
|
|
2572
2686
|
|
2573
2687
|
/**
|
@@ -2608,7 +2722,7 @@ bool V8EXPORT SetResourceConstraints(ResourceConstraints* constraints);
|
|
2608
2722
|
typedef void (*FatalErrorCallback)(const char* location, const char* message);
|
2609
2723
|
|
2610
2724
|
|
2611
|
-
typedef void (*MessageCallback)(Handle<Message> message, Handle<Value>
|
2725
|
+
typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error);
|
2612
2726
|
|
2613
2727
|
|
2614
2728
|
/**
|
@@ -2721,6 +2835,7 @@ class V8EXPORT HeapStatistics {
|
|
2721
2835
|
HeapStatistics();
|
2722
2836
|
size_t total_heap_size() { return total_heap_size_; }
|
2723
2837
|
size_t total_heap_size_executable() { return total_heap_size_executable_; }
|
2838
|
+
size_t total_physical_size() { return total_physical_size_; }
|
2724
2839
|
size_t used_heap_size() { return used_heap_size_; }
|
2725
2840
|
size_t heap_size_limit() { return heap_size_limit_; }
|
2726
2841
|
|
@@ -2729,11 +2844,15 @@ class V8EXPORT HeapStatistics {
|
|
2729
2844
|
void set_total_heap_size_executable(size_t size) {
|
2730
2845
|
total_heap_size_executable_ = size;
|
2731
2846
|
}
|
2847
|
+
void set_total_physical_size(size_t size) {
|
2848
|
+
total_physical_size_ = size;
|
2849
|
+
}
|
2732
2850
|
void set_used_heap_size(size_t size) { used_heap_size_ = size; }
|
2733
2851
|
void set_heap_size_limit(size_t size) { heap_size_limit_ = size; }
|
2734
2852
|
|
2735
2853
|
size_t total_heap_size_;
|
2736
2854
|
size_t total_heap_size_executable_;
|
2855
|
+
size_t total_physical_size_;
|
2737
2856
|
size_t used_heap_size_;
|
2738
2857
|
size_t heap_size_limit_;
|
2739
2858
|
|
@@ -2819,13 +2938,13 @@ class V8EXPORT Isolate {
|
|
2819
2938
|
/**
|
2820
2939
|
* Associate embedder-specific data with the isolate
|
2821
2940
|
*/
|
2822
|
-
|
2941
|
+
V8_INLINE(void SetData(void* data));
|
2823
2942
|
|
2824
2943
|
/**
|
2825
2944
|
* Retrieve embedder-specific data from the isolate.
|
2826
2945
|
* Returns NULL if SetData has never been called.
|
2827
2946
|
*/
|
2828
|
-
|
2947
|
+
V8_INLINE(void* GetData());
|
2829
2948
|
|
2830
2949
|
private:
|
2831
2950
|
Isolate();
|
@@ -2837,7 +2956,7 @@ class V8EXPORT Isolate {
|
|
2837
2956
|
};
|
2838
2957
|
|
2839
2958
|
|
2840
|
-
class StartupData {
|
2959
|
+
class V8EXPORT StartupData {
|
2841
2960
|
public:
|
2842
2961
|
enum CompressionAlgorithm {
|
2843
2962
|
kUncompressed,
|
@@ -2887,17 +3006,86 @@ typedef bool (*EntropySource)(unsigned char* buffer, size_t length);
|
|
2887
3006
|
* resolving the location of a return address on the stack. Profilers that
|
2888
3007
|
* change the return address on the stack can use this to resolve the stack
|
2889
3008
|
* location to whereever the profiler stashed the original return address.
|
2890
|
-
*
|
2891
|
-
*
|
2892
|
-
*
|
2893
|
-
*
|
3009
|
+
*
|
3010
|
+
* \param return_addr_location points to a location on stack where a machine
|
3011
|
+
* return address resides.
|
3012
|
+
* \returns either return_addr_location, or else a pointer to the profiler's
|
3013
|
+
* copy of the original return address.
|
3014
|
+
*
|
3015
|
+
* \note the resolver function must not cause garbage collection.
|
2894
3016
|
*/
|
2895
3017
|
typedef uintptr_t (*ReturnAddressLocationResolver)(
|
2896
3018
|
uintptr_t return_addr_location);
|
2897
3019
|
|
2898
3020
|
|
2899
3021
|
/**
|
2900
|
-
*
|
3022
|
+
* FunctionEntryHook is the type of the profile entry hook called at entry to
|
3023
|
+
* any generated function when function-level profiling is enabled.
|
3024
|
+
*
|
3025
|
+
* \param function the address of the function that's being entered.
|
3026
|
+
* \param return_addr_location points to a location on stack where the machine
|
3027
|
+
* return address resides. This can be used to identify the caller of
|
3028
|
+
* \p function, and/or modified to divert execution when \p function exits.
|
3029
|
+
*
|
3030
|
+
* \note the entry hook must not cause garbage collection.
|
3031
|
+
*/
|
3032
|
+
typedef void (*FunctionEntryHook)(uintptr_t function,
|
3033
|
+
uintptr_t return_addr_location);
|
3034
|
+
|
3035
|
+
|
3036
|
+
/**
|
3037
|
+
* A JIT code event is issued each time code is added, moved or removed.
|
3038
|
+
*
|
3039
|
+
* \note removal events are not currently issued.
|
3040
|
+
*/
|
3041
|
+
struct JitCodeEvent {
|
3042
|
+
enum EventType {
|
3043
|
+
CODE_ADDED,
|
3044
|
+
CODE_MOVED,
|
3045
|
+
CODE_REMOVED
|
3046
|
+
};
|
3047
|
+
|
3048
|
+
// Type of event.
|
3049
|
+
EventType type;
|
3050
|
+
// Start of the instructions.
|
3051
|
+
void* code_start;
|
3052
|
+
// Size of the instructions.
|
3053
|
+
size_t code_len;
|
3054
|
+
|
3055
|
+
union {
|
3056
|
+
// Only valid for CODE_ADDED.
|
3057
|
+
struct {
|
3058
|
+
// Name of the object associated with the code, note that the string is
|
3059
|
+
// not zero-terminated.
|
3060
|
+
const char* str;
|
3061
|
+
// Number of chars in str.
|
3062
|
+
size_t len;
|
3063
|
+
} name;
|
3064
|
+
// New location of instructions. Only valid for CODE_MOVED.
|
3065
|
+
void* new_code_start;
|
3066
|
+
};
|
3067
|
+
};
|
3068
|
+
|
3069
|
+
/**
|
3070
|
+
* Option flags passed to the SetJitCodeEventHandler function.
|
3071
|
+
*/
|
3072
|
+
enum JitCodeEventOptions {
|
3073
|
+
kJitCodeEventDefault = 0,
|
3074
|
+
// Generate callbacks for already existent code.
|
3075
|
+
kJitCodeEventEnumExisting = 1
|
3076
|
+
};
|
3077
|
+
|
3078
|
+
|
3079
|
+
/**
|
3080
|
+
* Callback function passed to SetJitCodeEventHandler.
|
3081
|
+
*
|
3082
|
+
* \param event code add, move or removal event.
|
3083
|
+
*/
|
3084
|
+
typedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
|
3085
|
+
|
3086
|
+
|
3087
|
+
/**
|
3088
|
+
* Interface for iterating through all external resources in the heap.
|
2901
3089
|
*/
|
2902
3090
|
class V8EXPORT ExternalResourceVisitor { // NOLINT
|
2903
3091
|
public:
|
@@ -2906,6 +3094,17 @@ class V8EXPORT ExternalResourceVisitor { // NOLINT
|
|
2906
3094
|
};
|
2907
3095
|
|
2908
3096
|
|
3097
|
+
/**
|
3098
|
+
* Interface for iterating through all the persistent handles in the heap.
|
3099
|
+
*/
|
3100
|
+
class V8EXPORT PersistentHandleVisitor { // NOLINT
|
3101
|
+
public:
|
3102
|
+
virtual ~PersistentHandleVisitor() {}
|
3103
|
+
virtual void VisitPersistentHandle(Persistent<Value> value,
|
3104
|
+
uint16_t class_id) {}
|
3105
|
+
};
|
3106
|
+
|
3107
|
+
|
2909
3108
|
/**
|
2910
3109
|
* Container class for static utility functions.
|
2911
3110
|
*/
|
@@ -2971,8 +3170,7 @@ class V8EXPORT V8 {
|
|
2971
3170
|
* The same message listener can be added more than once and in that
|
2972
3171
|
* case it will be called more than once for each message.
|
2973
3172
|
*/
|
2974
|
-
static bool AddMessageListener(MessageCallback that
|
2975
|
-
Handle<Value> data = Handle<Value>());
|
3173
|
+
static bool AddMessageListener(MessageCallback that);
|
2976
3174
|
|
2977
3175
|
/**
|
2978
3176
|
* Remove all message listeners from the specified callback function.
|
@@ -3018,12 +3216,6 @@ class V8EXPORT V8 {
|
|
3018
3216
|
static void SetCreateHistogramFunction(CreateHistogramCallback);
|
3019
3217
|
static void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
|
3020
3218
|
|
3021
|
-
/**
|
3022
|
-
* Enables the computation of a sliding window of states. The sliding
|
3023
|
-
* window information is recorded in statistics counters.
|
3024
|
-
*/
|
3025
|
-
static void EnableSlidingStateWindow();
|
3026
|
-
|
3027
3219
|
/** Callback function for reporting failed access checks.*/
|
3028
3220
|
static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback);
|
3029
3221
|
|
@@ -3054,7 +3246,7 @@ class V8EXPORT V8 {
|
|
3054
3246
|
* or delete properties for example) since it is possible such
|
3055
3247
|
* operations will result in the allocation of objects.
|
3056
3248
|
*/
|
3057
|
-
static void SetGlobalGCPrologueCallback(GCCallback);
|
3249
|
+
V8_DEPRECATED(static void SetGlobalGCPrologueCallback(GCCallback));
|
3058
3250
|
|
3059
3251
|
/**
|
3060
3252
|
* Enables the host application to receive a notification after a
|
@@ -3083,7 +3275,7 @@ class V8EXPORT V8 {
|
|
3083
3275
|
* or delete properties for example) since it is possible such
|
3084
3276
|
* operations will result in the allocation of objects.
|
3085
3277
|
*/
|
3086
|
-
static void SetGlobalGCEpilogueCallback(GCCallback);
|
3278
|
+
V8_DEPRECATED(static void SetGlobalGCEpilogueCallback(GCCallback));
|
3087
3279
|
|
3088
3280
|
/**
|
3089
3281
|
* Enables the host application to provide a mechanism to be notified
|
@@ -3118,12 +3310,19 @@ class V8EXPORT V8 {
|
|
3118
3310
|
* After each garbage collection, object groups are removed. It is
|
3119
3311
|
* intended to be used in the before-garbage-collection callback
|
3120
3312
|
* function, for instance to simulate DOM tree connections among JS
|
3121
|
-
* wrapper objects.
|
3313
|
+
* wrapper objects. Object groups for all dependent handles need to
|
3314
|
+
* be provided for kGCTypeMarkSweepCompact collections, for all other
|
3315
|
+
* garbage collection types it is sufficient to provide object groups
|
3316
|
+
* for partially dependent handles only.
|
3122
3317
|
* See v8-profiler.h for RetainedObjectInfo interface description.
|
3123
3318
|
*/
|
3124
3319
|
static void AddObjectGroup(Persistent<Value>* objects,
|
3125
3320
|
size_t length,
|
3126
3321
|
RetainedObjectInfo* info = NULL);
|
3322
|
+
static void AddObjectGroup(Isolate* isolate,
|
3323
|
+
Persistent<Value>* objects,
|
3324
|
+
size_t length,
|
3325
|
+
RetainedObjectInfo* info = NULL);
|
3127
3326
|
|
3128
3327
|
/**
|
3129
3328
|
* Allows the host application to declare implicit references between
|
@@ -3156,6 +3355,43 @@ class V8EXPORT V8 {
|
|
3156
3355
|
static void SetReturnAddressLocationResolver(
|
3157
3356
|
ReturnAddressLocationResolver return_address_resolver);
|
3158
3357
|
|
3358
|
+
/**
|
3359
|
+
* Allows the host application to provide the address of a function that's
|
3360
|
+
* invoked on entry to every V8-generated function.
|
3361
|
+
* Note that \p entry_hook is invoked at the very start of each
|
3362
|
+
* generated function.
|
3363
|
+
*
|
3364
|
+
* \param entry_hook a function that will be invoked on entry to every
|
3365
|
+
* V8-generated function.
|
3366
|
+
* \returns true on success on supported platforms, false on failure.
|
3367
|
+
* \note Setting a new entry hook function when one is already active will
|
3368
|
+
* fail.
|
3369
|
+
*/
|
3370
|
+
static bool SetFunctionEntryHook(FunctionEntryHook entry_hook);
|
3371
|
+
|
3372
|
+
/**
|
3373
|
+
* Allows the host application to provide the address of a function that is
|
3374
|
+
* notified each time code is added, moved or removed.
|
3375
|
+
*
|
3376
|
+
* \param options options for the JIT code event handler.
|
3377
|
+
* \param event_handler the JIT code event handler, which will be invoked
|
3378
|
+
* each time code is added, moved or removed.
|
3379
|
+
* \note \p event_handler won't get notified of existent code.
|
3380
|
+
* \note since code removal notifications are not currently issued, the
|
3381
|
+
* \p event_handler may get notifications of code that overlaps earlier
|
3382
|
+
* code notifications. This happens when code areas are reused, and the
|
3383
|
+
* earlier overlapping code areas should therefore be discarded.
|
3384
|
+
* \note the events passed to \p event_handler and the strings they point to
|
3385
|
+
* are not guaranteed to live past each call. The \p event_handler must
|
3386
|
+
* copy strings and other parameters it needs to keep around.
|
3387
|
+
* \note the set of events declared in JitCodeEvent::EventType is expected to
|
3388
|
+
* grow over time, and the JitCodeEvent structure is expected to accrue
|
3389
|
+
* new members. The \p event_handler function must ignore event codes
|
3390
|
+
* it does not recognize to maintain future compatibility.
|
3391
|
+
*/
|
3392
|
+
static void SetJitCodeEventHandler(JitCodeEventOptions options,
|
3393
|
+
JitCodeEventHandler event_handler);
|
3394
|
+
|
3159
3395
|
/**
|
3160
3396
|
* Adjusts the amount of registered external memory. Used to give
|
3161
3397
|
* V8 an indication of the amount of externally allocated memory
|
@@ -3271,11 +3507,27 @@ class V8EXPORT V8 {
|
|
3271
3507
|
|
3272
3508
|
/**
|
3273
3509
|
* Iterates through all external resources referenced from current isolate
|
3274
|
-
* heap.
|
3275
|
-
*
|
3510
|
+
* heap. GC is not invoked prior to iterating, therefore there is no
|
3511
|
+
* guarantee that visited objects are still alive.
|
3276
3512
|
*/
|
3277
3513
|
static void VisitExternalResources(ExternalResourceVisitor* visitor);
|
3278
3514
|
|
3515
|
+
/**
|
3516
|
+
* Iterates through all the persistent handles in the current isolate's heap
|
3517
|
+
* that have class_ids.
|
3518
|
+
*/
|
3519
|
+
static void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
|
3520
|
+
|
3521
|
+
/**
|
3522
|
+
* Iterates through all the persistent handles in the current isolate's heap
|
3523
|
+
* that have class_ids and are candidates to be marked as partially dependent
|
3524
|
+
* handles. This will visit handles to young objects created since the last
|
3525
|
+
* garbage collection but is free to visit an arbitrary superset of these
|
3526
|
+
* objects.
|
3527
|
+
*/
|
3528
|
+
static void VisitHandlesForPartialDependence(
|
3529
|
+
Isolate* isolate, PersistentHandleVisitor* visitor);
|
3530
|
+
|
3279
3531
|
/**
|
3280
3532
|
* Optional notification that the embedder is idle.
|
3281
3533
|
* V8 uses the notification to reduce memory footprint.
|
@@ -3307,17 +3559,17 @@ class V8EXPORT V8 {
|
|
3307
3559
|
private:
|
3308
3560
|
V8();
|
3309
3561
|
|
3310
|
-
static internal::Object** GlobalizeReference(internal::
|
3311
|
-
|
3312
|
-
static void
|
3562
|
+
static internal::Object** GlobalizeReference(internal::Isolate* isolate,
|
3563
|
+
internal::Object** handle);
|
3564
|
+
static void DisposeGlobal(internal::Isolate* isolate,
|
3565
|
+
internal::Object** global_handle);
|
3566
|
+
static void MakeWeak(internal::Isolate* isolate,
|
3567
|
+
internal::Object** global_handle,
|
3313
3568
|
void* data,
|
3314
|
-
WeakReferenceCallback
|
3315
|
-
|
3316
|
-
static void
|
3317
|
-
|
3318
|
-
static bool IsGlobalWeak(internal::Object** global_handle);
|
3319
|
-
static void SetWrapperClassId(internal::Object** global_handle,
|
3320
|
-
uint16_t class_id);
|
3569
|
+
WeakReferenceCallback weak_reference_callback,
|
3570
|
+
NearDeathCallback near_death_callback);
|
3571
|
+
static void ClearWeak(internal::Isolate* isolate,
|
3572
|
+
internal::Object** global_handle);
|
3321
3573
|
|
3322
3574
|
template <class T> friend class Handle;
|
3323
3575
|
template <class T> friend class Local;
|
@@ -3332,7 +3584,9 @@ class V8EXPORT V8 {
|
|
3332
3584
|
class V8EXPORT TryCatch {
|
3333
3585
|
public:
|
3334
3586
|
/**
|
3335
|
-
* Creates a new try/catch block and registers it with v8.
|
3587
|
+
* Creates a new try/catch block and registers it with v8. Note that
|
3588
|
+
* all TryCatch blocks should be stack allocated because the memory
|
3589
|
+
* location itself is compared against JavaScript try/catch blocks.
|
3336
3590
|
*/
|
3337
3591
|
TryCatch();
|
3338
3592
|
|
@@ -3422,6 +3676,12 @@ class V8EXPORT TryCatch {
|
|
3422
3676
|
void SetCaptureMessage(bool value);
|
3423
3677
|
|
3424
3678
|
private:
|
3679
|
+
// Make it hard to create heap-allocated TryCatch blocks.
|
3680
|
+
TryCatch(const TryCatch&);
|
3681
|
+
void operator=(const TryCatch&);
|
3682
|
+
void* operator new(size_t size);
|
3683
|
+
void operator delete(void*, size_t);
|
3684
|
+
|
3425
3685
|
v8::internal::Isolate* isolate_;
|
3426
3686
|
void* next_;
|
3427
3687
|
void* exception_;
|
@@ -3562,13 +3822,37 @@ class V8EXPORT Context {
|
|
3562
3822
|
/** Returns true if V8 has a current context. */
|
3563
3823
|
static bool InContext();
|
3564
3824
|
|
3825
|
+
/** Returns an isolate associated with a current context. */
|
3826
|
+
v8::Isolate* GetIsolate();
|
3827
|
+
|
3565
3828
|
/**
|
3566
|
-
*
|
3567
|
-
*
|
3568
|
-
*
|
3829
|
+
* Gets the embedder data with the given index, which must have been set by a
|
3830
|
+
* previous call to SetEmbedderData with the same index. Note that index 0
|
3831
|
+
* currently has a special meaning for Chrome's debugger.
|
3569
3832
|
*/
|
3570
|
-
|
3571
|
-
|
3833
|
+
V8_INLINE(Local<Value> GetEmbedderData(int index));
|
3834
|
+
|
3835
|
+
/**
|
3836
|
+
* Sets the embedder data with the given index, growing the data as
|
3837
|
+
* needed. Note that index 0 currently has a special meaning for Chrome's
|
3838
|
+
* debugger.
|
3839
|
+
*/
|
3840
|
+
void SetEmbedderData(int index, Handle<Value> value);
|
3841
|
+
|
3842
|
+
/**
|
3843
|
+
* Gets a 2-byte-aligned native pointer from the embedder data with the given
|
3844
|
+
* index, which must have bees set by a previous call to
|
3845
|
+
* SetAlignedPointerInEmbedderData with the same index. Note that index 0
|
3846
|
+
* currently has a special meaning for Chrome's debugger.
|
3847
|
+
*/
|
3848
|
+
V8_INLINE(void* GetAlignedPointerFromEmbedderData(int index));
|
3849
|
+
|
3850
|
+
/**
|
3851
|
+
* Sets a 2-byte-aligned native pointer in the embedder data with the given
|
3852
|
+
* index, growing the data as needed. Note that index 0 currently has a
|
3853
|
+
* special meaning for Chrome's debugger.
|
3854
|
+
*/
|
3855
|
+
void SetAlignedPointerInEmbedderData(int index, void* value);
|
3572
3856
|
|
3573
3857
|
/**
|
3574
3858
|
* Control whether code generation from strings is allowed. Calling
|
@@ -3591,16 +3875,23 @@ class V8EXPORT Context {
|
|
3591
3875
|
*/
|
3592
3876
|
bool IsCodeGenerationFromStringsAllowed();
|
3593
3877
|
|
3878
|
+
/**
|
3879
|
+
* Sets the error description for the exception that is thrown when
|
3880
|
+
* code generation from strings is not allowed and 'eval' or the 'Function'
|
3881
|
+
* constructor are called.
|
3882
|
+
*/
|
3883
|
+
void SetErrorMessageForCodeGenerationFromStrings(Handle<String> message);
|
3884
|
+
|
3594
3885
|
/**
|
3595
3886
|
* Stack-allocated class which sets the execution context for all
|
3596
3887
|
* operations executed within a local scope.
|
3597
3888
|
*/
|
3598
3889
|
class Scope {
|
3599
3890
|
public:
|
3600
|
-
explicit
|
3891
|
+
explicit V8_INLINE(Scope(Handle<Context> context)) : context_(context) {
|
3601
3892
|
context_->Enter();
|
3602
3893
|
}
|
3603
|
-
|
3894
|
+
V8_INLINE(~Scope()) { context_->Exit(); }
|
3604
3895
|
private:
|
3605
3896
|
Handle<Context> context_;
|
3606
3897
|
};
|
@@ -3610,25 +3901,26 @@ class V8EXPORT Context {
|
|
3610
3901
|
friend class Script;
|
3611
3902
|
friend class Object;
|
3612
3903
|
friend class Function;
|
3904
|
+
|
3905
|
+
Local<Value> SlowGetEmbedderData(int index);
|
3906
|
+
void* SlowGetAlignedPointerFromEmbedderData(int index);
|
3613
3907
|
};
|
3614
3908
|
|
3615
3909
|
|
3616
3910
|
/**
|
3617
|
-
* Multiple threads in V8 are allowed, but only one thread at a time
|
3618
|
-
*
|
3619
|
-
*
|
3620
|
-
*
|
3621
|
-
*
|
3622
|
-
*
|
3623
|
-
*
|
3624
|
-
*
|
3625
|
-
* must be used to signal thead switches to V8.
|
3911
|
+
* Multiple threads in V8 are allowed, but only one thread at a time is allowed
|
3912
|
+
* to use any given V8 isolate, see the comments in the Isolate class. The
|
3913
|
+
* definition of 'using a V8 isolate' includes accessing handles or holding onto
|
3914
|
+
* object pointers obtained from V8 handles while in the particular V8 isolate.
|
3915
|
+
* It is up to the user of V8 to ensure, perhaps with locking, that this
|
3916
|
+
* constraint is not violated. In addition to any other synchronization
|
3917
|
+
* mechanism that may be used, the v8::Locker and v8::Unlocker classes must be
|
3918
|
+
* used to signal thead switches to V8.
|
3626
3919
|
*
|
3627
|
-
* v8::Locker is a scoped lock object. While it's
|
3628
|
-
*
|
3629
|
-
*
|
3630
|
-
*
|
3631
|
-
* v8::Locker is a critical section.
|
3920
|
+
* v8::Locker is a scoped lock object. While it's active, i.e. between its
|
3921
|
+
* construction and destruction, the current thread is allowed to use the locked
|
3922
|
+
* isolate. V8 guarantees that an isolate can be locked by at most one thread at
|
3923
|
+
* any time. In other words, the scope of a v8::Locker is a critical section.
|
3632
3924
|
*
|
3633
3925
|
* Sample usage:
|
3634
3926
|
* \code
|
@@ -3642,9 +3934,9 @@ class V8EXPORT Context {
|
|
3642
3934
|
* } // Destructor called here
|
3643
3935
|
* \endcode
|
3644
3936
|
*
|
3645
|
-
* If you wish to stop using V8 in a thread A you can do this either
|
3646
|
-
*
|
3647
|
-
*
|
3937
|
+
* If you wish to stop using V8 in a thread A you can do this either by
|
3938
|
+
* destroying the v8::Locker object as above or by constructing a v8::Unlocker
|
3939
|
+
* object:
|
3648
3940
|
*
|
3649
3941
|
* \code
|
3650
3942
|
* {
|
@@ -3657,19 +3949,17 @@ class V8EXPORT Context {
|
|
3657
3949
|
* isolate->Enter();
|
3658
3950
|
* \endcode
|
3659
3951
|
*
|
3660
|
-
* The Unlocker object is intended for use in a long-running callback
|
3661
|
-
*
|
3662
|
-
* use.
|
3952
|
+
* The Unlocker object is intended for use in a long-running callback from V8,
|
3953
|
+
* where you want to release the V8 lock for other threads to use.
|
3663
3954
|
*
|
3664
|
-
* The v8::Locker is a recursive lock.
|
3665
|
-
*
|
3666
|
-
*
|
3667
|
-
* not
|
3668
|
-
*
|
3669
|
-
* thread that is not inside a Locker's scope.
|
3955
|
+
* The v8::Locker is a recursive lock, i.e. you can lock more than once in a
|
3956
|
+
* given thread. This can be useful if you have code that can be called either
|
3957
|
+
* from code that holds the lock or from code that does not. The Unlocker is
|
3958
|
+
* not recursive so you can not have several Unlockers on the stack at once, and
|
3959
|
+
* you can not use an Unlocker in a thread that is not inside a Locker's scope.
|
3670
3960
|
*
|
3671
|
-
* An unlocker will unlock several lockers if it has to and reinstate
|
3672
|
-
*
|
3961
|
+
* An unlocker will unlock several lockers if it has to and reinstate the
|
3962
|
+
* correct depth of locking on its destruction, e.g.:
|
3673
3963
|
*
|
3674
3964
|
* \code
|
3675
3965
|
* // V8 not locked.
|
@@ -3692,17 +3982,21 @@ class V8EXPORT Context {
|
|
3692
3982
|
* }
|
3693
3983
|
* // V8 Now no longer locked.
|
3694
3984
|
* \endcode
|
3695
|
-
*
|
3696
|
-
*
|
3697
3985
|
*/
|
3698
3986
|
class V8EXPORT Unlocker {
|
3699
3987
|
public:
|
3700
3988
|
/**
|
3701
|
-
* Initialize Unlocker for a given Isolate.
|
3989
|
+
* Initialize Unlocker for a given Isolate.
|
3702
3990
|
*/
|
3703
|
-
explicit Unlocker(Isolate* isolate
|
3991
|
+
V8_INLINE(explicit Unlocker(Isolate* isolate)) { Initialize(isolate); }
|
3992
|
+
|
3993
|
+
/** Deprecated. Use Isolate version instead. */
|
3994
|
+
V8_DEPRECATED(Unlocker());
|
3995
|
+
|
3704
3996
|
~Unlocker();
|
3705
3997
|
private:
|
3998
|
+
void Initialize(Isolate* isolate);
|
3999
|
+
|
3706
4000
|
internal::Isolate* isolate_;
|
3707
4001
|
};
|
3708
4002
|
|
@@ -3710,9 +4004,13 @@ class V8EXPORT Unlocker {
|
|
3710
4004
|
class V8EXPORT Locker {
|
3711
4005
|
public:
|
3712
4006
|
/**
|
3713
|
-
* Initialize Locker for a given Isolate.
|
4007
|
+
* Initialize Locker for a given Isolate.
|
3714
4008
|
*/
|
3715
|
-
explicit Locker(Isolate* isolate
|
4009
|
+
V8_INLINE(explicit Locker(Isolate* isolate)) { Initialize(isolate); }
|
4010
|
+
|
4011
|
+
/** Deprecated. Use Isolate version instead. */
|
4012
|
+
V8_DEPRECATED(Locker());
|
4013
|
+
|
3716
4014
|
~Locker();
|
3717
4015
|
|
3718
4016
|
/**
|
@@ -3730,10 +4028,10 @@ class V8EXPORT Locker {
|
|
3730
4028
|
static void StopPreemption();
|
3731
4029
|
|
3732
4030
|
/**
|
3733
|
-
* Returns whether or not the locker for a given isolate,
|
3734
|
-
*
|
4031
|
+
* Returns whether or not the locker for a given isolate, is locked by the
|
4032
|
+
* current thread.
|
3735
4033
|
*/
|
3736
|
-
static bool IsLocked(Isolate* isolate
|
4034
|
+
static bool IsLocked(Isolate* isolate);
|
3737
4035
|
|
3738
4036
|
/**
|
3739
4037
|
* Returns whether v8::Locker is being used by this V8 instance.
|
@@ -3741,6 +4039,8 @@ class V8EXPORT Locker {
|
|
3741
4039
|
static bool IsActive();
|
3742
4040
|
|
3743
4041
|
private:
|
4042
|
+
void Initialize(Isolate* isolate);
|
4043
|
+
|
3744
4044
|
bool has_lock_;
|
3745
4045
|
bool top_level_;
|
3746
4046
|
internal::Isolate* isolate_;
|
@@ -3838,47 +4138,27 @@ template <size_t ptr_size> struct SmiTagging;
|
|
3838
4138
|
template <> struct SmiTagging<4> {
|
3839
4139
|
static const int kSmiShiftSize = 0;
|
3840
4140
|
static const int kSmiValueSize = 31;
|
3841
|
-
static
|
4141
|
+
V8_INLINE(static int SmiToInt(internal::Object* value)) {
|
3842
4142
|
int shift_bits = kSmiTagSize + kSmiShiftSize;
|
3843
4143
|
// Throw away top 32 bits and shift down (requires >> to be sign extending).
|
3844
4144
|
return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
|
3845
4145
|
}
|
3846
|
-
|
3847
|
-
// For 32-bit systems any 2 bytes aligned pointer can be encoded as smi
|
3848
|
-
// with a plain reinterpret_cast.
|
3849
|
-
static const uintptr_t kEncodablePointerMask = 0x1;
|
3850
|
-
static const int kPointerToSmiShift = 0;
|
3851
4146
|
};
|
3852
4147
|
|
3853
4148
|
// Smi constants for 64-bit systems.
|
3854
4149
|
template <> struct SmiTagging<8> {
|
3855
4150
|
static const int kSmiShiftSize = 31;
|
3856
4151
|
static const int kSmiValueSize = 32;
|
3857
|
-
static
|
4152
|
+
V8_INLINE(static int SmiToInt(internal::Object* value)) {
|
3858
4153
|
int shift_bits = kSmiTagSize + kSmiShiftSize;
|
3859
4154
|
// Shift down and throw away top 32 bits.
|
3860
4155
|
return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
|
3861
4156
|
}
|
3862
|
-
|
3863
|
-
// To maximize the range of pointers that can be encoded
|
3864
|
-
// in the available 32 bits, we require them to be 8 bytes aligned.
|
3865
|
-
// This gives 2 ^ (32 + 3) = 32G address space covered.
|
3866
|
-
// It might be not enough to cover stack allocated objects on some platforms.
|
3867
|
-
static const int kPointerAlignment = 3;
|
3868
|
-
|
3869
|
-
static const uintptr_t kEncodablePointerMask =
|
3870
|
-
~(uintptr_t(0xffffffff) << kPointerAlignment);
|
3871
|
-
|
3872
|
-
static const int kPointerToSmiShift =
|
3873
|
-
kSmiTagSize + kSmiShiftSize - kPointerAlignment;
|
3874
4157
|
};
|
3875
4158
|
|
3876
4159
|
typedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
|
3877
4160
|
const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
|
3878
4161
|
const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
|
3879
|
-
const uintptr_t kEncodablePointerMask =
|
3880
|
-
PlatformSmiTagging::kEncodablePointerMask;
|
3881
|
-
const int kPointerToSmiShift = PlatformSmiTagging::kPointerToSmiShift;
|
3882
4162
|
|
3883
4163
|
/**
|
3884
4164
|
* This class exports constants and functionality from within v8 that
|
@@ -3896,8 +4176,13 @@ class Internals {
|
|
3896
4176
|
static const int kOddballKindOffset = 3 * kApiPointerSize;
|
3897
4177
|
static const int kForeignAddressOffset = kApiPointerSize;
|
3898
4178
|
static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
|
4179
|
+
static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
|
4180
|
+
static const int kContextHeaderSize = 2 * kApiPointerSize;
|
4181
|
+
static const int kContextEmbedderDataIndex = 54;
|
3899
4182
|
static const int kFullStringRepresentationMask = 0x07;
|
4183
|
+
static const int kStringEncodingMask = 0x4;
|
3900
4184
|
static const int kExternalTwoByteRepresentationTag = 0x02;
|
4185
|
+
static const int kExternalAsciiRepresentationTag = 0x06;
|
3901
4186
|
|
3902
4187
|
static const int kIsolateStateOffset = 0;
|
3903
4188
|
static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
|
@@ -3906,9 +4191,17 @@ class Internals {
|
|
3906
4191
|
static const int kNullValueRootIndex = 7;
|
3907
4192
|
static const int kTrueValueRootIndex = 8;
|
3908
4193
|
static const int kFalseValueRootIndex = 9;
|
3909
|
-
static const int kEmptySymbolRootIndex =
|
4194
|
+
static const int kEmptySymbolRootIndex = 119;
|
4195
|
+
|
4196
|
+
static const int kNodeClassIdOffset = 1 * kApiPointerSize;
|
4197
|
+
static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
|
4198
|
+
static const int kNodeStateMask = 0xf;
|
4199
|
+
static const int kNodeStateIsWeakValue = 2;
|
4200
|
+
static const int kNodeStateIsNearDeathValue = 4;
|
4201
|
+
static const int kNodeIsIndependentShift = 4;
|
4202
|
+
static const int kNodeIsPartiallyDependentShift = 5;
|
3910
4203
|
|
3911
|
-
static const int kJSObjectType =
|
4204
|
+
static const int kJSObjectType = 0xab;
|
3912
4205
|
static const int kFirstNonstringType = 0x80;
|
3913
4206
|
static const int kOddballType = 0x82;
|
3914
4207
|
static const int kForeignType = 0x85;
|
@@ -3916,85 +4209,103 @@ class Internals {
|
|
3916
4209
|
static const int kUndefinedOddballKind = 5;
|
3917
4210
|
static const int kNullOddballKind = 3;
|
3918
4211
|
|
3919
|
-
static
|
4212
|
+
V8_INLINE(static bool HasHeapObjectTag(internal::Object* value)) {
|
3920
4213
|
return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
|
3921
4214
|
kHeapObjectTag);
|
3922
4215
|
}
|
3923
4216
|
|
3924
|
-
static
|
3925
|
-
return ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag);
|
3926
|
-
}
|
3927
|
-
|
3928
|
-
static inline int SmiValue(internal::Object* value) {
|
4217
|
+
V8_INLINE(static int SmiValue(internal::Object* value)) {
|
3929
4218
|
return PlatformSmiTagging::SmiToInt(value);
|
3930
4219
|
}
|
3931
4220
|
|
3932
|
-
static
|
4221
|
+
V8_INLINE(static int GetInstanceType(internal::Object* obj)) {
|
3933
4222
|
typedef internal::Object O;
|
3934
4223
|
O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
|
3935
4224
|
return ReadField<uint8_t>(map, kMapInstanceTypeOffset);
|
3936
4225
|
}
|
3937
4226
|
|
3938
|
-
static
|
4227
|
+
V8_INLINE(static int GetOddballKind(internal::Object* obj)) {
|
3939
4228
|
typedef internal::Object O;
|
3940
4229
|
return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
|
3941
4230
|
}
|
3942
4231
|
|
3943
|
-
static
|
3944
|
-
const uintptr_t address = reinterpret_cast<uintptr_t>(value);
|
3945
|
-
return reinterpret_cast<void*>(address >> kPointerToSmiShift);
|
3946
|
-
}
|
3947
|
-
|
3948
|
-
static inline void* GetExternalPointer(internal::Object* obj) {
|
3949
|
-
if (HasSmiTag(obj)) {
|
3950
|
-
return GetExternalPointerFromSmi(obj);
|
3951
|
-
} else if (GetInstanceType(obj) == kForeignType) {
|
3952
|
-
return ReadField<void*>(obj, kForeignAddressOffset);
|
3953
|
-
} else {
|
3954
|
-
return NULL;
|
3955
|
-
}
|
3956
|
-
}
|
3957
|
-
|
3958
|
-
static inline bool IsExternalTwoByteString(int instance_type) {
|
4232
|
+
V8_INLINE(static bool IsExternalTwoByteString(int instance_type)) {
|
3959
4233
|
int representation = (instance_type & kFullStringRepresentationMask);
|
3960
4234
|
return representation == kExternalTwoByteRepresentationTag;
|
3961
4235
|
}
|
3962
4236
|
|
3963
|
-
static
|
4237
|
+
V8_INLINE(static bool IsInitialized(v8::Isolate* isolate)) {
|
3964
4238
|
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateStateOffset;
|
3965
4239
|
return *reinterpret_cast<int*>(addr) == 1;
|
3966
4240
|
}
|
3967
4241
|
|
3968
|
-
static
|
4242
|
+
V8_INLINE(static uint8_t GetNodeFlag(internal::Object** obj, int shift)) {
|
4243
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
4244
|
+
return *addr & (1 << shift);
|
4245
|
+
}
|
4246
|
+
|
4247
|
+
V8_INLINE(static void UpdateNodeFlag(internal::Object** obj,
|
4248
|
+
bool value, int shift)) {
|
4249
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
4250
|
+
uint8_t mask = 1 << shift;
|
4251
|
+
*addr = (*addr & ~mask) | (value << shift);
|
4252
|
+
}
|
4253
|
+
|
4254
|
+
V8_INLINE(static uint8_t GetNodeState(internal::Object** obj)) {
|
4255
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
4256
|
+
return *addr & kNodeStateMask;
|
4257
|
+
}
|
4258
|
+
|
4259
|
+
V8_INLINE(static void UpdateNodeState(internal::Object** obj,
|
4260
|
+
uint8_t value)) {
|
4261
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
4262
|
+
*addr = (*addr & ~kNodeStateMask) | value;
|
4263
|
+
}
|
4264
|
+
|
4265
|
+
V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) {
|
3969
4266
|
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
|
3970
4267
|
kIsolateEmbedderDataOffset;
|
3971
4268
|
*reinterpret_cast<void**>(addr) = data;
|
3972
4269
|
}
|
3973
4270
|
|
3974
|
-
static
|
4271
|
+
V8_INLINE(static void* GetEmbedderData(v8::Isolate* isolate)) {
|
3975
4272
|
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
|
3976
4273
|
kIsolateEmbedderDataOffset;
|
3977
4274
|
return *reinterpret_cast<void**>(addr);
|
3978
4275
|
}
|
3979
4276
|
|
3980
|
-
static
|
4277
|
+
V8_INLINE(static internal::Object** GetRoot(v8::Isolate* isolate,
|
4278
|
+
int index)) {
|
3981
4279
|
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
|
3982
4280
|
return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
|
3983
4281
|
}
|
3984
4282
|
|
3985
4283
|
template <typename T>
|
3986
|
-
static
|
4284
|
+
V8_INLINE(static T ReadField(Object* ptr, int offset)) {
|
3987
4285
|
uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag;
|
3988
4286
|
return *reinterpret_cast<T*>(addr);
|
3989
4287
|
}
|
3990
4288
|
|
3991
|
-
|
3992
|
-
static
|
3993
|
-
|
3994
|
-
|
3995
|
-
|
3996
|
-
|
3997
|
-
|
4289
|
+
template <typename T>
|
4290
|
+
V8_INLINE(static T ReadEmbedderData(Context* context, int index)) {
|
4291
|
+
typedef internal::Object O;
|
4292
|
+
typedef internal::Internals I;
|
4293
|
+
O* ctx = *reinterpret_cast<O**>(context);
|
4294
|
+
int embedder_data_offset = I::kContextHeaderSize +
|
4295
|
+
(internal::kApiPointerSize * I::kContextEmbedderDataIndex);
|
4296
|
+
O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset);
|
4297
|
+
int value_offset =
|
4298
|
+
I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index);
|
4299
|
+
return I::ReadField<T>(embedder_data, value_offset);
|
4300
|
+
}
|
4301
|
+
|
4302
|
+
V8_INLINE(static bool CanCastToHeapObject(void* o)) { return false; }
|
4303
|
+
V8_INLINE(static bool CanCastToHeapObject(Context* o)) { return true; }
|
4304
|
+
V8_INLINE(static bool CanCastToHeapObject(String* o)) { return true; }
|
4305
|
+
V8_INLINE(static bool CanCastToHeapObject(Object* o)) { return true; }
|
4306
|
+
V8_INLINE(static bool CanCastToHeapObject(Message* o)) { return true; }
|
4307
|
+
V8_INLINE(static bool CanCastToHeapObject(StackTrace* o)) { return true; }
|
4308
|
+
V8_INLINE(static bool CanCastToHeapObject(StackFrame* o)) { return true; }
|
3998
4309
|
};
|
3999
4310
|
|
4000
4311
|
} // namespace internal
|
@@ -4017,32 +4328,91 @@ Local<T> Local<T>::New(Handle<T> that) {
|
|
4017
4328
|
}
|
4018
4329
|
|
4019
4330
|
|
4331
|
+
template <class T>
|
4332
|
+
Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) {
|
4333
|
+
if (that.IsEmpty()) return Local<T>();
|
4334
|
+
T* that_ptr = *that;
|
4335
|
+
internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
|
4336
|
+
return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
|
4337
|
+
reinterpret_cast<internal::Isolate*>(isolate), *p)));
|
4338
|
+
}
|
4339
|
+
|
4340
|
+
|
4020
4341
|
template <class T>
|
4021
4342
|
Persistent<T> Persistent<T>::New(Handle<T> that) {
|
4343
|
+
return New(Isolate::GetCurrent(), that);
|
4344
|
+
}
|
4345
|
+
|
4346
|
+
|
4347
|
+
template <class T>
|
4348
|
+
Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) {
|
4022
4349
|
if (that.IsEmpty()) return Persistent<T>();
|
4023
4350
|
internal::Object** p = reinterpret_cast<internal::Object**>(*that);
|
4024
|
-
return Persistent<T>(reinterpret_cast<T*>(
|
4351
|
+
return Persistent<T>(reinterpret_cast<T*>(
|
4352
|
+
V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate),
|
4353
|
+
p)));
|
4354
|
+
}
|
4355
|
+
|
4356
|
+
|
4357
|
+
template <class T>
|
4358
|
+
bool Persistent<T>::IsIndependent() const {
|
4359
|
+
return IsIndependent(Isolate::GetCurrent());
|
4360
|
+
}
|
4361
|
+
|
4362
|
+
|
4363
|
+
template <class T>
|
4364
|
+
bool Persistent<T>::IsIndependent(Isolate* isolate) const {
|
4365
|
+
typedef internal::Internals I;
|
4366
|
+
if (this->IsEmpty()) return false;
|
4367
|
+
if (!I::IsInitialized(isolate)) return false;
|
4368
|
+
return I::GetNodeFlag(reinterpret_cast<internal::Object**>(**this),
|
4369
|
+
I::kNodeIsIndependentShift);
|
4025
4370
|
}
|
4026
4371
|
|
4027
4372
|
|
4028
4373
|
template <class T>
|
4029
4374
|
bool Persistent<T>::IsNearDeath() const {
|
4375
|
+
return IsNearDeath(Isolate::GetCurrent());
|
4376
|
+
}
|
4377
|
+
|
4378
|
+
|
4379
|
+
template <class T>
|
4380
|
+
bool Persistent<T>::IsNearDeath(Isolate* isolate) const {
|
4381
|
+
typedef internal::Internals I;
|
4030
4382
|
if (this->IsEmpty()) return false;
|
4031
|
-
|
4383
|
+
if (!I::IsInitialized(isolate)) return false;
|
4384
|
+
return I::GetNodeState(reinterpret_cast<internal::Object**>(**this)) ==
|
4385
|
+
I::kNodeStateIsNearDeathValue;
|
4032
4386
|
}
|
4033
4387
|
|
4034
4388
|
|
4035
4389
|
template <class T>
|
4036
4390
|
bool Persistent<T>::IsWeak() const {
|
4391
|
+
return IsWeak(Isolate::GetCurrent());
|
4392
|
+
}
|
4393
|
+
|
4394
|
+
|
4395
|
+
template <class T>
|
4396
|
+
bool Persistent<T>::IsWeak(Isolate* isolate) const {
|
4397
|
+
typedef internal::Internals I;
|
4037
4398
|
if (this->IsEmpty()) return false;
|
4038
|
-
|
4399
|
+
if (!I::IsInitialized(isolate)) return false;
|
4400
|
+
return I::GetNodeState(reinterpret_cast<internal::Object**>(**this)) ==
|
4401
|
+
I::kNodeStateIsWeakValue;
|
4039
4402
|
}
|
4040
4403
|
|
4041
4404
|
|
4042
4405
|
template <class T>
|
4043
4406
|
void Persistent<T>::Dispose() {
|
4407
|
+
Dispose(Isolate::GetCurrent());
|
4408
|
+
}
|
4409
|
+
|
4410
|
+
|
4411
|
+
template <class T>
|
4412
|
+
void Persistent<T>::Dispose(Isolate* isolate) {
|
4044
4413
|
if (this->IsEmpty()) return;
|
4045
|
-
V8::DisposeGlobal(reinterpret_cast<internal::
|
4414
|
+
V8::DisposeGlobal(reinterpret_cast<internal::Isolate*>(isolate),
|
4415
|
+
reinterpret_cast<internal::Object**>(**this));
|
4046
4416
|
}
|
4047
4417
|
|
4048
4418
|
|
@@ -4051,24 +4421,94 @@ Persistent<T>::Persistent() : Handle<T>() { }
|
|
4051
4421
|
|
4052
4422
|
template <class T>
|
4053
4423
|
void Persistent<T>::MakeWeak(void* parameters, WeakReferenceCallback callback) {
|
4054
|
-
|
4424
|
+
Isolate* isolate = Isolate::GetCurrent();
|
4425
|
+
V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate),
|
4426
|
+
reinterpret_cast<internal::Object**>(**this),
|
4055
4427
|
parameters,
|
4428
|
+
callback,
|
4429
|
+
NULL);
|
4430
|
+
}
|
4431
|
+
|
4432
|
+
template <class T>
|
4433
|
+
void Persistent<T>::MakeWeak(Isolate* isolate,
|
4434
|
+
void* parameters,
|
4435
|
+
NearDeathCallback callback) {
|
4436
|
+
V8::MakeWeak(reinterpret_cast<internal::Isolate*>(isolate),
|
4437
|
+
reinterpret_cast<internal::Object**>(**this),
|
4438
|
+
parameters,
|
4439
|
+
NULL,
|
4056
4440
|
callback);
|
4057
4441
|
}
|
4058
4442
|
|
4059
4443
|
template <class T>
|
4060
4444
|
void Persistent<T>::ClearWeak() {
|
4061
|
-
|
4445
|
+
ClearWeak(Isolate::GetCurrent());
|
4446
|
+
}
|
4447
|
+
|
4448
|
+
template <class T>
|
4449
|
+
void Persistent<T>::ClearWeak(Isolate* isolate) {
|
4450
|
+
V8::ClearWeak(reinterpret_cast<internal::Isolate*>(isolate),
|
4451
|
+
reinterpret_cast<internal::Object**>(**this));
|
4062
4452
|
}
|
4063
4453
|
|
4064
4454
|
template <class T>
|
4065
4455
|
void Persistent<T>::MarkIndependent() {
|
4066
|
-
|
4456
|
+
MarkIndependent(Isolate::GetCurrent());
|
4457
|
+
}
|
4458
|
+
|
4459
|
+
template <class T>
|
4460
|
+
void Persistent<T>::MarkIndependent(Isolate* isolate) {
|
4461
|
+
typedef internal::Internals I;
|
4462
|
+
if (this->IsEmpty()) return;
|
4463
|
+
if (!I::IsInitialized(isolate)) return;
|
4464
|
+
I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this),
|
4465
|
+
true,
|
4466
|
+
I::kNodeIsIndependentShift);
|
4467
|
+
}
|
4468
|
+
|
4469
|
+
template <class T>
|
4470
|
+
void Persistent<T>::MarkPartiallyDependent() {
|
4471
|
+
MarkPartiallyDependent(Isolate::GetCurrent());
|
4472
|
+
}
|
4473
|
+
|
4474
|
+
template <class T>
|
4475
|
+
void Persistent<T>::MarkPartiallyDependent(Isolate* isolate) {
|
4476
|
+
typedef internal::Internals I;
|
4477
|
+
if (this->IsEmpty()) return;
|
4478
|
+
if (!I::IsInitialized(isolate)) return;
|
4479
|
+
I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(**this),
|
4480
|
+
true,
|
4481
|
+
I::kNodeIsPartiallyDependentShift);
|
4067
4482
|
}
|
4068
4483
|
|
4069
4484
|
template <class T>
|
4070
4485
|
void Persistent<T>::SetWrapperClassId(uint16_t class_id) {
|
4071
|
-
|
4486
|
+
SetWrapperClassId(Isolate::GetCurrent(), class_id);
|
4487
|
+
}
|
4488
|
+
|
4489
|
+
template <class T>
|
4490
|
+
void Persistent<T>::SetWrapperClassId(Isolate* isolate, uint16_t class_id) {
|
4491
|
+
typedef internal::Internals I;
|
4492
|
+
if (this->IsEmpty()) return;
|
4493
|
+
if (!I::IsInitialized(isolate)) return;
|
4494
|
+
internal::Object** obj = reinterpret_cast<internal::Object**>(**this);
|
4495
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
|
4496
|
+
*reinterpret_cast<uint16_t*>(addr) = class_id;
|
4497
|
+
}
|
4498
|
+
|
4499
|
+
template <class T>
|
4500
|
+
uint16_t Persistent<T>::WrapperClassId() const {
|
4501
|
+
return WrapperClassId(Isolate::GetCurrent());
|
4502
|
+
}
|
4503
|
+
|
4504
|
+
template <class T>
|
4505
|
+
uint16_t Persistent<T>::WrapperClassId(Isolate* isolate) const {
|
4506
|
+
typedef internal::Internals I;
|
4507
|
+
if (this->IsEmpty()) return 0;
|
4508
|
+
if (!I::IsInitialized(isolate)) return 0;
|
4509
|
+
internal::Object** obj = reinterpret_cast<internal::Object**>(**this);
|
4510
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
|
4511
|
+
return *reinterpret_cast<uint16_t*>(addr);
|
4072
4512
|
}
|
4073
4513
|
|
4074
4514
|
Arguments::Arguments(internal::Object** implicit_args,
|
@@ -4157,63 +4597,35 @@ void Template::Set(const char* name, v8::Handle<Data> value) {
|
|
4157
4597
|
|
4158
4598
|
Local<Value> Object::GetInternalField(int index) {
|
4159
4599
|
#ifndef V8_ENABLE_CHECKS
|
4160
|
-
Local<Value> quick_result = UncheckedGetInternalField(index);
|
4161
|
-
if (!quick_result.IsEmpty()) return quick_result;
|
4162
|
-
#endif
|
4163
|
-
return CheckedGetInternalField(index);
|
4164
|
-
}
|
4165
|
-
|
4166
|
-
|
4167
|
-
Local<Value> Object::UncheckedGetInternalField(int index) {
|
4168
4600
|
typedef internal::Object O;
|
4169
4601
|
typedef internal::Internals I;
|
4170
4602
|
O* obj = *reinterpret_cast<O**>(this);
|
4603
|
+
// Fast path: If the object is a plain JSObject, which is the common case, we
|
4604
|
+
// know where to find the internal fields and can return the value directly.
|
4171
4605
|
if (I::GetInstanceType(obj) == I::kJSObjectType) {
|
4172
|
-
// If the object is a plain JSObject, which is the common case,
|
4173
|
-
// we know where to find the internal fields and can return the
|
4174
|
-
// value directly.
|
4175
4606
|
int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
|
4176
4607
|
O* value = I::ReadField<O*>(obj, offset);
|
4177
4608
|
O** result = HandleScope::CreateHandle(value);
|
4178
4609
|
return Local<Value>(reinterpret_cast<Value*>(result));
|
4179
|
-
} else {
|
4180
|
-
return Local<Value>();
|
4181
4610
|
}
|
4182
|
-
}
|
4183
|
-
|
4184
|
-
|
4185
|
-
void* External::Unwrap(Handle<v8::Value> obj) {
|
4186
|
-
#ifdef V8_ENABLE_CHECKS
|
4187
|
-
return FullUnwrap(obj);
|
4188
|
-
#else
|
4189
|
-
return QuickUnwrap(obj);
|
4190
4611
|
#endif
|
4612
|
+
return SlowGetInternalField(index);
|
4191
4613
|
}
|
4192
4614
|
|
4193
4615
|
|
4194
|
-
void*
|
4195
|
-
|
4196
|
-
O* obj = *reinterpret_cast<O**>(const_cast<v8::Value*>(*wrapper));
|
4197
|
-
return internal::Internals::GetExternalPointer(obj);
|
4198
|
-
}
|
4199
|
-
|
4200
|
-
|
4201
|
-
void* Object::GetPointerFromInternalField(int index) {
|
4616
|
+
void* Object::GetAlignedPointerFromInternalField(int index) {
|
4617
|
+
#ifndef V8_ENABLE_CHECKS
|
4202
4618
|
typedef internal::Object O;
|
4203
4619
|
typedef internal::Internals I;
|
4204
|
-
|
4205
4620
|
O* obj = *reinterpret_cast<O**>(this);
|
4206
|
-
|
4621
|
+
// Fast path: If the object is a plain JSObject, which is the common case, we
|
4622
|
+
// know where to find the internal fields and can return the value directly.
|
4207
4623
|
if (I::GetInstanceType(obj) == I::kJSObjectType) {
|
4208
|
-
// If the object is a plain JSObject, which is the common case,
|
4209
|
-
// we know where to find the internal fields and can return the
|
4210
|
-
// value directly.
|
4211
4624
|
int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
|
4212
|
-
|
4213
|
-
return I::GetExternalPointer(value);
|
4625
|
+
return I::ReadField<void*>(obj, offset);
|
4214
4626
|
}
|
4215
|
-
|
4216
|
-
return
|
4627
|
+
#endif
|
4628
|
+
return SlowGetAlignedPointerFromInternalField(index);
|
4217
4629
|
}
|
4218
4630
|
|
4219
4631
|
|
@@ -4252,6 +4664,26 @@ String::ExternalStringResource* String::GetExternalStringResource() const {
|
|
4252
4664
|
}
|
4253
4665
|
|
4254
4666
|
|
4667
|
+
String::ExternalStringResourceBase* String::GetExternalStringResourceBase(
|
4668
|
+
String::Encoding* encoding_out) const {
|
4669
|
+
typedef internal::Object O;
|
4670
|
+
typedef internal::Internals I;
|
4671
|
+
O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
|
4672
|
+
int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
|
4673
|
+
*encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
|
4674
|
+
ExternalStringResourceBase* resource = NULL;
|
4675
|
+
if (type == I::kExternalAsciiRepresentationTag ||
|
4676
|
+
type == I::kExternalTwoByteRepresentationTag) {
|
4677
|
+
void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
|
4678
|
+
resource = static_cast<ExternalStringResourceBase*>(value);
|
4679
|
+
}
|
4680
|
+
#ifdef V8_ENABLE_CHECKS
|
4681
|
+
VerifyExternalStringResourceBase(resource, *encoding_out);
|
4682
|
+
#endif
|
4683
|
+
return resource;
|
4684
|
+
}
|
4685
|
+
|
4686
|
+
|
4255
4687
|
bool Value::IsUndefined() const {
|
4256
4688
|
#ifdef V8_ENABLE_CHECKS
|
4257
4689
|
return FullIsUndefined();
|
@@ -4461,6 +4893,28 @@ void* Isolate::GetData() {
|
|
4461
4893
|
}
|
4462
4894
|
|
4463
4895
|
|
4896
|
+
Local<Value> Context::GetEmbedderData(int index) {
|
4897
|
+
#ifndef V8_ENABLE_CHECKS
|
4898
|
+
typedef internal::Object O;
|
4899
|
+
typedef internal::Internals I;
|
4900
|
+
O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index));
|
4901
|
+
return Local<Value>(reinterpret_cast<Value*>(result));
|
4902
|
+
#else
|
4903
|
+
return SlowGetEmbedderData(index);
|
4904
|
+
#endif
|
4905
|
+
}
|
4906
|
+
|
4907
|
+
|
4908
|
+
void* Context::GetAlignedPointerFromEmbedderData(int index) {
|
4909
|
+
#ifndef V8_ENABLE_CHECKS
|
4910
|
+
typedef internal::Internals I;
|
4911
|
+
return I::ReadEmbedderData<void*>(this, index);
|
4912
|
+
#else
|
4913
|
+
return SlowGetAlignedPointerFromEmbedderData(index);
|
4914
|
+
#endif
|
4915
|
+
}
|
4916
|
+
|
4917
|
+
|
4464
4918
|
/**
|
4465
4919
|
* \example shell.cc
|
4466
4920
|
* A simple shell that takes a list of expressions on the
|