libv8 3.3.10.4-amd64-freebsd-9 → 3.11.8.13-amd64-freebsd-9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/libv8/.location.yml +1 -0
- data/ext/libv8/arch.rb +35 -0
- data/ext/libv8/location.rb +81 -0
- data/ext/libv8/paths.rb +38 -0
- data/lib/libv8.rb +4 -10
- data/lib/libv8/version.rb +1 -4
- data/{lib/libv8 → vendor}/v8/include/v8-debug.h +5 -0
- data/{lib/libv8 → vendor}/v8/include/v8-preparser.h +0 -0
- data/{lib/libv8 → vendor}/v8/include/v8-profiler.h +106 -31
- data/{lib/libv8 → vendor}/v8/include/v8-testing.h +0 -0
- data/{lib/libv8 → vendor}/v8/include/v8.h +530 -171
- data/{lib/libv8 → vendor}/v8/include/v8stdint.h +2 -1
- data/vendor/v8/out/x64.release/obj.target/tools/gyp/libpreparser_lib.a +0 -0
- data/{lib/libv8/build/v8/libv8.a → 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 +86 -23
- data/lib/libv8/build/v8/libv8preparser.a +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
--- !ruby/object:Libv8::Location::Vendor {}
|
data/ext/libv8/arch.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
|
3
|
+
module Libv8
|
4
|
+
module Arch
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def x86_64_from_build_cpu
|
8
|
+
RbConfig::MAKEFILE_CONFIG['build_cpu'] == 'x86_64'
|
9
|
+
end
|
10
|
+
|
11
|
+
def x86_64_from_byte_length
|
12
|
+
['foo'].pack('p').size == 8
|
13
|
+
end
|
14
|
+
|
15
|
+
def x86_64_from_arch_flag
|
16
|
+
RbConfig::MAKEFILE_CONFIG['ARCH_FLAG'] =~ /x86_64/
|
17
|
+
end
|
18
|
+
|
19
|
+
def rubinius?
|
20
|
+
Object.const_defined?(:RUBY_ENGINE) && RUBY_ENGINE == "rbx"
|
21
|
+
end
|
22
|
+
|
23
|
+
def x64?
|
24
|
+
if rubinius?
|
25
|
+
x86_64_from_build_cpu || x86_64_from_arch_flag
|
26
|
+
else
|
27
|
+
x86_64_from_byte_length
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def libv8_arch
|
32
|
+
x64? ? "x64" : "ia32"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'pathname'
|
3
|
+
require File.expand_path '../paths', __FILE__
|
4
|
+
|
5
|
+
module Libv8
|
6
|
+
class Location
|
7
|
+
def install!
|
8
|
+
File.open(Pathname(__FILE__).dirname.join('.location.yml'), "w") do |f|
|
9
|
+
f.write self.to_yaml
|
10
|
+
end
|
11
|
+
return 0
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.load!
|
15
|
+
File.open(Pathname(__FILE__).dirname.join('.location.yml')) do |f|
|
16
|
+
YAML.load f
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Vendor < Location
|
21
|
+
def install!
|
22
|
+
require File.expand_path '../builder', __FILE__
|
23
|
+
builder = Libv8::Builder.new
|
24
|
+
exit_status = builder.build_libv8!
|
25
|
+
super if exit_status == 0
|
26
|
+
verify_installation!
|
27
|
+
return exit_status
|
28
|
+
end
|
29
|
+
def configure(context = MkmfContext.new)
|
30
|
+
context.incflags.insert 0, Libv8::Paths.include_paths.map{|p| "-I#{p}"}.join(" ") + " "
|
31
|
+
context.ldflags.insert 0, Libv8::Paths.object_paths.join(" ") + " "
|
32
|
+
end
|
33
|
+
|
34
|
+
def verify_installation!
|
35
|
+
Libv8::Paths.object_paths.each do |p|
|
36
|
+
fail ArchiveNotFound, p unless File.exists? p
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class ArchiveNotFound < StandardError
|
41
|
+
def initialize(filename)
|
42
|
+
super "libv8 did not install properly, expected binary v8 archive '#{filename}'to exist, but it was not found"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class System < Location
|
48
|
+
def configure(context = MkmfContext.new)
|
49
|
+
context.send(:dir_config, 'v8')
|
50
|
+
context.send(:find_header, 'v8.h') or fail NotFoundError
|
51
|
+
end
|
52
|
+
|
53
|
+
class NotFoundError < StandardError
|
54
|
+
def initialize(*args)
|
55
|
+
super(<<-EOS)
|
56
|
+
You have chosen to use the version of V8 found on your system
|
57
|
+
and *not* the one that is bundle with the libv8 rubygem. However,
|
58
|
+
it could not be located. please make sure you have a version of
|
59
|
+
v8 that is compatible with #{Libv8::VERSION} installed. You may
|
60
|
+
need to special --with-v8-dir options if it is in a non-standard
|
61
|
+
location
|
62
|
+
|
63
|
+
thanks,
|
64
|
+
The Mgmt
|
65
|
+
|
66
|
+
EOS
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class MkmfContext
|
72
|
+
def incflags
|
73
|
+
$INCFLAGS
|
74
|
+
end
|
75
|
+
|
76
|
+
def ldflags
|
77
|
+
$LDFLAGS
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/ext/libv8/paths.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require File.expand_path '../arch', __FILE__
|
3
|
+
|
4
|
+
module Libv8
|
5
|
+
module Paths
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def include_paths
|
9
|
+
["#{vendored_source_path}/include"]
|
10
|
+
end
|
11
|
+
|
12
|
+
def object_paths
|
13
|
+
[libv8_object(:base), libv8_object(:snapshot)]
|
14
|
+
end
|
15
|
+
|
16
|
+
def config
|
17
|
+
RbConfig::MAKEFILE_CONFIG
|
18
|
+
end
|
19
|
+
|
20
|
+
def libv8_object(name)
|
21
|
+
filename = "#{libv8_profile}/libv8_#{name}.#{config['LIBEXT']}"
|
22
|
+
unless File.exists? filename
|
23
|
+
filename = "#{libv8_profile}/obj.target/tools/gyp/libv8_#{name}.#{config['LIBEXT']}"
|
24
|
+
end
|
25
|
+
return filename
|
26
|
+
end
|
27
|
+
|
28
|
+
def libv8_profile
|
29
|
+
base = "#{vendored_source_path}/out/#{Libv8::Arch.libv8_arch}"
|
30
|
+
debug = "#{base}.debug"
|
31
|
+
File.exists?(debug) ? debug : "#{base}.release"
|
32
|
+
end
|
33
|
+
|
34
|
+
def vendored_source_path
|
35
|
+
File.expand_path "../../../vendor/v8", __FILE__
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/libv8.rb
CHANGED
@@ -1,15 +1,9 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
|
3
1
|
require 'libv8/version'
|
2
|
+
require 'libv8/location'
|
4
3
|
|
5
4
|
module Libv8
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
INCLUDE_PATH = Pathname(__FILE__).dirname.join('libv8', 'v8', 'include').to_s
|
12
|
-
def self.include_path
|
13
|
-
INCLUDE_PATH
|
5
|
+
def self.configure_makefile
|
6
|
+
location = Location.load!
|
7
|
+
location.configure
|
14
8
|
end
|
15
9
|
end
|
data/lib/libv8/version.rb
CHANGED
@@ -339,6 +339,11 @@ class EXPORT Debug {
|
|
339
339
|
static bool EnableAgent(const char* name, int port,
|
340
340
|
bool wait_for_connection = false);
|
341
341
|
|
342
|
+
/**
|
343
|
+
* Disable the V8 builtin debug agent. The TCP/IP connection will be closed.
|
344
|
+
*/
|
345
|
+
static void DisableAgent();
|
346
|
+
|
342
347
|
/**
|
343
348
|
* Makes V8 process all pending debug messages.
|
344
349
|
*
|
File without changes
|
@@ -64,6 +64,7 @@
|
|
64
64
|
*/
|
65
65
|
namespace v8 {
|
66
66
|
|
67
|
+
typedef uint32_t SnapshotObjectId;
|
67
68
|
|
68
69
|
/**
|
69
70
|
* CpuProfileNode represents a node in a call graph.
|
@@ -219,8 +220,9 @@ class V8EXPORT HeapGraphEdge {
|
|
219
220
|
// (e.g. parts of a ConsString).
|
220
221
|
kHidden = 4, // A link that is needed for proper sizes
|
221
222
|
// calculation, but may be hidden from user.
|
222
|
-
kShortcut = 5
|
223
|
+
kShortcut = 5, // A link that must not be followed during
|
223
224
|
// sizes calculation.
|
225
|
+
kWeak = 6 // A weak reference (ignored by the GC).
|
224
226
|
};
|
225
227
|
|
226
228
|
/** Returns edge type (see HeapGraphEdge::Type). */
|
@@ -254,7 +256,9 @@ class V8EXPORT HeapGraphNode {
|
|
254
256
|
kClosure = 5, // Function closure.
|
255
257
|
kRegExp = 6, // RegExp.
|
256
258
|
kHeapNumber = 7, // Number stored in the heap.
|
257
|
-
kNative = 8
|
259
|
+
kNative = 8, // Native object (not from V8 heap).
|
260
|
+
kSynthetic = 9 // Synthetic object, usualy used for grouping
|
261
|
+
// snapshot items together.
|
258
262
|
};
|
259
263
|
|
260
264
|
/** Returns node type (see HeapGraphNode::Type). */
|
@@ -269,16 +273,9 @@ class V8EXPORT HeapGraphNode {
|
|
269
273
|
|
270
274
|
/**
|
271
275
|
* Returns node id. For the same heap object, the id remains the same
|
272
|
-
* across all snapshots.
|
273
|
-
* as they only contain aggregated instances.
|
276
|
+
* across all snapshots.
|
274
277
|
*/
|
275
|
-
|
276
|
-
|
277
|
-
/**
|
278
|
-
* Returns the number of instances. Only applicable to aggregated
|
279
|
-
* heap snapshots.
|
280
|
-
*/
|
281
|
-
int GetInstancesCount() const;
|
278
|
+
SnapshotObjectId GetId() const;
|
282
279
|
|
283
280
|
/** Returns node's own size, in bytes. */
|
284
281
|
int GetSelfSize() const;
|
@@ -288,14 +285,8 @@ class V8EXPORT HeapGraphNode {
|
|
288
285
|
* the objects that are reachable only from this object. In other
|
289
286
|
* words, the size of memory that will be reclaimed having this node
|
290
287
|
* collected.
|
291
|
-
*
|
292
|
-
* Exact retained size calculation has O(N) (number of nodes)
|
293
|
-
* computational complexity, while approximate has O(1). It is
|
294
|
-
* assumed that initially heap profiling tools provide approximate
|
295
|
-
* sizes for all nodes, and then exact sizes are calculated for the
|
296
|
-
* most 'interesting' nodes.
|
297
288
|
*/
|
298
|
-
int GetRetainedSize(
|
289
|
+
int GetRetainedSize() const;
|
299
290
|
|
300
291
|
/** Returns child nodes count of the node. */
|
301
292
|
int GetChildrenCount() const;
|
@@ -314,6 +305,12 @@ class V8EXPORT HeapGraphNode {
|
|
314
305
|
* path from the snapshot root to the current node.
|
315
306
|
*/
|
316
307
|
const HeapGraphNode* GetDominatorNode() const;
|
308
|
+
|
309
|
+
/**
|
310
|
+
* Finds and returns a value from the heap corresponding to this node,
|
311
|
+
* if the value is still reachable.
|
312
|
+
*/
|
313
|
+
Handle<Value> GetHeapValue() const;
|
317
314
|
};
|
318
315
|
|
319
316
|
|
@@ -323,9 +320,7 @@ class V8EXPORT HeapGraphNode {
|
|
323
320
|
class V8EXPORT HeapSnapshot {
|
324
321
|
public:
|
325
322
|
enum Type {
|
326
|
-
kFull = 0
|
327
|
-
kAggregated = 1 // Snapshot doesn't contain individual heap entries,
|
328
|
-
// instead they are grouped by constructor name.
|
323
|
+
kFull = 0 // Heap snapshot with all instances and references.
|
329
324
|
};
|
330
325
|
enum SerializationFormat {
|
331
326
|
kJSON = 0 // See format description near 'Serialize' method.
|
@@ -344,7 +339,16 @@ class V8EXPORT HeapSnapshot {
|
|
344
339
|
const HeapGraphNode* GetRoot() const;
|
345
340
|
|
346
341
|
/** Returns a node by its id. */
|
347
|
-
const HeapGraphNode* GetNodeById(
|
342
|
+
const HeapGraphNode* GetNodeById(SnapshotObjectId id) const;
|
343
|
+
|
344
|
+
/** Returns total nodes count in the snapshot. */
|
345
|
+
int GetNodesCount() const;
|
346
|
+
|
347
|
+
/** Returns a node by index. */
|
348
|
+
const HeapGraphNode* GetNode(int index) const;
|
349
|
+
|
350
|
+
/** Returns a max seen JS object Id. */
|
351
|
+
SnapshotObjectId GetMaxSnapshotJSObjectId() const;
|
348
352
|
|
349
353
|
/**
|
350
354
|
* Deletes the snapshot and removes it from HeapProfiler's list.
|
@@ -364,16 +368,20 @@ class V8EXPORT HeapSnapshot {
|
|
364
368
|
* with the following structure:
|
365
369
|
*
|
366
370
|
* {
|
367
|
-
* snapshot: {
|
368
|
-
*
|
369
|
-
*
|
370
|
-
*
|
371
|
-
*
|
372
|
-
*
|
371
|
+
* snapshot: {
|
372
|
+
* title: "...",
|
373
|
+
* uid: nnn,
|
374
|
+
* meta: { meta-info },
|
375
|
+
* node_count: nnn,
|
376
|
+
* edge_count: nnn
|
377
|
+
* },
|
378
|
+
* nodes: [nodes array],
|
379
|
+
* edges: [edges array],
|
380
|
+
* strings: [strings array]
|
373
381
|
* }
|
374
382
|
*
|
375
|
-
*
|
376
|
-
*
|
383
|
+
* Nodes reference strings, other nodes, and edges by their indexes
|
384
|
+
* in corresponding arrays.
|
377
385
|
*/
|
378
386
|
void Serialize(OutputStream* stream, SerializationFormat format) const;
|
379
387
|
};
|
@@ -404,6 +412,19 @@ class V8EXPORT HeapProfiler {
|
|
404
412
|
/** Returns a profile by uid. */
|
405
413
|
static const HeapSnapshot* FindSnapshot(unsigned uid);
|
406
414
|
|
415
|
+
/**
|
416
|
+
* Returns SnapshotObjectId for a heap object referenced by |value| if
|
417
|
+
* it has been seen by the heap profiler, kUnknownObjectId otherwise.
|
418
|
+
*/
|
419
|
+
static SnapshotObjectId GetSnapshotObjectId(Handle<Value> value);
|
420
|
+
|
421
|
+
/**
|
422
|
+
* A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return
|
423
|
+
* it in case heap profiler cannot find id for the object passed as
|
424
|
+
* parameter. HeapSnapshot::GetNodeById will always return NULL for such id.
|
425
|
+
*/
|
426
|
+
static const SnapshotObjectId kUnknownObjectId = 0;
|
427
|
+
|
407
428
|
/**
|
408
429
|
* Takes a heap snapshot and returns it. Title may be an empty string.
|
409
430
|
* See HeapSnapshot::Type for types description.
|
@@ -413,6 +434,33 @@ class V8EXPORT HeapProfiler {
|
|
413
434
|
HeapSnapshot::Type type = HeapSnapshot::kFull,
|
414
435
|
ActivityControl* control = NULL);
|
415
436
|
|
437
|
+
/**
|
438
|
+
* Starts tracking of heap objects population statistics. After calling
|
439
|
+
* this method, all heap objects relocations done by the garbage collector
|
440
|
+
* are being registered.
|
441
|
+
*/
|
442
|
+
static void StartHeapObjectsTracking();
|
443
|
+
|
444
|
+
/**
|
445
|
+
* Adds a new time interval entry to the aggregated statistics array. The
|
446
|
+
* time interval entry contains information on the current heap objects
|
447
|
+
* population size. The method also updates aggregated statistics and
|
448
|
+
* reports updates for all previous time intervals via the OutputStream
|
449
|
+
* object. Updates on each time interval are provided as a stream of the
|
450
|
+
* HeapStatsUpdate structure instances.
|
451
|
+
*
|
452
|
+
* StartHeapObjectsTracking must be called before the first call to this
|
453
|
+
* method.
|
454
|
+
*/
|
455
|
+
static void PushHeapObjectsStats(OutputStream* stream);
|
456
|
+
|
457
|
+
/**
|
458
|
+
* Stops tracking of heap objects population statistics, cleans up all
|
459
|
+
* collected data. StartHeapObjectsTracking must be called again prior to
|
460
|
+
* calling PushHeapObjectsStats next time.
|
461
|
+
*/
|
462
|
+
static void StopHeapObjectsTracking();
|
463
|
+
|
416
464
|
/**
|
417
465
|
* Deletes all snapshots taken. All previously returned pointers to
|
418
466
|
* snapshots and their contents become invalid after this call.
|
@@ -430,6 +478,9 @@ class V8EXPORT HeapProfiler {
|
|
430
478
|
* handle.
|
431
479
|
*/
|
432
480
|
static const uint16_t kPersistentHandleNoClassId = 0;
|
481
|
+
|
482
|
+
/** Returns the number of currently existing persistent handles. */
|
483
|
+
static int GetPersistentHandleCount();
|
433
484
|
};
|
434
485
|
|
435
486
|
|
@@ -472,11 +523,22 @@ class V8EXPORT RetainedObjectInfo { // NOLINT
|
|
472
523
|
virtual intptr_t GetHash() = 0;
|
473
524
|
|
474
525
|
/**
|
475
|
-
* Returns human-readable label. It must be a
|
526
|
+
* Returns human-readable label. It must be a null-terminated UTF-8
|
476
527
|
* encoded string. V8 copies its contents during a call to GetLabel.
|
477
528
|
*/
|
478
529
|
virtual const char* GetLabel() = 0;
|
479
530
|
|
531
|
+
/**
|
532
|
+
* Returns human-readable group label. It must be a null-terminated UTF-8
|
533
|
+
* encoded string. V8 copies its contents during a call to GetGroupLabel.
|
534
|
+
* Heap snapshot generator will collect all the group names, create
|
535
|
+
* top level entries with these names and attach the objects to the
|
536
|
+
* corresponding top level group objects. There is a default
|
537
|
+
* implementation which is required because embedders don't have their
|
538
|
+
* own implementation yet.
|
539
|
+
*/
|
540
|
+
virtual const char* GetGroupLabel() { return GetLabel(); }
|
541
|
+
|
480
542
|
/**
|
481
543
|
* Returns element count in case if a global handle retains
|
482
544
|
* a subgraph by holding one of its nodes.
|
@@ -496,6 +558,19 @@ class V8EXPORT RetainedObjectInfo { // NOLINT
|
|
496
558
|
};
|
497
559
|
|
498
560
|
|
561
|
+
/**
|
562
|
+
* A struct for exporting HeapStats data from V8, using "push" model.
|
563
|
+
* See HeapProfiler::PushHeapObjectsStats.
|
564
|
+
*/
|
565
|
+
struct HeapStatsUpdate {
|
566
|
+
HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size)
|
567
|
+
: index(index), count(count), size(size) { }
|
568
|
+
uint32_t index; // Index of the time interval that was changed.
|
569
|
+
uint32_t count; // New value of count field for the interval with this index.
|
570
|
+
uint32_t size; // New value of size field for the interval with this index.
|
571
|
+
};
|
572
|
+
|
573
|
+
|
499
574
|
} // namespace v8
|
500
575
|
|
501
576
|
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright
|
1
|
+
// Copyright 2012 the V8 project authors. All rights reserved.
|
2
2
|
// Redistribution and use in source and binary forms, with or without
|
3
3
|
// modification, are permitted provided that the following conditions are
|
4
4
|
// met:
|
@@ -62,11 +62,13 @@
|
|
62
62
|
|
63
63
|
#else // _WIN32
|
64
64
|
|
65
|
-
// Setup for Linux shared library export.
|
66
|
-
// between building or using the V8 shared library, but we should not
|
67
|
-
// export symbols when we are building a static library.
|
65
|
+
// Setup for Linux shared library export.
|
68
66
|
#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(V8_SHARED)
|
67
|
+
#ifdef BUILDING_V8_SHARED
|
69
68
|
#define V8EXPORT __attribute__ ((visibility("default")))
|
69
|
+
#else
|
70
|
+
#define V8EXPORT
|
71
|
+
#endif
|
70
72
|
#else // defined(__GNUC__) && (__GNUC__ >= 4)
|
71
73
|
#define V8EXPORT
|
72
74
|
#endif // defined(__GNUC__) && (__GNUC__ >= 4)
|
@@ -80,9 +82,11 @@ namespace v8 {
|
|
80
82
|
|
81
83
|
class Context;
|
82
84
|
class String;
|
85
|
+
class StringObject;
|
83
86
|
class Value;
|
84
87
|
class Utils;
|
85
88
|
class Number;
|
89
|
+
class NumberObject;
|
86
90
|
class Object;
|
87
91
|
class Array;
|
88
92
|
class Int32;
|
@@ -90,6 +94,7 @@ class Uint32;
|
|
90
94
|
class External;
|
91
95
|
class Primitive;
|
92
96
|
class Boolean;
|
97
|
+
class BooleanObject;
|
93
98
|
class Integer;
|
94
99
|
class Function;
|
95
100
|
class Date;
|
@@ -104,6 +109,7 @@ class Data;
|
|
104
109
|
class AccessorInfo;
|
105
110
|
class StackTrace;
|
106
111
|
class StackFrame;
|
112
|
+
class Isolate;
|
107
113
|
|
108
114
|
namespace internal {
|
109
115
|
|
@@ -165,16 +171,15 @@ typedef void (*WeakReferenceCallback)(Persistent<Value> object,
|
|
165
171
|
*/
|
166
172
|
template <class T> class Handle {
|
167
173
|
public:
|
168
|
-
|
169
174
|
/**
|
170
175
|
* Creates an empty handle.
|
171
176
|
*/
|
172
|
-
inline Handle()
|
177
|
+
inline Handle() : val_(0) {}
|
173
178
|
|
174
179
|
/**
|
175
180
|
* Creates a new handle for the specified value.
|
176
181
|
*/
|
177
|
-
inline explicit Handle(T* val) : val_(val) {
|
182
|
+
inline explicit Handle(T* val) : val_(val) {}
|
178
183
|
|
179
184
|
/**
|
180
185
|
* Creates a handle for the contents of the specified handle. This
|
@@ -201,14 +206,14 @@ template <class T> class Handle {
|
|
201
206
|
*/
|
202
207
|
inline bool IsEmpty() const { return val_ == 0; }
|
203
208
|
|
204
|
-
inline T* operator->() const { return val_; }
|
205
|
-
|
206
|
-
inline T* operator*() const { return val_; }
|
207
|
-
|
208
209
|
/**
|
209
210
|
* Sets the handle to be empty. IsEmpty() will then return true.
|
210
211
|
*/
|
211
|
-
inline void Clear() {
|
212
|
+
inline void Clear() { val_ = 0; }
|
213
|
+
|
214
|
+
inline T* operator->() const { return val_; }
|
215
|
+
|
216
|
+
inline T* operator*() const { return val_; }
|
212
217
|
|
213
218
|
/**
|
214
219
|
* Checks whether two handles are the same.
|
@@ -312,7 +317,6 @@ template <class T> class Local : public Handle<T> {
|
|
312
317
|
*/
|
313
318
|
template <class T> class Persistent : public Handle<T> {
|
314
319
|
public:
|
315
|
-
|
316
320
|
/**
|
317
321
|
* Creates an empty persistent handle that doesn't point to any
|
318
322
|
* storage cell.
|
@@ -586,7 +590,6 @@ class ScriptOrigin {
|
|
586
590
|
*/
|
587
591
|
class V8EXPORT Script {
|
588
592
|
public:
|
589
|
-
|
590
593
|
/**
|
591
594
|
* Compiles the specified script (context-independent).
|
592
595
|
*
|
@@ -858,18 +861,17 @@ class V8EXPORT StackFrame {
|
|
858
861
|
*/
|
859
862
|
class Value : public Data {
|
860
863
|
public:
|
861
|
-
|
862
864
|
/**
|
863
865
|
* Returns true if this value is the undefined value. See ECMA-262
|
864
866
|
* 4.3.10.
|
865
867
|
*/
|
866
|
-
|
868
|
+
inline bool IsUndefined() const;
|
867
869
|
|
868
870
|
/**
|
869
871
|
* Returns true if this value is the null value. See ECMA-262
|
870
872
|
* 4.3.11.
|
871
873
|
*/
|
872
|
-
|
874
|
+
inline bool IsNull() const;
|
873
875
|
|
874
876
|
/**
|
875
877
|
* Returns true if this value is true.
|
@@ -932,6 +934,26 @@ class Value : public Data {
|
|
932
934
|
*/
|
933
935
|
V8EXPORT bool IsDate() const;
|
934
936
|
|
937
|
+
/**
|
938
|
+
* Returns true if this value is a Boolean object.
|
939
|
+
*/
|
940
|
+
V8EXPORT bool IsBooleanObject() const;
|
941
|
+
|
942
|
+
/**
|
943
|
+
* Returns true if this value is a Number object.
|
944
|
+
*/
|
945
|
+
V8EXPORT bool IsNumberObject() const;
|
946
|
+
|
947
|
+
/**
|
948
|
+
* Returns true if this value is a String object.
|
949
|
+
*/
|
950
|
+
V8EXPORT bool IsStringObject() const;
|
951
|
+
|
952
|
+
/**
|
953
|
+
* Returns true if this value is a NativeError.
|
954
|
+
*/
|
955
|
+
V8EXPORT bool IsNativeError() const;
|
956
|
+
|
935
957
|
/**
|
936
958
|
* Returns true if this value is a RegExp.
|
937
959
|
*/
|
@@ -963,7 +985,11 @@ class Value : public Data {
|
|
963
985
|
V8EXPORT bool StrictEquals(Handle<Value> that) const;
|
964
986
|
|
965
987
|
private:
|
988
|
+
inline bool QuickIsUndefined() const;
|
989
|
+
inline bool QuickIsNull() const;
|
966
990
|
inline bool QuickIsString() const;
|
991
|
+
V8EXPORT bool FullIsUndefined() const;
|
992
|
+
V8EXPORT bool FullIsNull() const;
|
967
993
|
V8EXPORT bool FullIsString() const;
|
968
994
|
};
|
969
995
|
|
@@ -990,7 +1016,6 @@ class Boolean : public Primitive {
|
|
990
1016
|
*/
|
991
1017
|
class String : public Primitive {
|
992
1018
|
public:
|
993
|
-
|
994
1019
|
/**
|
995
1020
|
* Returns the number of characters in this string.
|
996
1021
|
*/
|
@@ -1002,6 +1027,14 @@ class String : public Primitive {
|
|
1002
1027
|
*/
|
1003
1028
|
V8EXPORT int Utf8Length() const;
|
1004
1029
|
|
1030
|
+
/**
|
1031
|
+
* A fast conservative check for non-ASCII characters. May
|
1032
|
+
* return true even for ASCII strings, but if it returns
|
1033
|
+
* false you can be sure that all characters are in the range
|
1034
|
+
* 0-127.
|
1035
|
+
*/
|
1036
|
+
V8EXPORT bool MayContainNonAscii() const;
|
1037
|
+
|
1005
1038
|
/**
|
1006
1039
|
* Write the contents of the string to an external buffer.
|
1007
1040
|
* If no arguments are given, expects the buffer to be large
|
@@ -1021,34 +1054,39 @@ class String : public Primitive {
|
|
1021
1054
|
* \param length The number of characters to copy from the string. For
|
1022
1055
|
* WriteUtf8 the number of bytes in the buffer.
|
1023
1056
|
* \param nchars_ref The number of characters written, can be NULL.
|
1024
|
-
* \param
|
1057
|
+
* \param options Various options that might affect performance of this or
|
1025
1058
|
* subsequent operations.
|
1026
1059
|
* \return The number of characters copied to the buffer excluding the null
|
1027
1060
|
* terminator. For WriteUtf8: The number of bytes copied to the buffer
|
1028
|
-
* including the null terminator.
|
1061
|
+
* including the null terminator (if written).
|
1029
1062
|
*/
|
1030
|
-
enum
|
1031
|
-
|
1032
|
-
HINT_MANY_WRITES_EXPECTED = 1
|
1063
|
+
enum WriteOptions {
|
1064
|
+
NO_OPTIONS = 0,
|
1065
|
+
HINT_MANY_WRITES_EXPECTED = 1,
|
1066
|
+
NO_NULL_TERMINATION = 2
|
1033
1067
|
};
|
1034
1068
|
|
1069
|
+
// 16-bit character codes.
|
1035
1070
|
V8EXPORT int Write(uint16_t* buffer,
|
1036
1071
|
int start = 0,
|
1037
1072
|
int length = -1,
|
1038
|
-
|
1073
|
+
int options = NO_OPTIONS) const;
|
1074
|
+
// ASCII characters.
|
1039
1075
|
V8EXPORT int WriteAscii(char* buffer,
|
1040
1076
|
int start = 0,
|
1041
1077
|
int length = -1,
|
1042
|
-
|
1078
|
+
int options = NO_OPTIONS) const;
|
1079
|
+
// UTF-8 encoded characters.
|
1043
1080
|
V8EXPORT int WriteUtf8(char* buffer,
|
1044
1081
|
int length = -1,
|
1045
1082
|
int* nchars_ref = NULL,
|
1046
|
-
|
1083
|
+
int options = NO_OPTIONS) const;
|
1047
1084
|
|
1048
1085
|
/**
|
1049
1086
|
* A zero length string.
|
1050
1087
|
*/
|
1051
1088
|
V8EXPORT static v8::Local<v8::String> Empty();
|
1089
|
+
inline static v8::Local<v8::String> Empty(Isolate* isolate);
|
1052
1090
|
|
1053
1091
|
/**
|
1054
1092
|
* Returns true if the string is external
|
@@ -1056,7 +1094,7 @@ class String : public Primitive {
|
|
1056
1094
|
V8EXPORT bool IsExternal() const;
|
1057
1095
|
|
1058
1096
|
/**
|
1059
|
-
* Returns true if the string is both external and
|
1097
|
+
* Returns true if the string is both external and ASCII
|
1060
1098
|
*/
|
1061
1099
|
V8EXPORT bool IsExternalAscii() const;
|
1062
1100
|
|
@@ -1113,11 +1151,11 @@ class String : public Primitive {
|
|
1113
1151
|
};
|
1114
1152
|
|
1115
1153
|
/**
|
1116
|
-
* An ExternalAsciiStringResource is a wrapper around an
|
1154
|
+
* An ExternalAsciiStringResource is a wrapper around an ASCII
|
1117
1155
|
* string buffer that resides outside V8's heap. Implement an
|
1118
1156
|
* ExternalAsciiStringResource to manage the life cycle of the
|
1119
1157
|
* underlying buffer. Note that the string data must be immutable
|
1120
|
-
* and that the data must be strict 7-bit ASCII, not
|
1158
|
+
* and that the data must be strict (7-bit) ASCII, not Latin-1 or
|
1121
1159
|
* UTF-8, which would require special treatment internally in the
|
1122
1160
|
* engine and, in the case of UTF-8, do not allow efficient indexing.
|
1123
1161
|
* Use String::New or convert to 16 bit data for non-ASCII.
|
@@ -1133,7 +1171,7 @@ class String : public Primitive {
|
|
1133
1171
|
virtual ~ExternalAsciiStringResource() {}
|
1134
1172
|
/** The string data from the underlying buffer.*/
|
1135
1173
|
virtual const char* data() const = 0;
|
1136
|
-
/** The number of
|
1174
|
+
/** The number of ASCII characters in the string.*/
|
1137
1175
|
virtual size_t length() const = 0;
|
1138
1176
|
protected:
|
1139
1177
|
ExternalAsciiStringResource() {}
|
@@ -1146,17 +1184,18 @@ class String : public Primitive {
|
|
1146
1184
|
inline ExternalStringResource* GetExternalStringResource() const;
|
1147
1185
|
|
1148
1186
|
/**
|
1149
|
-
* Get the ExternalAsciiStringResource for an external
|
1187
|
+
* Get the ExternalAsciiStringResource for an external ASCII string.
|
1150
1188
|
* Returns NULL if IsExternalAscii() doesn't return true.
|
1151
1189
|
*/
|
1152
|
-
V8EXPORT ExternalAsciiStringResource* GetExternalAsciiStringResource()
|
1190
|
+
V8EXPORT const ExternalAsciiStringResource* GetExternalAsciiStringResource()
|
1191
|
+
const;
|
1153
1192
|
|
1154
1193
|
static inline String* Cast(v8::Value* obj);
|
1155
1194
|
|
1156
1195
|
/**
|
1157
|
-
* Allocates a new string from either
|
1196
|
+
* Allocates a new string from either UTF-8 encoded or ASCII data.
|
1158
1197
|
* The second parameter 'length' gives the buffer length.
|
1159
|
-
* If the data is
|
1198
|
+
* If the data is UTF-8 encoded, the caller must
|
1160
1199
|
* be careful to supply the length parameter.
|
1161
1200
|
* If it is not given, the function calls
|
1162
1201
|
* 'strlen' to determine the buffer length, it might be
|
@@ -1164,7 +1203,7 @@ class String : public Primitive {
|
|
1164
1203
|
*/
|
1165
1204
|
V8EXPORT static Local<String> New(const char* data, int length = -1);
|
1166
1205
|
|
1167
|
-
/** Allocates a new string from
|
1206
|
+
/** Allocates a new string from 16-bit character codes.*/
|
1168
1207
|
V8EXPORT static Local<String> New(const uint16_t* data, int length = -1);
|
1169
1208
|
|
1170
1209
|
/** Creates a symbol. Returns one if it exists already.*/
|
@@ -1175,7 +1214,7 @@ class String : public Primitive {
|
|
1175
1214
|
* passed in as parameters.
|
1176
1215
|
*/
|
1177
1216
|
V8EXPORT static Local<String> Concat(Handle<String> left,
|
1178
|
-
Handle<String>right);
|
1217
|
+
Handle<String> right);
|
1179
1218
|
|
1180
1219
|
/**
|
1181
1220
|
* Creates a new external string using the data defined in the given
|
@@ -1199,14 +1238,13 @@ class String : public Primitive {
|
|
1199
1238
|
V8EXPORT bool MakeExternal(ExternalStringResource* resource);
|
1200
1239
|
|
1201
1240
|
/**
|
1202
|
-
* Creates a new external string using the
|
1241
|
+
* Creates a new external string using the ASCII data defined in the given
|
1203
1242
|
* resource. When the external string is no longer live on V8's heap the
|
1204
1243
|
* resource will be disposed by calling its Dispose method. The caller of
|
1205
1244
|
* this function should not otherwise delete or modify the resource. Neither
|
1206
1245
|
* should the underlying buffer be deallocated or modified except through the
|
1207
1246
|
* destructor of the external string resource.
|
1208
|
-
*/
|
1209
|
-
V8EXPORT static Local<String> NewExternal(
|
1247
|
+
*/ V8EXPORT static Local<String> NewExternal(
|
1210
1248
|
ExternalAsciiStringResource* resource);
|
1211
1249
|
|
1212
1250
|
/**
|
@@ -1225,18 +1263,18 @@ class String : public Primitive {
|
|
1225
1263
|
*/
|
1226
1264
|
V8EXPORT bool CanMakeExternal();
|
1227
1265
|
|
1228
|
-
/** Creates an undetectable string from the supplied
|
1266
|
+
/** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/
|
1229
1267
|
V8EXPORT static Local<String> NewUndetectable(const char* data,
|
1230
1268
|
int length = -1);
|
1231
1269
|
|
1232
|
-
/** Creates an undetectable string from the supplied
|
1270
|
+
/** Creates an undetectable string from the supplied 16-bit character codes.*/
|
1233
1271
|
V8EXPORT static Local<String> NewUndetectable(const uint16_t* data,
|
1234
1272
|
int length = -1);
|
1235
1273
|
|
1236
1274
|
/**
|
1237
|
-
* Converts an object to a
|
1275
|
+
* Converts an object to a UTF-8-encoded character array. Useful if
|
1238
1276
|
* you want to print the object. If conversion to a string fails
|
1239
|
-
* (
|
1277
|
+
* (e.g. due to an exception in the toString() method of the object)
|
1240
1278
|
* then the length() method returns 0 and the * operator returns
|
1241
1279
|
* NULL.
|
1242
1280
|
*/
|
@@ -1257,7 +1295,7 @@ class String : public Primitive {
|
|
1257
1295
|
};
|
1258
1296
|
|
1259
1297
|
/**
|
1260
|
-
* Converts an object to an
|
1298
|
+
* Converts an object to an ASCII string.
|
1261
1299
|
* Useful if you want to print the object.
|
1262
1300
|
* If conversion to a string fails (eg. due to an exception in the toString()
|
1263
1301
|
* method of the object) then the length() method returns 0 and the * operator
|
@@ -1317,7 +1355,7 @@ class Number : public Primitive {
|
|
1317
1355
|
static inline Number* Cast(v8::Value* obj);
|
1318
1356
|
private:
|
1319
1357
|
V8EXPORT Number();
|
1320
|
-
static void CheckCast(v8::Value* obj);
|
1358
|
+
V8EXPORT static void CheckCast(v8::Value* obj);
|
1321
1359
|
};
|
1322
1360
|
|
1323
1361
|
|
@@ -1440,6 +1478,13 @@ class Object : public Value {
|
|
1440
1478
|
|
1441
1479
|
V8EXPORT Local<Value> Get(uint32_t index);
|
1442
1480
|
|
1481
|
+
/**
|
1482
|
+
* Gets the property attributes of a property which can be None or
|
1483
|
+
* any combination of ReadOnly, DontEnum and DontDelete. Returns
|
1484
|
+
* None when the property doesn't exist.
|
1485
|
+
*/
|
1486
|
+
V8EXPORT PropertyAttribute GetPropertyAttributes(Handle<Value> key);
|
1487
|
+
|
1443
1488
|
// TODO(1245389): Replace the type-specific versions of these
|
1444
1489
|
// functions with generic ones that accept a Handle<Value> key.
|
1445
1490
|
V8EXPORT bool Has(Handle<String> key);
|
@@ -1469,6 +1514,13 @@ class Object : public Value {
|
|
1469
1514
|
*/
|
1470
1515
|
V8EXPORT Local<Array> GetPropertyNames();
|
1471
1516
|
|
1517
|
+
/**
|
1518
|
+
* This function has the same functionality as GetPropertyNames but
|
1519
|
+
* the returned array doesn't contain the names of properties from
|
1520
|
+
* prototype objects.
|
1521
|
+
*/
|
1522
|
+
V8EXPORT Local<Array> GetOwnPropertyNames();
|
1523
|
+
|
1472
1524
|
/**
|
1473
1525
|
* Get the prototype object. This does not skip objects marked to
|
1474
1526
|
* be skipped by __proto__ and it does not consult the security
|
@@ -1623,7 +1675,7 @@ class Object : public Value {
|
|
1623
1675
|
V8EXPORT bool IsCallable();
|
1624
1676
|
|
1625
1677
|
/**
|
1626
|
-
* Call an Object as a function if a callback is set by the
|
1678
|
+
* Call an Object as a function if a callback is set by the
|
1627
1679
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
1628
1680
|
*/
|
1629
1681
|
V8EXPORT Local<Value> CallAsFunction(Handle<Object> recv,
|
@@ -1640,6 +1692,7 @@ class Object : public Value {
|
|
1640
1692
|
|
1641
1693
|
V8EXPORT static Local<Object> New();
|
1642
1694
|
static inline Object* Cast(Value* obj);
|
1695
|
+
|
1643
1696
|
private:
|
1644
1697
|
V8EXPORT Object();
|
1645
1698
|
V8EXPORT static void CheckCast(Value* obj);
|
@@ -1676,7 +1729,7 @@ class Array : public Object {
|
|
1676
1729
|
static inline Array* Cast(Value* obj);
|
1677
1730
|
private:
|
1678
1731
|
V8EXPORT Array();
|
1679
|
-
static void CheckCast(Value* obj);
|
1732
|
+
V8EXPORT static void CheckCast(Value* obj);
|
1680
1733
|
};
|
1681
1734
|
|
1682
1735
|
|
@@ -1693,14 +1746,29 @@ class Function : public Object {
|
|
1693
1746
|
V8EXPORT void SetName(Handle<String> name);
|
1694
1747
|
V8EXPORT Handle<Value> GetName() const;
|
1695
1748
|
|
1749
|
+
/**
|
1750
|
+
* Name inferred from variable or property assignment of this function.
|
1751
|
+
* Used to facilitate debugging and profiling of JavaScript code written
|
1752
|
+
* in an OO style, where many functions are anonymous but are assigned
|
1753
|
+
* to object properties.
|
1754
|
+
*/
|
1755
|
+
V8EXPORT Handle<Value> GetInferredName() const;
|
1756
|
+
|
1696
1757
|
/**
|
1697
1758
|
* Returns zero based line number of function body and
|
1698
1759
|
* kLineOffsetNotFound if no information available.
|
1699
1760
|
*/
|
1700
1761
|
V8EXPORT int GetScriptLineNumber() const;
|
1762
|
+
/**
|
1763
|
+
* Returns zero based column number of function body and
|
1764
|
+
* kLineOffsetNotFound if no information available.
|
1765
|
+
*/
|
1766
|
+
V8EXPORT int GetScriptColumnNumber() const;
|
1767
|
+
V8EXPORT Handle<Value> GetScriptId() const;
|
1701
1768
|
V8EXPORT ScriptOrigin GetScriptOrigin() const;
|
1702
1769
|
static inline Function* Cast(Value* obj);
|
1703
1770
|
V8EXPORT static const int kLineOffsetNotFound;
|
1771
|
+
|
1704
1772
|
private:
|
1705
1773
|
V8EXPORT Function();
|
1706
1774
|
V8EXPORT static void CheckCast(Value* obj);
|
@@ -1741,6 +1809,63 @@ class Date : public Object {
|
|
1741
1809
|
};
|
1742
1810
|
|
1743
1811
|
|
1812
|
+
/**
|
1813
|
+
* A Number object (ECMA-262, 4.3.21).
|
1814
|
+
*/
|
1815
|
+
class NumberObject : public Object {
|
1816
|
+
public:
|
1817
|
+
V8EXPORT static Local<Value> New(double value);
|
1818
|
+
|
1819
|
+
/**
|
1820
|
+
* Returns the Number held by the object.
|
1821
|
+
*/
|
1822
|
+
V8EXPORT double NumberValue() const;
|
1823
|
+
|
1824
|
+
static inline NumberObject* Cast(v8::Value* obj);
|
1825
|
+
|
1826
|
+
private:
|
1827
|
+
V8EXPORT static void CheckCast(v8::Value* obj);
|
1828
|
+
};
|
1829
|
+
|
1830
|
+
|
1831
|
+
/**
|
1832
|
+
* A Boolean object (ECMA-262, 4.3.15).
|
1833
|
+
*/
|
1834
|
+
class BooleanObject : public Object {
|
1835
|
+
public:
|
1836
|
+
V8EXPORT static Local<Value> New(bool value);
|
1837
|
+
|
1838
|
+
/**
|
1839
|
+
* Returns the Boolean held by the object.
|
1840
|
+
*/
|
1841
|
+
V8EXPORT bool BooleanValue() const;
|
1842
|
+
|
1843
|
+
static inline BooleanObject* Cast(v8::Value* obj);
|
1844
|
+
|
1845
|
+
private:
|
1846
|
+
V8EXPORT static void CheckCast(v8::Value* obj);
|
1847
|
+
};
|
1848
|
+
|
1849
|
+
|
1850
|
+
/**
|
1851
|
+
* A String object (ECMA-262, 4.3.18).
|
1852
|
+
*/
|
1853
|
+
class StringObject : public Object {
|
1854
|
+
public:
|
1855
|
+
V8EXPORT static Local<Value> New(Handle<String> value);
|
1856
|
+
|
1857
|
+
/**
|
1858
|
+
* Returns the String held by the object.
|
1859
|
+
*/
|
1860
|
+
V8EXPORT Local<String> StringValue() const;
|
1861
|
+
|
1862
|
+
static inline StringObject* Cast(v8::Value* obj);
|
1863
|
+
|
1864
|
+
private:
|
1865
|
+
V8EXPORT static void CheckCast(v8::Value* obj);
|
1866
|
+
};
|
1867
|
+
|
1868
|
+
|
1744
1869
|
/**
|
1745
1870
|
* An instance of the built-in RegExp constructor (ECMA-262, 15.10).
|
1746
1871
|
*/
|
@@ -1850,10 +1975,13 @@ class Arguments {
|
|
1850
1975
|
inline Local<Object> Holder() const;
|
1851
1976
|
inline bool IsConstructCall() const;
|
1852
1977
|
inline Local<Value> Data() const;
|
1978
|
+
inline Isolate* GetIsolate() const;
|
1979
|
+
|
1853
1980
|
private:
|
1854
|
-
static const int
|
1855
|
-
static const int
|
1856
|
-
static const int
|
1981
|
+
static const int kIsolateIndex = 0;
|
1982
|
+
static const int kDataIndex = -1;
|
1983
|
+
static const int kCalleeIndex = -2;
|
1984
|
+
static const int kHolderIndex = -3;
|
1857
1985
|
|
1858
1986
|
friend class ImplementationUtilities;
|
1859
1987
|
inline Arguments(internal::Object** implicit_args,
|
@@ -1875,9 +2003,11 @@ class V8EXPORT AccessorInfo {
|
|
1875
2003
|
public:
|
1876
2004
|
inline AccessorInfo(internal::Object** args)
|
1877
2005
|
: args_(args) { }
|
2006
|
+
inline Isolate* GetIsolate() const;
|
1878
2007
|
inline Local<Value> Data() const;
|
1879
2008
|
inline Local<Object> This() const;
|
1880
2009
|
inline Local<Object> Holder() const;
|
2010
|
+
|
1881
2011
|
private:
|
1882
2012
|
internal::Object** args_;
|
1883
2013
|
};
|
@@ -2140,6 +2270,12 @@ class V8EXPORT FunctionTemplate : public Template {
|
|
2140
2270
|
*/
|
2141
2271
|
void SetHiddenPrototype(bool value);
|
2142
2272
|
|
2273
|
+
/**
|
2274
|
+
* Sets the ReadOnly flag in the attributes of the 'prototype' property
|
2275
|
+
* of functions created from this FunctionTemplate to true.
|
2276
|
+
*/
|
2277
|
+
void ReadOnlyPrototype();
|
2278
|
+
|
2143
2279
|
/**
|
2144
2280
|
* Returns true if the given object is an instance of this function
|
2145
2281
|
* template.
|
@@ -2351,24 +2487,42 @@ class V8EXPORT TypeSwitch : public Data {
|
|
2351
2487
|
|
2352
2488
|
// --- Extensions ---
|
2353
2489
|
|
2490
|
+
class V8EXPORT ExternalAsciiStringResourceImpl
|
2491
|
+
: public String::ExternalAsciiStringResource {
|
2492
|
+
public:
|
2493
|
+
ExternalAsciiStringResourceImpl() : data_(0), length_(0) {}
|
2494
|
+
ExternalAsciiStringResourceImpl(const char* data, size_t length)
|
2495
|
+
: data_(data), length_(length) {}
|
2496
|
+
const char* data() const { return data_; }
|
2497
|
+
size_t length() const { return length_; }
|
2498
|
+
|
2499
|
+
private:
|
2500
|
+
const char* data_;
|
2501
|
+
size_t length_;
|
2502
|
+
};
|
2354
2503
|
|
2355
2504
|
/**
|
2356
2505
|
* Ignore
|
2357
2506
|
*/
|
2358
2507
|
class V8EXPORT Extension { // NOLINT
|
2359
2508
|
public:
|
2509
|
+
// Note that the strings passed into this constructor must live as long
|
2510
|
+
// as the Extension itself.
|
2360
2511
|
Extension(const char* name,
|
2361
2512
|
const char* source = 0,
|
2362
2513
|
int dep_count = 0,
|
2363
|
-
const char** deps = 0
|
2514
|
+
const char** deps = 0,
|
2515
|
+
int source_length = -1);
|
2364
2516
|
virtual ~Extension() { }
|
2365
2517
|
virtual v8::Handle<v8::FunctionTemplate>
|
2366
2518
|
GetNativeFunction(v8::Handle<v8::String> name) {
|
2367
2519
|
return v8::Handle<v8::FunctionTemplate>();
|
2368
2520
|
}
|
2369
2521
|
|
2370
|
-
const char* name() { return name_; }
|
2371
|
-
|
2522
|
+
const char* name() const { return name_; }
|
2523
|
+
size_t source_length() const { return source_length_; }
|
2524
|
+
const String::ExternalAsciiStringResource* source() const {
|
2525
|
+
return &source_; }
|
2372
2526
|
int dependency_count() { return dep_count_; }
|
2373
2527
|
const char** dependencies() { return deps_; }
|
2374
2528
|
void set_auto_enable(bool value) { auto_enable_ = value; }
|
@@ -2376,7 +2530,8 @@ class V8EXPORT Extension { // NOLINT
|
|
2376
2530
|
|
2377
2531
|
private:
|
2378
2532
|
const char* name_;
|
2379
|
-
|
2533
|
+
size_t source_length_; // expected to initialize before source_
|
2534
|
+
ExternalAsciiStringResourceImpl source_;
|
2380
2535
|
int dep_count_;
|
2381
2536
|
const char** deps_;
|
2382
2537
|
bool auto_enable_;
|
@@ -2409,6 +2564,11 @@ Handle<Primitive> V8EXPORT Null();
|
|
2409
2564
|
Handle<Boolean> V8EXPORT True();
|
2410
2565
|
Handle<Boolean> V8EXPORT False();
|
2411
2566
|
|
2567
|
+
inline Handle<Primitive> Undefined(Isolate* isolate);
|
2568
|
+
inline Handle<Primitive> Null(Isolate* isolate);
|
2569
|
+
inline Handle<Boolean> True(Isolate* isolate);
|
2570
|
+
inline Handle<Boolean> False(Isolate* isolate);
|
2571
|
+
|
2412
2572
|
|
2413
2573
|
/**
|
2414
2574
|
* A set of constraints that specifies the limits of the runtime's memory use.
|
@@ -2508,6 +2668,9 @@ typedef void (*MemoryAllocationCallback)(ObjectSpace space,
|
|
2508
2668
|
AllocationAction action,
|
2509
2669
|
int size);
|
2510
2670
|
|
2671
|
+
// --- Leave Script Callback ---
|
2672
|
+
typedef void (*CallCompletedCallback)();
|
2673
|
+
|
2511
2674
|
// --- Failed Access Check Callback ---
|
2512
2675
|
typedef void (*FailedAccessCheckCallback)(Local<Object> target,
|
2513
2676
|
AccessType type,
|
@@ -2547,23 +2710,6 @@ typedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags);
|
|
2547
2710
|
typedef void (*GCCallback)();
|
2548
2711
|
|
2549
2712
|
|
2550
|
-
/**
|
2551
|
-
* Profiler modules.
|
2552
|
-
*
|
2553
|
-
* In V8, profiler consists of several modules: CPU profiler, and different
|
2554
|
-
* kinds of heap profiling. Each can be turned on / off independently.
|
2555
|
-
* When PROFILER_MODULE_HEAP_SNAPSHOT flag is passed to ResumeProfilerEx,
|
2556
|
-
* modules are enabled only temporarily for making a snapshot of the heap.
|
2557
|
-
*/
|
2558
|
-
enum ProfilerModules {
|
2559
|
-
PROFILER_MODULE_NONE = 0,
|
2560
|
-
PROFILER_MODULE_CPU = 1,
|
2561
|
-
PROFILER_MODULE_HEAP_STATS = 1 << 1,
|
2562
|
-
PROFILER_MODULE_JS_CONSTRUCTORS = 1 << 2,
|
2563
|
-
PROFILER_MODULE_HEAP_SNAPSHOT = 1 << 16
|
2564
|
-
};
|
2565
|
-
|
2566
|
-
|
2567
2713
|
/**
|
2568
2714
|
* Collection of V8 heap information.
|
2569
2715
|
*
|
@@ -2604,7 +2750,7 @@ class RetainedObjectInfo;
|
|
2604
2750
|
* default isolate is implicitly created and entered. The embedder
|
2605
2751
|
* can create additional isolates and use them in parallel in multiple
|
2606
2752
|
* threads. An isolate can be entered by at most one thread at any
|
2607
|
-
* given time. The Locker/Unlocker API
|
2753
|
+
* given time. The Locker/Unlocker API must be used to synchronize.
|
2608
2754
|
*/
|
2609
2755
|
class V8EXPORT Isolate {
|
2610
2756
|
public:
|
@@ -2673,16 +2819,15 @@ class V8EXPORT Isolate {
|
|
2673
2819
|
/**
|
2674
2820
|
* Associate embedder-specific data with the isolate
|
2675
2821
|
*/
|
2676
|
-
void SetData(void* data);
|
2822
|
+
inline void SetData(void* data);
|
2677
2823
|
|
2678
2824
|
/**
|
2679
|
-
*
|
2825
|
+
* Retrieve embedder-specific data from the isolate.
|
2680
2826
|
* Returns NULL if SetData has never been called.
|
2681
2827
|
*/
|
2682
|
-
void* GetData();
|
2828
|
+
inline void* GetData();
|
2683
2829
|
|
2684
2830
|
private:
|
2685
|
-
|
2686
2831
|
Isolate();
|
2687
2832
|
Isolate(const Isolate&);
|
2688
2833
|
~Isolate();
|
@@ -2704,6 +2849,63 @@ class StartupData {
|
|
2704
2849
|
int raw_size;
|
2705
2850
|
};
|
2706
2851
|
|
2852
|
+
|
2853
|
+
/**
|
2854
|
+
* A helper class for driving V8 startup data decompression. It is based on
|
2855
|
+
* "CompressedStartupData" API functions from the V8 class. It isn't mandatory
|
2856
|
+
* for an embedder to use this class, instead, API functions can be used
|
2857
|
+
* directly.
|
2858
|
+
*
|
2859
|
+
* For an example of the class usage, see the "shell.cc" sample application.
|
2860
|
+
*/
|
2861
|
+
class V8EXPORT StartupDataDecompressor { // NOLINT
|
2862
|
+
public:
|
2863
|
+
StartupDataDecompressor();
|
2864
|
+
virtual ~StartupDataDecompressor();
|
2865
|
+
int Decompress();
|
2866
|
+
|
2867
|
+
protected:
|
2868
|
+
virtual int DecompressData(char* raw_data,
|
2869
|
+
int* raw_data_size,
|
2870
|
+
const char* compressed_data,
|
2871
|
+
int compressed_data_size) = 0;
|
2872
|
+
|
2873
|
+
private:
|
2874
|
+
char** raw_data;
|
2875
|
+
};
|
2876
|
+
|
2877
|
+
|
2878
|
+
/**
|
2879
|
+
* EntropySource is used as a callback function when v8 needs a source
|
2880
|
+
* of entropy.
|
2881
|
+
*/
|
2882
|
+
typedef bool (*EntropySource)(unsigned char* buffer, size_t length);
|
2883
|
+
|
2884
|
+
|
2885
|
+
/**
|
2886
|
+
* ReturnAddressLocationResolver is used as a callback function when v8 is
|
2887
|
+
* resolving the location of a return address on the stack. Profilers that
|
2888
|
+
* change the return address on the stack can use this to resolve the stack
|
2889
|
+
* location to whereever the profiler stashed the original return address.
|
2890
|
+
* When invoked, return_addr_location will point to a location on stack where
|
2891
|
+
* a machine return address resides, this function should return either the
|
2892
|
+
* same pointer, or a pointer to the profiler's copy of the original return
|
2893
|
+
* address.
|
2894
|
+
*/
|
2895
|
+
typedef uintptr_t (*ReturnAddressLocationResolver)(
|
2896
|
+
uintptr_t return_addr_location);
|
2897
|
+
|
2898
|
+
|
2899
|
+
/**
|
2900
|
+
* Interface for iterating though all external resources in the heap.
|
2901
|
+
*/
|
2902
|
+
class V8EXPORT ExternalResourceVisitor { // NOLINT
|
2903
|
+
public:
|
2904
|
+
virtual ~ExternalResourceVisitor() {}
|
2905
|
+
virtual void VisitExternalString(Handle<String> string) {}
|
2906
|
+
};
|
2907
|
+
|
2908
|
+
|
2707
2909
|
/**
|
2708
2910
|
* Container class for static utility functions.
|
2709
2911
|
*/
|
@@ -2753,6 +2955,10 @@ class V8EXPORT V8 {
|
|
2753
2955
|
* v8::V8::SetDecompressedStartupData(compressed_data);
|
2754
2956
|
* ... now V8 can be initialized
|
2755
2957
|
* ... make sure the decompressed data stays valid until V8 shutdown
|
2958
|
+
*
|
2959
|
+
* A helper class StartupDataDecompressor is provided. It implements
|
2960
|
+
* the protocol of the interaction described above, and can be used in
|
2961
|
+
* most cases instead of calling these API functions directly.
|
2756
2962
|
*/
|
2757
2963
|
static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm();
|
2758
2964
|
static int GetCompressedStartupDataCount();
|
@@ -2888,11 +3094,24 @@ class V8EXPORT V8 {
|
|
2888
3094
|
AllocationAction action);
|
2889
3095
|
|
2890
3096
|
/**
|
2891
|
-
*
|
2892
|
-
* AddMemoryAllocationCallback function.
|
3097
|
+
* Removes callback that was installed by AddMemoryAllocationCallback.
|
2893
3098
|
*/
|
2894
3099
|
static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);
|
2895
3100
|
|
3101
|
+
/**
|
3102
|
+
* Adds a callback to notify the host application when a script finished
|
3103
|
+
* running. If a script re-enters the runtime during executing, the
|
3104
|
+
* CallCompletedCallback is only invoked when the outer-most script
|
3105
|
+
* execution ends. Executing scripts inside the callback do not trigger
|
3106
|
+
* further callbacks.
|
3107
|
+
*/
|
3108
|
+
static void AddCallCompletedCallback(CallCompletedCallback callback);
|
3109
|
+
|
3110
|
+
/**
|
3111
|
+
* Removes callback that was installed by AddCallCompletedCallback.
|
3112
|
+
*/
|
3113
|
+
static void RemoveCallCompletedCallback(CallCompletedCallback callback);
|
3114
|
+
|
2896
3115
|
/**
|
2897
3116
|
* Allows the host application to group objects together. If one
|
2898
3117
|
* object in the group is alive, all objects in the group are alive.
|
@@ -2924,6 +3143,19 @@ class V8EXPORT V8 {
|
|
2924
3143
|
*/
|
2925
3144
|
static bool Initialize();
|
2926
3145
|
|
3146
|
+
/**
|
3147
|
+
* Allows the host application to provide a callback which can be used
|
3148
|
+
* as a source of entropy for random number generators.
|
3149
|
+
*/
|
3150
|
+
static void SetEntropySource(EntropySource source);
|
3151
|
+
|
3152
|
+
/**
|
3153
|
+
* Allows the host application to provide a callback that allows v8 to
|
3154
|
+
* cooperate with a profiler that rewrites return addresses on stack.
|
3155
|
+
*/
|
3156
|
+
static void SetReturnAddressLocationResolver(
|
3157
|
+
ReturnAddressLocationResolver return_address_resolver);
|
3158
|
+
|
2927
3159
|
/**
|
2928
3160
|
* Adjusts the amount of registered external memory. Used to give
|
2929
3161
|
* V8 an indication of the amount of externally allocated memory
|
@@ -2938,7 +3170,8 @@ class V8EXPORT V8 {
|
|
2938
3170
|
* that is kept alive by JavaScript objects.
|
2939
3171
|
* \returns the adjusted value.
|
2940
3172
|
*/
|
2941
|
-
static
|
3173
|
+
static intptr_t AdjustAmountOfExternalAllocatedMemory(
|
3174
|
+
intptr_t change_in_bytes);
|
2942
3175
|
|
2943
3176
|
/**
|
2944
3177
|
* Suspends recording of tick samples in the profiler.
|
@@ -2962,65 +3195,6 @@ class V8EXPORT V8 {
|
|
2962
3195
|
*/
|
2963
3196
|
static bool IsProfilerPaused();
|
2964
3197
|
|
2965
|
-
/**
|
2966
|
-
* Resumes specified profiler modules. Can be called several times to
|
2967
|
-
* mark the opening of a profiler events block with the given tag.
|
2968
|
-
*
|
2969
|
-
* "ResumeProfiler" is equivalent to "ResumeProfilerEx(PROFILER_MODULE_CPU)".
|
2970
|
-
* See ProfilerModules enum.
|
2971
|
-
*
|
2972
|
-
* \param flags Flags specifying profiler modules.
|
2973
|
-
* \param tag Profile tag.
|
2974
|
-
*/
|
2975
|
-
static void ResumeProfilerEx(int flags, int tag = 0);
|
2976
|
-
|
2977
|
-
/**
|
2978
|
-
* Pauses specified profiler modules. Each call to "PauseProfilerEx" closes
|
2979
|
-
* a block of profiler events opened by a call to "ResumeProfilerEx" with the
|
2980
|
-
* same tag value. There is no need for blocks to be properly nested.
|
2981
|
-
* The profiler is paused when the last opened block is closed.
|
2982
|
-
*
|
2983
|
-
* "PauseProfiler" is equivalent to "PauseProfilerEx(PROFILER_MODULE_CPU)".
|
2984
|
-
* See ProfilerModules enum.
|
2985
|
-
*
|
2986
|
-
* \param flags Flags specifying profiler modules.
|
2987
|
-
* \param tag Profile tag.
|
2988
|
-
*/
|
2989
|
-
static void PauseProfilerEx(int flags, int tag = 0);
|
2990
|
-
|
2991
|
-
/**
|
2992
|
-
* Returns active (resumed) profiler modules.
|
2993
|
-
* See ProfilerModules enum.
|
2994
|
-
*
|
2995
|
-
* \returns active profiler modules.
|
2996
|
-
*/
|
2997
|
-
static int GetActiveProfilerModules();
|
2998
|
-
|
2999
|
-
/**
|
3000
|
-
* If logging is performed into a memory buffer (via --logfile=*), allows to
|
3001
|
-
* retrieve previously written messages. This can be used for retrieving
|
3002
|
-
* profiler log data in the application. This function is thread-safe.
|
3003
|
-
*
|
3004
|
-
* Caller provides a destination buffer that must exist during GetLogLines
|
3005
|
-
* call. Only whole log lines are copied into the buffer.
|
3006
|
-
*
|
3007
|
-
* \param from_pos specified a point in a buffer to read from, 0 is the
|
3008
|
-
* beginning of a buffer. It is assumed that caller updates its current
|
3009
|
-
* position using returned size value from the previous call.
|
3010
|
-
* \param dest_buf destination buffer for log data.
|
3011
|
-
* \param max_size size of the destination buffer.
|
3012
|
-
* \returns actual size of log data copied into buffer.
|
3013
|
-
*/
|
3014
|
-
static int GetLogLines(int from_pos, char* dest_buf, int max_size);
|
3015
|
-
|
3016
|
-
/**
|
3017
|
-
* The minimum allowed size for a log lines buffer. If the size of
|
3018
|
-
* the buffer given will not be enough to hold a line of the maximum
|
3019
|
-
* length, an attempt to find a log line end in GetLogLines will
|
3020
|
-
* fail, and an empty result will be returned.
|
3021
|
-
*/
|
3022
|
-
static const int kMinimumSizeForLogLinesBuffer = 2048;
|
3023
|
-
|
3024
3198
|
/**
|
3025
3199
|
* Retrieve the V8 thread id of the calling thread.
|
3026
3200
|
*
|
@@ -3074,8 +3248,10 @@ class V8EXPORT V8 {
|
|
3074
3248
|
* because of a call to TerminateExecution. In that case there are
|
3075
3249
|
* still JavaScript frames on the stack and the termination
|
3076
3250
|
* exception is still active.
|
3251
|
+
*
|
3252
|
+
* \param isolate The isolate in which to check.
|
3077
3253
|
*/
|
3078
|
-
static bool IsExecutionTerminating();
|
3254
|
+
static bool IsExecutionTerminating(Isolate* isolate = NULL);
|
3079
3255
|
|
3080
3256
|
/**
|
3081
3257
|
* Releases any resources used by v8 and stops any utility threads
|
@@ -3093,6 +3269,13 @@ class V8EXPORT V8 {
|
|
3093
3269
|
*/
|
3094
3270
|
static void GetHeapStatistics(HeapStatistics* heap_statistics);
|
3095
3271
|
|
3272
|
+
/**
|
3273
|
+
* Iterates through all external resources referenced from current isolate
|
3274
|
+
* heap. This method is not expected to be used except for debugging purposes
|
3275
|
+
* and may be quite slow.
|
3276
|
+
*/
|
3277
|
+
static void VisitExternalResources(ExternalResourceVisitor* visitor);
|
3278
|
+
|
3096
3279
|
/**
|
3097
3280
|
* Optional notification that the embedder is idle.
|
3098
3281
|
* V8 uses the notification to reduce memory footprint.
|
@@ -3100,8 +3283,12 @@ class V8EXPORT V8 {
|
|
3100
3283
|
* Returns true if the embedder should stop calling IdleNotification
|
3101
3284
|
* until real work has been done. This indicates that V8 has done
|
3102
3285
|
* as much cleanup as it will be able to do.
|
3286
|
+
*
|
3287
|
+
* The hint argument specifies the amount of work to be done in the function
|
3288
|
+
* on scale from 1 to 1000. There is no guarantee that the actual work will
|
3289
|
+
* match the hint.
|
3103
3290
|
*/
|
3104
|
-
static bool IdleNotification();
|
3291
|
+
static bool IdleNotification(int hint = 1000);
|
3105
3292
|
|
3106
3293
|
/**
|
3107
3294
|
* Optional notification that the system is running low on memory.
|
@@ -3144,7 +3331,6 @@ class V8EXPORT V8 {
|
|
3144
3331
|
*/
|
3145
3332
|
class V8EXPORT TryCatch {
|
3146
3333
|
public:
|
3147
|
-
|
3148
3334
|
/**
|
3149
3335
|
* Creates a new try/catch block and registers it with v8.
|
3150
3336
|
*/
|
@@ -3236,6 +3422,7 @@ class V8EXPORT TryCatch {
|
|
3236
3422
|
void SetCaptureMessage(bool value);
|
3237
3423
|
|
3238
3424
|
private:
|
3425
|
+
v8::internal::Isolate* isolate_;
|
3239
3426
|
void* next_;
|
3240
3427
|
void* exception_;
|
3241
3428
|
void* message_;
|
@@ -3398,6 +3585,12 @@ class V8EXPORT Context {
|
|
3398
3585
|
*/
|
3399
3586
|
void AllowCodeGenerationFromStrings(bool allow);
|
3400
3587
|
|
3588
|
+
/**
|
3589
|
+
* Returns true if code generation from strings is allowed for the context.
|
3590
|
+
* For more details see AllowCodeGenerationFromStrings(bool) documentation.
|
3591
|
+
*/
|
3592
|
+
bool IsCodeGenerationFromStringsAllowed();
|
3593
|
+
|
3401
3594
|
/**
|
3402
3595
|
* Stack-allocated class which sets the execution context for all
|
3403
3596
|
* operations executed within a local scope.
|
@@ -3427,13 +3620,15 @@ class V8EXPORT Context {
|
|
3427
3620
|
* accessing handles or holding onto object pointers obtained
|
3428
3621
|
* from V8 handles while in the particular V8 isolate. It is up
|
3429
3622
|
* to the user of V8 to ensure (perhaps with locking) that this
|
3430
|
-
* constraint is not violated.
|
3623
|
+
* constraint is not violated. In addition to any other synchronization
|
3624
|
+
* mechanism that may be used, the v8::Locker and v8::Unlocker classes
|
3625
|
+
* must be used to signal thead switches to V8.
|
3431
3626
|
*
|
3432
3627
|
* v8::Locker is a scoped lock object. While it's
|
3433
3628
|
* active (i.e. between its construction and destruction) the current thread is
|
3434
|
-
* allowed to use the locked isolate. V8 guarantees that an isolate can be
|
3435
|
-
* by at most one thread at any time. In other words, the scope of a
|
3436
|
-
* a critical section.
|
3629
|
+
* allowed to use the locked isolate. V8 guarantees that an isolate can be
|
3630
|
+
* locked by at most one thread at any time. In other words, the scope of a
|
3631
|
+
* v8::Locker is a critical section.
|
3437
3632
|
*
|
3438
3633
|
* Sample usage:
|
3439
3634
|
* \code
|
@@ -3498,7 +3693,7 @@ class V8EXPORT Context {
|
|
3498
3693
|
* // V8 Now no longer locked.
|
3499
3694
|
* \endcode
|
3500
3695
|
*
|
3501
|
-
*
|
3696
|
+
*
|
3502
3697
|
*/
|
3503
3698
|
class V8EXPORT Unlocker {
|
3504
3699
|
public:
|
@@ -3535,15 +3730,15 @@ class V8EXPORT Locker {
|
|
3535
3730
|
static void StopPreemption();
|
3536
3731
|
|
3537
3732
|
/**
|
3538
|
-
* Returns whether or not the locker for a given isolate, or default isolate
|
3539
|
-
* is locked by the current thread.
|
3733
|
+
* Returns whether or not the locker for a given isolate, or default isolate
|
3734
|
+
* if NULL is given, is locked by the current thread.
|
3540
3735
|
*/
|
3541
3736
|
static bool IsLocked(Isolate* isolate = NULL);
|
3542
3737
|
|
3543
3738
|
/**
|
3544
3739
|
* Returns whether v8::Locker is being used by this V8 instance.
|
3545
3740
|
*/
|
3546
|
-
static bool IsActive()
|
3741
|
+
static bool IsActive();
|
3547
3742
|
|
3548
3743
|
private:
|
3549
3744
|
bool has_lock_;
|
@@ -3558,6 +3753,12 @@ class V8EXPORT Locker {
|
|
3558
3753
|
};
|
3559
3754
|
|
3560
3755
|
|
3756
|
+
/**
|
3757
|
+
* A struct for exporting HeapStats data from V8, using "push" model.
|
3758
|
+
*/
|
3759
|
+
struct HeapStatsUpdate;
|
3760
|
+
|
3761
|
+
|
3561
3762
|
/**
|
3562
3763
|
* An interface for exporting data from V8, using "push" model.
|
3563
3764
|
*/
|
@@ -3583,6 +3784,14 @@ class V8EXPORT OutputStream { // NOLINT
|
|
3583
3784
|
* will not be called in case writing was aborted.
|
3584
3785
|
*/
|
3585
3786
|
virtual WriteResult WriteAsciiChunk(char* data, int size) = 0;
|
3787
|
+
/**
|
3788
|
+
* Writes the next chunk of heap stats data into the stream. Writing
|
3789
|
+
* can be stopped by returning kAbort as function result. EndOfStream
|
3790
|
+
* will not be called in case writing was aborted.
|
3791
|
+
*/
|
3792
|
+
virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) {
|
3793
|
+
return kAbort;
|
3794
|
+
};
|
3586
3795
|
};
|
3587
3796
|
|
3588
3797
|
|
@@ -3610,8 +3819,8 @@ class V8EXPORT ActivityControl { // NOLINT
|
|
3610
3819
|
|
3611
3820
|
namespace internal {
|
3612
3821
|
|
3613
|
-
|
3614
|
-
|
3822
|
+
const int kApiPointerSize = sizeof(void*); // NOLINT
|
3823
|
+
const int kApiIntSize = sizeof(int); // NOLINT
|
3615
3824
|
|
3616
3825
|
// Tag information for HeapObject.
|
3617
3826
|
const int kHeapObjectTag = 1;
|
@@ -3671,18 +3880,6 @@ const uintptr_t kEncodablePointerMask =
|
|
3671
3880
|
PlatformSmiTagging::kEncodablePointerMask;
|
3672
3881
|
const int kPointerToSmiShift = PlatformSmiTagging::kPointerToSmiShift;
|
3673
3882
|
|
3674
|
-
template <size_t ptr_size> struct InternalConstants;
|
3675
|
-
|
3676
|
-
// Internal constants for 32-bit systems.
|
3677
|
-
template <> struct InternalConstants<4> {
|
3678
|
-
static const int kStringResourceOffset = 3 * kApiPointerSize;
|
3679
|
-
};
|
3680
|
-
|
3681
|
-
// Internal constants for 64-bit systems.
|
3682
|
-
template <> struct InternalConstants<8> {
|
3683
|
-
static const int kStringResourceOffset = 3 * kApiPointerSize;
|
3684
|
-
};
|
3685
|
-
|
3686
3883
|
/**
|
3687
3884
|
* This class exports constants and functionality from within v8 that
|
3688
3885
|
* is necessary to implement inline functions in the v8 api. Don't
|
@@ -3690,23 +3887,35 @@ template <> struct InternalConstants<8> {
|
|
3690
3887
|
*/
|
3691
3888
|
class Internals {
|
3692
3889
|
public:
|
3693
|
-
|
3694
3890
|
// These values match non-compiler-dependent values defined within
|
3695
3891
|
// the implementation of v8.
|
3696
3892
|
static const int kHeapObjectMapOffset = 0;
|
3697
3893
|
static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
|
3698
|
-
static const int kStringResourceOffset =
|
3699
|
-
InternalConstants<kApiPointerSize>::kStringResourceOffset;
|
3894
|
+
static const int kStringResourceOffset = 3 * kApiPointerSize;
|
3700
3895
|
|
3896
|
+
static const int kOddballKindOffset = 3 * kApiPointerSize;
|
3701
3897
|
static const int kForeignAddressOffset = kApiPointerSize;
|
3702
3898
|
static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
|
3703
3899
|
static const int kFullStringRepresentationMask = 0x07;
|
3704
3900
|
static const int kExternalTwoByteRepresentationTag = 0x02;
|
3705
3901
|
|
3706
|
-
static const int
|
3902
|
+
static const int kIsolateStateOffset = 0;
|
3903
|
+
static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
|
3904
|
+
static const int kIsolateRootsOffset = 3 * kApiPointerSize;
|
3905
|
+
static const int kUndefinedValueRootIndex = 5;
|
3906
|
+
static const int kNullValueRootIndex = 7;
|
3907
|
+
static const int kTrueValueRootIndex = 8;
|
3908
|
+
static const int kFalseValueRootIndex = 9;
|
3909
|
+
static const int kEmptySymbolRootIndex = 128;
|
3910
|
+
|
3911
|
+
static const int kJSObjectType = 0xaa;
|
3707
3912
|
static const int kFirstNonstringType = 0x80;
|
3913
|
+
static const int kOddballType = 0x82;
|
3708
3914
|
static const int kForeignType = 0x85;
|
3709
3915
|
|
3916
|
+
static const int kUndefinedOddballKind = 5;
|
3917
|
+
static const int kNullOddballKind = 3;
|
3918
|
+
|
3710
3919
|
static inline bool HasHeapObjectTag(internal::Object* value) {
|
3711
3920
|
return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
|
3712
3921
|
kHeapObjectTag);
|
@@ -3726,6 +3935,11 @@ class Internals {
|
|
3726
3935
|
return ReadField<uint8_t>(map, kMapInstanceTypeOffset);
|
3727
3936
|
}
|
3728
3937
|
|
3938
|
+
static inline int GetOddballKind(internal::Object* obj) {
|
3939
|
+
typedef internal::Object O;
|
3940
|
+
return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
|
3941
|
+
}
|
3942
|
+
|
3729
3943
|
static inline void* GetExternalPointerFromSmi(internal::Object* value) {
|
3730
3944
|
const uintptr_t address = reinterpret_cast<uintptr_t>(value);
|
3731
3945
|
return reinterpret_cast<void*>(address >> kPointerToSmiShift);
|
@@ -3746,6 +3960,28 @@ class Internals {
|
|
3746
3960
|
return representation == kExternalTwoByteRepresentationTag;
|
3747
3961
|
}
|
3748
3962
|
|
3963
|
+
static inline bool IsInitialized(v8::Isolate* isolate) {
|
3964
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateStateOffset;
|
3965
|
+
return *reinterpret_cast<int*>(addr) == 1;
|
3966
|
+
}
|
3967
|
+
|
3968
|
+
static inline void SetEmbedderData(v8::Isolate* isolate, void* data) {
|
3969
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
|
3970
|
+
kIsolateEmbedderDataOffset;
|
3971
|
+
*reinterpret_cast<void**>(addr) = data;
|
3972
|
+
}
|
3973
|
+
|
3974
|
+
static inline void* GetEmbedderData(v8::Isolate* isolate) {
|
3975
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
|
3976
|
+
kIsolateEmbedderDataOffset;
|
3977
|
+
return *reinterpret_cast<void**>(addr);
|
3978
|
+
}
|
3979
|
+
|
3980
|
+
static inline internal::Object** GetRoot(v8::Isolate* isolate, int index) {
|
3981
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
|
3982
|
+
return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
|
3983
|
+
}
|
3984
|
+
|
3749
3985
|
template <typename T>
|
3750
3986
|
static inline T ReadField(Object* ptr, int offset) {
|
3751
3987
|
uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag;
|
@@ -3764,10 +4000,6 @@ class Internals {
|
|
3764
4000
|
} // namespace internal
|
3765
4001
|
|
3766
4002
|
|
3767
|
-
template <class T>
|
3768
|
-
Handle<T>::Handle() : val_(0) { }
|
3769
|
-
|
3770
|
-
|
3771
4003
|
template <class T>
|
3772
4004
|
Local<T>::Local() : Handle<T>() { }
|
3773
4005
|
|
@@ -3876,6 +4108,11 @@ Local<Value> Arguments::Data() const {
|
|
3876
4108
|
}
|
3877
4109
|
|
3878
4110
|
|
4111
|
+
Isolate* Arguments::GetIsolate() const {
|
4112
|
+
return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]);
|
4113
|
+
}
|
4114
|
+
|
4115
|
+
|
3879
4116
|
bool Arguments::IsConstructCall() const {
|
3880
4117
|
return is_construct_call_;
|
3881
4118
|
}
|
@@ -3988,6 +4225,15 @@ String* String::Cast(v8::Value* value) {
|
|
3988
4225
|
}
|
3989
4226
|
|
3990
4227
|
|
4228
|
+
Local<String> String::Empty(Isolate* isolate) {
|
4229
|
+
typedef internal::Object* S;
|
4230
|
+
typedef internal::Internals I;
|
4231
|
+
if (!I::IsInitialized(isolate)) return Empty();
|
4232
|
+
S* slot = I::GetRoot(isolate, I::kEmptySymbolRootIndex);
|
4233
|
+
return Local<String>(reinterpret_cast<String*>(slot));
|
4234
|
+
}
|
4235
|
+
|
4236
|
+
|
3991
4237
|
String::ExternalStringResource* String::GetExternalStringResource() const {
|
3992
4238
|
typedef internal::Object O;
|
3993
4239
|
typedef internal::Internals I;
|
@@ -4006,6 +4252,42 @@ String::ExternalStringResource* String::GetExternalStringResource() const {
|
|
4006
4252
|
}
|
4007
4253
|
|
4008
4254
|
|
4255
|
+
bool Value::IsUndefined() const {
|
4256
|
+
#ifdef V8_ENABLE_CHECKS
|
4257
|
+
return FullIsUndefined();
|
4258
|
+
#else
|
4259
|
+
return QuickIsUndefined();
|
4260
|
+
#endif
|
4261
|
+
}
|
4262
|
+
|
4263
|
+
bool Value::QuickIsUndefined() const {
|
4264
|
+
typedef internal::Object O;
|
4265
|
+
typedef internal::Internals I;
|
4266
|
+
O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
|
4267
|
+
if (!I::HasHeapObjectTag(obj)) return false;
|
4268
|
+
if (I::GetInstanceType(obj) != I::kOddballType) return false;
|
4269
|
+
return (I::GetOddballKind(obj) == I::kUndefinedOddballKind);
|
4270
|
+
}
|
4271
|
+
|
4272
|
+
|
4273
|
+
bool Value::IsNull() const {
|
4274
|
+
#ifdef V8_ENABLE_CHECKS
|
4275
|
+
return FullIsNull();
|
4276
|
+
#else
|
4277
|
+
return QuickIsNull();
|
4278
|
+
#endif
|
4279
|
+
}
|
4280
|
+
|
4281
|
+
bool Value::QuickIsNull() const {
|
4282
|
+
typedef internal::Object O;
|
4283
|
+
typedef internal::Internals I;
|
4284
|
+
O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
|
4285
|
+
if (!I::HasHeapObjectTag(obj)) return false;
|
4286
|
+
if (I::GetInstanceType(obj) != I::kOddballType) return false;
|
4287
|
+
return (I::GetOddballKind(obj) == I::kNullOddballKind);
|
4288
|
+
}
|
4289
|
+
|
4290
|
+
|
4009
4291
|
bool Value::IsString() const {
|
4010
4292
|
#ifdef V8_ENABLE_CHECKS
|
4011
4293
|
return FullIsString();
|
@@ -4047,6 +4329,30 @@ Date* Date::Cast(v8::Value* value) {
|
|
4047
4329
|
}
|
4048
4330
|
|
4049
4331
|
|
4332
|
+
StringObject* StringObject::Cast(v8::Value* value) {
|
4333
|
+
#ifdef V8_ENABLE_CHECKS
|
4334
|
+
CheckCast(value);
|
4335
|
+
#endif
|
4336
|
+
return static_cast<StringObject*>(value);
|
4337
|
+
}
|
4338
|
+
|
4339
|
+
|
4340
|
+
NumberObject* NumberObject::Cast(v8::Value* value) {
|
4341
|
+
#ifdef V8_ENABLE_CHECKS
|
4342
|
+
CheckCast(value);
|
4343
|
+
#endif
|
4344
|
+
return static_cast<NumberObject*>(value);
|
4345
|
+
}
|
4346
|
+
|
4347
|
+
|
4348
|
+
BooleanObject* BooleanObject::Cast(v8::Value* value) {
|
4349
|
+
#ifdef V8_ENABLE_CHECKS
|
4350
|
+
CheckCast(value);
|
4351
|
+
#endif
|
4352
|
+
return static_cast<BooleanObject*>(value);
|
4353
|
+
}
|
4354
|
+
|
4355
|
+
|
4050
4356
|
RegExp* RegExp::Cast(v8::Value* value) {
|
4051
4357
|
#ifdef V8_ENABLE_CHECKS
|
4052
4358
|
CheckCast(value);
|
@@ -4087,6 +4393,11 @@ External* External::Cast(v8::Value* value) {
|
|
4087
4393
|
}
|
4088
4394
|
|
4089
4395
|
|
4396
|
+
Isolate* AccessorInfo::GetIsolate() const {
|
4397
|
+
return *reinterpret_cast<Isolate**>(&args_[-3]);
|
4398
|
+
}
|
4399
|
+
|
4400
|
+
|
4090
4401
|
Local<Value> AccessorInfo::Data() const {
|
4091
4402
|
return Local<Value>(reinterpret_cast<Value*>(&args_[-2]));
|
4092
4403
|
}
|
@@ -4102,6 +4413,54 @@ Local<Object> AccessorInfo::Holder() const {
|
|
4102
4413
|
}
|
4103
4414
|
|
4104
4415
|
|
4416
|
+
Handle<Primitive> Undefined(Isolate* isolate) {
|
4417
|
+
typedef internal::Object* S;
|
4418
|
+
typedef internal::Internals I;
|
4419
|
+
if (!I::IsInitialized(isolate)) return Undefined();
|
4420
|
+
S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex);
|
4421
|
+
return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
|
4422
|
+
}
|
4423
|
+
|
4424
|
+
|
4425
|
+
Handle<Primitive> Null(Isolate* isolate) {
|
4426
|
+
typedef internal::Object* S;
|
4427
|
+
typedef internal::Internals I;
|
4428
|
+
if (!I::IsInitialized(isolate)) return Null();
|
4429
|
+
S* slot = I::GetRoot(isolate, I::kNullValueRootIndex);
|
4430
|
+
return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
|
4431
|
+
}
|
4432
|
+
|
4433
|
+
|
4434
|
+
Handle<Boolean> True(Isolate* isolate) {
|
4435
|
+
typedef internal::Object* S;
|
4436
|
+
typedef internal::Internals I;
|
4437
|
+
if (!I::IsInitialized(isolate)) return True();
|
4438
|
+
S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex);
|
4439
|
+
return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
|
4440
|
+
}
|
4441
|
+
|
4442
|
+
|
4443
|
+
Handle<Boolean> False(Isolate* isolate) {
|
4444
|
+
typedef internal::Object* S;
|
4445
|
+
typedef internal::Internals I;
|
4446
|
+
if (!I::IsInitialized(isolate)) return False();
|
4447
|
+
S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex);
|
4448
|
+
return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
|
4449
|
+
}
|
4450
|
+
|
4451
|
+
|
4452
|
+
void Isolate::SetData(void* data) {
|
4453
|
+
typedef internal::Internals I;
|
4454
|
+
I::SetEmbedderData(this, data);
|
4455
|
+
}
|
4456
|
+
|
4457
|
+
|
4458
|
+
void* Isolate::GetData() {
|
4459
|
+
typedef internal::Internals I;
|
4460
|
+
return I::GetEmbedderData(this);
|
4461
|
+
}
|
4462
|
+
|
4463
|
+
|
4105
4464
|
/**
|
4106
4465
|
* \example shell.cc
|
4107
4466
|
* A simple shell that takes a list of expressions on the
|