The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / include / v8.h @ 40c0f755

History | View | Annotate | Download (75.9 KB)

1
// Copyright 2007-2008 the V8 project authors. All rights reserved.
2
// Redistribution and use in source and binary forms, with or without
3
// modification, are permitted provided that the following conditions are
4
// met:
5
//
6
//     * Redistributions of source code must retain the above copyright
7
//       notice, this list of conditions and the following disclaimer.
8
//     * Redistributions in binary form must reproduce the above
9
//       copyright notice, this list of conditions and the following
10
//       disclaimer in the documentation and/or other materials provided
11
//       with the distribution.
12
//     * Neither the name of Google Inc. nor the names of its
13
//       contributors may be used to endorse or promote products derived
14
//       from this software without specific prior written permission.
15
//
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27

    
28
/** \mainpage V8 API Reference Guide
29
 *
30
 * V8 is Google's open source JavaScript engine.
31
 *
32
 * This set of documents provides reference material generated from the
33
 * V8 header file, include/v8.h.
34
 *
35
 * For other documentation see http://code.google.com/apis/v8/
36
 */
37

    
38
#ifndef V8_H_
39
#define V8_H_
40

    
41
#include <stdio.h>
42

    
43
#ifdef _WIN32
44
typedef int int32_t;
45
typedef unsigned int uint32_t;
46
typedef unsigned short uint16_t;  // NOLINT
47
typedef long long int64_t;  // NOLINT
48

    
49
// Setup for Windows DLL export/import. When building the V8 DLL the
50
// BUILDING_V8_SHARED needs to be defined. When building a program which uses
51
// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
52
// static library or building a program which uses the V8 static library neither
53
// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
54
// The reason for having both V8EXPORT and V8EXPORT_INLINE is that classes which
55
// have their code inside this header file need to have __declspec(dllexport)
56
// when building the DLL but cannot have __declspec(dllimport) when building
57
// a program which uses the DLL.
58
#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
59
#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
60
  build configuration to ensure that at most one of these is set
61
#endif
62

    
63
#ifdef BUILDING_V8_SHARED
64
#define V8EXPORT __declspec(dllexport)
65
#define V8EXPORT_INLINE __declspec(dllexport)
66
#elif USING_V8_SHARED
67
#define V8EXPORT __declspec(dllimport)
68
#define V8EXPORT_INLINE
69
#else
70
#define V8EXPORT
71
#define V8EXPORT_INLINE
72
#endif  // BUILDING_V8_SHARED
73

    
74
#else  // _WIN32
75

    
76
#include <stdint.h>
77

    
78
// Setup for Linux shared library export. There is no need to destinguish
79
// neither between building or using the V8 shared library nor between using
80
// the shared or static V8 library as there is on Windows. Therefore there is
81
// no checking of BUILDING_V8_SHARED and USING_V8_SHARED.
82
#if defined(__GNUC__) && (__GNUC__ >= 4)
83
#define V8EXPORT __attribute__ ((visibility("default")))
84
#define V8EXPORT_INLINE __attribute__ ((visibility("default")))
85
#else  // defined(__GNUC__) && (__GNUC__ >= 4)
86
#define V8EXPORT
87
#define V8EXPORT_INLINE
88
#endif  // defined(__GNUC__) && (__GNUC__ >= 4)
89

    
90
#endif  // _WIN32
91

    
92
/**
93
 * The v8 JavaScript engine.
94
 */
95
namespace v8 {
96

    
97
class Context;
98
class String;
99
class Value;
100
class Utils;
101
class Number;
102
class Object;
103
class Array;
104
class Int32;
105
class Uint32;
106
class External;
107
class Primitive;
108
class Boolean;
109
class Integer;
110
class Function;
111
class Date;
112
class ImplementationUtilities;
113
class Signature;
114
template <class T> class Handle;
115
template <class T> class Local;
116
template <class T> class Persistent;
117
class FunctionTemplate;
118
class ObjectTemplate;
119
class Data;
120

    
121

    
122
// --- W e a k  H a n d l e s
123

    
124

    
125
/**
126
 * A weak reference callback function.
127
 *
128
 * \param object the weak global object to be reclaimed by the garbage collector
129
 * \param parameter the value passed in when making the weak global object
130
 */
131
typedef void (*WeakReferenceCallback)(Persistent<Value> object,
132
                                      void* parameter);
133

    
134

    
135
// --- H a n d l e s ---
136

    
137
#define TYPE_CHECK(T, S)                              \
138
  while (false) {                                     \
139
    *(static_cast<T**>(0)) = static_cast<S*>(0);      \
140
  }
141

    
142
/**
143
 * An object reference managed by the v8 garbage collector.
144
 *
145
 * All objects returned from v8 have to be tracked by the garbage
146
 * collector so that it knows that the objects are still alive.  Also,
147
 * because the garbage collector may move objects, it is unsafe to
148
 * point directly to an object.  Instead, all objects are stored in
149
 * handles which are known by the garbage collector and updated
150
 * whenever an object moves.  Handles should always be passed by value
151
 * (except in cases like out-parameters) and they should never be
152
 * allocated on the heap.
153
 *
154
 * There are two types of handles: local and persistent handles.
155
 * Local handles are light-weight and transient and typically used in
156
 * local operations.  They are managed by HandleScopes.  Persistent
157
 * handles can be used when storing objects across several independent
158
 * operations and have to be explicitly deallocated when they're no
159
 * longer used.
160
 *
161
 * It is safe to extract the object stored in the handle by
162
 * dereferencing the handle (for instance, to extract the Object* from
163
 * an Handle<Object>); the value will still be governed by a handle
164
 * behind the scenes and the same rules apply to these values as to
165
 * their handles.
166
 */
167
template <class T> class V8EXPORT_INLINE Handle {
168
 public:
169

    
170
  /**
171
   * Creates an empty handle.
172
   */
173
  Handle();
174

    
175
  /**
176
   * Creates a new handle for the specified value.
177
   */
178
  explicit Handle(T* val) : val_(val) { }
179

    
180
  /**
181
   * Creates a handle for the contents of the specified handle.  This
182
   * constructor allows you to pass handles as arguments by value and
183
   * to assign between handles.  However, if you try to assign between
184
   * incompatible handles, for instance from a Handle<String> to a
185
   * Handle<Number> it will cause a compiletime error.  Assigning
186
   * between compatible handles, for instance assigning a
187
   * Handle<String> to a variable declared as Handle<Value>, is legal
188
   * because String is a subclass of Value.
189
   */
190
  template <class S> inline Handle(Handle<S> that)
191
      : val_(reinterpret_cast<T*>(*that)) {
192
    /**
193
     * This check fails when trying to convert between incompatible
194
     * handles. For example, converting from a Handle<String> to a
195
     * Handle<Number>.
196
     */
197
    TYPE_CHECK(T, S);
198
  }
199

    
200
  /**
201
   * Returns true if the handle is empty.
202
   */
203
  bool IsEmpty() const { return val_ == 0; }
204

    
205
  T* operator->() const;
206

    
207
  T* operator*() const;
208

    
209
  /**
210
   * Sets the handle to be empty. IsEmpty() will then return true.
211
   */
212
  void Clear() { this->val_ = 0; }
213

    
214
  /**
215
   * Checks whether two handles are the same.
216
   * Returns true if both are empty, or if the objects
217
   * to which they refer are identical.
218
   * The handles' references are not checked.
219
   */
220
  template <class S> bool operator==(Handle<S> that) const {
221
    void** a = reinterpret_cast<void**>(**this);
222
    void** b = reinterpret_cast<void**>(*that);
223
    if (a == 0) return b == 0;
224
    if (b == 0) return false;
225
    return *a == *b;
226
  }
227

    
228
  /**
229
   * Checks whether two handles are different.
230
   * Returns true if only one of the handles is empty, or if
231
   * the objects to which they refer are different.
232
   * The handles' references are not checked.
233
   */
234
  template <class S> bool operator!=(Handle<S> that) const {
235
    return !operator==(that);
236
  }
237

    
238
  template <class S> static inline Handle<T> Cast(Handle<S> that) {
239
    if (that.IsEmpty()) return Handle<T>();
240
    return Handle<T>(T::Cast(*that));
241
  }
242

    
243
 private:
244
  T* val_;
245
};
246

    
247

    
248
/**
249
 * A light-weight stack-allocated object handle.  All operations
250
 * that return objects from within v8 return them in local handles.  They
251
 * are created within HandleScopes, and all local handles allocated within a
252
 * handle scope are destroyed when the handle scope is destroyed.  Hence it
253
 * is not necessary to explicitly deallocate local handles.
254
 */
255
template <class T> class V8EXPORT_INLINE Local : public Handle<T> {
256
 public:
257
  Local();
258
  template <class S> inline Local(Local<S> that)
259
      : Handle<T>(reinterpret_cast<T*>(*that)) {
260
    /**
261
     * This check fails when trying to convert between incompatible
262
     * handles. For example, converting from a Handle<String> to a
263
     * Handle<Number>.
264
     */
265
    TYPE_CHECK(T, S);
266
  }
267
  template <class S> inline Local(S* that) : Handle<T>(that) { }
268
  template <class S> static inline Local<T> Cast(Local<S> that) {
269
    if (that.IsEmpty()) return Local<T>();
270
    return Local<T>(T::Cast(*that));
271
  }
272

    
273
  /** Create a local handle for the content of another handle.
274
   *  The referee is kept alive by the local handle even when
275
   *  the original handle is destroyed/disposed.
276
   */
277
  static Local<T> New(Handle<T> that);
278
};
279

    
280

    
281
/**
282
 * An object reference that is independent of any handle scope.  Where
283
 * a Local handle only lives as long as the HandleScope in which it was
284
 * allocated, a Persistent handle remains valid until it is explicitly
285
 * disposed.
286
 *
287
 * A persistent handle contains a reference to a storage cell within
288
 * the v8 engine which holds an object value and which is updated by
289
 * the garbage collector whenever the object is moved.  A new storage
290
 * cell can be created using Persistent::New and existing handles can
291
 * be disposed using Persistent::Dispose.  Since persistent handles
292
 * are passed by value you may have many persistent handle objects
293
 * that point to the same storage cell.  For instance, if you pass a
294
 * persistent handle as an argument to a function you will not get two
295
 * different storage cells but rather two references to the same
296
 * storage cell.
297
 */
298
template <class T> class V8EXPORT_INLINE Persistent : public Handle<T> {
299
 public:
300

    
301
  /**
302
   * Creates an empty persistent handle that doesn't point to any
303
   * storage cell.
304
   */
305
  Persistent();
306

    
307
  /**
308
   * Creates a persistent handle for the same storage cell as the
309
   * specified handle.  This constructor allows you to pass persistent
310
   * handles as arguments by value and to assign between persistent
311
   * handles.  However, attempting to assign between incompatible
312
   * persistent handles, for instance from a Persistent<String> to a
313
   * Persistent<Number> will cause a compiletime error.  Assigning
314
   * between compatible persistent handles, for instance assigning a
315
   * Persistent<String> to a variable declared as Persistent<Value>,
316
   * is allowed as String is a subclass of Value.
317
   */
318
  template <class S> inline Persistent(Persistent<S> that)
319
      : Handle<T>(reinterpret_cast<T*>(*that)) {
320
    /**
321
     * This check fails when trying to convert between incompatible
322
     * handles. For example, converting from a Handle<String> to a
323
     * Handle<Number>.
324
     */
325
    TYPE_CHECK(T, S);
326
  }
327

    
328
  template <class S> inline Persistent(S* that) : Handle<T>(that) { }
329

    
330
  /**
331
   * "Casts" a plain handle which is known to be a persistent handle
332
   * to a persistent handle.
333
   */
334
  template <class S> explicit inline Persistent(Handle<S> that)
335
      : Handle<T>(*that) { }
336

    
337
  template <class S> static inline Persistent<T> Cast(Persistent<S> that) {
338
    if (that.IsEmpty()) return Persistent<T>();
339
    return Persistent<T>(T::Cast(*that));
340
  }
341

    
342
  /**
343
   * Creates a new persistent handle for an existing local or
344
   * persistent handle.
345
   */
346
  static Persistent<T> New(Handle<T> that);
347

    
348
  /**
349
   * Releases the storage cell referenced by this persistent handle.
350
   * Does not remove the reference to the cell from any handles.
351
   * This handle's reference, and any any other references to the storage
352
   * cell remain and IsEmpty will still return false.
353
   */
354
  void Dispose();
355

    
356
  /**
357
   * Make the reference to this object weak.  When only weak handles
358
   * refer to the object, the garbage collector will perform a
359
   * callback to the given V8::WeakReferenceCallback function, passing
360
   * it the object reference and the given parameters.
361
   */
362
  void MakeWeak(void* parameters, WeakReferenceCallback callback);
363

    
364
  /** Clears the weak reference to this object.*/
365
  void ClearWeak();
366

    
367
  /**
368
   *Checks if the handle holds the only reference to an object.
369
   */
370
  bool IsNearDeath() const;
371

    
372
  /**
373
   * Returns true if the handle's reference is weak.
374
   */
375
  bool IsWeak() const;
376

    
377
 private:
378
  friend class ImplementationUtilities;
379
  friend class ObjectTemplate;
380
};
381

    
382

    
383
 /**
384
 * A stack-allocated class that governs a number of local handles.
385
 * After a handle scope has been created, all local handles will be
386
 * allocated within that handle scope until either the handle scope is
387
 * deleted or another handle scope is created.  If there is already a
388
 * handle scope and a new one is created, all allocations will take
389
 * place in the new handle scope until it is deleted.  After that,
390
 * new handles will again be allocated in the original handle scope.
391
 *
392
 * After the handle scope of a local handle has been deleted the
393
 * garbage collector will no longer track the object stored in the
394
 * handle and may deallocate it.  The behavior of accessing a handle
395
 * for which the handle scope has been deleted is undefined.
396
 */
397
class V8EXPORT HandleScope {
398
 public:
399
  HandleScope();
400

    
401
  ~HandleScope();
402

    
403
  /**
404
   * Closes the handle scope and returns the value as a handle in the
405
   * previous scope, which is the new current scope after the call.
406
   */
407
  template <class T> Local<T> Close(Handle<T> value);
408

    
409
  /**
410
   * Counts the number of allocated handles.
411
   */
412
  static int NumberOfHandles();
413

    
414
  /**
415
   * Creates a new handle with the given value.
416
   */
417
  static void** CreateHandle(void* value);
418

    
419
 private:
420
  // Make it impossible to create heap-allocated or illegal handle
421
  // scopes by disallowing certain operations.
422
  HandleScope(const HandleScope&);
423
  void operator=(const HandleScope&);
424
  void* operator new(size_t size);
425
  void operator delete(void*, size_t);
426

    
427
  // This Data class is accessible internally through a typedef in the
428
  // ImplementationUtilities class.
429
  class V8EXPORT Data {
430
   public:
431
    int extensions;
432
    void** next;
433
    void** limit;
434
    inline void Initialize() {
435
      extensions = -1;
436
      next = limit = NULL;
437
    }
438
  };
439

    
440
  Data previous_;
441

    
442
  // Allow for the active closing of HandleScopes which allows to pass a handle
443
  // from the HandleScope being closed to the next top most HandleScope.
444
  bool is_closed_;
445
  void** RawClose(void** value);
446

    
447
  friend class ImplementationUtilities;
448
};
449

    
450

    
451
// --- S p e c i a l   o b j e c t s ---
452

    
453

    
454
/**
455
 * The superclass of values and API object templates.
456
 */
457
class V8EXPORT Data {
458
 private:
459
  Data();
460
};
461

    
462

    
463
/**
464
 * Pre-compilation data that can be associated with a script.  This
465
 * data can be calculated for a script in advance of actually
466
 * compiling it, and can be stored between compilations.  When script
467
 * data is given to the compile method compilation will be faster.
468
 */
469
class V8EXPORT ScriptData {  // NOLINT
470
 public:
471
  virtual ~ScriptData() { }
472
  static ScriptData* PreCompile(const char* input, int length);
473
  static ScriptData* New(unsigned* data, int length);
474

    
475
  virtual int Length() = 0;
476
  virtual unsigned* Data() = 0;
477
};
478

    
479

    
480
/**
481
 * The origin, within a file, of a script.
482
 */
483
class V8EXPORT ScriptOrigin {
484
 public:
485
  ScriptOrigin(Handle<Value> resource_name,
486
               Handle<Integer> resource_line_offset = Handle<Integer>(),
487
               Handle<Integer> resource_column_offset = Handle<Integer>())
488
      : resource_name_(resource_name),
489
        resource_line_offset_(resource_line_offset),
490
        resource_column_offset_(resource_column_offset) { }
491
  inline Handle<Value> ResourceName() const;
492
  inline Handle<Integer> ResourceLineOffset() const;
493
  inline Handle<Integer> ResourceColumnOffset() const;
494
 private:
495
  Handle<Value> resource_name_;
496
  Handle<Integer> resource_line_offset_;
497
  Handle<Integer> resource_column_offset_;
498
};
499

    
500

    
501
/**
502
 * A compiled JavaScript script.
503
 */
504
class V8EXPORT Script {
505
 public:
506

    
507
  /**
508
   * Compiles the specified script. The ScriptOrigin* and ScriptData*
509
   * parameters are owned by the caller of Script::Compile. No
510
   * references to these objects are kept after compilation finishes.
511
   */
512
  static Local<Script> Compile(Handle<String> source,
513
                               ScriptOrigin* origin = NULL,
514
                               ScriptData* pre_data = NULL);
515

    
516
  /**
517
   * Compiles the specified script using the specified file name
518
   * object (typically a string) as the script's origin.
519
   */
520
  static Local<Script> Compile(Handle<String> source,
521
                               Handle<Value> file_name);
522

    
523
  /**
524
   * Runs the script returning the resulting value.
525
   */
526
  Local<Value> Run();
527

    
528
  /**
529
   * Returns the script id value.
530
   */
531
  Local<Value> Id();
532
};
533

    
534

    
535
/**
536
 * An error message.
537
 */
538
class V8EXPORT Message {
539
 public:
540
  Local<String> Get() const;
541
  Local<String> GetSourceLine() const;
542

    
543
  Handle<Value> GetScriptResourceName() const;
544

    
545
  /**
546
   * Returns the number, 1-based, of the line where the error occurred.
547
   */
548
  int GetLineNumber() const;
549

    
550
  /**
551
   * Returns the index within the script of the first character where
552
   * the error occurred.
553
   */
554
  int GetStartPosition() const;
555

    
556
  /**
557
   * Returns the index within the script of the last character where
558
   * the error occurred.
559
   */
560
  int GetEndPosition() const;
561

    
562
  /**
563
   * Returns the index within the line of the first character where
564
   * the error occurred.
565
   */
566
  int GetStartColumn() const;
567

    
568
  /**
569
   * Returns the index within the line of the last character where
570
   * the error occurred.
571
   */
572
  int GetEndColumn() const;
573

    
574
  // TODO(1245381): Print to a string instead of on a FILE.
575
  static void PrintCurrentStackTrace(FILE* out);
576
};
577

    
578

    
579
// --- V a l u e ---
580

    
581

    
582
/**
583
 * The superclass of all JavaScript values and objects.
584
 */
585
class V8EXPORT Value : public Data {
586
 public:
587

    
588
  /**
589
   * Returns true if this value is the undefined value.  See ECMA-262
590
   * 4.3.10.
591
   */
592
  bool IsUndefined() const;
593

    
594
  /**
595
   * Returns true if this value is the null value.  See ECMA-262
596
   * 4.3.11.
597
   */
598
  bool IsNull() const;
599

    
600
   /**
601
   * Returns true if this value is true.
602
   */
603
  bool IsTrue() const;
604

    
605
  /**
606
   * Returns true if this value is false.
607
   */
608
  bool IsFalse() const;
609

    
610
  /**
611
   * Returns true if this value is an instance of the String type.
612
   * See ECMA-262 8.4.
613
   */
614
  bool IsString() const;
615

    
616
  /**
617
   * Returns true if this value is a function.
618
   */
619
  bool IsFunction() const;
620

    
621
  /**
622
   * Returns true if this value is an array.
623
   */
624
  bool IsArray() const;
625

    
626
  /**
627
   * Returns true if this value is an object.
628
   */
629
  bool IsObject() const;
630

    
631
  /**
632
   * Returns true if this value is boolean.
633
   */
634
  bool IsBoolean() const;
635

    
636
  /**
637
   * Returns true if this value is a number.
638
   */
639
  bool IsNumber() const;
640

    
641
  /**
642
   * Returns true if this value is external.
643
   */
644
  bool IsExternal() const;
645

    
646
  /**
647
   * Returns true if this value is a 32-bit signed integer.
648
   */
649
  bool IsInt32() const;
650

    
651
  /**
652
   * Returns true if this value is a Date.
653
   */
654
  bool IsDate() const;
655

    
656
  Local<Boolean> ToBoolean() const;
657
  Local<Number> ToNumber() const;
658
  Local<String> ToString() const;
659
  Local<String> ToDetailString() const;
660
  Local<Object> ToObject() const;
661
  Local<Integer> ToInteger() const;
662
  Local<Uint32> ToUint32() const;
663
  Local<Int32> ToInt32() const;
664

    
665
  /**
666
   * Attempts to convert a string to an array index.
667
   * Returns an empty handle if the conversion fails.
668
   */
669
  Local<Uint32> ToArrayIndex() const;
670

    
671
  bool BooleanValue() const;
672
  double NumberValue() const;
673
  int64_t IntegerValue() const;
674
  uint32_t Uint32Value() const;
675
  int32_t Int32Value() const;
676

    
677
  /** JS == */
678
  bool Equals(Handle<Value> that) const;
679
  bool StrictEquals(Handle<Value> that) const;
680
};
681

    
682

    
683
/**
684
 * The superclass of primitive values.  See ECMA-262 4.3.2.
685
 */
686
class V8EXPORT Primitive : public Value { };
687

    
688

    
689
/**
690
 * A primitive boolean value (ECMA-262, 4.3.14).  Either the true
691
 * or false value.
692
 */
693
class V8EXPORT Boolean : public Primitive {
694
 public:
695
  bool Value() const;
696
  static inline Handle<Boolean> New(bool value);
697
};
698

    
699

    
700
/**
701
 * A JavaScript string value (ECMA-262, 4.3.17).
702
 */
703
class V8EXPORT String : public Primitive {
704
 public:
705

    
706
  /**
707
   * Returns the number of characters in this string.
708
   */
709
  int Length() const;
710

    
711
  /**
712
   * Returns the number of bytes in the UTF-8 encoded
713
   * representation of this string.
714
   */
715
  int Utf8Length() const;
716

    
717
  /**
718
   * Write the contents of the string to an external buffer.
719
   * If no arguments are given, expects the buffer to be large
720
   * enough to hold the entire string and NULL terminator. Copies
721
   * the contents of the string and the NULL terminator into the
722
   * buffer.
723
   *
724
   * Copies up to length characters into the output buffer.
725
   * Only null-terminates if there is enough space in the buffer.
726
   *
727
   * \param buffer The buffer into which the string will be copied.
728
   * \param start The starting position within the string at which
729
   * copying begins.
730
   * \param length The number of bytes to copy from the string.
731
   * \return The number of characters copied to the buffer
732
   * excluding the NULL terminator.
733
   */
734
  int Write(uint16_t* buffer, int start = 0, int length = -1) const;  // UTF-16
735
  int WriteAscii(char* buffer, int start = 0, int length = -1) const;  // ASCII
736
  int WriteUtf8(char* buffer, int length = -1) const; // UTF-8
737

    
738
  /**
739
   * A zero length string.
740
   */
741
  static v8::Local<v8::String> Empty();
742

    
743
  /**
744
   * Returns true if the string is external
745
   */
746
  bool IsExternal() const;
747

    
748
  /**
749
   * Returns true if the string is both external and ascii
750
   */
751
  bool IsExternalAscii() const;
752
  /**
753
   * An ExternalStringResource is a wrapper around a two-byte string
754
   * buffer that resides outside V8's heap. Implement an
755
   * ExternalStringResource to manage the life cycle of the underlying
756
   * buffer.  Note that the string data must be immutable.
757
   */
758
  class V8EXPORT ExternalStringResource {  // NOLINT
759
   public:
760
    /**
761
     * Override the destructor to manage the life cycle of the underlying
762
     * buffer.
763
     */
764
    virtual ~ExternalStringResource() {}
765
    /** The string data from the underlying buffer.*/
766
    virtual const uint16_t* data() const = 0;
767
    /** The length of the string. That is, the number of two-byte characters.*/
768
    virtual size_t length() const = 0;
769
   protected:
770
    ExternalStringResource() {}
771
   private:
772
    // Disallow copying and assigning.
773
    ExternalStringResource(const ExternalStringResource&);
774
    void operator=(const ExternalStringResource&);
775
  };
776

    
777
  /**
778
   * An ExternalAsciiStringResource is a wrapper around an ascii
779
   * string buffer that resides outside V8's heap. Implement an
780
   * ExternalAsciiStringResource to manage the life cycle of the
781
   * underlying buffer.  Note that the string data must be immutable
782
   * and that the data must be strict 7-bit ASCII, not Latin1 or
783
   * UTF-8, which would require special treatment internally in the
784
   * engine and, in the case of UTF-8, do not allow efficient indexing.
785
   * Use String::New or convert to 16 bit data for non-ASCII.
786
   */
787

    
788
  class V8EXPORT ExternalAsciiStringResource {  // NOLINT
789
   public:
790
    /**
791
     * Override the destructor to manage the life cycle of the underlying
792
     * buffer.
793
     */
794
    virtual ~ExternalAsciiStringResource() {}
795
    /** The string data from the underlying buffer.*/
796
    virtual const char* data() const = 0;
797
    /** The number of ascii characters in the string.*/
798
    virtual size_t length() const = 0;
799
   protected:
800
    ExternalAsciiStringResource() {}
801
   private:
802
    // Disallow copying and assigning.
803
    ExternalAsciiStringResource(const ExternalAsciiStringResource&);
804
    void operator=(const ExternalAsciiStringResource&);
805
  };
806

    
807
  /**
808
   * Get the ExternalStringResource for an external string.  Only
809
   * valid if IsExternal() returns true.
810
   */
811
  ExternalStringResource* GetExternalStringResource() const;
812

    
813
  /**
814
   * Get the ExternalAsciiStringResource for an external ascii string.
815
   * Only valid if IsExternalAscii() returns true.
816
   */
817
  ExternalAsciiStringResource* GetExternalAsciiStringResource() const;
818

    
819
  static String* Cast(v8::Value* obj);
820

    
821
  /**
822
   * Allocates a new string from either utf-8 encoded or ascii data.
823
   * The second parameter 'length' gives the buffer length.
824
   * If the data is utf-8 encoded, the caller must
825
   * be careful to supply the length parameter.
826
   * If it is not given, the function calls
827
   * 'strlen' to determine the buffer length, it might be
828
   * wrong if 'data' contains a null character.
829
   */
830
  static Local<String> New(const char* data, int length = -1);
831

    
832
  /** Allocates a new string from utf16 data.*/
833
  static Local<String> New(const uint16_t* data, int length = -1);
834

    
835
  /** Creates a symbol. Returns one if it exists already.*/
836
  static Local<String> NewSymbol(const char* data, int length = -1);
837

    
838
  /**
839
   * Creates a new external string using the data defined in the given
840
   * resource. The resource is deleted when the external string is no
841
   * longer live on V8's heap. The caller of this function should not
842
   * delete or modify the resource. Neither should the underlying buffer be
843
   * deallocated or modified except through the destructor of the
844
   * external string resource.
845
   */
846
  static Local<String> NewExternal(ExternalStringResource* resource);
847

    
848
  /**
849
   * Associate an external string resource with this string by transforming it
850
   * in place so that existing references to this string in the JavaScript heap
851
   * will use the external string resource. The external string resource's
852
   * character contents needs to be equivalent to this string.
853
   * Returns true if the string has been changed to be an external string.
854
   * The string is not modified if the operation fails.
855
   */
856
  bool MakeExternal(ExternalStringResource* resource);
857

    
858
  /**
859
   * Creates a new external string using the ascii data defined in the given
860
   * resource. The resource is deleted when the external string is no
861
   * longer live on V8's heap. The caller of this function should not
862
   * delete or modify the resource. Neither should the underlying buffer be
863
   * deallocated or modified except through the destructor of the
864
   * external string resource.
865
   */
866
  static Local<String> NewExternal(ExternalAsciiStringResource* resource);
867

    
868
  /**
869
   * Associate an external string resource with this string by transforming it
870
   * in place so that existing references to this string in the JavaScript heap
871
   * will use the external string resource. The external string resource's
872
   * character contents needs to be equivalent to this string.
873
   * Returns true if the string has been changed to be an external string.
874
   * The string is not modified if the operation fails.
875
   */
876
  bool MakeExternal(ExternalAsciiStringResource* resource);
877

    
878
  /** Creates an undetectable string from the supplied ascii or utf-8 data.*/
879
  static Local<String> NewUndetectable(const char* data, int length = -1);
880

    
881
  /** Creates an undetectable string from the supplied utf-16 data.*/
882
  static Local<String> NewUndetectable(const uint16_t* data, int length = -1);
883

    
884
  /**
885
   * Converts an object to a utf8-encoded character array.  Useful if
886
   * you want to print the object.  If conversion to a string fails
887
   * (eg. due to an exception in the toString() method of the object)
888
   * then the length() method returns 0 and the * operator returns
889
   * NULL.
890
   */
891
  class V8EXPORT Utf8Value {
892
   public:
893
    explicit Utf8Value(Handle<v8::Value> obj);
894
    ~Utf8Value();
895
    char* operator*() const { return str_; }
896
    int length() { return length_; }
897
   private:
898
    char* str_;
899
    int length_;
900

    
901
    // Disallow copying and assigning.
902
    Utf8Value(const Utf8Value&);
903
    void operator=(const Utf8Value&);
904
  };
905

    
906
  /**
907
   * Converts an object to an ascii string.
908
   * Useful if you want to print the object.
909
   * If conversion to a string fails (eg. due to an exception in the toString()
910
   * method of the object) then the length() method returns 0 and the * operator
911
   * returns NULL.
912
   */
913
  class V8EXPORT AsciiValue {
914
   public:
915
    explicit AsciiValue(Handle<v8::Value> obj);
916
    ~AsciiValue();
917
    char* operator*() const { return str_; }
918
    int length() { return length_; }
919
   private:
920
    char* str_;
921
    int length_;
922

    
923
    // Disallow copying and assigning.
924
    AsciiValue(const AsciiValue&);
925
    void operator=(const AsciiValue&);
926
  };
927

    
928
  /**
929
   * Converts an object to a two-byte string.
930
   * If conversion to a string fails (eg. due to an exception in the toString()
931
   * method of the object) then the length() method returns 0 and the * operator
932
   * returns NULL.
933
   */
934
  class V8EXPORT Value {
935
   public:
936
    explicit Value(Handle<v8::Value> obj);
937
    ~Value();
938
    uint16_t* operator*() const { return str_; }
939
    int length() { return length_; }
940
   private:
941
    uint16_t* str_;
942
    int length_;
943

    
944
    // Disallow copying and assigning.
945
    Value(const Value&);
946
    void operator=(const Value&);
947
  };
948
};
949

    
950

    
951
/**
952
 * A JavaScript number value (ECMA-262, 4.3.20)
953
 */
954
class V8EXPORT Number : public Primitive {
955
 public:
956
  double Value() const;
957
  static Local<Number> New(double value);
958
  static Number* Cast(v8::Value* obj);
959
 private:
960
  Number();
961
};
962

    
963

    
964
/**
965
 * A JavaScript value representing a signed integer.
966
 */
967
class V8EXPORT Integer : public Number {
968
 public:
969
  static Local<Integer> New(int32_t value);
970
  int64_t Value() const;
971
  static Integer* Cast(v8::Value* obj);
972
 private:
973
  Integer();
974
};
975

    
976

    
977
/**
978
 * A JavaScript value representing a 32-bit signed integer.
979
 */
980
class V8EXPORT Int32 : public Integer {
981
 public:
982
  int32_t Value() const;
983
 private:
984
  Int32();
985
};
986

    
987

    
988
/**
989
 * A JavaScript value representing a 32-bit unsigned integer.
990
 */
991
class V8EXPORT Uint32 : public Integer {
992
 public:
993
  uint32_t Value() const;
994
 private:
995
  Uint32();
996
};
997

    
998

    
999
/**
1000
 * An instance of the built-in Date constructor (ECMA-262, 15.9).
1001
 */
1002
class V8EXPORT Date : public Value {
1003
 public:
1004
  static Local<Value> New(double time);
1005

    
1006
  /**
1007
   * A specialization of Value::NumberValue that is more efficient
1008
   * because we know the structure of this object.
1009
   */
1010
  double NumberValue() const;
1011

    
1012
  static Date* Cast(v8::Value* obj);
1013
};
1014

    
1015

    
1016
enum PropertyAttribute {
1017
  None       = 0,
1018
  ReadOnly   = 1 << 0,
1019
  DontEnum   = 1 << 1,
1020
  DontDelete = 1 << 2
1021
};
1022

    
1023
/**
1024
 * A JavaScript object (ECMA-262, 4.3.3)
1025
 */
1026
class V8EXPORT Object : public Value {
1027
 public:
1028
  bool Set(Handle<Value> key,
1029
           Handle<Value> value,
1030
           PropertyAttribute attribs = None);
1031
  Local<Value> Get(Handle<Value> key);
1032

    
1033
  // TODO(1245389): Replace the type-specific versions of these
1034
  // functions with generic ones that accept a Handle<Value> key.
1035
  bool Has(Handle<String> key);
1036
  bool Delete(Handle<String> key);
1037
  bool Has(uint32_t index);
1038
  bool Delete(uint32_t index);
1039

    
1040
  /**
1041
   * Returns an array containing the names of the enumerable properties
1042
   * of this object, including properties from prototype objects.  The
1043
   * array returned by this method contains the same values as would
1044
   * be enumerated by a for-in statement over this object.
1045
   */
1046
  Local<Array> GetPropertyNames();
1047

    
1048
  /**
1049
   * Get the prototype object.  This does not skip objects marked to
1050
   * be skipped by __proto__ and it does not consult the security
1051
   * handler.
1052
   */
1053
  Local<Value> GetPrototype();
1054

    
1055
  /**
1056
   * Call builtin Object.prototype.toString on this object.
1057
   * This is different from Value::ToString() that may call
1058
   * user-defined toString function. This one does not.
1059
   */
1060
  Local<String> ObjectProtoToString();
1061

    
1062
  /** Gets the number of internal fields for this Object. */
1063
  int InternalFieldCount();
1064
  /** Gets the value in an internal field. */
1065
  Local<Value> GetInternalField(int index);
1066
  /** Sets the value in an internal field. */
1067
  void SetInternalField(int index, Handle<Value> value);
1068

    
1069
  // Testers for local properties.
1070
  bool HasRealNamedProperty(Handle<String> key);
1071
  bool HasRealIndexedProperty(uint32_t index);
1072
  bool HasRealNamedCallbackProperty(Handle<String> key);
1073

    
1074
  /**
1075
   * If result.IsEmpty() no real property was located in the prototype chain.
1076
   * This means interceptors in the prototype chain are not called.
1077
   */
1078
  Handle<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key);
1079

    
1080
  /** Tests for a named lookup interceptor.*/
1081
  bool HasNamedLookupInterceptor();
1082

    
1083
  /** Tests for an index lookup interceptor.*/
1084
  bool HasIndexedLookupInterceptor();
1085

    
1086
  /**
1087
   * Turns on access check on the object if the object is an instance of
1088
   * a template that has access check callbacks. If an object has no
1089
   * access check info, the object cannot be accessed by anyone.
1090
   */
1091
  void TurnOnAccessCheck();
1092

    
1093
  /**
1094
   * Returns the identity hash for this object. The current implemenation uses
1095
   * a hidden property on the object to store the identity hash.
1096
   */
1097
  int GetIdentityHash();
1098

    
1099
  /**
1100
   * Access hidden properties on JavaScript objects. These properties are
1101
   * hidden from the executing JavaScript and only accessible through the V8
1102
   * C++ API. Hidden properties introduced by V8 internally (for example the
1103
   * identity hash) are prefixed with "v8::".
1104
   */
1105
  bool SetHiddenValue(Handle<String> key, Handle<Value> value);
1106
  Local<Value> GetHiddenValue(Handle<String> key);
1107
  bool DeleteHiddenValue(Handle<String> key);
1108

    
1109
  /**
1110
   * Clone this object with a fast but shallow copy.  Values will point
1111
   * to the same values as the original object.
1112
   */
1113
  Local<Object> Clone();
1114

    
1115
  static Local<Object> New();
1116
  static Object* Cast(Value* obj);
1117
 private:
1118
  Object();
1119
};
1120

    
1121

    
1122
/**
1123
 * An instance of the built-in array constructor (ECMA-262, 15.4.2).
1124
 */
1125
class V8EXPORT Array : public Object {
1126
 public:
1127
  uint32_t Length() const;
1128

    
1129
  static Local<Array> New(int length = 0);
1130
  static Array* Cast(Value* obj);
1131
 private:
1132
  Array();
1133
};
1134

    
1135

    
1136
/**
1137
 * A JavaScript function object (ECMA-262, 15.3).
1138
 */
1139
class V8EXPORT Function : public Object {
1140
 public:
1141
  Local<Object> NewInstance() const;
1142
  Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
1143
  Local<Value> Call(Handle<Object> recv, int argc, Handle<Value> argv[]);
1144
  void SetName(Handle<String> name);
1145
  Handle<Value> GetName() const;
1146
  static Function* Cast(Value* obj);
1147
 private:
1148
  Function();
1149
};
1150

    
1151

    
1152
/**
1153
 * A JavaScript value that wraps a C++ void*.  This type of value is
1154
 * mainly used to associate C++ data structures with JavaScript
1155
 * objects.
1156
 *
1157
 * The Wrap function V8 will return the most optimal Value object wrapping the
1158
 * C++ void*. The type of the value is not guaranteed to be an External object
1159
 * and no assumptions about its type should be made. To access the wrapped
1160
 * value Unwrap should be used, all other operations on that object will lead
1161
 * to unpredictable results.
1162
 */
1163
class V8EXPORT External : public Value {
1164
 public:
1165
  static Local<Value> Wrap(void* data);
1166
  static void* Unwrap(Handle<Value> obj);
1167

    
1168
  static Local<External> New(void* value);
1169
  static External* Cast(Value* obj);
1170
  void* Value() const;
1171
 private:
1172
  External();
1173
};
1174

    
1175

    
1176
// --- T e m p l a t e s ---
1177

    
1178

    
1179
/**
1180
 * The superclass of object and function templates.
1181
 */
1182
class V8EXPORT Template : public Data {
1183
 public:
1184
  /** Adds a property to each instance created by this template.*/
1185
  void Set(Handle<String> name, Handle<Data> value,
1186
           PropertyAttribute attributes = None);
1187
  inline void Set(const char* name, Handle<Data> value);
1188
 private:
1189
  Template();
1190

    
1191
  friend class ObjectTemplate;
1192
  friend class FunctionTemplate;
1193
};
1194

    
1195

    
1196
/**
1197
 * The argument information given to function call callbacks.  This
1198
 * class provides access to information about the context of the call,
1199
 * including the receiver, the number and values of arguments, and
1200
 * the holder of the function.
1201
 */
1202
class V8EXPORT Arguments {
1203
 public:
1204
  inline int Length() const;
1205
  inline Local<Value> operator[](int i) const;
1206
  inline Local<Function> Callee() const;
1207
  inline Local<Object> This() const;
1208
  inline Local<Object> Holder() const;
1209
  inline bool IsConstructCall() const;
1210
  inline Local<Value> Data() const;
1211
 private:
1212
  Arguments();
1213
  friend class ImplementationUtilities;
1214
  inline Arguments(Local<Value> data,
1215
                   Local<Object> holder,
1216
                   Local<Function> callee,
1217
                   bool is_construct_call,
1218
                   void** values, int length);
1219
  Local<Value> data_;
1220
  Local<Object> holder_;
1221
  Local<Function> callee_;
1222
  bool is_construct_call_;
1223
  void** values_;
1224
  int length_;
1225
};
1226

    
1227

    
1228
/**
1229
 * The information passed to an accessor callback about the context
1230
 * of the property access.
1231
 */
1232
class V8EXPORT AccessorInfo {
1233
 public:
1234
  inline AccessorInfo(Local<Object> self,
1235
                      Local<Value> data,
1236
                      Local<Object> holder)
1237
      : self_(self), data_(data), holder_(holder) { }
1238
  inline Local<Value> Data() const;
1239
  inline Local<Object> This() const;
1240
  inline Local<Object> Holder() const;
1241
 private:
1242
  Local<Object> self_;
1243
  Local<Value> data_;
1244
  Local<Object> holder_;
1245
};
1246

    
1247

    
1248
typedef Handle<Value> (*InvocationCallback)(const Arguments& args);
1249

    
1250
typedef int (*LookupCallback)(Local<Object> self, Local<String> name);
1251

    
1252
/**
1253
 * Accessor[Getter|Setter] are used as callback functions when
1254
 * setting|getting a particular property. See objectTemplate::SetAccessor.
1255
 */
1256
typedef Handle<Value> (*AccessorGetter)(Local<String> property,
1257
                                        const AccessorInfo& info);
1258

    
1259

    
1260
typedef void (*AccessorSetter)(Local<String> property,
1261
                               Local<Value> value,
1262
                               const AccessorInfo& info);
1263

    
1264

    
1265
/**
1266
 * NamedProperty[Getter|Setter] are used as interceptors on object.
1267
 * See ObjectTemplate::SetNamedPropertyHandler.
1268
 */
1269
typedef Handle<Value> (*NamedPropertyGetter)(Local<String> property,
1270
                                             const AccessorInfo& info);
1271

    
1272

    
1273
/**
1274
 * Returns the value if the setter intercepts the request.
1275
 * Otherwise, returns an empty handle.
1276
 */
1277
typedef Handle<Value> (*NamedPropertySetter)(Local<String> property,
1278
                                             Local<Value> value,
1279
                                             const AccessorInfo& info);
1280

    
1281

    
1282
/**
1283
 * Returns a non-empty handle if the interceptor intercepts the request.
1284
 * The result is true if the property exists and false otherwise.
1285
 */
1286
typedef Handle<Boolean> (*NamedPropertyQuery)(Local<String> property,
1287
                                              const AccessorInfo& info);
1288

    
1289

    
1290
/**
1291
 * Returns a non-empty handle if the deleter intercepts the request.
1292
 * The return value is true if the property could be deleted and false
1293
 * otherwise.
1294
 */
1295
typedef Handle<Boolean> (*NamedPropertyDeleter)(Local<String> property,
1296
                                                const AccessorInfo& info);
1297

    
1298
/**
1299
 * Returns an array containing the names of the properties the named
1300
 * property getter intercepts.
1301
 */
1302
typedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info);
1303

    
1304

    
1305
/**
1306
 * Returns the value of the property if the getter intercepts the
1307
 * request.  Otherwise, returns an empty handle.
1308
 */
1309
typedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index,
1310
                                               const AccessorInfo& info);
1311

    
1312

    
1313
/**
1314
 * Returns the value if the setter intercepts the request.
1315
 * Otherwise, returns an empty handle.
1316
 */
1317
typedef Handle<Value> (*IndexedPropertySetter)(uint32_t index,
1318
                                               Local<Value> value,
1319
                                               const AccessorInfo& info);
1320

    
1321

    
1322
/**
1323
 * Returns a non-empty handle if the interceptor intercepts the request.
1324
 * The result is true if the property exists and false otherwise.
1325
 */
1326
typedef Handle<Boolean> (*IndexedPropertyQuery)(uint32_t index,
1327
                                                const AccessorInfo& info);
1328

    
1329
/**
1330
 * Returns a non-empty handle if the deleter intercepts the request.
1331
 * The return value is true if the property could be deleted and false
1332
 * otherwise.
1333
 */
1334
typedef Handle<Boolean> (*IndexedPropertyDeleter)(uint32_t index,
1335
                                                  const AccessorInfo& info);
1336

    
1337
/**
1338
 * Returns an array containing the indices of the properties the
1339
 * indexed property getter intercepts.
1340
 */
1341
typedef Handle<Array> (*IndexedPropertyEnumerator)(const AccessorInfo& info);
1342

    
1343

    
1344
/**
1345
 * Access control specifications.
1346
 *
1347
 * Some accessors should be accessible across contexts.  These
1348
 * accessors have an explicit access control parameter which specifies
1349
 * the kind of cross-context access that should be allowed.
1350
 *
1351
 * Additionally, for security, accessors can prohibit overwriting by
1352
 * accessors defined in JavaScript.  For objects that have such
1353
 * accessors either locally or in their prototype chain it is not
1354
 * possible to overwrite the accessor by using __defineGetter__ or
1355
 * __defineSetter__ from JavaScript code.
1356
 */
1357
enum AccessControl {
1358
  DEFAULT               = 0,
1359
  ALL_CAN_READ          = 1,
1360
  ALL_CAN_WRITE         = 1 << 1,
1361
  PROHIBITS_OVERWRITING = 1 << 2
1362
};
1363

    
1364

    
1365
/**
1366
 * Access type specification.
1367
 */
1368
enum AccessType {
1369
  ACCESS_GET,
1370
  ACCESS_SET,
1371
  ACCESS_HAS,
1372
  ACCESS_DELETE,
1373
  ACCESS_KEYS
1374
};
1375

    
1376

    
1377
/**
1378
 * Returns true if cross-context access should be allowed to the named
1379
 * property with the given key on the global object.
1380
 */
1381
typedef bool (*NamedSecurityCallback)(Local<Object> global,
1382
                                      Local<Value> key,
1383
                                      AccessType type,
1384
                                      Local<Value> data);
1385

    
1386

    
1387
/**
1388
 * Returns true if cross-context access should be allowed to the indexed
1389
 * property with the given index on the global object.
1390
 */
1391
typedef bool (*IndexedSecurityCallback)(Local<Object> global,
1392
                                        uint32_t index,
1393
                                        AccessType type,
1394
                                        Local<Value> data);
1395

    
1396

    
1397
/**
1398
 * A FunctionTemplate is used to create functions at runtime. There
1399
 * can only be one function created from a FunctionTemplate in a
1400
 * context.
1401
 *
1402
 * A FunctionTemplate can have properties, these properties are added to the
1403
 * function object when it is created.
1404
 *
1405
 * A FunctionTemplate has a corresponding instance template which is
1406
 * used to create object instances when the function is used as a
1407
 * constructor. Properties added to the instance template are added to
1408
 * each object instance.
1409
 *
1410
 * A FunctionTemplate can have a prototype template. The prototype template
1411
 * is used to create the prototype object of the function.
1412
 *
1413
 * The following example shows how to use a FunctionTemplate:
1414
 *
1415
 * \code
1416
 *    v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
1417
 *    t->Set("func_property", v8::Number::New(1));
1418
 *
1419
 *    v8::Local<v8::Template> proto_t = t->PrototypeTemplate();
1420
 *    proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback));
1421
 *    proto_t->Set("proto_const", v8::Number::New(2));
1422
 *
1423
 *    v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate();
1424
 *    instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback);
1425
 *    instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...);
1426
 *    instance_t->Set("instance_property", Number::New(3));
1427
 *
1428
 *    v8::Local<v8::Function> function = t->GetFunction();
1429
 *    v8::Local<v8::Object> instance = function->NewInstance();
1430
 * \endcode
1431
 *
1432
 * Let's use "function" as the JS variable name of the function object
1433
 * and "instance" for the instance object created above.  The function
1434
 * and the instance will have the following properties:
1435
 *
1436
 * \code
1437
 *   func_property in function == true;
1438
 *   function.func_property == 1;
1439
 *
1440
 *   function.prototype.proto_method() invokes 'InvokeCallback'
1441
 *   function.prototype.proto_const == 2;
1442
 *
1443
 *   instance instanceof function == true;
1444
 *   instance.instance_accessor calls 'InstanceAccessorCallback'
1445
 *   instance.instance_property == 3;
1446
 * \endcode
1447
 *
1448
 * A FunctionTemplate can inherit from another one by calling the
1449
 * FunctionTemplate::Inherit method.  The following graph illustrates
1450
 * the semantics of inheritance:
1451
 *
1452
 * \code
1453
 *   FunctionTemplate Parent  -> Parent() . prototype -> { }
1454
 *     ^                                                  ^
1455
 *     | Inherit(Parent)                                  | .__proto__
1456
 *     |                                                  |
1457
 *   FunctionTemplate Child   -> Child()  . prototype -> { }
1458
 * \endcode
1459
 *
1460
 * A FunctionTemplate 'Child' inherits from 'Parent', the prototype
1461
 * object of the Child() function has __proto__ pointing to the
1462
 * Parent() function's prototype object. An instance of the Child
1463
 * function has all properties on Parent's instance templates.
1464
 *
1465
 * Let Parent be the FunctionTemplate initialized in the previous
1466
 * section and create a Child FunctionTemplate by:
1467
 *
1468
 * \code
1469
 *   Local<FunctionTemplate> parent = t;
1470
 *   Local<FunctionTemplate> child = FunctionTemplate::New();
1471
 *   child->Inherit(parent);
1472
 *
1473
 *   Local<Function> child_function = child->GetFunction();
1474
 *   Local<Object> child_instance = child_function->NewInstance();
1475
 * \endcode
1476
 *
1477
 * The Child function and Child instance will have the following
1478
 * properties:
1479
 *
1480
 * \code
1481
 *   child_func.prototype.__proto__ == function.prototype;
1482
 *   child_instance.instance_accessor calls 'InstanceAccessorCallback'
1483
 *   child_instance.instance_property == 3;
1484
 * \endcode
1485
 */
1486
class V8EXPORT FunctionTemplate : public Template {
1487
 public:
1488
  /** Creates a function template.*/
1489
  static Local<FunctionTemplate> New(
1490
      InvocationCallback callback = 0,
1491
      Handle<Value> data = Handle<Value>(),
1492
      Handle<Signature> signature = Handle<Signature>());
1493
  /** Returns the unique function instance in the current execution context.*/
1494
  Local<Function> GetFunction();
1495

    
1496
  /**
1497
   * Set the call-handler callback for a FunctionTemplate.  This
1498
   * callback is called whenever the function created from this
1499
   * FunctionTemplate is called.
1500
   */
1501
  void SetCallHandler(InvocationCallback callback,
1502
                      Handle<Value> data = Handle<Value>());
1503

    
1504
  /** Get the InstanceTemplate. */
1505
  Local<ObjectTemplate> InstanceTemplate();
1506

    
1507
  /** Causes the function template to inherit from a parent function template.*/
1508
  void Inherit(Handle<FunctionTemplate> parent);
1509

    
1510
  /**
1511
   * A PrototypeTemplate is the template used to create the prototype object
1512
   * of the function created by this template.
1513
   */
1514
  Local<ObjectTemplate> PrototypeTemplate();
1515

    
1516

    
1517
  /**
1518
   * Set the class name of the FunctionTemplate.  This is used for
1519
   * printing objects created with the function created from the
1520
   * FunctionTemplate as its constructor.
1521
   */
1522
  void SetClassName(Handle<String> name);
1523

    
1524
  /**
1525
   * Determines whether the __proto__ accessor ignores instances of
1526
   * the function template.  If instances of the function template are
1527
   * ignored, __proto__ skips all instances and instead returns the
1528
   * next object in the prototype chain.
1529
   *
1530
   * Call with a value of true to make the __proto__ accessor ignore
1531
   * instances of the function template.  Call with a value of false
1532
   * to make the __proto__ accessor not ignore instances of the
1533
   * function template.  By default, instances of a function template
1534
   * are not ignored.
1535
   */
1536
  void SetHiddenPrototype(bool value);
1537

    
1538
  /**
1539
   * Returns true if the given object is an instance of this function
1540
   * template.
1541
   */
1542
  bool HasInstance(Handle<Value> object);
1543

    
1544
 private:
1545
  FunctionTemplate();
1546
  void AddInstancePropertyAccessor(Handle<String> name,
1547
                                   AccessorGetter getter,
1548
                                   AccessorSetter setter,
1549
                                   Handle<Value> data,
1550
                                   AccessControl settings,
1551
                                   PropertyAttribute attributes);
1552
  void SetNamedInstancePropertyHandler(NamedPropertyGetter getter,
1553
                                       NamedPropertySetter setter,
1554
                                       NamedPropertyQuery query,
1555
                                       NamedPropertyDeleter remover,
1556
                                       NamedPropertyEnumerator enumerator,
1557
                                       Handle<Value> data);
1558
  void SetIndexedInstancePropertyHandler(IndexedPropertyGetter getter,
1559
                                         IndexedPropertySetter setter,
1560
                                         IndexedPropertyQuery query,
1561
                                         IndexedPropertyDeleter remover,
1562
                                         IndexedPropertyEnumerator enumerator,
1563
                                         Handle<Value> data);
1564
  void SetInstanceCallAsFunctionHandler(InvocationCallback callback,
1565
                                        Handle<Value> data);
1566

    
1567
  friend class Context;
1568
  friend class ObjectTemplate;
1569
};
1570

    
1571

    
1572
/**
1573
 * An ObjectTemplate is used to create objects at runtime.
1574
 *
1575
 * Properties added to an ObjectTemplate are added to each object
1576
 * created from the ObjectTemplate.
1577
 */
1578
class V8EXPORT ObjectTemplate : public Template {
1579
 public:
1580
  /** Creates an ObjectTemplate. */
1581
  static Local<ObjectTemplate> New();
1582

    
1583
  /** Creates a new instance of this template.*/
1584
  Local<Object> NewInstance();
1585

    
1586
  /**
1587
   * Sets an accessor on the object template.
1588
   *
1589
   * Whenever the property with the given name is accessed on objects
1590
   * created from this ObjectTemplate the getter and setter callbacks
1591
   * are called instead of getting and setting the property directly
1592
   * on the JavaScript object.
1593
   *
1594
   * \param name The name of the property for which an accessor is added.
1595
   * \param getter The callback to invoke when getting the property.
1596
   * \param setter The callback to invoke when setting the property.
1597
   * \param data A piece of data that will be passed to the getter and setter
1598
   *   callbacks whenever they are invoked.
1599
   * \param settings Access control settings for the accessor. This is a bit
1600
   *   field consisting of one of more of
1601
   *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
1602
   *   The default is to not allow cross-context access.
1603
   *   ALL_CAN_READ means that all cross-context reads are allowed.
1604
   *   ALL_CAN_WRITE means that all cross-context writes are allowed.
1605
   *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
1606
   *   cross-context access.
1607
   * \param attribute The attributes of the property for which an accessor
1608
   *   is added.
1609
   */
1610
  void SetAccessor(Handle<String> name,
1611
                   AccessorGetter getter,
1612
                   AccessorSetter setter = 0,
1613
                   Handle<Value> data = Handle<Value>(),
1614
                   AccessControl settings = DEFAULT,
1615
                   PropertyAttribute attribute = None);
1616

    
1617
  /**
1618
   * Sets a named property handler on the object template.
1619
   *
1620
   * Whenever a named property is accessed on objects created from
1621
   * this object template, the provided callback is invoked instead of
1622
   * accessing the property directly on the JavaScript object.
1623
   *
1624
   * \param getter The callback to invoke when getting a property.
1625
   * \param setter The callback to invoke when setting a property.
1626
   * \param query The callback to invoke to check is an object has a property.
1627
   * \param deleter The callback to invoke when deleting a property.
1628
   * \param enumerator The callback to invoke to enumerate all the named
1629
   *   properties of an object.
1630
   * \param data A piece of data that will be passed to the callbacks
1631
   *   whenever they are invoked.
1632
   */
1633
  void SetNamedPropertyHandler(NamedPropertyGetter getter,
1634
                               NamedPropertySetter setter = 0,
1635
                               NamedPropertyQuery query = 0,
1636
                               NamedPropertyDeleter deleter = 0,
1637
                               NamedPropertyEnumerator enumerator = 0,
1638
                               Handle<Value> data = Handle<Value>());
1639

    
1640
  /**
1641
   * Sets an indexed property handler on the object template.
1642
   *
1643
   * Whenever an indexed property is accessed on objects created from
1644
   * this object template, the provided callback is invoked instead of
1645
   * accessing the property directly on the JavaScript object.
1646
   *
1647
   * \param getter The callback to invoke when getting a property.
1648
   * \param setter The callback to invoke when setting a property.
1649
   * \param query The callback to invoke to check is an object has a property.
1650
   * \param deleter The callback to invoke when deleting a property.
1651
   * \param enumerator The callback to invoke to enumerate all the indexed
1652
   *   properties of an object.
1653
   * \param data A piece of data that will be passed to the callbacks
1654
   *   whenever they are invoked.
1655
   */
1656
  void SetIndexedPropertyHandler(IndexedPropertyGetter getter,
1657
                                 IndexedPropertySetter setter = 0,
1658
                                 IndexedPropertyQuery query = 0,
1659
                                 IndexedPropertyDeleter deleter = 0,
1660
                                 IndexedPropertyEnumerator enumerator = 0,
1661
                                 Handle<Value> data = Handle<Value>());
1662
  /**
1663
   * Sets the callback to be used when calling instances created from
1664
   * this template as a function.  If no callback is set, instances
1665
   * behave like normal JavaScript objects that cannot be called as a
1666
   * function.
1667
   */
1668
  void SetCallAsFunctionHandler(InvocationCallback callback,
1669
                                Handle<Value> data = Handle<Value>());
1670

    
1671
  /**
1672
   * Mark object instances of the template as undetectable.
1673
   *
1674
   * In many ways, undetectable objects behave as though they are not
1675
   * there.  They behave like 'undefined' in conditionals and when
1676
   * printed.  However, properties can be accessed and called as on
1677
   * normal objects.
1678
   */
1679
  void MarkAsUndetectable();
1680

    
1681
  /**
1682
   * Sets access check callbacks on the object template.
1683
   *
1684
   * When accessing properties on instances of this object template,
1685
   * the access check callback will be called to determine whether or
1686
   * not to allow cross-context access to the properties.
1687
   * The last parameter specifies whether access checks are turned
1688
   * on by default on instances. If access checks are off by default,
1689
   * they can be turned on on individual instances by calling
1690
   * Object::TurnOnAccessCheck().
1691
   */
1692
  void SetAccessCheckCallbacks(NamedSecurityCallback named_handler,
1693
                               IndexedSecurityCallback indexed_handler,
1694
                               Handle<Value> data = Handle<Value>(),
1695
                               bool turned_on_by_default = true);
1696

    
1697
  /**
1698
   * Gets the number of internal fields for objects generated from
1699
   * this template.
1700
   */
1701
  int InternalFieldCount();
1702

    
1703
  /**
1704
   * Sets the number of internal fields for objects generated from
1705
   * this template.
1706
   */
1707
  void SetInternalFieldCount(int value);
1708

    
1709
 private:
1710
  ObjectTemplate();
1711
  static Local<ObjectTemplate> New(Handle<FunctionTemplate> constructor);
1712
  friend class FunctionTemplate;
1713
};
1714

    
1715

    
1716
/**
1717
 * A Signature specifies which receivers and arguments a function can
1718
 * legally be called with.
1719
 */
1720
class V8EXPORT Signature : public Data {
1721
 public:
1722
  static Local<Signature> New(Handle<FunctionTemplate> receiver =
1723
                                  Handle<FunctionTemplate>(),
1724
                              int argc = 0,
1725
                              Handle<FunctionTemplate> argv[] = 0);
1726
 private:
1727
  Signature();
1728
};
1729

    
1730

    
1731
/**
1732
 * A utility for determining the type of objects based on the template
1733
 * they were constructed from.
1734
 */
1735
class V8EXPORT TypeSwitch : public Data {
1736
 public:
1737
  static Local<TypeSwitch> New(Handle<FunctionTemplate> type);
1738
  static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]);
1739
  int match(Handle<Value> value);
1740
 private:
1741
  TypeSwitch();
1742
};
1743

    
1744

    
1745
// --- E x t e n s i o n s ---
1746

    
1747

    
1748
/**
1749
 * Ignore
1750
 */
1751
class V8EXPORT Extension {  // NOLINT
1752
 public:
1753
  Extension(const char* name,
1754
            const char* source = 0,
1755
            int dep_count = 0,
1756
            const char** deps = 0);
1757
  virtual ~Extension() { }
1758
  virtual v8::Handle<v8::FunctionTemplate>
1759
      GetNativeFunction(v8::Handle<v8::String> name) {
1760
    return v8::Handle<v8::FunctionTemplate>();
1761
  }
1762

    
1763
  const char* name() { return name_; }
1764
  const char* source() { return source_; }
1765
  int dependency_count() { return dep_count_; }
1766
  const char** dependencies() { return deps_; }
1767
  void set_auto_enable(bool value) { auto_enable_ = value; }
1768
  bool auto_enable() { return auto_enable_; }
1769

    
1770
 private:
1771
  const char* name_;
1772
  const char* source_;
1773
  int dep_count_;
1774
  const char** deps_;
1775
  bool auto_enable_;
1776

    
1777
  // Disallow copying and assigning.
1778
  Extension(const Extension&);
1779
  void operator=(const Extension&);
1780
};
1781

    
1782

    
1783
void V8EXPORT RegisterExtension(Extension* extension);
1784

    
1785

    
1786
/**
1787
 * Ignore
1788
 */
1789
class V8EXPORT DeclareExtension {
1790
 public:
1791
  inline DeclareExtension(Extension* extension) {
1792
    RegisterExtension(extension);
1793
  }
1794
};
1795

    
1796

    
1797
// --- S t a t i c s ---
1798

    
1799

    
1800
Handle<Primitive> V8EXPORT Undefined();
1801
Handle<Primitive> V8EXPORT Null();
1802
Handle<Boolean> V8EXPORT True();
1803
Handle<Boolean> V8EXPORT False();
1804

    
1805

    
1806
/**
1807
 * A set of constraints that specifies the limits of the runtime's
1808
 * memory use.
1809
 */
1810
class V8EXPORT ResourceConstraints {
1811
 public:
1812
  ResourceConstraints();
1813
  int max_young_space_size() const { return max_young_space_size_; }
1814
  void set_max_young_space_size(int value) { max_young_space_size_ = value; }
1815
  int max_old_space_size() const { return max_old_space_size_; }
1816
  void set_max_old_space_size(int value) { max_old_space_size_ = value; }
1817
  uint32_t* stack_limit() const { return stack_limit_; }
1818
  void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
1819
 private:
1820
  int max_young_space_size_;
1821
  int max_old_space_size_;
1822
  uint32_t* stack_limit_;
1823
};
1824

    
1825

    
1826
bool SetResourceConstraints(ResourceConstraints* constraints);
1827

    
1828

    
1829
// --- E x c e p t i o n s ---
1830

    
1831

    
1832
typedef void (*FatalErrorCallback)(const char* location, const char* message);
1833

    
1834

    
1835
typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> data);
1836

    
1837

    
1838
/**
1839
 * Schedules an exception to be thrown when returning to JavaScript.  When an
1840
 * exception has been scheduled it is illegal to invoke any JavaScript
1841
 * operation; the caller must return immediately and only after the exception
1842
 * has been handled does it become legal to invoke JavaScript operations.
1843
 */
1844
Handle<Value> V8EXPORT ThrowException(Handle<Value> exception);
1845

    
1846
/**
1847
 * Create new error objects by calling the corresponding error object
1848
 * constructor with the message.
1849
 */
1850
class V8EXPORT Exception {
1851
 public:
1852
  static Local<Value> RangeError(Handle<String> message);
1853
  static Local<Value> ReferenceError(Handle<String> message);
1854
  static Local<Value> SyntaxError(Handle<String> message);
1855
  static Local<Value> TypeError(Handle<String> message);
1856
  static Local<Value> Error(Handle<String> message);
1857
};
1858

    
1859

    
1860
// --- C o u n t e r s  C a l l b a c k s ---
1861

    
1862
typedef int* (*CounterLookupCallback)(const char* name);
1863

    
1864
typedef void* (*CreateHistogramCallback)(const char* name,
1865
                                         int min,
1866
                                         int max,
1867
                                         size_t buckets);
1868

    
1869
typedef void (*AddHistogramSampleCallback)(void* histogram, int sample);
1870

    
1871
// --- F a i l e d A c c e s s C h e c k C a l l b a c k ---
1872
typedef void (*FailedAccessCheckCallback)(Local<Object> target,
1873
                                          AccessType type,
1874
                                          Local<Value> data);
1875

    
1876
// --- G a r b a g e C o l l e c t i o n  C a l l b a c k s
1877

    
1878
/**
1879
 * Applications can register a callback function which is called
1880
 * before and after a major garbage collection.  Allocations are not
1881
 * allowed in the callback function, you therefore cannot manipulate
1882
 * objects (set or delete properties for example) since it is possible
1883
 * such operations will result in the allocation of objects.
1884
 */
1885
typedef void (*GCCallback)();
1886

    
1887

    
1888
// --- C o n t e x t  G e n e r a t o r ---
1889

    
1890
/**
1891
 * Applications must provide a callback function which is called to generate
1892
 * a context if a context was not deserialized from the snapshot.
1893
 */
1894
typedef Persistent<Context> (*ContextGenerator)();
1895

    
1896

    
1897
/**
1898
 * Container class for static utility functions.
1899
 */
1900
class V8EXPORT V8 {
1901
 public:
1902
  /** Set the callback to invoke in case of fatal errors. */
1903
  static void SetFatalErrorHandler(FatalErrorCallback that);
1904

    
1905
  /**
1906
   * Ignore out-of-memory exceptions.
1907
   *
1908
   * V8 running out of memory is treated as a fatal error by default.
1909
   * This means that the fatal error handler is called and that V8 is
1910
   * terminated.
1911
   *
1912
   * IgnoreOutOfMemoryException can be used to not treat a
1913
   * out-of-memory situation as a fatal error.  This way, the contexts
1914
   * that did not cause the out of memory problem might be able to
1915
   * continue execution.
1916
   */
1917
  static void IgnoreOutOfMemoryException();
1918

    
1919
  /**
1920
   * Check if V8 is dead and therefore unusable.  This is the case after
1921
   * fatal errors such as out-of-memory situations.
1922
   */
1923
  static bool IsDead();
1924

    
1925
  /**
1926
   * Adds a message listener.
1927
   *
1928
   * The same message listener can be added more than once and it that
1929
   * case it will be called more than once for each message.
1930
   */
1931
  static bool AddMessageListener(MessageCallback that,
1932
                                 Handle<Value> data = Handle<Value>());
1933

    
1934
  /**
1935
   * Remove all message listeners from the specified callback function.
1936
   */
1937
  static void RemoveMessageListeners(MessageCallback that);
1938

    
1939
  /**
1940
   * Sets V8 flags from a string.
1941
   */
1942
  static void SetFlagsFromString(const char* str, int length);
1943

    
1944
  /**
1945
   * Sets V8 flags from the command line.
1946
   */
1947
  static void SetFlagsFromCommandLine(int* argc,
1948
                                      char** argv,
1949
                                      bool remove_flags);
1950

    
1951
  /** Get the version string. */
1952
  static const char* GetVersion();
1953

    
1954
  /**
1955
   * Enables the host application to provide a mechanism for recording
1956
   * statistics counters.
1957
   */
1958
  static void SetCounterFunction(CounterLookupCallback);
1959

    
1960
  /**
1961
   * Enables the host application to provide a mechanism for recording
1962
   * histograms. The CreateHistogram function returns a
1963
   * histogram which will later be passed to the AddHistogramSample
1964
   * function.
1965
   */
1966
  static void SetCreateHistogramFunction(CreateHistogramCallback);
1967
  static void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
1968

    
1969
  /**
1970
   * Enables the computation of a sliding window of states. The sliding
1971
   * window information is recorded in statistics counters.
1972
   */
1973
  static void EnableSlidingStateWindow();
1974

    
1975
  /** Callback function for reporting failed access checks.*/
1976
  static void SetFailedAccessCheckCallbackFunction(FailedAccessCheckCallback);
1977

    
1978
  /**
1979
   * Enables the host application to receive a notification before a
1980
   * major garbage colletion.  Allocations are not allowed in the
1981
   * callback function, you therefore cannot manipulate objects (set
1982
   * or delete properties for example) since it is possible such
1983
   * operations will result in the allocation of objects.
1984
   */
1985
  static void SetGlobalGCPrologueCallback(GCCallback);
1986

    
1987
  /**
1988
   * Enables the host application to receive a notification after a
1989
   * major garbage collection.  Allocations are not allowed in the
1990
   * callback function, you therefore cannot manipulate objects (set
1991
   * or delete properties for example) since it is possible such
1992
   * operations will result in the allocation of objects.
1993
   */
1994
  static void SetGlobalGCEpilogueCallback(GCCallback);
1995

    
1996
  /**
1997
   * Allows the host application to group objects together. If one
1998
   * object in the group is alive, all objects in the group are alive.
1999
   * After each garbage collection, object groups are removed. It is
2000
   * intended to be used in the before-garbage-collection callback
2001
   * function, for instance to simulate DOM tree connections among JS
2002
   * wrapper objects.
2003
   */
2004
  static void AddObjectGroup(Persistent<Value>* objects, size_t length);
2005

    
2006
  /**
2007
   * Initializes from snapshot if possible. Otherwise, attempts to
2008
   * initialize from scratch.
2009
   */
2010
  static bool Initialize();
2011

    
2012
  /**
2013
   * Adjusts the amount of registered external memory.  Used to give
2014
   * V8 an indication of the amount of externally allocated memory
2015
   * that is kept alive by JavaScript objects.  V8 uses this to decide
2016
   * when to perform global garbage collections.  Registering
2017
   * externally allocated memory will trigger global garbage
2018
   * collections more often than otherwise in an attempt to garbage
2019
   * collect the JavaScript objects keeping the externally allocated
2020
   * memory alive.
2021
   *
2022
   * \param change_in_bytes the change in externally allocated memory
2023
   *   that is kept alive by JavaScript objects.
2024
   * \returns the adjusted value.
2025
   */
2026
  static int AdjustAmountOfExternalAllocatedMemory(int change_in_bytes);
2027

    
2028
  /**
2029
   * Suspends recording of tick samples in the profiler.
2030
   * When the V8 profiling mode is enabled (usually via command line
2031
   * switches) this function suspends recording of tick samples.
2032
   * Profiling ticks are discarded until ResumeProfiler() is called.
2033
   *
2034
   * See also the --prof and --prof_auto command line switches to
2035
   * enable V8 profiling.
2036
   */
2037
  static void PauseProfiler();
2038

    
2039
  /**
2040
   * Resumes recording of tick samples in the profiler.
2041
   * See also PauseProfiler().
2042
   */
2043
  static void ResumeProfiler();
2044

    
2045
  /**
2046
   * Releases any resources used by v8 and stops any utility threads
2047
   * that may be running.  Note that disposing v8 is permanent, it
2048
   * cannot be reinitialized.
2049
   *
2050
   * It should generally not be necessary to dispose v8 before exiting
2051
   * a process, this should happen automatically.  It is only necessary
2052
   * to use if the process needs the resources taken up by v8.
2053
   */
2054
  static bool Dispose();
2055

    
2056
 private:
2057
  V8();
2058

    
2059
  static void** GlobalizeReference(void** handle);
2060
  static void DisposeGlobal(void** global_handle);
2061
  static void MakeWeak(void** global_handle, void* data, WeakReferenceCallback);
2062
  static void ClearWeak(void** global_handle);
2063
  static bool IsGlobalNearDeath(void** global_handle);
2064
  static bool IsGlobalWeak(void** global_handle);
2065

    
2066
  template <class T> friend class Handle;
2067
  template <class T> friend class Local;
2068
  template <class T> friend class Persistent;
2069
  friend class Context;
2070
};
2071

    
2072

    
2073
/**
2074
 * An external exception handler.
2075
 */
2076
class V8EXPORT TryCatch {
2077
 public:
2078

    
2079
  /**
2080
   * Creates a new try/catch block and registers it with v8.
2081
   */
2082
  TryCatch();
2083

    
2084
  /**
2085
   * Unregisters and deletes this try/catch block.
2086
   */
2087
  ~TryCatch();
2088

    
2089
  /**
2090
   * Returns true if an exception has been caught by this try/catch block.
2091
   */
2092
  bool HasCaught() const;
2093

    
2094
  /**
2095
   * Returns the exception caught by this try/catch block.  If no exception has
2096
   * been caught an empty handle is returned.
2097
   *
2098
   * The returned handle is valid until this TryCatch block has been destroyed.
2099
   */
2100
  Local<Value> Exception() const;
2101

    
2102
  /**
2103
   * Returns the message associated with this exception.  If there is
2104
   * no message associated an empty handle is returned.
2105
   *
2106
   * The returned handle is valid until this TryCatch block has been
2107
   * destroyed.
2108
   */
2109
  Local<v8::Message> Message() const;
2110

    
2111
  /**
2112
   * Clears any exceptions that may have been caught by this try/catch block.
2113
   * After this method has been called, HasCaught() will return false.
2114
   *
2115
   * It is not necessary to clear a try/catch block before using it again; if
2116
   * another exception is thrown the previously caught exception will just be
2117
   * overwritten.  However, it is often a good idea since it makes it easier
2118
   * to determine which operation threw a given exception.
2119
   */
2120
  void Reset();
2121

    
2122
  /**
2123
   * Set verbosity of the external exception handler.
2124
   *
2125
   * By default, exceptions that are caught by an external exception
2126
   * handler are not reported.  Call SetVerbose with true on an
2127
   * external exception handler to have exceptions caught by the
2128
   * handler reported as if they were not caught.
2129
   */
2130
  void SetVerbose(bool value);
2131

    
2132
  /**
2133
   * Set whether or not this TryCatch should capture a Message object
2134
   * which holds source information about where the exception
2135
   * occurred.  True by default.
2136
   */
2137
  void SetCaptureMessage(bool value);
2138

    
2139
 public:
2140
  TryCatch* next_;
2141
  void* exception_;
2142
  void* message_;
2143
  bool is_verbose_;
2144
  bool capture_message_;
2145
  void* js_handler_;
2146
};
2147

    
2148

    
2149
// --- C o n t e x t ---
2150

    
2151

    
2152
/**
2153
 * Ignore
2154
 */
2155
class V8EXPORT ExtensionConfiguration {
2156
 public:
2157
  ExtensionConfiguration(int name_count, const char* names[])
2158
      : name_count_(name_count), names_(names) { }
2159
 private:
2160
  friend class ImplementationUtilities;
2161
  int name_count_;
2162
  const char** names_;
2163
};
2164

    
2165

    
2166
/**
2167
 * A sandboxed execution context with its own set of built-in objects
2168
 * and functions.
2169
 */
2170
class V8EXPORT Context {
2171
 public:
2172
  /** Returns the global object of the context. */
2173
  Local<Object> Global();
2174

    
2175
  /**
2176
   * Detaches the global object from its context before
2177
   * the global object can be reused to create a new context.
2178
   */
2179
  void DetachGlobal();
2180

    
2181
  /** Creates a new context. */
2182
  static Persistent<Context> New(
2183
      ExtensionConfiguration* extensions = 0,
2184
      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
2185
      Handle<Value> global_object = Handle<Value>());
2186

    
2187
  /** Returns the last entered context. */
2188
  static Local<Context> GetEntered();
2189

    
2190
  /** Returns the context that is on the top of the stack. */
2191
  static Local<Context> GetCurrent();
2192

    
2193
  /**
2194
   * Sets the security token for the context.  To access an object in
2195
   * another context, the security tokens must match.
2196
   */
2197
  void SetSecurityToken(Handle<Value> token);
2198

    
2199
  /** Restores the security token to the default value. */
2200
  void UseDefaultSecurityToken();
2201

    
2202
  /** Returns the security token of this context.*/
2203
  Handle<Value> GetSecurityToken();
2204

    
2205
  /**
2206
   * Enter this context.  After entering a context, all code compiled
2207
   * and run is compiled and run in this context.  If another context
2208
   * is already entered, this old context is saved so it can be
2209
   * restored when the new context is exited.
2210
   */
2211
  void Enter();
2212

    
2213
  /**
2214
   * Exit this context.  Exiting the current context restores the
2215
   * context that was in place when entering the current context.
2216
   */
2217
  void Exit();
2218

    
2219
  /** Returns true if the context has experienced an out of memory situation. */
2220
  bool HasOutOfMemoryException();
2221

    
2222
  /** Returns true if V8 has a current context. */
2223
  static bool InContext();
2224

    
2225
  /**
2226
   * Stack-allocated class which sets the execution context for all
2227
   * operations executed within a local scope.
2228
   */
2229
  class V8EXPORT Scope {
2230
   public:
2231
    inline Scope(Handle<Context> context) : context_(context) {
2232
      context_->Enter();
2233
    }
2234
    inline ~Scope() { context_->Exit(); }
2235
   private:
2236
    Handle<Context> context_;
2237
  };
2238

    
2239
 private:
2240
  friend class Value;
2241
  friend class Script;
2242
  friend class Object;
2243
  friend class Function;
2244
};
2245

    
2246

    
2247
/**
2248
 * Multiple threads in V8 are allowed, but only one thread at a time
2249
 * is allowed to use V8.  The definition of 'using V8' includes
2250
 * accessing handles or holding onto object pointers obtained from V8
2251
 * handles.  It is up to the user of V8 to ensure (perhaps with
2252
 * locking) that this constraint is not violated.
2253
 *
2254
 * If you wish to start using V8 in a thread you can do this by constructing
2255
 * a v8::Locker object.  After the code using V8 has completed for the
2256
 * current thread you can call the destructor.  This can be combined
2257
 * with C++ scope-based construction as follows:
2258
 *
2259
 * \code
2260
 * ...
2261
 * {
2262
 *   v8::Locker locker;
2263
 *   ...
2264
 *   // Code using V8 goes here.
2265
 *   ...
2266
 * } // Destructor called here
2267
 * \endcode
2268
 *
2269
 * If you wish to stop using V8 in a thread A you can do this by either
2270
 * by destroying the v8::Locker object as above or by constructing a
2271
 * v8::Unlocker object:
2272
 *
2273
 * \code
2274
 * {
2275
 *   v8::Unlocker unlocker;
2276
 *   ...
2277
 *   // Code not using V8 goes here while V8 can run in another thread.
2278
 *   ...
2279
 * } // Destructor called here.
2280
 * \endcode
2281
 *
2282
 * The Unlocker object is intended for use in a long-running callback
2283
 * from V8, where you want to release the V8 lock for other threads to
2284
 * use.
2285
 *
2286
 * The v8::Locker is a recursive lock.  That is, you can lock more than
2287
 * once in a given thread.  This can be useful if you have code that can
2288
 * be called either from code that holds the lock or from code that does
2289
 * not.  The Unlocker is not recursive so you can not have several
2290
 * Unlockers on the stack at once, and you can not use an Unlocker in a
2291
 * thread that is not inside a Locker's scope.
2292
 *
2293
 * An unlocker will unlock several lockers if it has to and reinstate
2294
 * the correct depth of locking on its destruction. eg.:
2295
 *
2296
 * \code
2297
 * // V8 not locked.
2298
 * {
2299
 *   v8::Locker locker;
2300
 *   // V8 locked.
2301
 *   {
2302
 *     v8::Locker another_locker;
2303
 *     // V8 still locked (2 levels).
2304
 *     {
2305
 *       v8::Unlocker unlocker;
2306
 *       // V8 not locked.
2307
 *     }
2308
 *     // V8 locked again (2 levels).
2309
 *   }
2310
 *   // V8 still locked (1 level).
2311
 * }
2312
 * // V8 Now no longer locked.
2313
 * \endcode
2314
 */
2315
class V8EXPORT Unlocker {
2316
 public:
2317
  Unlocker();
2318
  ~Unlocker();
2319
};
2320

    
2321

    
2322
class V8EXPORT Locker {
2323
 public:
2324
  Locker();
2325
  ~Locker();
2326

    
2327
  /**
2328
   * Start preemption.
2329
   *
2330
   * When preemption is started, a timer is fired every n milli seconds
2331
   * that will switch between multiple threads that are in contention
2332
   * for the V8 lock.
2333
   */
2334
  static void StartPreemption(int every_n_ms);
2335

    
2336
  /**
2337
   * Stop preemption.
2338
   */
2339
  static void StopPreemption();
2340

    
2341
  /**
2342
   * Returns whether or not the locker is locked by the current thread.
2343
   */
2344
  static bool IsLocked();
2345

    
2346
  /**
2347
   * Returns whether v8::Locker is being used by this V8 instance.
2348
   */
2349
  static bool IsActive() { return active_; }
2350

    
2351
 private:
2352
  bool has_lock_;
2353
  bool top_level_;
2354

    
2355
  static bool active_;
2356

    
2357
  // Disallow copying and assigning.
2358
  Locker(const Locker&);
2359
  void operator=(const Locker&);
2360
};
2361

    
2362

    
2363

    
2364
// --- I m p l e m e n t a t i o n ---
2365

    
2366
template <class T>
2367
Handle<T>::Handle() : val_(0) { }
2368

    
2369

    
2370
template <class T>
2371
Local<T>::Local() : Handle<T>() { }
2372

    
2373

    
2374
template <class T>
2375
Local<T> Local<T>::New(Handle<T> that) {
2376
  if (that.IsEmpty()) return Local<T>();
2377
  void** p = reinterpret_cast<void**>(*that);
2378
  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p)));
2379
}
2380

    
2381

    
2382
template <class T>
2383
Persistent<T> Persistent<T>::New(Handle<T> that) {
2384
  if (that.IsEmpty()) return Persistent<T>();
2385
  void** p = reinterpret_cast<void**>(*that);
2386
  return Persistent<T>(reinterpret_cast<T*>(V8::GlobalizeReference(p)));
2387
}
2388

    
2389

    
2390
template <class T>
2391
bool Persistent<T>::IsNearDeath() const {
2392
  if (this->IsEmpty()) return false;
2393
  return V8::IsGlobalNearDeath(reinterpret_cast<void**>(**this));
2394
}
2395

    
2396

    
2397
template <class T>
2398
bool Persistent<T>::IsWeak() const {
2399
  if (this->IsEmpty()) return false;
2400
  return V8::IsGlobalWeak(reinterpret_cast<void**>(**this));
2401
}
2402

    
2403

    
2404
template <class T>
2405
void Persistent<T>::Dispose() {
2406
  if (this->IsEmpty()) return;
2407
  V8::DisposeGlobal(reinterpret_cast<void**>(**this));
2408
}
2409

    
2410

    
2411
template <class T>
2412
Persistent<T>::Persistent() : Handle<T>() { }
2413

    
2414
template <class T>
2415
void Persistent<T>::MakeWeak(void* parameters, WeakReferenceCallback callback) {
2416
  V8::MakeWeak(reinterpret_cast<void**>(**this), parameters, callback);
2417
}
2418

    
2419
template <class T>
2420
void Persistent<T>::ClearWeak() {
2421
  V8::ClearWeak(reinterpret_cast<void**>(**this));
2422
}
2423

    
2424
template <class T>
2425
T* Handle<T>::operator->() const {
2426
  return val_;
2427
}
2428

    
2429

    
2430
template <class T>
2431
T* Handle<T>::operator*() const {
2432
  return val_;
2433
}
2434

    
2435

    
2436
Local<Value> Arguments::operator[](int i) const {
2437
  if (i < 0 || length_ <= i) return Local<Value>(*Undefined());
2438
  return Local<Value>(reinterpret_cast<Value*>(values_ - i));
2439
}
2440

    
2441

    
2442
Local<Function> Arguments::Callee() const {
2443
  return callee_;
2444
}
2445

    
2446

    
2447
Local<Object> Arguments::This() const {
2448
  return Local<Object>(reinterpret_cast<Object*>(values_ + 1));
2449
}
2450

    
2451

    
2452
Local<Object> Arguments::Holder() const {
2453
  return holder_;
2454
}
2455

    
2456

    
2457
Local<Value> Arguments::Data() const {
2458
  return data_;
2459
}
2460

    
2461

    
2462
bool Arguments::IsConstructCall() const {
2463
  return is_construct_call_;
2464
}
2465

    
2466

    
2467
int Arguments::Length() const {
2468
  return length_;
2469
}
2470

    
2471

    
2472
Local<Value> AccessorInfo::Data() const {
2473
  return data_;
2474
}
2475

    
2476

    
2477
Local<Object> AccessorInfo::This() const {
2478
  return self_;
2479
}
2480

    
2481

    
2482
Local<Object> AccessorInfo::Holder() const {
2483
  return holder_;
2484
}
2485

    
2486

    
2487
template <class T>
2488
Local<T> HandleScope::Close(Handle<T> value) {
2489
  void** after = RawClose(reinterpret_cast<void**>(*value));
2490
  return Local<T>(reinterpret_cast<T*>(after));
2491
}
2492

    
2493
Handle<Value> ScriptOrigin::ResourceName() const {
2494
  return resource_name_;
2495
}
2496

    
2497

    
2498
Handle<Integer> ScriptOrigin::ResourceLineOffset() const {
2499
  return resource_line_offset_;
2500
}
2501

    
2502

    
2503
Handle<Integer> ScriptOrigin::ResourceColumnOffset() const {
2504
  return resource_column_offset_;
2505
}
2506

    
2507

    
2508
Handle<Boolean> Boolean::New(bool value) {
2509
  return value ? True() : False();
2510
}
2511

    
2512

    
2513
void Template::Set(const char* name, v8::Handle<Data> value) {
2514
  Set(v8::String::New(name), value);
2515
}
2516

    
2517

    
2518
/**
2519
 * \example shell.cc
2520
 * A simple shell that takes a list of expressions on the
2521
 * command-line and executes them.
2522
 */
2523

    
2524

    
2525
/**
2526
 * \example process.cc
2527
 */
2528

    
2529

    
2530
}  // namespace v8
2531

    
2532

    
2533
#undef V8EXPORT
2534
#undef V8EXPORT_INLINE
2535
#undef TYPE_CHECK
2536

    
2537

    
2538
#endif  // V8_H_