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

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

38 39
#ifndef V8_H_
#define V8_H_
40

41
#include "v8stdint.h"
42 43

#ifdef _WIN32
44 45 46 47 48 49 50 51 52 53 54 55

// Setup for Windows DLL export/import. When building the V8 DLL the
// BUILDING_V8_SHARED needs to be defined. When building a program which uses
// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
// static library or building a program which uses the V8 static library neither
// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
  build configuration to ensure that at most one of these is set
#endif

#ifdef BUILDING_V8_SHARED
56
#define V8EXPORT __declspec(dllexport)
57
#elif USING_V8_SHARED
58
#define V8EXPORT __declspec(dllimport)
59
#else
60
#define V8EXPORT
61 62 63
#endif  // BUILDING_V8_SHARED

#else  // _WIN32
64

65
// Setup for Linux shared library export.
66 67
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
    (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
68
#ifdef BUILDING_V8_SHARED
69
#define V8EXPORT __attribute__ ((visibility("default")))
70 71 72
#else
#define V8EXPORT
#endif
73
#else
74
#define V8EXPORT
75
#endif
76 77

#endif  // _WIN32
78

79 80 81 82 83 84 85 86
#if defined(__GNUC__) && !defined(DEBUG)
#define V8_INLINE(declarator) inline __attribute__((always_inline)) declarator
#elif defined(_MSC_VER) && !defined(DEBUG)
#define V8_INLINE(declarator) __forceinline declarator
#else
#define V8_INLINE(declarator) inline declarator
#endif

87
#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS
88
#define V8_DEPRECATED(declarator) declarator __attribute__ ((deprecated))
89
#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS
90
#define V8_DEPRECATED(declarator) __declspec(deprecated) declarator
91
#else
92
#define V8_DEPRECATED(declarator) declarator
93 94
#endif

95
#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
96 97
  #define V8_UNLIKELY(condition) __builtin_expect((condition), 0)
  #define V8_LIKELY(condition) __builtin_expect((condition), 1)
98 99 100 101 102
#else
  #define V8_UNLIKELY(condition) (condition)
  #define V8_LIKELY(condition) (condition)
#endif

103
/**
104
 * The v8 JavaScript engine.
105 106 107
 */
namespace v8 {

108 109
class AccessorInfo;
class AccessorSignature;
110 111
class Array;
class Boolean;
112
class BooleanObject;
113
class Context;
114
class CpuProfiler;
115
class Data;
116
class Date;
117 118 119 120
class DeclaredAccessorDescriptor;
class External;
class Function;
class FunctionTemplate;
121
class HeapProfiler;
122
class ImplementationUtilities;
123 124 125 126 127 128 129 130 131 132
class Int32;
class Integer;
class Isolate;
class Number;
class NumberObject;
class Object;
class ObjectOperationDescriptor;
class ObjectTemplate;
class Primitive;
class RawOperationDescriptor;
133
class Signature;
134 135 136 137
class StackFrame;
class StackTrace;
class String;
class StringObject;
138 139
class Symbol;
class SymbolObject;
140 141 142
class Uint32;
class Utils;
class Value;
143 144 145
template <class T> class Handle;
template <class T> class Local;
template <class T> class Persistent;
146 147 148 149 150 151 152 153 154 155 156
class FunctionTemplate;
class ObjectTemplate;
class Data;
class AccessorInfo;
template<typename T> class PropertyCallbackInfo;
class StackTrace;
class StackFrame;
class Isolate;
class DeclaredAccessorDescriptor;
class ObjectOperationDescriptor;
class RawOperationDescriptor;
157

158
namespace internal {
159
class Arguments;
160
class Heap;
161 162
class HeapObject;
class Isolate;
163
class Object;
164
template<typename T> class CustomArguments;
165 166
class PropertyCallbackArguments;
class FunctionCallbackArguments;
167 168
}

169

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
/**
 * General purpose unique identifier.
 */
class UniqueId {
 public:
  explicit UniqueId(intptr_t data)
      : data_(data) {}

  bool operator==(const UniqueId& other) const {
    return data_ == other.data_;
  }

  bool operator!=(const UniqueId& other) const {
    return data_ != other.data_;
  }

  bool operator<(const UniqueId& other) const {
    return data_ < other.data_;
  }

 private:
  intptr_t data_;
};


195
// --- Weak Handles ---
196 197 198 199 200


/**
 * A weak reference callback function.
 *
201 202 203
 * This callback should either explicitly invoke Dispose on |object| if
 * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak.
 *
204 205 206
 * \param object the weak global object to be reclaimed by the garbage collector
 * \param parameter the value passed in when making the weak global object
 */
207 208 209 210 211 212 213
template<typename T, typename P>
class WeakReferenceCallbacks {
 public:
  typedef void (*Revivable)(Isolate* isolate,
                            Persistent<T>* object,
                            P* parameter);
};
214

215
// --- Handles ---
216

217 218 219
#define TYPE_CHECK(T, S)                                       \
  while (false) {                                              \
    *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
220 221
  }

222

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
/**
 * An object reference managed by the v8 garbage collector.
 *
 * All objects returned from v8 have to be tracked by the garbage
 * collector so that it knows that the objects are still alive.  Also,
 * because the garbage collector may move objects, it is unsafe to
 * point directly to an object.  Instead, all objects are stored in
 * handles which are known by the garbage collector and updated
 * whenever an object moves.  Handles should always be passed by value
 * (except in cases like out-parameters) and they should never be
 * allocated on the heap.
 *
 * There are two types of handles: local and persistent handles.
 * Local handles are light-weight and transient and typically used in
 * local operations.  They are managed by HandleScopes.  Persistent
 * handles can be used when storing objects across several independent
 * operations and have to be explicitly deallocated when they're no
 * longer used.
 *
 * It is safe to extract the object stored in the handle by
 * dereferencing the handle (for instance, to extract the Object* from
244
 * a Handle<Object>); the value will still be governed by a handle
245 246 247
 * behind the scenes and the same rules apply to these values as to
 * their handles.
 */
248
template <class T> class Handle {
249 250 251 252
 public:
  /**
   * Creates an empty handle.
   */
253
  V8_INLINE(Handle()) : val_(0) {}
254

255
#ifdef V8_USE_UNSAFE_HANDLES
256 257 258
  /**
   * Creates a new handle for the specified value.
   */
259
  V8_INLINE(explicit Handle(T* val)) : val_(val) {}
260
#endif
261 262 263 264

  /**
   * Creates a handle for the contents of the specified handle.  This
   * constructor allows you to pass handles as arguments by value and
265
   * to assign between handles.  However, if you try to assign between
266
   * incompatible handles, for instance from a Handle<String> to a
267
   * Handle<Number> it will cause a compile-time error.  Assigning
268 269 270 271
   * between compatible handles, for instance assigning a
   * Handle<String> to a variable declared as Handle<Value>, is legal
   * because String is a subclass of Value.
   */
272
  template <class S> V8_INLINE(Handle(Handle<S> that))
273 274 275 276 277 278 279 280 281 282 283 284
      : val_(reinterpret_cast<T*>(*that)) {
    /**
     * This check fails when trying to convert between incompatible
     * handles. For example, converting from a Handle<String> to a
     * Handle<Number>.
     */
    TYPE_CHECK(T, S);
  }

  /**
   * Returns true if the handle is empty.
   */
285
  V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
286 287 288 289

  /**
   * Sets the handle to be empty. IsEmpty() will then return true.
   */
290
  V8_INLINE(void Clear()) { val_ = 0; }
291

292
  V8_INLINE(T* operator->() const) { return val_; }
293

294
  V8_INLINE(T* operator*() const) { return val_; }
295 296 297 298 299 300 301

  /**
   * Checks whether two handles are the same.
   * Returns true if both are empty, or if the objects
   * to which they refer are identical.
   * The handles' references are not checked.
   */
302
  template <class S> V8_INLINE(bool operator==(const Handle<S> that) const) {
303 304
    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
305 306 307 308 309
    if (a == 0) return b == 0;
    if (b == 0) return false;
    return *a == *b;
  }

310 311 312 313 314 315 316 317 318 319 320
#ifndef V8_USE_UNSAFE_HANDLES
  template <class S> V8_INLINE(
      bool operator==(const Persistent<S>& that) const) {
    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
    if (a == 0) return b == 0;
    if (b == 0) return false;
    return *a == *b;
  }
#endif

321 322 323 324 325 326
  /**
   * Checks whether two handles are different.
   * Returns true if only one of the handles is empty, or if
   * the objects to which they refer are different.
   * The handles' references are not checked.
   */
327
  template <class S> V8_INLINE(bool operator!=(Handle<S> that) const) {
328 329 330
    return !operator==(that);
  }

331
  template <class S> V8_INLINE(static Handle<T> Cast(Handle<S> that)) {
332 333 334
#ifdef V8_ENABLE_CHECKS
    // If we're going to perform the type check then we have to check
    // that the handle isn't empty before doing the checked cast.
335
    if (that.IsEmpty()) return Handle<T>();
336
#endif
337 338 339
    return Handle<T>(T::Cast(*that));
  }

340
  template <class S> V8_INLINE(Handle<S> As()) {
341 342 343
    return Handle<S>::Cast(*this);
  }

344 345 346 347 348 349 350 351 352 353 354
#ifndef V8_USE_UNSAFE_HANDLES
  V8_INLINE(static Handle<T> New(Isolate* isolate, Handle<T> that)) {
    return New(isolate, that.val_);
  }
  // TODO(dcarney): remove before cutover
  V8_INLINE(static Handle<T> New(Isolate* isolate, const Persistent<T>& that)) {
    return New(isolate, that.val_);
  }

#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR

355
 private:
356 357 358 359 360 361 362 363
#endif
  /**
   * Creates a new handle for the specified value.
   */
  V8_INLINE(explicit Handle(T* val)) : val_(val) {}
#endif

 private:
364
  friend class Utils;
365 366
  template<class F> friend class Persistent;
  template<class F> friend class Local;
367
  friend class Arguments;
368 369
  template<class F> friend class FunctionCallbackInfo;
  template<class F> friend class PropertyCallbackInfo;
370
  template<class F> friend class internal::CustomArguments;
371 372 373 374 375 376
  friend class AccessorInfo;
  friend Handle<Primitive> Undefined(Isolate* isolate);
  friend Handle<Primitive> Null(Isolate* isolate);
  friend Handle<Boolean> True(Isolate* isolate);
  friend Handle<Boolean> False(Isolate* isolate);
  friend class Context;
377
  friend class HandleScope;
378 379 380 381 382

#ifndef V8_USE_UNSAFE_HANDLES
  V8_INLINE(static Handle<T> New(Isolate* isolate, T* that));
#endif

383 384 385 386 387 388 389 390 391 392 393
  T* val_;
};


/**
 * A light-weight stack-allocated object handle.  All operations
 * that return objects from within v8 return them in local handles.  They
 * are created within HandleScopes, and all local handles allocated within a
 * handle scope are destroyed when the handle scope is destroyed.  Hence it
 * is not necessary to explicitly deallocate local handles.
 */
394
// TODO(dcarney): deprecate entire class
395
template <class T> class Local : public Handle<T> {
396
 public:
397 398
  V8_INLINE(Local());
  template <class S> V8_INLINE(Local(Local<S> that))
399 400 401 402 403 404 405 406
      : Handle<T>(reinterpret_cast<T*>(*that)) {
    /**
     * This check fails when trying to convert between incompatible
     * handles. For example, converting from a Handle<String> to a
     * Handle<Number>.
     */
    TYPE_CHECK(T, S);
  }
407 408 409


#ifdef V8_USE_UNSAFE_HANDLES
410
  template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
411 412
#endif

413
  template <class S> V8_INLINE(static Local<T> Cast(Local<S> that)) {
414 415 416
#ifdef V8_ENABLE_CHECKS
    // If we're going to perform the type check then we have to check
    // that the handle isn't empty before doing the checked cast.
417
    if (that.IsEmpty()) return Local<T>();
418
#endif
419 420
    return Local<T>(T::Cast(*that));
  }
421 422 423 424 425 426
#ifndef V8_USE_UNSAFE_HANDLES
  template <class S> V8_INLINE(Local(Handle<S> that))
      : Handle<T>(reinterpret_cast<T*>(*that)) {
    TYPE_CHECK(T, S);
  }
#endif
427

428
  template <class S> V8_INLINE(Local<S> As()) {
429 430 431
    return Local<S>::Cast(*this);
  }

432 433 434 435
  /**
   * Create a local handle for the content of another handle.
   * The referee is kept alive by the local handle even when
   * the original handle is destroyed/disposed.
436
   */
437
  V8_INLINE(static Local<T> New(Handle<T> that));
438
  V8_INLINE(static Local<T> New(Isolate* isolate, Handle<T> that));
439 440 441
#ifndef V8_USE_UNSAFE_HANDLES
  // TODO(dcarney): remove before cutover
  V8_INLINE(static Local<T> New(Isolate* isolate, const Persistent<T>& that));
442

443 444 445 446 447 448 449 450
#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR

 private:
#endif
  template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
#endif

 private:
451
  friend class Utils;
452 453
  template<class F> friend class Persistent;
  template<class F> friend class Handle;
454
  friend class Arguments;
455 456
  template<class F> friend class FunctionCallbackInfo;
  template<class F> friend class PropertyCallbackInfo;
457 458 459 460
  friend class String;
  friend class Object;
  friend class AccessorInfo;
  friend class Context;
461
  template<class F> friend class internal::CustomArguments;
462
  friend class HandleScope;
463 464 465

  V8_INLINE(static Local<T> New(Isolate* isolate, T* that));
};
466 467 468

/**
 * An object reference that is independent of any handle scope.  Where
469
 * a Local handle only lives as long as the HandleScope in which it was
470 471 472 473 474 475 476 477 478 479 480 481 482 483
 * allocated, a Persistent handle remains valid until it is explicitly
 * disposed.
 *
 * A persistent handle contains a reference to a storage cell within
 * the v8 engine which holds an object value and which is updated by
 * the garbage collector whenever the object is moved.  A new storage
 * cell can be created using Persistent::New and existing handles can
 * be disposed using Persistent::Dispose.  Since persistent handles
 * are passed by value you may have many persistent handle objects
 * that point to the same storage cell.  For instance, if you pass a
 * persistent handle as an argument to a function you will not get two
 * different storage cells but rather two references to the same
 * storage cell.
 */
484 485 486 487 488 489
template <class T> class Persistent // NOLINT
#ifdef V8_USE_UNSAFE_HANDLES
    : public Handle<T> {
#else
  { // NOLINT
#endif
490
 public:
491 492
#ifndef V8_USE_UNSAFE_HANDLES
  V8_INLINE(Persistent()) : val_(0) { }
493 494 495 496
  // TODO(dcarney): add this back before cutover.
//  V8_INLINE(~Persistent()) {
//  Dispose();
//  }
497 498 499 500 501 502 503 504 505 506 507
  V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
  // TODO(dcarney): remove somehow before cutover
  // The handle should either be 0, or a pointer to a live cell.
  V8_INLINE(void Clear()) { val_ = 0; }

  /**
   * A constructor that creates a new global cell pointing to that. In contrast
   * to the copy constructor, this creates a new persistent handle which needs
   * to be separately disposed.
   */
  template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
508
      : val_(New(isolate, *that)) { }
509

510 511
  template <class S> V8_INLINE(Persistent(Isolate* isolate,
                                          Persistent<S>& that)) // NOLINT
512
      : val_(New(isolate, *that)) { }
513

514
#else
515 516 517 518
  /**
   * Creates an empty persistent handle that doesn't point to any
   * storage cell.
   */
519
  V8_INLINE(Persistent()) : Handle<T>() { }
520 521 522 523 524

  /**
   * Creates a persistent handle for the same storage cell as the
   * specified handle.  This constructor allows you to pass persistent
   * handles as arguments by value and to assign between persistent
525
   * handles.  However, attempting to assign between incompatible
526
   * persistent handles, for instance from a Persistent<String> to a
527
   * Persistent<Number> will cause a compile-time error.  Assigning
528 529
   * between compatible persistent handles, for instance assigning a
   * Persistent<String> to a variable declared as Persistent<Value>,
530
   * is allowed as String is a subclass of Value.
531
   */
532
  template <class S> V8_INLINE(Persistent(Persistent<S> that))
533 534 535 536 537 538 539 540 541
      : Handle<T>(reinterpret_cast<T*>(*that)) {
    /**
     * This check fails when trying to convert between incompatible
     * handles. For example, converting from a Handle<String> to a
     * Handle<Number>.
     */
    TYPE_CHECK(T, S);
  }

542
  template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { }
543

544 545 546 547 548 549 550 551
  /**
   * A constructor that creates a new global cell pointing to that. In contrast
   * to the copy constructor, this creates a new persistent handle which needs
   * to be separately disposed.
   */
  template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
      : Handle<T>(New(isolate, that)) { }

552 553 554 555
  /**
   * "Casts" a plain handle which is known to be a persistent handle
   * to a persistent handle.
   */
556
  template <class S> explicit V8_INLINE(Persistent(Handle<S> that))
557 558
      : Handle<T>(*that) { }

559 560
#endif

561
#ifdef V8_USE_UNSAFE_HANDLES
562
  template <class S> V8_INLINE(static Persistent<T> Cast(Persistent<S> that)) {
563 564 565
#ifdef V8_ENABLE_CHECKS
    // If we're going to perform the type check then we have to check
    // that the handle isn't empty before doing the checked cast.
566
    if (that.IsEmpty()) return Persistent<T>();
567
#endif
568 569 570
    return Persistent<T>(T::Cast(*that));
  }

571
  template <class S> V8_INLINE(Persistent<S> As()) {
572 573 574
    return Persistent<S>::Cast(*this);
  }

575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
#else
  template <class S>
  V8_INLINE(static Persistent<T>& Cast(Persistent<S>& that)) { // NOLINT
#ifdef V8_ENABLE_CHECKS
    // If we're going to perform the type check then we have to check
    // that the handle isn't empty before doing the checked cast.
    if (!that.IsEmpty()) T::Cast(*that);
#endif
    return reinterpret_cast<Persistent<T>&>(that);
  }

  template <class S> V8_INLINE(Persistent<S>& As()) { // NOLINT
    return Persistent<S>::Cast(*this);
  }
#endif

591
#ifdef V8_USE_UNSAFE_HANDLES
592 593
  V8_DEPRECATED(static Persistent<T> New(Handle<T> that));
  V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that));
594 595
  V8_INLINE(static Persistent<T> New(Isolate* isolate, Persistent<T> that));
#endif
596

597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
#ifndef V8_USE_UNSAFE_HANDLES
  template <class S> V8_INLINE(
      bool operator==(const Persistent<S>& that) const) {
    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
    if (a == 0) return b == 0;
    if (b == 0) return false;
    return *a == *b;
  }

  template <class S> V8_INLINE(bool operator==(const Handle<S> that) const) {
    internal::Object** a = reinterpret_cast<internal::Object**>(**this);
    internal::Object** b = reinterpret_cast<internal::Object**>(*that);
    if (a == 0) return b == 0;
    if (b == 0) return false;
    return *a == *b;
  }
#endif

  V8_INLINE(void Dispose());
617 618 619 620

  /**
   * Releases the storage cell referenced by this persistent handle.
   * Does not remove the reference to the cell from any handles.
621
   * This handle's reference, and any other references to the storage
622 623
   * cell remain and IsEmpty will still return false.
   */
624 625
  // TODO(dcarney): deprecate
  V8_INLINE(void Dispose(Isolate* isolate)) { Dispose(); }
626

627 628 629 630 631 632
  /**
   * Make the reference to this object weak.  When only weak handles
   * refer to the object, the garbage collector will perform a
   * callback to the given V8::NearDeathCallback function, passing
   * it the object reference and the given parameters.
   */
633 634 635 636 637 638 639 640 641
  template<typename S, typename P>
  V8_INLINE(void MakeWeak(
      P* parameters,
      typename WeakReferenceCallbacks<S, P>::Revivable callback));

  template<typename P>
  V8_INLINE(void MakeWeak(
      P* parameters,
      typename WeakReferenceCallbacks<T, P>::Revivable callback));
642

643
  template<typename S, typename P>
644
  V8_DEPRECATED(void MakeWeak(
645 646
      Isolate* isolate,
      P* parameters,
647
      typename WeakReferenceCallbacks<S, P>::Revivable callback));
648 649

  template<typename P>
650
  V8_DEPRECATED(void MakeWeak(
651 652
      Isolate* isolate,
      P* parameters,
653
      typename WeakReferenceCallbacks<T, P>::Revivable callback));
654

655
  V8_INLINE(void ClearWeak());
656

657 658
  // TODO(dcarney): deprecate
  V8_INLINE(void ClearWeak(Isolate* isolate)) { ClearWeak(); }
659

660
  /**
661 662 663 664
   * Marks the reference to this object independent. Garbage collector is free
   * to ignore any object groups containing this object. Weak callback for an
   * independent handle should not assume that it will be preceded by a global
   * GC prologue callback or followed by a global GC epilogue callback.
665
   */
666
  V8_INLINE(void MarkIndependent());
667

668 669
  // TODO(dcarney): deprecate
  V8_INLINE(void MarkIndependent(Isolate* isolate)) { MarkIndependent(); }
670

671
  /**
672 673 674 675 676 677
   * Marks the reference to this object partially dependent. Partially dependent
   * handles only depend on other partially dependent handles and these
   * dependencies are provided through object groups. It provides a way to build
   * smaller object groups for young objects that represent only a subset of all
   * external dependencies. This mark is automatically cleared after each
   * garbage collection.
678
   */
679
  V8_INLINE(void MarkPartiallyDependent());
680

681 682 683 684
  // TODO(dcarney): deprecate
  V8_INLINE(void MarkPartiallyDependent(Isolate* isolate)) {
    MarkPartiallyDependent();
  }
685

686
  V8_INLINE(bool IsIndependent() const);
687

688 689 690 691
  // TODO(dcarney): deprecate
  V8_INLINE(bool IsIndependent(Isolate* isolate) const) {
    return IsIndependent();
  }
692

693
  /** Checks if the handle holds the only reference to an object. */
694
  V8_INLINE(bool IsNearDeath() const);
695

696 697
  // TODO(dcarney): deprecate
  V8_INLINE(bool IsNearDeath(Isolate* isolate) const) { return IsNearDeath(); }
698

699
  /** Returns true if the handle's reference is weak.  */
700
  V8_INLINE(bool IsWeak() const);
701

702 703
  // TODO(dcarney): deprecate
  V8_INLINE(bool IsWeak(Isolate* isolate) const) { return IsWeak(); }
704

705
  /**
706 707
   * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface
   * description in v8-profiler.h for details.
708
   */
709
  V8_INLINE(void SetWrapperClassId(uint16_t class_id));
710

711 712 713 714
  // TODO(dcarney): deprecate
  V8_INLINE(void SetWrapperClassId(Isolate* isolate, uint16_t class_id)) {
    SetWrapperClassId(class_id);
  }
715

716
  /**
717 718
   * Returns the class ID previously assigned to this handle or 0 if no class ID
   * was previously assigned.
719
   */
720 721 722 723 724 725
  V8_INLINE(uint16_t WrapperClassId() const);

  // TODO(dcarney): deprecate
  V8_INLINE(uint16_t WrapperClassId(Isolate* isolate) const) {
    return WrapperClassId();
  }
726

727 728 729 730 731
  /**
   * Disposes the current contents of the handle and replaces it.
   */
  V8_INLINE(void Reset(Isolate* isolate, const Handle<T>& other));

732 733 734 735
#ifndef V8_USE_UNSAFE_HANDLES
  V8_INLINE(void Reset(Isolate* isolate, const Persistent<T>& other));
#endif

736 737 738 739 740 741 742 743 744 745
  /**
   * Returns the underlying raw pointer and clears the handle. The caller is
   * responsible of eventually destroying the underlying object (by creating a
   * Persistent handle which points to it and Disposing it). In the future,
   * destructing a Persistent will also Dispose it. With this function, the
   * embedder can let the Persistent go out of scope without it getting
   * disposed.
   */
  V8_INLINE(T* ClearAndLeak());

746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
#ifndef V8_USE_UNSAFE_HANDLES

 private:
  // TODO(dcarney): make unlinkable before cutover
  V8_INLINE(Persistent(const Persistent& that)) : val_(that.val_) {}
  // TODO(dcarney): make unlinkable before cutover
  V8_INLINE(Persistent& operator=(const Persistent& that)) {  // NOLINT
    this->val_ = that.val_;
    return *this;
  }

 public:
#ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR

 private:
#endif
  // TODO(dcarney): remove before cutover
  template <class S> V8_INLINE(Persistent(S* that)) : val_(that) { }
764

765 766 767 768 769 770 771 772 773
  // TODO(dcarney): remove before cutover
  V8_INLINE(T* operator*() const) { return val_; }

 private:
  // TODO(dcarney): remove before cutover
  V8_INLINE(T* operator->() const) { return val_; }
 public:
#endif

774
 private:
775
  friend class Utils;
776 777
  template<class F> friend class Handle;
  template<class F> friend class Local;
778
  template<class F> friend class Persistent;
779
  template<class F> friend class ReturnValue;
780

781
  V8_INLINE(static T* New(Isolate* isolate, T* that));
782 783 784 785

#ifndef V8_USE_UNSAFE_HANDLES
  T* val_;
#endif
786 787 788
};


789
 /**
790 791 792 793 794
 * A stack-allocated class that governs a number of local handles.
 * After a handle scope has been created, all local handles will be
 * allocated within that handle scope until either the handle scope is
 * deleted or another handle scope is created.  If there is already a
 * handle scope and a new one is created, all allocations will take
795
 * place in the new handle scope until it is deleted.  After that,
796 797 798 799 800 801 802
 * new handles will again be allocated in the original handle scope.
 *
 * After the handle scope of a local handle has been deleted the
 * garbage collector will no longer track the object stored in the
 * handle and may deallocate it.  The behavior of accessing a handle
 * for which the handle scope has been deleted is undefined.
 */
803
class V8EXPORT HandleScope {
804
 public:
805
  // TODO(svenpanne) Deprecate me when Chrome is fixed!
806
  HandleScope();
807

808 809
  HandleScope(Isolate* isolate);

810
  ~HandleScope();
811 812 813 814 815 816 817 818 819 820 821 822 823 824 825

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

  /**
   * Counts the number of allocated handles.
   */
  static int NumberOfHandles();

  /**
   * Creates a new handle with the given value.
   */
826
  static internal::Object** CreateHandle(internal::Object* value);
827 828
  static internal::Object** CreateHandle(internal::Isolate* isolate,
                                         internal::Object* value);
829 830
  // Faster version, uses HeapObject to obtain the current Isolate.
  static internal::Object** CreateHandle(internal::HeapObject* value);
831 832

 private:
833 834
  // Make it hard to create heap-allocated or illegal handle scopes by
  // disallowing certain operations.
835 836 837 838 839
  HandleScope(const HandleScope&);
  void operator=(const HandleScope&);
  void* operator new(size_t size);
  void operator delete(void*, size_t);

840 841
  // This Data class is accessible internally as HandleScopeData through a
  // typedef in the ImplementationUtilities class.
842
  class V8EXPORT Data {
843
   public:
844 845
    internal::Object** next;
    internal::Object** limit;
846
    int level;
847
    V8_INLINE(void Initialize()) {
848
      next = limit = NULL;
849
      level = 0;
850 851
    }
  };
852

853
  void Initialize(Isolate* isolate);
854
  void Leave();
855

856
  internal::Isolate* isolate_;
857 858
  internal::Object** prev_next_;
  internal::Object** prev_limit_;
859

860 861
  // Allow for the active closing of HandleScopes which allows to pass a handle
  // from the HandleScope being closed to the next top most HandleScope.
862
  bool is_closed_;
863
  internal::Object** RawClose(internal::Object** value);
864 865 866 867 868

  friend class ImplementationUtilities;
};


869
// --- Special objects ---
870 871 872 873 874


/**
 * The superclass of values and API object templates.
 */
875
class V8EXPORT Data {
876 877 878 879 880 881 882 883
 private:
  Data();
};


/**
 * Pre-compilation data that can be associated with a script.  This
 * data can be calculated for a script in advance of actually
884
 * compiling it, and can be stored between compilations.  When script
885
 * data is given to the compile method compilation will be faster.
886
 */
887
class V8EXPORT ScriptData {  // NOLINT
888 889
 public:
  virtual ~ScriptData() { }
890

891 892 893 894 895 896
  /**
   * Pre-compiles the specified script (context-independent).
   *
   * \param input Pointer to UTF-8 script source code.
   * \param length Length of UTF-8 script source code.
   */
897 898
  static ScriptData* PreCompile(const char* input, int length);

899 900 901 902 903 904 905 906 907 908
  /**
   * Pre-compiles the specified script (context-independent).
   *
   * NOTE: Pre-compilation using this method cannot happen on another thread
   * without using Lockers.
   *
   * \param source Script source code.
   */
  static ScriptData* PreCompile(Handle<String> source);

909 910 911 912 913 914 915 916 917 918 919 920
  /**
   * Load previous pre-compilation data.
   *
   * \param data Pointer to data returned by a call to Data() of a previous
   *   ScriptData. Ownership is not transferred.
   * \param length Length of data.
   */
  static ScriptData* New(const char* data, int length);

  /**
   * Returns the length of Data().
   */
921
  virtual int Length() = 0;
922 923 924 925 926 927 928 929 930 931

  /**
   * Returns a serialized representation of this ScriptData that can later be
   * passed to New(). NOTE: Serialized data is platform-dependent.
   */
  virtual const char* Data() = 0;

  /**
   * Returns true if the source code could not be parsed.
   */
932
  virtual bool HasError() = 0;
933 934 935 936 937 938
};


/**
 * The origin, within a file, of a script.
 */
939
class ScriptOrigin {
940
 public:
941
  V8_INLINE(ScriptOrigin(
942 943
      Handle<Value> resource_name,
      Handle<Integer> resource_line_offset = Handle<Integer>(),
944
      Handle<Integer> resource_column_offset = Handle<Integer>()))
945 946 947
      : resource_name_(resource_name),
        resource_line_offset_(resource_line_offset),
        resource_column_offset_(resource_column_offset) { }
948 949 950
  V8_INLINE(Handle<Value> ResourceName() const);
  V8_INLINE(Handle<Integer> ResourceLineOffset() const);
  V8_INLINE(Handle<Integer> ResourceColumnOffset() const);
951
 private:
952
  Handle<Value> resource_name_;
953 954 955 956 957 958
  Handle<Integer> resource_line_offset_;
  Handle<Integer> resource_column_offset_;
};


/**
959
 * A compiled JavaScript script.
960
 */
961
class V8EXPORT Script {
962
 public:
963 964 965 966
  /**
   * Compiles the specified script (context-independent).
   *
   * \param source Script source code.
967
   * \param origin Script origin, owned by caller, no references are kept
968 969 970 971 972
   *   when New() returns
   * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
   *   using pre_data speeds compilation if it's done multiple times.
   *   Owned by caller, no references are kept when New() returns.
   * \param script_data Arbitrary data associated with script. Using
973
   *   this has same effect as calling SetData(), but allows data to be
974 975 976 977 978 979 980 981 982 983 984 985 986 987
   *   available to compile event handlers.
   * \return Compiled script object (context independent; when run it
   *   will use the currently entered context).
   */
  static Local<Script> New(Handle<String> source,
                           ScriptOrigin* origin = NULL,
                           ScriptData* pre_data = NULL,
                           Handle<String> script_data = Handle<String>());

  /**
   * Compiles the specified script using the specified file name
   * object (typically a string) as the script's origin.
   *
   * \param source Script source code.
988
   * \param file_name file name object (typically a string) to be used
989 990 991 992 993 994
   *   as the script's origin.
   * \return Compiled script object (context independent; when run it
   *   will use the currently entered context).
   */
  static Local<Script> New(Handle<String> source,
                           Handle<Value> file_name);
995

996
  /**
997
   * Compiles the specified script (bound to current context).
998
   *
999
   * \param source Script source code.
1000
   * \param origin Script origin, owned by caller, no references are kept
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
   *   when Compile() returns
   * \param pre_data Pre-parsing data, as obtained by ScriptData::PreCompile()
   *   using pre_data speeds compilation if it's done multiple times.
   *   Owned by caller, no references are kept when Compile() returns.
   * \param script_data Arbitrary data associated with script. Using
   *   this has same effect as calling SetData(), but makes data available
   *   earlier (i.e. to compile event handlers).
   * \return Compiled script object, bound to the context that was active
   *   when this function was called.  When run it will always use this
   *   context.
1011 1012 1013
   */
  static Local<Script> Compile(Handle<String> source,
                               ScriptOrigin* origin = NULL,
1014 1015
                               ScriptData* pre_data = NULL,
                               Handle<String> script_data = Handle<String>());
1016

1017 1018 1019
  /**
   * Compiles the specified script using the specified file name
   * object (typically a string) as the script's origin.
1020
   *
1021 1022 1023 1024 1025 1026 1027 1028
   * \param source Script source code.
   * \param file_name File name to use as script's origin
   * \param script_data Arbitrary data associated with script. Using
   *   this has same effect as calling SetData(), but makes data available
   *   earlier (i.e. to compile event handlers).
   * \return Compiled script object, bound to the context that was active
   *   when this function was called.  When run it will always use this
   *   context.
1029 1030
   */
  static Local<Script> Compile(Handle<String> source,
1031 1032
                               Handle<Value> file_name,
                               Handle<String> script_data = Handle<String>());
1033

1034
  /**
1035 1036 1037 1038 1039
   * Runs the script returning the resulting value.  If the script is
   * context independent (created using ::New) it will be run in the
   * currently entered context.  If it is context specific (created
   * using ::Compile) it will be run in the context in which it was
   * compiled.
1040
   */
1041
  Local<Value> Run();
1042 1043 1044 1045 1046

  /**
   * Returns the script id value.
   */
  Local<Value> Id();
1047 1048 1049 1050 1051 1052

  /**
   * Associate an additional data object with the script. This is mainly used
   * with the debugger as this data object is only available through the
   * debugger API.
   */
1053
  void SetData(Handle<String> data);
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064

  /**
   * Returns the name value of one Script.
   */
  Handle<Value> GetScriptName();

  /**
   * Returns zero based line number of the code_pos location in the script.
   * -1 will be returned if no information available.
   */
  int GetLineNumber(int code_pos);
1065 1066 1067 1068 1069 1070
};


/**
 * An error message.
 */
1071
class V8EXPORT Message {
1072
 public:
1073 1074
  Local<String> Get() const;
  Local<String> GetSourceLine() const;
1075

1076 1077 1078 1079
  /**
   * Returns the resource name for the script from where the function causing
   * the error originates.
   */
1080
  Handle<Value> GetScriptResourceName() const;
1081

1082 1083 1084 1085 1086 1087
  /**
   * Returns the resource data for the script from where the function causing
   * the error originates.
   */
  Handle<Value> GetScriptData() const;

1088 1089 1090 1091 1092 1093 1094
  /**
   * Exception stack trace. By default stack traces are not captured for
   * uncaught exceptions. SetCaptureStackTraceForUncaughtExceptions allows
   * to change this option.
   */
  Handle<StackTrace> GetStackTrace() const;

1095 1096 1097
  /**
   * Returns the number, 1-based, of the line where the error occurred.
   */
1098
  int GetLineNumber() const;
1099

1100 1101 1102 1103
  /**
   * Returns the index within the script of the first character where
   * the error occurred.
   */
1104
  int GetStartPosition() const;
1105 1106 1107 1108 1109

  /**
   * Returns the index within the script of the last character where
   * the error occurred.
   */
1110
  int GetEndPosition() const;
1111 1112 1113 1114 1115

  /**
   * Returns the index within the line of the first character where
   * the error occurred.
   */
1116
  int GetStartColumn() const;
1117 1118 1119 1120 1121

  /**
   * Returns the index within the line of the last character where
   * the error occurred.
   */
1122
  int GetEndColumn() const;
1123

1124 1125
  // TODO(1245381): Print to a string instead of on a FILE.
  static void PrintCurrentStackTrace(FILE* out);
1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149

  static const int kNoLineNumberInfo = 0;
  static const int kNoColumnInfo = 0;
};


/**
 * Representation of a JavaScript stack trace. The information collected is a
 * snapshot of the execution stack and the information remains valid after
 * execution continues.
 */
class V8EXPORT StackTrace {
 public:
  /**
   * Flags that determine what information is placed captured for each
   * StackFrame when grabbing the current stack trace.
   */
  enum StackTraceOptions {
    kLineNumber = 1,
    kColumnOffset = 1 << 1 | kLineNumber,
    kScriptName = 1 << 2,
    kFunctionName = 1 << 3,
    kIsEval = 1 << 4,
    kIsConstructor = 1 << 5,
1150
    kScriptNameOrSourceURL = 1 << 6,
1151
    kOverview = kLineNumber | kColumnOffset | kScriptName | kFunctionName,
1152
    kDetailed = kOverview | kIsEval | kIsConstructor | kScriptNameOrSourceURL
1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
  };

  /**
   * Returns a StackFrame at a particular index.
   */
  Local<StackFrame> GetFrame(uint32_t index) const;

  /**
   * Returns the number of StackFrames.
   */
  int GetFrameCount() const;

  /**
   * Returns StackTrace as a v8::Array that contains StackFrame objects.
   */
  Local<Array> AsArray();

  /**
1171
   * Grab a snapshot of the current JavaScript execution stack.
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210
   *
   * \param frame_limit The maximum number of stack frames we want to capture.
   * \param options Enumerates the set of things we will capture for each
   *   StackFrame.
   */
  static Local<StackTrace> CurrentStackTrace(
      int frame_limit,
      StackTraceOptions options = kOverview);
};


/**
 * A single JavaScript stack frame.
 */
class V8EXPORT StackFrame {
 public:
  /**
   * Returns the number, 1-based, of the line for the associate function call.
   * This method will return Message::kNoLineNumberInfo if it is unable to
   * retrieve the line number, or if kLineNumber was not passed as an option
   * when capturing the StackTrace.
   */
  int GetLineNumber() const;

  /**
   * Returns the 1-based column offset on the line for the associated function
   * call.
   * This method will return Message::kNoColumnInfo if it is unable to retrieve
   * the column number, or if kColumnOffset was not passed as an option when
   * capturing the StackTrace.
   */
  int GetColumn() const;

  /**
   * Returns the name of the resource that contains the script for the
   * function for this StackFrame.
   */
  Local<String> GetScriptName() const;

1211 1212 1213
  /**
   * Returns the name of the resource that contains the script for the
   * function for this StackFrame or sourceURL value if the script name
1214 1215
   * is undefined and its source ends with //# sourceURL=... string or
   * deprecated //@ sourceURL=... string.
1216 1217 1218
   */
  Local<String> GetScriptNameOrSourceURL() const;

1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
  /**
   * Returns the name of the function associated with this stack frame.
   */
  Local<String> GetFunctionName() const;

  /**
   * Returns whether or not the associated function is compiled via a call to
   * eval().
   */
  bool IsEval() const;

  /**
1231
   * Returns whether or not the associated function is called as a
1232 1233 1234
   * constructor via "new".
   */
  bool IsConstructor() const;
1235 1236 1237
};


1238
// --- Value ---
1239 1240 1241


/**
1242
 * The superclass of all JavaScript values and objects.
1243
 */
1244
class V8EXPORT Value : public Data {
1245 1246 1247 1248 1249
 public:
  /**
   * Returns true if this value is the undefined value.  See ECMA-262
   * 4.3.10.
   */
1250
  V8_INLINE(bool IsUndefined() const);
1251 1252 1253 1254 1255

  /**
   * Returns true if this value is the null value.  See ECMA-262
   * 4.3.11.
   */
1256
  V8_INLINE(bool IsNull() const);
1257 1258 1259 1260

   /**
   * Returns true if this value is true.
   */
1261
  bool IsTrue() const;
1262 1263 1264 1265

  /**
   * Returns true if this value is false.
   */
1266
  bool IsFalse() const;
1267 1268 1269 1270 1271

  /**
   * Returns true if this value is an instance of the String type.
   * See ECMA-262 8.4.
   */
1272
  V8_INLINE(bool IsString() const);
1273

1274 1275 1276 1277 1278 1279
  /**
   * Returns true if this value is a symbol.
   * This is an experimental feature.
   */
  bool IsSymbol() const;

1280 1281 1282
  /**
   * Returns true if this value is a function.
   */
1283
  bool IsFunction() const;
1284 1285 1286 1287

  /**
   * Returns true if this value is an array.
   */
1288
  bool IsArray() const;
1289

1290
  /**
1291 1292
   * Returns true if this value is an object.
   */
1293
  bool IsObject() const;
1294

1295
  /**
1296 1297
   * Returns true if this value is boolean.
   */
1298
  bool IsBoolean() const;
1299

1300
  /**
1301 1302
   * Returns true if this value is a number.
   */
1303
  bool IsNumber() const;
1304

1305
  /**
1306 1307
   * Returns true if this value is external.
   */
1308
  bool IsExternal() const;
1309

1310
  /**
1311 1312
   * Returns true if this value is a 32-bit signed integer.
   */
1313
  bool IsInt32() const;
1314

1315
  /**
1316
   * Returns true if this value is a 32-bit unsigned integer.
1317
   */
1318
  bool IsUint32() const;
1319

1320 1321 1322
  /**
   * Returns true if this value is a Date.
   */
1323
  bool IsDate() const;
1324

1325 1326 1327
  /**
   * Returns true if this value is a Boolean object.
   */
1328
  bool IsBooleanObject() const;
1329 1330 1331 1332

  /**
   * Returns true if this value is a Number object.
   */
1333
  bool IsNumberObject() const;
1334 1335 1336 1337

  /**
   * Returns true if this value is a String object.
   */
1338
  bool IsStringObject() const;
1339

1340 1341 1342 1343 1344 1345
  /**
   * Returns true if this value is a Symbol object.
   * This is an experimental feature.
   */
  bool IsSymbolObject() const;

1346 1347 1348
  /**
   * Returns true if this value is a NativeError.
   */
1349
  bool IsNativeError() const;
1350

1351 1352 1353
  /**
   * Returns true if this value is a RegExp.
   */
1354
  bool IsRegExp() const;
1355

1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374

  /**
   * Returns true if this value is an ArrayBuffer.
   * This is an experimental feature.
   */
  bool IsArrayBuffer() const;

  /**
   * Returns true if this value is one of TypedArrays.
   * This is an experimental feature.
   */
  bool IsTypedArray() const;

  /**
   * Returns true if this value is an Uint8Array.
   * This is an experimental feature.
   */
  bool IsUint8Array() const;

1375 1376 1377 1378 1379 1380
  /**
   * Returns true if this value is an Uint8ClampedArray.
   * This is an experimental feature.
   */
  bool IsUint8ClampedArray() const;

1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
  /**
   * Returns true if this value is an Int8Array.
   * This is an experimental feature.
   */
  bool IsInt8Array() const;

  /**
   * Returns true if this value is an Uint16Array.
   * This is an experimental feature.
   */
  bool IsUint16Array() const;

  /**
   * Returns true if this value is an Int16Array.
   * This is an experimental feature.
   */
  bool IsInt16Array() const;

  /**
   * Returns true if this value is an Uint32Array.
   * This is an experimental feature.
   */
  bool IsUint32Array() const;

  /**
   * Returns true if this value is an Int32Array.
   * This is an experimental feature.
   */
  bool IsInt32Array() const;

  /**
   * Returns true if this value is a Float32Array.
   * This is an experimental feature.
   */
  bool IsFloat32Array() const;

  /**
   * Returns true if this value is a Float64Array.
   * This is an experimental feature.
   */
  bool IsFloat64Array() const;

1423 1424 1425 1426 1427 1428 1429 1430
  Local<Boolean> ToBoolean() const;
  Local<Number> ToNumber() const;
  Local<String> ToString() const;
  Local<String> ToDetailString() const;
  Local<Object> ToObject() const;
  Local<Integer> ToInteger() const;
  Local<Uint32> ToUint32() const;
  Local<Int32> ToInt32() const;
1431 1432 1433 1434 1435

  /**
   * Attempts to convert a string to an array index.
   * Returns an empty handle if the conversion fails.
   */
1436
  Local<Uint32> ToArrayIndex() const;
1437

1438 1439 1440 1441 1442
  bool BooleanValue() const;
  double NumberValue() const;
  int64_t IntegerValue() const;
  uint32_t Uint32Value() const;
  int32_t Int32Value() const;
1443 1444

  /** JS == */
1445 1446
  bool Equals(Handle<Value> that) const;
  bool StrictEquals(Handle<Value> that) const;
lrn@chromium.org's avatar
lrn@chromium.org committed
1447

dcarney@chromium.org's avatar
dcarney@chromium.org committed
1448 1449
  template <class T> V8_INLINE(static Value* Cast(T* value));

1450
 private:
1451 1452 1453
  V8_INLINE(bool QuickIsUndefined() const);
  V8_INLINE(bool QuickIsNull() const);
  V8_INLINE(bool QuickIsString() const);
1454 1455 1456
  bool FullIsUndefined() const;
  bool FullIsNull() const;
  bool FullIsString() const;
1457 1458 1459 1460 1461 1462
};


/**
 * The superclass of primitive values.  See ECMA-262 4.3.2.
 */
1463
class V8EXPORT Primitive : public Value { };
1464 1465 1466 1467 1468 1469


/**
 * A primitive boolean value (ECMA-262, 4.3.14).  Either the true
 * or false value.
 */
1470
class V8EXPORT Boolean : public Primitive {
1471
 public:
1472
  bool Value() const;
1473
  V8_INLINE(static Handle<Boolean> New(bool value));
1474 1475 1476 1477
};


/**
1478
 * A JavaScript string value (ECMA-262, 4.3.17).
1479
 */
1480
class V8EXPORT String : public Primitive {
1481
 public:
1482 1483 1484
  enum Encoding {
    UNKNOWN_ENCODING = 0x1,
    TWO_BYTE_ENCODING = 0x0,
1485 1486
    ASCII_ENCODING = 0x4,
    ONE_BYTE_ENCODING = 0x4
1487
  };
1488 1489 1490
  /**
   * Returns the number of characters in this string.
   */
1491
  int Length() const;
1492

1493 1494 1495 1496
  /**
   * Returns the number of bytes in the UTF-8 encoded
   * representation of this string.
   */
1497
  int Utf8Length() const;
1498

1499
  /**
1500
   * This function is no longer useful.
1501
   */
1502
  V8_DEPRECATED(V8_INLINE(bool MayContainNonAscii()) const) { return true; }
1503

1504
  /**
1505 1506 1507
   * Returns whether this string is known to contain only one byte data.
   * Does not read the string.
   * False negatives are possible.
1508
   */
1509
  bool IsOneByte() const;
1510

1511 1512 1513 1514 1515 1516
  /**
   * Returns whether this string contain only one byte data.
   * Will read the entire string in some cases.
   */
  bool ContainsOnlyOneByte() const;

1517 1518 1519 1520 1521 1522 1523
  /**
   * Write the contents of the string to an external buffer.
   * If no arguments are given, expects the buffer to be large
   * enough to hold the entire string and NULL terminator. Copies
   * the contents of the string and the NULL terminator into the
   * buffer.
   *
1524 1525 1526
   * WriteUtf8 will not write partial UTF-8 sequences, preferring to stop
   * before the end of the buffer.
   *
1527 1528 1529 1530 1531 1532
   * Copies up to length characters into the output buffer.
   * Only null-terminates if there is enough space in the buffer.
   *
   * \param buffer The buffer into which the string will be copied.
   * \param start The starting position within the string at which
   * copying begins.
1533 1534
   * \param length The number of characters to copy from the string.  For
   *    WriteUtf8 the number of bytes in the buffer.
1535
   * \param nchars_ref The number of characters written, can be NULL.
1536
   * \param options Various options that might affect performance of this or
1537
   *    subsequent operations.
1538 1539
   * \return The number of characters copied to the buffer excluding the null
   *    terminator.  For WriteUtf8: The number of bytes copied to the buffer
1540
   *    including the null terminator (if written).
1541
   */
1542 1543 1544
  enum WriteOptions {
    NO_OPTIONS = 0,
    HINT_MANY_WRITES_EXPECTED = 1,
1545 1546
    NO_NULL_TERMINATION = 2,
    PRESERVE_ASCII_NULL = 4
1547 1548
  };

1549
  // 16-bit character codes.
1550 1551 1552 1553
  int Write(uint16_t* buffer,
            int start = 0,
            int length = -1,
            int options = NO_OPTIONS) const;
1554
  // ASCII characters.
1555 1556 1557 1558
  V8_DEPRECATED(int WriteAscii(char* buffer,
                               int start = 0,
                               int length = -1,
                               int options = NO_OPTIONS) const);
1559
  // One byte characters.
1560
  int WriteOneByte(uint8_t* buffer,
1561 1562 1563
                   int start = 0,
                   int length = -1,
                   int options = NO_OPTIONS) const;
1564
  // UTF-8 encoded characters.
1565 1566 1567 1568
  int WriteUtf8(char* buffer,
                int length = -1,
                int* nchars_ref = NULL,
                int options = NO_OPTIONS) const;
1569

1570 1571 1572
  /**
   * A zero length string.
   */
1573
  static v8::Local<v8::String> Empty();
1574
  V8_INLINE(static v8::Local<v8::String> Empty(Isolate* isolate));
1575

1576 1577 1578
  /**
   * Returns true if the string is external
   */
1579
  bool IsExternal() const;
1580

1581
  /**
1582
   * Returns true if the string is both external and ASCII
1583
   */
1584
  bool IsExternalAscii() const;
1585

1586
  class V8EXPORT ExternalStringResourceBase {  // NOLINT
1587 1588
   public:
    virtual ~ExternalStringResourceBase() {}
1589

1590 1591
   protected:
    ExternalStringResourceBase() {}
1592 1593 1594 1595 1596 1597 1598 1599 1600

    /**
     * Internally V8 will call this Dispose method when the external string
     * resource is no longer needed. The default implementation will use the
     * delete operator. This method can be overridden in subclasses to
     * control how allocated external string resources are disposed.
     */
    virtual void Dispose() { delete this; }

1601 1602 1603 1604
   private:
    // Disallow copying and assigning.
    ExternalStringResourceBase(const ExternalStringResourceBase&);
    void operator=(const ExternalStringResourceBase&);
1605 1606

    friend class v8::internal::Heap;
1607 1608
  };

1609 1610 1611 1612
  /**
   * An ExternalStringResource is a wrapper around a two-byte string
   * buffer that resides outside V8's heap. Implement an
   * ExternalStringResource to manage the life cycle of the underlying
1613
   * buffer.  Note that the string data must be immutable.
1614
   */
1615 1616
  class V8EXPORT ExternalStringResource
      : public ExternalStringResourceBase {
1617 1618 1619 1620 1621 1622
   public:
    /**
     * Override the destructor to manage the life cycle of the underlying
     * buffer.
     */
    virtual ~ExternalStringResource() {}
1623 1624 1625 1626

    /**
     * The string data from the underlying buffer.
     */
1627
    virtual const uint16_t* data() const = 0;
1628 1629 1630 1631

    /**
     * The length of the string. That is, the number of two-byte characters.
     */
1632
    virtual size_t length() const = 0;
1633

1634 1635 1636 1637 1638
   protected:
    ExternalStringResource() {}
  };

  /**
1639
   * An ExternalAsciiStringResource is a wrapper around an ASCII
1640 1641
   * string buffer that resides outside V8's heap. Implement an
   * ExternalAsciiStringResource to manage the life cycle of the
1642
   * underlying buffer.  Note that the string data must be immutable
1643
   * and that the data must be strict (7-bit) ASCII, not Latin-1 or
1644 1645 1646
   * UTF-8, which would require special treatment internally in the
   * engine and, in the case of UTF-8, do not allow efficient indexing.
   * Use String::New or convert to 16 bit data for non-ASCII.
1647
   */
1648

1649 1650
  class V8EXPORT ExternalAsciiStringResource
      : public ExternalStringResourceBase {
1651 1652 1653 1654 1655 1656 1657 1658
   public:
    /**
     * Override the destructor to manage the life cycle of the underlying
     * buffer.
     */
    virtual ~ExternalAsciiStringResource() {}
    /** The string data from the underlying buffer.*/
    virtual const char* data() const = 0;
1659
    /** The number of ASCII characters in the string.*/
1660 1661 1662 1663 1664
    virtual size_t length() const = 0;
   protected:
    ExternalAsciiStringResource() {}
  };

1665 1666
  typedef ExternalAsciiStringResource ExternalOneByteStringResource;

1667 1668 1669 1670 1671
  /**
   * If the string is an external string, return the ExternalStringResourceBase
   * regardless of the encoding, otherwise return NULL.  The encoding of the
   * string is returned in encoding_out.
   */
1672 1673
  V8_INLINE(ExternalStringResourceBase* GetExternalStringResourceBase(
      Encoding* encoding_out) const);
1674

1675
  /**
1676 1677
   * Get the ExternalStringResource for an external string.  Returns
   * NULL if IsExternal() doesn't return true.
1678
   */
1679
  V8_INLINE(ExternalStringResource* GetExternalStringResource() const);
1680 1681

  /**
1682
   * Get the ExternalAsciiStringResource for an external ASCII string.
1683
   * Returns NULL if IsExternalAscii() doesn't return true.
1684
   */
1685
  const ExternalAsciiStringResource* GetExternalAsciiStringResource() const;
1686

1687
  V8_INLINE(static String* Cast(v8::Value* obj));
1688

1689
  // TODO(dcarney): deprecate
1690
  /**
1691
   * Allocates a new string from either UTF-8 encoded or ASCII data.
1692 1693
   * The second parameter 'length' gives the buffer length. If omitted,
   * the function calls 'strlen' to determine the buffer length.
1694
   */
1695
  V8_INLINE(static Local<String> New(const char* data, int length = -1));
1696

1697
  // TODO(dcarney): deprecate
1698
  /** Allocates a new string from 16-bit character codes.*/
1699
  V8_INLINE(static Local<String> New(const uint16_t* data, int length = -1));
1700

1701
  // TODO(dcarney): deprecate
1702 1703 1704 1705
  /**
   * Creates an internalized string (historically called a "symbol",
   * not to be confused with ES6 symbols). Returns one if it exists already.
   */
1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730
  V8_INLINE(static Local<String> NewSymbol(const char* data, int length = -1));

  enum NewStringType {
    kNormalString, kInternalizedString, kUndetectableString
  };

  /** Allocates a new string from UTF-8 data.*/
  static Local<String> NewFromUtf8(Isolate* isolate,
                                  const char* data,
                                  NewStringType type = kNormalString,
                                  int length = -1);

  /** Allocates a new string from Latin-1 data.*/
  static Local<String> NewFromOneByte(
      Isolate* isolate,
      const uint8_t* data,
      NewStringType type = kNormalString,
      int length = -1);

  /** Allocates a new string from UTF-16 data.*/
  static Local<String> NewFromTwoByte(
      Isolate* isolate,
      const uint16_t* data,
      NewStringType type = kNormalString,
      int length = -1);
1731

1732 1733 1734 1735
  /**
   * Creates a new string by concatenating the left and the right strings
   * passed in as parameters.
   */
1736
  static Local<String> Concat(Handle<String> left, Handle<String> right);
1737

1738 1739
  /**
   * Creates a new external string using the data defined in the given
1740
   * resource. When the external string is no longer live on V8's heap the
1741 1742 1743 1744
   * resource will be disposed by calling its Dispose method. The caller of
   * this function should not otherwise delete or modify the resource. Neither
   * should the underlying buffer be deallocated or modified except through the
   * destructor of the external string resource.
1745
   */
1746
  static Local<String> NewExternal(ExternalStringResource* resource);
1747

1748 1749 1750 1751
  /**
   * Associate an external string resource with this string by transforming it
   * in place so that existing references to this string in the JavaScript heap
   * will use the external string resource. The external string resource's
1752
   * character contents need to be equivalent to this string.
1753
   * Returns true if the string has been changed to be an external string.
1754 1755
   * The string is not modified if the operation fails. See NewExternal for
   * information on the lifetime of the resource.
1756
   */
1757
  bool MakeExternal(ExternalStringResource* resource);
1758

1759
  /**
1760
   * Creates a new external string using the ASCII data defined in the given
1761
   * resource. When the external string is no longer live on V8's heap the
1762 1763 1764 1765
   * resource will be disposed by calling its Dispose method. The caller of
   * this function should not otherwise delete or modify the resource. Neither
   * should the underlying buffer be deallocated or modified except through the
   * destructor of the external string resource.
1766 1767
   */
  static Local<String> NewExternal(ExternalAsciiStringResource* resource);
1768

1769 1770 1771 1772
  /**
   * Associate an external string resource with this string by transforming it
   * in place so that existing references to this string in the JavaScript heap
   * will use the external string resource. The external string resource's
1773
   * character contents need to be equivalent to this string.
1774
   * Returns true if the string has been changed to be an external string.
1775 1776
   * The string is not modified if the operation fails. See NewExternal for
   * information on the lifetime of the resource.
1777
   */
1778
  bool MakeExternal(ExternalAsciiStringResource* resource);
1779

1780 1781 1782
  /**
   * Returns true if this string can be made external.
   */
1783
  bool CanMakeExternal();
1784

1785
  // TODO(dcarney): deprecate
1786
  /** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/
1787 1788
  V8_INLINE(
      static Local<String> NewUndetectable(const char* data, int length = -1));
1789

1790
  // TODO(dcarney): deprecate
1791
  /** Creates an undetectable string from the supplied 16-bit character codes.*/
1792 1793
  V8_INLINE(static Local<String> NewUndetectable(
      const uint16_t* data, int length = -1));
1794

1795
  /**
1796
   * Converts an object to a UTF-8-encoded character array.  Useful if
1797
   * you want to print the object.  If conversion to a string fails
1798
   * (e.g. due to an exception in the toString() method of the object)
1799 1800
   * then the length() method returns 0 and the * operator returns
   * NULL.
1801
   */
1802
  class V8EXPORT Utf8Value {
1803 1804 1805
   public:
    explicit Utf8Value(Handle<v8::Value> obj);
    ~Utf8Value();
1806 1807 1808
    char* operator*() { return str_; }
    const char* operator*() const { return str_; }
    int length() const { return length_; }
1809 1810 1811
   private:
    char* str_;
    int length_;
1812 1813 1814 1815

    // Disallow copying and assigning.
    Utf8Value(const Utf8Value&);
    void operator=(const Utf8Value&);
1816 1817
  };

1818
  /**
1819
   * Converts an object to an ASCII string.
1820
   * Useful if you want to print the object.
1821 1822 1823
   * If conversion to a string fails (eg. due to an exception in the toString()
   * method of the object) then the length() method returns 0 and the * operator
   * returns NULL.
1824
   */
1825
  class V8EXPORT AsciiValue {
1826
   public:
1827
    // TODO(dcarney): deprecate
1828 1829
    explicit AsciiValue(Handle<v8::Value> obj);
    ~AsciiValue();
1830 1831 1832
    char* operator*() { return str_; }
    const char* operator*() const { return str_; }
    int length() const { return length_; }
1833 1834
   private:
    char* str_;
1835
    int length_;
1836 1837 1838 1839

    // Disallow copying and assigning.
    AsciiValue(const AsciiValue&);
    void operator=(const AsciiValue&);
1840 1841 1842 1843
  };

  /**
   * Converts an object to a two-byte string.
1844 1845 1846
   * If conversion to a string fails (eg. due to an exception in the toString()
   * method of the object) then the length() method returns 0 and the * operator
   * returns NULL.
1847
   */
1848
  class V8EXPORT Value {
1849 1850 1851
   public:
    explicit Value(Handle<v8::Value> obj);
    ~Value();
1852 1853
    uint16_t* operator*() { return str_; }
    const uint16_t* operator*() const { return str_; }
1854
    int length() const { return length_; }
1855 1856
   private:
    uint16_t* str_;
1857
    int length_;
1858 1859 1860 1861

    // Disallow copying and assigning.
    Value(const Value&);
    void operator=(const Value&);
1862
  };
lrn@chromium.org's avatar
lrn@chromium.org committed
1863

1864
 private:
1865 1866 1867 1868
  void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
                                        Encoding encoding) const;
  void VerifyExternalStringResource(ExternalStringResource* val) const;
  static void CheckCast(v8::Value* obj);
1869 1870 1871
};


1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894
/**
 * A JavaScript symbol (ECMA-262 edition 6)
 *
 * This is an experimental feature. Use at your own risk.
 */
class V8EXPORT Symbol : public Primitive {
 public:
  // Returns the print name string of the symbol, or undefined if none.
  Local<Value> Name() const;

  // Create a symbol without a print name.
  static Local<Symbol> New(Isolate* isolate);

  // Create a symbol with a print name.
  static Local<Symbol> New(Isolate *isolate, const char* data, int length = -1);

  V8_INLINE(static Symbol* Cast(v8::Value* obj));
 private:
  Symbol();
  static void CheckCast(v8::Value* obj);
};


1895
/**
1896
 * A JavaScript number value (ECMA-262, 4.3.20)
1897
 */
1898
class V8EXPORT Number : public Primitive {
1899
 public:
1900 1901
  double Value() const;
  static Local<Number> New(double value);
1902
  static Local<Number> New(Isolate* isolate, double value);
1903
  V8_INLINE(static Number* Cast(v8::Value* obj));
1904
 private:
1905 1906
  Number();
  static void CheckCast(v8::Value* obj);
1907 1908 1909 1910
};


/**
1911
 * A JavaScript value representing a signed integer.
1912
 */
1913
class V8EXPORT Integer : public Number {
1914
 public:
1915 1916 1917 1918 1919
  static Local<Integer> New(int32_t value);
  static Local<Integer> NewFromUnsigned(uint32_t value);
  static Local<Integer> New(int32_t value, Isolate*);
  static Local<Integer> NewFromUnsigned(uint32_t value, Isolate*);
  int64_t Value() const;
1920
  V8_INLINE(static Integer* Cast(v8::Value* obj));
1921
 private:
1922 1923
  Integer();
  static void CheckCast(v8::Value* obj);
1924 1925 1926 1927
};


/**
1928
 * A JavaScript value representing a 32-bit signed integer.
1929
 */
1930
class V8EXPORT Int32 : public Integer {
1931
 public:
1932
  int32_t Value() const;
1933
 private:
1934
  Int32();
1935 1936 1937 1938
};


/**
1939
 * A JavaScript value representing a 32-bit unsigned integer.
1940
 */
1941
class V8EXPORT Uint32 : public Integer {
1942
 public:
1943
  uint32_t Value() const;
1944
 private:
1945
  Uint32();
1946 1947 1948 1949 1950 1951 1952 1953 1954 1955
};


enum PropertyAttribute {
  None       = 0,
  ReadOnly   = 1 << 0,
  DontEnum   = 1 << 1,
  DontDelete = 1 << 2
};

1956 1957 1958 1959 1960 1961 1962
enum ExternalArrayType {
  kExternalByteArray = 1,
  kExternalUnsignedByteArray,
  kExternalShortArray,
  kExternalUnsignedShortArray,
  kExternalIntArray,
  kExternalUnsignedIntArray,
1963
  kExternalFloatArray,
1964
  kExternalDoubleArray,
1965
  kExternalPixelArray
1966 1967
};

1968 1969 1970 1971 1972 1973 1974
/**
 * Accessor[Getter|Setter] are used as callback functions when
 * setting|getting a particular property. See Object and ObjectTemplate's
 * method SetAccessor.
 */
typedef Handle<Value> (*AccessorGetter)(Local<String> property,
                                        const AccessorInfo& info);
1975 1976 1977
typedef void (*AccessorGetterCallback)(
    Local<String> property,
    const PropertyCallbackInfo<Value>& info);
1978 1979 1980 1981 1982


typedef void (*AccessorSetter)(Local<String> property,
                               Local<Value> value,
                               const AccessorInfo& info);
1983 1984 1985 1986
typedef void (*AccessorSetterCallback)(
    Local<String> property,
    Local<Value> value,
    const PropertyCallbackInfo<void>& info);
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009


/**
 * Access control specifications.
 *
 * Some accessors should be accessible across contexts.  These
 * accessors have an explicit access control parameter which specifies
 * the kind of cross-context access that should be allowed.
 *
 * Additionally, for security, accessors can prohibit overwriting by
 * accessors defined in JavaScript.  For objects that have such
 * accessors either locally or in their prototype chain it is not
 * possible to overwrite the accessor by using __defineGetter__ or
 * __defineSetter__ from JavaScript code.
 */
enum AccessControl {
  DEFAULT               = 0,
  ALL_CAN_READ          = 1,
  ALL_CAN_WRITE         = 1 << 1,
  PROHIBITS_OVERWRITING = 1 << 2
};


2010
/**
2011
 * A JavaScript object (ECMA-262, 4.3.3)
2012
 */
2013
class V8EXPORT Object : public Value {
2014
 public:
2015 2016 2017
  bool Set(Handle<Value> key,
           Handle<Value> value,
           PropertyAttribute attribs = None);
christian.plesner.hansen@gmail.com's avatar
christian.plesner.hansen@gmail.com committed
2018

2019
  bool Set(uint32_t index, Handle<Value> value);
2020

2021
  // Sets a local property on this object bypassing interceptors and
christian.plesner.hansen@gmail.com's avatar
christian.plesner.hansen@gmail.com committed
2022 2023 2024 2025 2026
  // overriding accessors or read-only properties.
  //
  // Note that if the object has an interceptor the property will be set
  // locally, but since the interceptor takes precedence the local property
  // will only be returned if the interceptor doesn't return a value.
2027 2028
  //
  // Note also that this only works for named properties.
2029 2030 2031
  bool ForceSet(Handle<Value> key,
                Handle<Value> value,
                PropertyAttribute attribs = None);
2032

2033
  Local<Value> Get(Handle<Value> key);
2034

2035
  Local<Value> Get(uint32_t index);
2036

2037 2038 2039 2040 2041
  /**
   * Gets the property attributes of a property which can be None or
   * any combination of ReadOnly, DontEnum and DontDelete. Returns
   * None when the property doesn't exist.
   */
2042
  PropertyAttribute GetPropertyAttributes(Handle<Value> key);
2043

2044
  bool Has(Handle<Value> key);
2045

2046
  bool Delete(Handle<Value> key);
2047 2048 2049

  // Delete a property on this object bypassing interceptors and
  // ignoring dont-delete attributes.
2050
  bool ForceDelete(Handle<Value> key);
2051

2052
  bool Has(uint32_t index);
2053

2054
  bool Delete(uint32_t index);
2055

2056
  // TODO(dcarney): deprecate
2057 2058 2059 2060 2061 2062
  bool SetAccessor(Handle<String> name,
                   AccessorGetter getter,
                   AccessorSetter setter = 0,
                   Handle<Value> data = Handle<Value>(),
                   AccessControl settings = DEFAULT,
                   PropertyAttribute attribute = None);
2063 2064 2065 2066 2067 2068
  bool SetAccessor(Handle<String> name,
                   AccessorGetterCallback getter,
                   AccessorSetterCallback setter = 0,
                   Handle<Value> data = Handle<Value>(),
                   AccessControl settings = DEFAULT,
                   PropertyAttribute attribute = None);
2069

2070 2071 2072 2073 2074 2075
  // This function is not yet stable and should not be used at this time.
  bool SetAccessor(Handle<String> name,
                   Handle<DeclaredAccessorDescriptor> descriptor,
                   AccessControl settings = DEFAULT,
                   PropertyAttribute attribute = None);

2076 2077 2078 2079 2080 2081
  /**
   * Returns an array containing the names of the enumerable properties
   * of this object, including properties from prototype objects.  The
   * array returned by this method contains the same values as would
   * be enumerated by a for-in statement over this object.
   */
2082
  Local<Array> GetPropertyNames();
2083

2084 2085 2086 2087 2088
  /**
   * This function has the same functionality as GetPropertyNames but
   * the returned array doesn't contain the names of properties from
   * prototype objects.
   */
2089
  Local<Array> GetOwnPropertyNames();
2090

2091 2092 2093 2094 2095
  /**
   * Get the prototype object.  This does not skip objects marked to
   * be skipped by __proto__ and it does not consult the security
   * handler.
   */
2096
  Local<Value> GetPrototype();
2097

2098 2099 2100 2101 2102
  /**
   * Set the prototype object.  This does not skip objects marked to
   * be skipped by __proto__ and it does not consult the security
   * handler.
   */
2103
  bool SetPrototype(Handle<Value> prototype);
2104

2105 2106 2107 2108
  /**
   * Finds an instance of the given function template in the prototype
   * chain.
   */
2109
  Local<Object> FindInstanceInPrototypeChain(Handle<FunctionTemplate> tmpl);
2110

2111 2112 2113 2114 2115
  /**
   * Call builtin Object.prototype.toString on this object.
   * This is different from Value::ToString() that may call
   * user-defined toString function. This one does not.
   */
2116
  Local<String> ObjectProtoToString();
2117

2118 2119 2120 2121
  /**
   * Returns the function invoked as a constructor for this object.
   * May be the null value.
   */
2122
  Local<Value> GetConstructor();
2123

2124 2125 2126
  /**
   * Returns the name of the function invoked as a constructor for this object.
   */
2127
  Local<String> GetConstructorName();
2128

2129
  /** Gets the number of internal fields for this Object. */
2130
  int InternalFieldCount();
2131 2132

  /** Gets the value from an internal field. */
2133
  V8_INLINE(Local<Value> GetInternalField(int index));
2134

2135
  /** Sets the value in an internal field. */
2136
  void SetInternalField(int index, Handle<Value> value);
2137

2138 2139 2140 2141 2142
  /**
   * Gets a 2-byte-aligned native pointer from an internal field. This field
   * must have been set by SetAlignedPointerInInternalField, everything else
   * leads to undefined behavior.
   */
2143
  V8_INLINE(void* GetAlignedPointerFromInternalField(int index));
2144 2145 2146 2147 2148 2149

  /**
   * Sets a 2-byte-aligned native pointer in an internal field. To retrieve such
   * a field, GetAlignedPointerFromInternalField must be used, everything else
   * leads to undefined behavior.
   */
2150
  void SetAlignedPointerInInternalField(int index, void* value);
2151

2152
  // Testers for local properties.
2153 2154 2155 2156
  bool HasOwnProperty(Handle<String> key);
  bool HasRealNamedProperty(Handle<String> key);
  bool HasRealIndexedProperty(uint32_t index);
  bool HasRealNamedCallbackProperty(Handle<String> key);
2157 2158 2159 2160 2161

  /**
   * If result.IsEmpty() no real property was located in the prototype chain.
   * This means interceptors in the prototype chain are not called.
   */
2162
  Local<Value> GetRealNamedPropertyInPrototypeChain(Handle<String> key);
2163

2164 2165 2166 2167 2168
  /**
   * If result.IsEmpty() no real property was located on the object or
   * in the prototype chain.
   * This means interceptors in the prototype chain are not called.
   */
2169
  Local<Value> GetRealNamedProperty(Handle<String> key);
2170

2171
  /** Tests for a named lookup interceptor.*/
2172
  bool HasNamedLookupInterceptor();
2173

2174
  /** Tests for an index lookup interceptor.*/
2175
  bool HasIndexedLookupInterceptor();
2176

2177 2178 2179 2180
  /**
   * Turns on access check on the object if the object is an instance of
   * a template that has access check callbacks. If an object has no
   * access check info, the object cannot be accessed by anyone.
2181
   */
2182
  void TurnOnAccessCheck();
2183

2184
  /**
2185 2186
   * Returns the identity hash for this object. The current implementation
   * uses a hidden property on the object to store the identity hash.
2187
   *
2188
   * The return value will never be 0. Also, it is not guaranteed to be
2189
   * unique.
2190
   */
2191
  int GetIdentityHash();
2192

2193 2194 2195 2196 2197 2198
  /**
   * Access hidden properties on JavaScript objects. These properties are
   * hidden from the executing JavaScript and only accessible through the V8
   * C++ API. Hidden properties introduced by V8 internally (for example the
   * identity hash) are prefixed with "v8::".
   */
2199 2200 2201
  bool SetHiddenValue(Handle<String> key, Handle<Value> value);
  Local<Value> GetHiddenValue(Handle<String> key);
  bool DeleteHiddenValue(Handle<String> key);
lrn@chromium.org's avatar
lrn@chromium.org committed
2202

2203 2204 2205 2206 2207 2208 2209
  /**
   * Returns true if this is an instance of an api function (one
   * created from a function created from a function template) and has
   * been modified since it was created.  Note that this method is
   * conservative and may return true for objects that haven't actually
   * been modified.
   */
2210
  bool IsDirty();
2211

2212 2213 2214 2215
  /**
   * Clone this object with a fast but shallow copy.  Values will point
   * to the same values as the original object.
   */
2216
  Local<Object> Clone();
2217

2218 2219 2220
  /**
   * Returns the context in which the object was created.
   */
2221
  Local<Context> CreationContext();
2222

2223 2224 2225 2226 2227 2228 2229
  /**
   * Set the backing store of the indexed properties to be managed by the
   * embedding layer. Access to the indexed properties will follow the rules
   * spelled out in CanvasPixelArray.
   * Note: The embedding program still owns the data and needs to ensure that
   *       the backing store is preserved while V8 has a reference.
   */
2230 2231 2232 2233
  void SetIndexedPropertiesToPixelData(uint8_t* data, int length);
  bool HasIndexedPropertiesInPixelData();
  uint8_t* GetIndexedPropertiesPixelData();
  int GetIndexedPropertiesPixelDataLength();
2234

2235 2236 2237 2238 2239 2240 2241
  /**
   * Set the backing store of the indexed properties to be managed by the
   * embedding layer. Access to the indexed properties will follow the rules
   * spelled out for the CanvasArray subtypes in the WebGL specification.
   * Note: The embedding program still owns the data and needs to ensure that
   *       the backing store is preserved while V8 has a reference.
   */
2242 2243 2244 2245 2246 2247 2248
  void SetIndexedPropertiesToExternalArrayData(void* data,
                                               ExternalArrayType array_type,
                                               int number_of_elements);
  bool HasIndexedPropertiesInExternalArrayData();
  void* GetIndexedPropertiesExternalArrayData();
  ExternalArrayType GetIndexedPropertiesExternalArrayDataType();
  int GetIndexedPropertiesExternalArrayDataLength();
2249

2250 2251 2252 2253 2254
  /**
   * Checks whether a callback is set by the
   * ObjectTemplate::SetCallAsFunctionHandler method.
   * When an Object is callable this method returns true.
   */
2255
  bool IsCallable();
2256

2257
  /**
2258
   * Call an Object as a function if a callback is set by the
2259 2260
   * ObjectTemplate::SetCallAsFunctionHandler method.
   */
2261 2262 2263
  Local<Value> CallAsFunction(Handle<Object> recv,
                              int argc,
                              Handle<Value> argv[]);
2264

2265
  /**
2266
   * Call an Object as a constructor if a callback is set by the
2267 2268 2269
   * ObjectTemplate::SetCallAsFunctionHandler method.
   * Note: This method behaves like the Function::NewInstance method.
   */
2270
  Local<Value> CallAsConstructor(int argc, Handle<Value> argv[]);
2271

2272
  static Local<Object> New();
2273
  V8_INLINE(static Object* Cast(Value* obj));
2274

2275
 private:
2276 2277 2278 2279
  Object();
  static void CheckCast(Value* obj);
  Local<Value> SlowGetInternalField(int index);
  void* SlowGetAlignedPointerFromInternalField(int index);
2280 2281 2282 2283 2284 2285
};


/**
 * An instance of the built-in array constructor (ECMA-262, 15.4.2).
 */
2286
class V8EXPORT Array : public Object {
2287
 public:
2288
  uint32_t Length() const;
2289

2290 2291 2292 2293
  /**
   * Clones an element at index |index|.  Returns an empty
   * handle if cloning fails (for any reason).
   */
2294
  Local<Object> CloneElementAt(uint32_t index);
2295

2296 2297 2298 2299
  /**
   * Creates a JavaScript array with the given length. If the length
   * is negative the returned array will have length 0.
   */
2300
  static Local<Array> New(int length = 0);
2301

2302
  V8_INLINE(static Array* Cast(Value* obj));
2303
 private:
2304 2305
  Array();
  static void CheckCast(Value* obj);
2306 2307 2308 2309
};


/**
2310
 * A JavaScript function object (ECMA-262, 15.3).
2311
 */
2312
class V8EXPORT Function : public Object {
2313
 public:
2314 2315 2316 2317 2318
  Local<Object> NewInstance() const;
  Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
  Local<Value> Call(Handle<Object> recv, int argc, Handle<Value> argv[]);
  void SetName(Handle<String> name);
  Handle<Value> GetName() const;
2319

2320 2321 2322 2323 2324 2325
  /**
   * Name inferred from variable or property assignment of this function.
   * Used to facilitate debugging and profiling of JavaScript code written
   * in an OO style, where many functions are anonymous but are assigned
   * to object properties.
   */
2326
  Handle<Value> GetInferredName() const;
2327

2328 2329 2330 2331
  /**
   * Returns zero based line number of function body and
   * kLineOffsetNotFound if no information available.
   */
2332
  int GetScriptLineNumber() const;
2333 2334 2335 2336
  /**
   * Returns zero based column number of function body and
   * kLineOffsetNotFound if no information available.
   */
2337 2338 2339
  int GetScriptColumnNumber() const;
  Handle<Value> GetScriptId() const;
  ScriptOrigin GetScriptOrigin() const;
2340
  V8_INLINE(static Function* Cast(Value* obj));
2341
  static const int kLineOffsetNotFound;
2342

2343
 private:
2344 2345
  Function();
  static void CheckCast(Value* obj);
2346 2347
};

2348 2349 2350
#ifndef V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT
#define V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT 2
#endif
2351

2352 2353 2354 2355 2356 2357
/**
 * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
 * This API is experimental and may change significantly.
 */
class V8EXPORT ArrayBuffer : public Object {
 public:
2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404
  /**
   * Allocator that V8 uses to allocate |ArrayBuffer|'s memory.
   * The allocator is a global V8 setting. It should be set with
   * V8::SetArrayBufferAllocator prior to creation of a first ArrayBuffer.
   *
   * This API is experimental and may change significantly.
   */
  class V8EXPORT Allocator { // NOLINT
   public:
    virtual ~Allocator() {}

    /**
     * Allocate |length| bytes. Return NULL if allocation is not successful.
     */
    virtual void* Allocate(size_t length) = 0;
    /**
     * Free the memory pointed to |data|. That memory is guaranteed to be
     * previously allocated by |Allocate|.
     */
    virtual void Free(void* data) = 0;
  };

  /**
   * The contents of an |ArrayBuffer|. Externalization of |ArrayBuffer|
   * returns an instance of this class, populated, with a pointer to data
   * and byte length.
   *
   * The Data pointer of ArrayBuffer::Contents is always allocated with
   * Allocator::Allocate that is set with V8::SetArrayBufferAllocator.
   *
   * This API is experimental and may change significantly.
   */
  class V8EXPORT Contents { // NOLINT
   public:
    Contents() : data_(NULL), byte_length_(0) {}

    void* Data() const { return data_; }
    size_t ByteLength() const { return byte_length_; }

   private:
    void* data_;
    size_t byte_length_;

    friend class ArrayBuffer;
  };


2405 2406 2407 2408 2409 2410 2411 2412
  /**
   * Data length in bytes.
   */
  size_t ByteLength() const;

  /**
   * Create a new ArrayBuffer. Allocate |byte_length| bytes.
   * Allocated memory will be owned by a created ArrayBuffer and
2413 2414
   * will be deallocated when it is garbage-collected,
   * unless the object is externalized.
2415 2416 2417 2418 2419
   */
  static Local<ArrayBuffer> New(size_t byte_length);

  /**
   * Create a new ArrayBuffer over an existing memory block.
2420
   * The created array buffer is immediately in externalized state.
2421 2422 2423 2424 2425
   * The memory block will not be reclaimed when a created ArrayBuffer
   * is garbage-collected.
   */
  static Local<ArrayBuffer> New(void* data, size_t byte_length);

2426 2427 2428 2429 2430 2431
  /**
   * Returns true if ArrayBuffer is extrenalized, that is, does not
   * own its memory block.
   */
  bool IsExternal() const;

2432 2433 2434 2435 2436 2437 2438 2439
  /**
   * Neuters this ArrayBuffer and all its views (typed arrays).
   * Neutering sets the byte length of the buffer and all typed arrays to zero,
   * preventing JavaScript from ever accessing underlying backing store.
   * ArrayBuffer should have been externalized.
   */
  void Neuter();

2440
  /**
2441 2442 2443 2444 2445 2446 2447
   * Make this ArrayBuffer external. The pointer to underlying memory block
   * and byte length are returned as |Contents| structure. After ArrayBuffer
   * had been etxrenalized, it does no longer owns the memory block. The caller
   * should take steps to free memory when it is no longer needed.
   *
   * The memory block is guaranteed to be allocated with |Allocator::Allocate|
   * that has been set with V8::SetArrayBufferAllocator.
2448
   */
2449
  Contents Externalize();
2450

2451 2452
  V8_INLINE(static ArrayBuffer* Cast(Value* obj));

2453 2454
  static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;

2455 2456 2457 2458 2459 2460
 private:
  ArrayBuffer();
  static void CheckCast(Value* obj);
};


2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512
/**
 * A base class for an instance of TypedArray series of constructors
 * (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT TypedArray : public Object {
 public:
  /**
   * Returns underlying ArrayBuffer.
   */
  Local<ArrayBuffer> Buffer();
  /**
   * Byte offset in |Buffer|
   */
  size_t ByteOffset();
  /**
   * Numbe of elements in this typed array.
   */
  size_t Length();
  /**
   * Size of typed array in bytes (e.g. for Int16Array, 2*|Length|).
   */
  size_t ByteLength();
  /**
   * Base address of typed array.
   */
  void* BaseAddress();

  V8_INLINE(static TypedArray* Cast(Value* obj));

 private:
  TypedArray();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Uint8Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Uint8Array : public TypedArray {
 public:
  static Local<Uint8Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Uint8Array* Cast(Value* obj));

 private:
  Uint8Array();
  static void CheckCast(Value* obj);
};


2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527
/**
 * An instance of Uint8ClampedArray constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Uint8ClampedArray : public TypedArray {
 public:
  static Local<Uint8ClampedArray> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Uint8ClampedArray* Cast(Value* obj));

 private:
  Uint8ClampedArray();
  static void CheckCast(Value* obj);
};

2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639
/**
 * An instance of Int8Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Int8Array : public TypedArray {
 public:
  static Local<Int8Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Int8Array* Cast(Value* obj));

 private:
  Int8Array();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Uint16Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Uint16Array : public TypedArray {
 public:
  static Local<Uint16Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Uint16Array* Cast(Value* obj));

 private:
  Uint16Array();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Int16Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Int16Array : public TypedArray {
 public:
  static Local<Int16Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Int16Array* Cast(Value* obj));

 private:
  Int16Array();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Uint32Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Uint32Array : public TypedArray {
 public:
  static Local<Uint32Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Uint32Array* Cast(Value* obj));

 private:
  Uint32Array();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Int32Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Int32Array : public TypedArray {
 public:
  static Local<Int32Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Int32Array* Cast(Value* obj));

 private:
  Int32Array();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Float32Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Float32Array : public TypedArray {
 public:
  static Local<Float32Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Float32Array* Cast(Value* obj));

 private:
  Float32Array();
  static void CheckCast(Value* obj);
};


/**
 * An instance of Float64Array constructor (ES6 draft 15.13.6).
 * This API is experimental and may change significantly.
 */
class V8EXPORT Float64Array : public TypedArray {
 public:
  static Local<Float64Array> New(Handle<ArrayBuffer> array_buffer,
                               size_t byte_offset, size_t length);
  V8_INLINE(static Float64Array* Cast(Value* obj));

 private:
  Float64Array();
  static void CheckCast(Value* obj);
};


2640 2641 2642
/**
 * An instance of the built-in Date constructor (ECMA-262, 15.9).
 */
2643
class V8EXPORT Date : public Object {
2644
 public:
2645
  static Local<Value> New(double time);
2646 2647 2648 2649 2650

  /**
   * A specialization of Value::NumberValue that is more efficient
   * because we know the structure of this object.
   */
2651
  double NumberValue() const;
2652

2653
  V8_INLINE(static Date* Cast(v8::Value* obj));
2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666

  /**
   * Notification that the embedder has changed the time zone,
   * daylight savings time, or other date / time configuration
   * parameters.  V8 keeps a cache of various values used for
   * date / time computation.  This notification will reset
   * those cached values for the current context so that date /
   * time configuration changes would be reflected in the Date
   * object.
   *
   * This API should not be called more than needed as it will
   * negatively impact the performance of date operations.
   */
2667
  static void DateTimeConfigurationChangeNotification();
2668 2669

 private:
2670
  static void CheckCast(v8::Value* obj);
2671 2672 2673
};


2674 2675 2676
/**
 * A Number object (ECMA-262, 4.3.21).
 */
2677
class V8EXPORT NumberObject : public Object {
2678
 public:
2679
  static Local<Value> New(double value);
2680 2681 2682 2683

  /**
   * Returns the Number held by the object.
   */
2684
  double NumberValue() const;
2685

2686
  V8_INLINE(static NumberObject* Cast(v8::Value* obj));
2687 2688

 private:
2689
  static void CheckCast(v8::Value* obj);
2690 2691 2692 2693 2694 2695
};


/**
 * A Boolean object (ECMA-262, 4.3.15).
 */
2696
class V8EXPORT BooleanObject : public Object {
2697
 public:
2698
  static Local<Value> New(bool value);
2699 2700 2701 2702

  /**
   * Returns the Boolean held by the object.
   */
2703
  bool BooleanValue() const;
2704

2705
  V8_INLINE(static BooleanObject* Cast(v8::Value* obj));
2706 2707

 private:
2708
  static void CheckCast(v8::Value* obj);
2709 2710 2711 2712 2713 2714
};


/**
 * A String object (ECMA-262, 4.3.18).
 */
2715
class V8EXPORT StringObject : public Object {
2716
 public:
2717
  static Local<Value> New(Handle<String> value);
2718 2719 2720 2721

  /**
   * Returns the String held by the object.
   */
2722
  Local<String> StringValue() const;
2723

2724
  V8_INLINE(static StringObject* Cast(v8::Value* obj));
2725 2726

 private:
2727
  static void CheckCast(v8::Value* obj);
2728 2729 2730
};


2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751
/**
 * A Symbol object (ECMA-262 edition 6).
 *
 * This is an experimental feature. Use at your own risk.
 */
class V8EXPORT SymbolObject : public Object {
 public:
  static Local<Value> New(Isolate* isolate, Handle<Symbol> value);

  /**
   * Returns the Symbol held by the object.
   */
  Local<Symbol> SymbolValue() const;

  V8_INLINE(static SymbolObject* Cast(v8::Value* obj));

 private:
  static void CheckCast(v8::Value* obj);
};


2752 2753 2754
/**
 * An instance of the built-in RegExp constructor (ECMA-262, 15.10).
 */
2755
class V8EXPORT RegExp : public Object {
2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777
 public:
  /**
   * Regular expression flag bits. They can be or'ed to enable a set
   * of flags.
   */
  enum Flags {
    kNone = 0,
    kGlobal = 1,
    kIgnoreCase = 2,
    kMultiline = 4
  };

  /**
   * Creates a regular expression from the given pattern string and
   * the flags bit field. May throw a JavaScript exception as
   * described in ECMA-262, 15.10.4.1.
   *
   * For example,
   *   RegExp::New(v8::String::New("foo"),
   *               static_cast<RegExp::Flags>(kGlobal | kMultiline))
   * is equivalent to evaluating "/foo/gm".
   */
2778
  static Local<RegExp> New(Handle<String> pattern, Flags flags);
2779 2780 2781 2782 2783

  /**
   * Returns the value of the source property: a string representing
   * the regular expression.
   */
2784
  Local<String> GetSource() const;
2785 2786 2787 2788

  /**
   * Returns the flags bit field.
   */
2789
  Flags GetFlags() const;
2790

2791
  V8_INLINE(static RegExp* Cast(v8::Value* obj));
2792 2793

 private:
2794
  static void CheckCast(v8::Value* obj);
2795 2796 2797
};


2798
/**
2799 2800
 * A JavaScript value that wraps a C++ void*. This type of value is mainly used
 * to associate C++ data structures with JavaScript objects.
2801
 */
2802
class V8EXPORT External : public Value {
2803
 public:
2804
  static Local<External> New(void* value);
2805
  V8_INLINE(static External* Cast(Value* obj));
2806
  void* Value() const;
2807
 private:
2808
  static void CheckCast(v8::Value* obj);
2809 2810 2811
};


2812
// --- Templates ---
2813 2814 2815 2816 2817


/**
 * The superclass of object and function templates.
 */
2818
class V8EXPORT Template : public Data {
2819 2820 2821 2822
 public:
  /** Adds a property to each instance created by this template.*/
  void Set(Handle<String> name, Handle<Data> value,
           PropertyAttribute attributes = None);
2823
  V8_INLINE(void Set(const char* name, Handle<Data> value));
2824 2825 2826 2827 2828 2829 2830 2831
 private:
  Template();

  friend class ObjectTemplate;
  friend class FunctionTemplate;
};


2832
template<typename T>
2833
class ReturnValue {
2834
 public:
2835 2836 2837
  template <class S> V8_INLINE(ReturnValue(const ReturnValue<S>& that))
      : value_(that.value_) {
    TYPE_CHECK(T, S);
2838
  }
2839
  // Handle setters
2840 2841
  template <typename S> V8_INLINE(void Set(const Persistent<S>& handle));
  template <typename S> V8_INLINE(void Set(const Handle<S> handle));
2842
  // Fast primitive setters
2843 2844 2845 2846
  V8_INLINE(void Set(bool value));
  V8_INLINE(void Set(double i));
  V8_INLINE(void Set(int32_t i));
  V8_INLINE(void Set(uint32_t i));
2847
  // Fast JS primitive setters
2848 2849
  V8_INLINE(void SetNull());
  V8_INLINE(void SetUndefined());
2850
  V8_INLINE(void SetEmptyString());
2851 2852
  // Convenience getter for Isolate
  V8_INLINE(Isolate* GetIsolate());
2853

2854
 private:
2855 2856 2857
  template<class F> friend class ReturnValue;
  template<class F> friend class FunctionCallbackInfo;
  template<class F> friend class PropertyCallbackInfo;
2858
  V8_INLINE(internal::Object* GetDefaultValue());
2859
  V8_INLINE(explicit ReturnValue(internal::Object** slot));
2860 2861 2862 2863
  internal::Object** value_;
};


2864 2865
/**
 * The argument information given to function call callbacks.  This
2866
 * class provides access to information about the context of the call,
2867 2868 2869
 * including the receiver, the number and values of arguments, and
 * the holder of the function.
 */
2870
template<typename T>
2871
class FunctionCallbackInfo {
2872
 public:
2873 2874 2875 2876 2877 2878 2879 2880
  V8_INLINE(int Length() const);
  V8_INLINE(Local<Value> operator[](int i) const);
  V8_INLINE(Local<Function> Callee() const);
  V8_INLINE(Local<Object> This() const);
  V8_INLINE(Local<Object> Holder() const);
  V8_INLINE(bool IsConstructCall() const);
  V8_INLINE(Local<Value> Data() const);
  V8_INLINE(Isolate* GetIsolate() const);
2881 2882
  V8_INLINE(ReturnValue<T> GetReturnValue() const);
  // This shouldn't be public, but the arm compiler needs it.
2883
  static const int kArgsLength = 6;
2884

2885 2886 2887 2888
 protected:
  friend class internal::FunctionCallbackArguments;
  friend class internal::CustomArguments<FunctionCallbackInfo>;
  static const int kReturnValueIndex = 0;
2889 2890 2891 2892 2893
  static const int kReturnValueDefaultValueIndex = -1;
  static const int kIsolateIndex = -2;
  static const int kDataIndex = -3;
  static const int kCalleeIndex = -4;
  static const int kHolderIndex = -5;
2894 2895

  V8_INLINE(FunctionCallbackInfo(internal::Object** implicit_args,
2896 2897
                   internal::Object** values,
                   int length,
2898
                   bool is_construct_call));
2899 2900
  internal::Object** implicit_args_;
  internal::Object** values_;
2901
  int length_;
2902
  bool is_construct_call_;
2903 2904 2905
};


2906 2907 2908 2909 2910 2911 2912 2913 2914
class V8EXPORT Arguments : public FunctionCallbackInfo<Value> {
 private:
  friend class internal::FunctionCallbackArguments;
  V8_INLINE(Arguments(internal::Object** implicit_args,
                      internal::Object** values,
                      int length,
                      bool is_construct_call));
};

2915
/**
2916
 * The information passed to a property callback about the context
2917 2918
 * of the property access.
 */
2919
template<typename T>
2920
class PropertyCallbackInfo {
2921
 public:
2922 2923 2924 2925
  V8_INLINE(Isolate* GetIsolate() const);
  V8_INLINE(Local<Value> Data() const);
  V8_INLINE(Local<Object> This() const);
  V8_INLINE(Local<Object> Holder() const);
2926 2927
  V8_INLINE(ReturnValue<T> GetReturnValue() const);
  // This shouldn't be public, but the arm compiler needs it.
2928
  static const int kArgsLength = 6;
2929

2930 2931 2932 2933 2934 2935 2936
 protected:
  friend class MacroAssembler;
  friend class internal::PropertyCallbackArguments;
  friend class internal::CustomArguments<PropertyCallbackInfo>;
  static const int kThisIndex = 0;
  static const int kHolderIndex = -1;
  static const int kDataIndex = -2;
2937
  static const int kReturnValueIndex = -3;
2938 2939
  static const int kReturnValueDefaultValueIndex = -4;
  static const int kIsolateIndex = -5;
2940 2941 2942

  V8_INLINE(PropertyCallbackInfo(internal::Object** args))
      : args_(args) { }
2943
  internal::Object** args_;
2944 2945 2946
};


2947 2948 2949 2950 2951 2952 2953 2954
class V8EXPORT AccessorInfo : public PropertyCallbackInfo<Value> {
 private:
  friend class internal::PropertyCallbackArguments;
  V8_INLINE(AccessorInfo(internal::Object** args))
      : PropertyCallbackInfo<Value>(args) { }
};


2955
typedef Handle<Value> (*InvocationCallback)(const Arguments& args);
2956
typedef void (*FunctionCallback)(const FunctionCallbackInfo<Value>& info);
2957 2958 2959 2960 2961 2962 2963

/**
 * NamedProperty[Getter|Setter] are used as interceptors on object.
 * See ObjectTemplate::SetNamedPropertyHandler.
 */
typedef Handle<Value> (*NamedPropertyGetter)(Local<String> property,
                                             const AccessorInfo& info);
2964 2965 2966
typedef void (*NamedPropertyGetterCallback)(
    Local<String> property,
    const PropertyCallbackInfo<Value>& info);
2967 2968 2969 2970 2971 2972 2973 2974 2975


/**
 * Returns the value if the setter intercepts the request.
 * Otherwise, returns an empty handle.
 */
typedef Handle<Value> (*NamedPropertySetter)(Local<String> property,
                                             Local<Value> value,
                                             const AccessorInfo& info);
2976 2977 2978 2979 2980
typedef void (*NamedPropertySetterCallback)(
    Local<String> property,
    Local<Value> value,
    const PropertyCallbackInfo<Value>& info);

2981 2982 2983

/**
 * Returns a non-empty handle if the interceptor intercepts the request.
2984 2985
 * The result is an integer encoding property attributes (like v8::None,
 * v8::DontEnum, etc.)
2986
 */
2987 2988
typedef Handle<Integer> (*NamedPropertyQuery)(Local<String> property,
                                              const AccessorInfo& info);
2989 2990 2991
typedef void (*NamedPropertyQueryCallback)(
    Local<String> property,
    const PropertyCallbackInfo<Integer>& info);
2992 2993 2994 2995


/**
 * Returns a non-empty handle if the deleter intercepts the request.
2996 2997
 * The return value is true if the property could be deleted and false
 * otherwise.
2998 2999 3000
 */
typedef Handle<Boolean> (*NamedPropertyDeleter)(Local<String> property,
                                                const AccessorInfo& info);
3001 3002 3003 3004
typedef void (*NamedPropertyDeleterCallback)(
    Local<String> property,
    const PropertyCallbackInfo<Boolean>& info);

3005 3006

/**
3007 3008
 * Returns an array containing the names of the properties the named
 * property getter intercepts.
3009 3010
 */
typedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info);
3011 3012
typedef void (*NamedPropertyEnumeratorCallback)(
    const PropertyCallbackInfo<Array>& info);
3013

3014

3015
/**
3016 3017
 * Returns the value of the property if the getter intercepts the
 * request.  Otherwise, returns an empty handle.
3018 3019 3020
 */
typedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index,
                                               const AccessorInfo& info);
3021 3022 3023
typedef void (*IndexedPropertyGetterCallback)(
    uint32_t index,
    const PropertyCallbackInfo<Value>& info);
3024 3025 3026 3027 3028 3029 3030 3031 3032


/**
 * Returns the value if the setter intercepts the request.
 * Otherwise, returns an empty handle.
 */
typedef Handle<Value> (*IndexedPropertySetter)(uint32_t index,
                                               Local<Value> value,
                                               const AccessorInfo& info);
3033 3034 3035 3036
typedef void (*IndexedPropertySetterCallback)(
    uint32_t index,
    Local<Value> value,
    const PropertyCallbackInfo<Value>& info);
3037 3038 3039 3040


/**
 * Returns a non-empty handle if the interceptor intercepts the request.
3041
 * The result is an integer encoding property attributes.
3042
 */
3043 3044
typedef Handle<Integer> (*IndexedPropertyQuery)(uint32_t index,
                                                const AccessorInfo& info);
3045 3046 3047 3048
typedef void (*IndexedPropertyQueryCallback)(
    uint32_t index,
    const PropertyCallbackInfo<Integer>& info);

3049 3050 3051

/**
 * Returns a non-empty handle if the deleter intercepts the request.
3052 3053
 * The return value is true if the property could be deleted and false
 * otherwise.
3054 3055 3056
 */
typedef Handle<Boolean> (*IndexedPropertyDeleter)(uint32_t index,
                                                  const AccessorInfo& info);
3057 3058 3059 3060
typedef void (*IndexedPropertyDeleterCallback)(
    uint32_t index,
    const PropertyCallbackInfo<Boolean>& info);

3061

3062 3063 3064 3065
/**
 * Returns an array containing the indices of the properties the
 * indexed property getter intercepts.
 */
3066
typedef Handle<Array> (*IndexedPropertyEnumerator)(const AccessorInfo& info);
3067 3068
typedef void (*IndexedPropertyEnumeratorCallback)(
    const PropertyCallbackInfo<Array>& info);
3069 3070 3071


/**
3072
 * Access type specification.
3073 3074 3075 3076 3077 3078 3079 3080 3081
 */
enum AccessType {
  ACCESS_GET,
  ACCESS_SET,
  ACCESS_HAS,
  ACCESS_DELETE,
  ACCESS_KEYS
};

3082

3083 3084
/**
 * Returns true if cross-context access should be allowed to the named
3085
 * property with the given key on the host object.
3086
 */
3087
typedef bool (*NamedSecurityCallback)(Local<Object> host,
3088 3089 3090 3091
                                      Local<Value> key,
                                      AccessType type,
                                      Local<Value> data);

3092 3093 3094

/**
 * Returns true if cross-context access should be allowed to the indexed
3095
 * property with the given index on the host object.
3096
 */
3097
typedef bool (*IndexedSecurityCallback)(Local<Object> host,
3098 3099 3100 3101 3102 3103
                                        uint32_t index,
                                        AccessType type,
                                        Local<Value> data);


/**
3104
 * A FunctionTemplate is used to create functions at runtime. There
3105
 * can only be one function created from a FunctionTemplate in a
3106 3107 3108 3109
 * context.  The lifetime of the created function is equal to the
 * lifetime of the context.  So in case the embedder needs to create
 * temporary functions that can be collected using Scripts is
 * preferred.
3110 3111
 *
 * A FunctionTemplate can have properties, these properties are added to the
3112
 * function object when it is created.
3113
 *
3114 3115 3116 3117
 * A FunctionTemplate has a corresponding instance template which is
 * used to create object instances when the function is used as a
 * constructor. Properties added to the instance template are added to
 * each object instance.
3118 3119 3120 3121
 *
 * A FunctionTemplate can have a prototype template. The prototype template
 * is used to create the prototype object of the function.
 *
3122
 * The following example shows how to use a FunctionTemplate:
3123
 *
3124
 * \code
3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138
 *    v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
 *    t->Set("func_property", v8::Number::New(1));
 *
 *    v8::Local<v8::Template> proto_t = t->PrototypeTemplate();
 *    proto_t->Set("proto_method", v8::FunctionTemplate::New(InvokeCallback));
 *    proto_t->Set("proto_const", v8::Number::New(2));
 *
 *    v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate();
 *    instance_t->SetAccessor("instance_accessor", InstanceAccessorCallback);
 *    instance_t->SetNamedPropertyHandler(PropertyHandlerCallback, ...);
 *    instance_t->Set("instance_property", Number::New(3));
 *
 *    v8::Local<v8::Function> function = t->GetFunction();
 *    v8::Local<v8::Object> instance = function->NewInstance();
3139
 * \endcode
3140 3141
 *
 * Let's use "function" as the JS variable name of the function object
3142 3143
 * and "instance" for the instance object created above.  The function
 * and the instance will have the following properties:
3144
 *
3145 3146 3147
 * \code
 *   func_property in function == true;
 *   function.func_property == 1;
3148
 *
3149 3150
 *   function.prototype.proto_method() invokes 'InvokeCallback'
 *   function.prototype.proto_const == 2;
3151
 *
3152 3153 3154 3155
 *   instance instanceof function == true;
 *   instance.instance_accessor calls 'InstanceAccessorCallback'
 *   instance.instance_property == 3;
 * \endcode
3156
 *
3157 3158 3159
 * A FunctionTemplate can inherit from another one by calling the
 * FunctionTemplate::Inherit method.  The following graph illustrates
 * the semantics of inheritance:
3160
 *
3161 3162 3163 3164 3165 3166 3167
 * \code
 *   FunctionTemplate Parent  -> Parent() . prototype -> { }
 *     ^                                                  ^
 *     | Inherit(Parent)                                  | .__proto__
 *     |                                                  |
 *   FunctionTemplate Child   -> Child()  . prototype -> { }
 * \endcode
3168
 *
3169 3170 3171 3172
 * A FunctionTemplate 'Child' inherits from 'Parent', the prototype
 * object of the Child() function has __proto__ pointing to the
 * Parent() function's prototype object. An instance of the Child
 * function has all properties on Parent's instance templates.
3173
 *
3174 3175
 * Let Parent be the FunctionTemplate initialized in the previous
 * section and create a Child FunctionTemplate by:
3176
 *
3177
 * \code
3178 3179 3180 3181 3182 3183
 *   Local<FunctionTemplate> parent = t;
 *   Local<FunctionTemplate> child = FunctionTemplate::New();
 *   child->Inherit(parent);
 *
 *   Local<Function> child_function = child->GetFunction();
 *   Local<Object> child_instance = child_function->NewInstance();
3184 3185 3186 3187
 * \endcode
 *
 * The Child function and Child instance will have the following
 * properties:
3188
 *
3189
 * \code
3190
 *   child_func.prototype.__proto__ == function.prototype;
3191
 *   child_instance.instance_accessor calls 'InstanceAccessorCallback'
3192
 *   child_instance.instance_property == 3;
3193
 * \endcode
3194
 */
3195
class V8EXPORT FunctionTemplate : public Template {
3196 3197
 public:
  /** Creates a function template.*/
3198
  // TODO(dcarney): deprecate
3199 3200 3201
  static Local<FunctionTemplate> New(
      InvocationCallback callback = 0,
      Handle<Value> data = Handle<Value>(),
3202 3203
      Handle<Signature> signature = Handle<Signature>(),
      int length = 0);
3204 3205 3206 3207 3208 3209
  static Local<FunctionTemplate> New(
      FunctionCallback callback,  // TODO(dcarney): add back default param.
      Handle<Value> data = Handle<Value>(),
      Handle<Signature> signature = Handle<Signature>(),
      int length = 0);

3210 3211 3212
  /** Returns the unique function instance in the current execution context.*/
  Local<Function> GetFunction();

3213 3214 3215 3216 3217
  /**
   * Set the call-handler callback for a FunctionTemplate.  This
   * callback is called whenever the function created from this
   * FunctionTemplate is called.
   */
3218
  // TODO(dcarney): deprecate
3219 3220
  void SetCallHandler(InvocationCallback callback,
                      Handle<Value> data = Handle<Value>());
3221 3222
  void SetCallHandler(FunctionCallback callback,
                      Handle<Value> data = Handle<Value>());
3223

3224 3225 3226
  /** Set the predefined length property for the FunctionTemplate. */
  void SetLength(int length);

3227
  /** Get the InstanceTemplate. */
3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238
  Local<ObjectTemplate> InstanceTemplate();

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

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

3239 3240 3241 3242 3243
  /**
   * Set the class name of the FunctionTemplate.  This is used for
   * printing objects created with the function created from the
   * FunctionTemplate as its constructor.
   */
3244 3245 3246
  void SetClassName(Handle<String> name);

  /**
3247 3248 3249 3250 3251 3252 3253 3254 3255 3256
   * Determines whether the __proto__ accessor ignores instances of
   * the function template.  If instances of the function template are
   * ignored, __proto__ skips all instances and instead returns the
   * next object in the prototype chain.
   *
   * Call with a value of true to make the __proto__ accessor ignore
   * instances of the function template.  Call with a value of false
   * to make the __proto__ accessor not ignore instances of the
   * function template.  By default, instances of a function template
   * are not ignored.
3257 3258 3259
   */
  void SetHiddenPrototype(bool value);

3260
  /**
3261 3262
   * Sets the ReadOnly flag in the attributes of the 'prototype' property
   * of functions created from this FunctionTemplate to true.
3263
   */
3264
  void ReadOnlyPrototype();
3265

3266
  /**
3267 3268
   * Returns true if the given object is an instance of this function
   * template.
3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279
   */
  bool HasInstance(Handle<Value> object);

 private:
  FunctionTemplate();
  friend class Context;
  friend class ObjectTemplate;
};


/**
3280 3281 3282 3283
 * An ObjectTemplate is used to create objects at runtime.
 *
 * Properties added to an ObjectTemplate are added to each object
 * created from the ObjectTemplate.
3284
 */
3285
class V8EXPORT ObjectTemplate : public Template {
3286
 public:
3287
  /** Creates an ObjectTemplate. */
3288
  static Local<ObjectTemplate> New();
3289

3290 3291 3292 3293 3294
  /** Creates a new instance of this template.*/
  Local<Object> NewInstance();

  /**
   * Sets an accessor on the object template.
3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308
   *
   * Whenever the property with the given name is accessed on objects
   * created from this ObjectTemplate the getter and setter callbacks
   * are called instead of getting and setting the property directly
   * on the JavaScript object.
   *
   * \param name The name of the property for which an accessor is added.
   * \param getter The callback to invoke when getting the property.
   * \param setter The callback to invoke when setting the property.
   * \param data A piece of data that will be passed to the getter and setter
   *   callbacks whenever they are invoked.
   * \param settings Access control settings for the accessor. This is a bit
   *   field consisting of one of more of
   *   DEFAULT = 0, ALL_CAN_READ = 1, or ALL_CAN_WRITE = 2.
3309 3310 3311
   *   The default is to not allow cross-context access.
   *   ALL_CAN_READ means that all cross-context reads are allowed.
   *   ALL_CAN_WRITE means that all cross-context writes are allowed.
3312
   *   The combination ALL_CAN_READ | ALL_CAN_WRITE can be used to allow all
3313
   *   cross-context access.
3314 3315
   * \param attribute The attributes of the property for which an accessor
   *   is added.
3316 3317 3318 3319 3320
   * \param signature The signature describes valid receivers for the accessor
   *   and is used to perform implicit instance checks against them. If the
   *   receiver is incompatible (i.e. is not an instance of the constructor as
   *   defined by FunctionTemplate::HasInstance()), an implicit TypeError is
   *   thrown and no callback is invoked.
3321
   */
3322
  // TODO(dcarney): deprecate
3323 3324 3325 3326 3327
  void SetAccessor(Handle<String> name,
                   AccessorGetter getter,
                   AccessorSetter setter = 0,
                   Handle<Value> data = Handle<Value>(),
                   AccessControl settings = DEFAULT,
3328 3329 3330
                   PropertyAttribute attribute = None,
                   Handle<AccessorSignature> signature =
                       Handle<AccessorSignature>());
3331 3332 3333 3334 3335 3336 3337 3338
  void SetAccessor(Handle<String> name,
                   AccessorGetterCallback getter,
                   AccessorSetterCallback setter = 0,
                   Handle<Value> data = Handle<Value>(),
                   AccessControl settings = DEFAULT,
                   PropertyAttribute attribute = None,
                   Handle<AccessorSignature> signature =
                       Handle<AccessorSignature>());
3339

3340 3341 3342 3343 3344 3345 3346 3347
  // This function is not yet stable and should not be used at this time.
  bool SetAccessor(Handle<String> name,
                   Handle<DeclaredAccessorDescriptor> descriptor,
                   AccessControl settings = DEFAULT,
                   PropertyAttribute attribute = None,
                   Handle<AccessorSignature> signature =
                       Handle<AccessorSignature>());

3348 3349
  /**
   * Sets a named property handler on the object template.
3350 3351 3352 3353 3354 3355 3356
   *
   * Whenever a named property is accessed on objects created from
   * this object template, the provided callback is invoked instead of
   * accessing the property directly on the JavaScript object.
   *
   * \param getter The callback to invoke when getting a property.
   * \param setter The callback to invoke when setting a property.
3357 3358
   * \param query The callback to invoke to check if a property is present,
   *   and if present, get its attributes.
3359 3360 3361 3362 3363
   * \param deleter The callback to invoke when deleting a property.
   * \param enumerator The callback to invoke to enumerate all the named
   *   properties of an object.
   * \param data A piece of data that will be passed to the callbacks
   *   whenever they are invoked.
3364
   */
3365
  // TODO(dcarney): deprecate
3366 3367 3368 3369 3370
  void SetNamedPropertyHandler(NamedPropertyGetter getter,
                               NamedPropertySetter setter = 0,
                               NamedPropertyQuery query = 0,
                               NamedPropertyDeleter deleter = 0,
                               NamedPropertyEnumerator enumerator = 0,
3371
                               Handle<Value> data = Handle<Value>());
3372 3373 3374 3375 3376 3377 3378
  void SetNamedPropertyHandler(
      NamedPropertyGetterCallback getter,
      NamedPropertySetterCallback setter = 0,
      NamedPropertyQueryCallback query = 0,
      NamedPropertyDeleterCallback deleter = 0,
      NamedPropertyEnumeratorCallback enumerator = 0,
      Handle<Value> data = Handle<Value>());
3379 3380 3381

  /**
   * Sets an indexed property handler on the object template.
3382 3383 3384 3385 3386 3387 3388
   *
   * Whenever an indexed property is accessed on objects created from
   * this object template, the provided callback is invoked instead of
   * accessing the property directly on the JavaScript object.
   *
   * \param getter The callback to invoke when getting a property.
   * \param setter The callback to invoke when setting a property.
3389
   * \param query The callback to invoke to check if an object has a property.
3390 3391 3392 3393 3394
   * \param deleter The callback to invoke when deleting a property.
   * \param enumerator The callback to invoke to enumerate all the indexed
   *   properties of an object.
   * \param data A piece of data that will be passed to the callbacks
   *   whenever they are invoked.
3395
   */
3396
  // TODO(dcarney): deprecate
3397 3398 3399 3400 3401
  void SetIndexedPropertyHandler(IndexedPropertyGetter getter,
                                 IndexedPropertySetter setter = 0,
                                 IndexedPropertyQuery query = 0,
                                 IndexedPropertyDeleter deleter = 0,
                                 IndexedPropertyEnumerator enumerator = 0,
3402
                                 Handle<Value> data = Handle<Value>());
3403 3404 3405 3406 3407 3408 3409
  void SetIndexedPropertyHandler(
      IndexedPropertyGetterCallback getter,
      IndexedPropertySetterCallback setter = 0,
      IndexedPropertyQueryCallback query = 0,
      IndexedPropertyDeleterCallback deleter = 0,
      IndexedPropertyEnumeratorCallback enumerator = 0,
      Handle<Value> data = Handle<Value>());
3410

3411 3412 3413
  /**
   * Sets the callback to be used when calling instances created from
   * this template as a function.  If no callback is set, instances
3414
   * behave like normal JavaScript objects that cannot be called as a
3415 3416
   * function.
   */
3417
  // TODO(dcarney): deprecate
3418 3419
  void SetCallAsFunctionHandler(InvocationCallback callback,
                                Handle<Value> data = Handle<Value>());
3420 3421
  void SetCallAsFunctionHandler(FunctionCallback callback,
                                Handle<Value> data = Handle<Value>());
3422

3423 3424 3425 3426 3427 3428 3429 3430
  /**
   * Mark object instances of the template as undetectable.
   *
   * In many ways, undetectable objects behave as though they are not
   * there.  They behave like 'undefined' in conditionals and when
   * printed.  However, properties can be accessed and called as on
   * normal objects.
   */
3431 3432
  void MarkAsUndetectable();

3433 3434 3435 3436 3437
  /**
   * Sets access check callbacks on the object template.
   *
   * When accessing properties on instances of this object template,
   * the access check callback will be called to determine whether or
3438
   * not to allow cross-context access to the properties.
3439 3440 3441 3442
   * The last parameter specifies whether access checks are turned
   * on by default on instances. If access checks are off by default,
   * they can be turned on on individual instances by calling
   * Object::TurnOnAccessCheck().
3443
   */
3444 3445
  void SetAccessCheckCallbacks(NamedSecurityCallback named_handler,
                               IndexedSecurityCallback indexed_handler,
3446 3447
                               Handle<Value> data = Handle<Value>(),
                               bool turned_on_by_default = true);
3448

3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460
  /**
   * Gets the number of internal fields for objects generated from
   * this template.
   */
  int InternalFieldCount();

  /**
   * Sets the number of internal fields for objects generated from
   * this template.
   */
  void SetInternalFieldCount(int value);

3461 3462 3463 3464 3465 3466 3467 3468
 private:
  ObjectTemplate();
  static Local<ObjectTemplate> New(Handle<FunctionTemplate> constructor);
  friend class FunctionTemplate;
};


/**
3469 3470
 * A Signature specifies which receivers and arguments are valid
 * parameters to a function.
3471
 */
3472
class V8EXPORT Signature : public Data {
3473 3474 3475 3476 3477 3478 3479 3480 3481 3482
 public:
  static Local<Signature> New(Handle<FunctionTemplate> receiver =
                                  Handle<FunctionTemplate>(),
                              int argc = 0,
                              Handle<FunctionTemplate> argv[] = 0);
 private:
  Signature();
};


3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495
/**
 * An AccessorSignature specifies which receivers are valid parameters
 * to an accessor callback.
 */
class V8EXPORT AccessorSignature : public Data {
 public:
  static Local<AccessorSignature> New(Handle<FunctionTemplate> receiver =
                                          Handle<FunctionTemplate>());
 private:
  AccessorSignature();
};


3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550
class V8EXPORT DeclaredAccessorDescriptor : public Data {
 private:
  DeclaredAccessorDescriptor();
};


class V8EXPORT ObjectOperationDescriptor : public Data {
 public:
  // This function is not yet stable and should not be used at this time.
  static Local<RawOperationDescriptor> NewInternalFieldDereference(
      Isolate* isolate,
      int internal_field);
 private:
  ObjectOperationDescriptor();
};


enum DeclaredAccessorDescriptorDataType {
    kDescriptorBoolType,
    kDescriptorInt8Type, kDescriptorUint8Type,
    kDescriptorInt16Type, kDescriptorUint16Type,
    kDescriptorInt32Type, kDescriptorUint32Type,
    kDescriptorFloatType, kDescriptorDoubleType
};


class V8EXPORT RawOperationDescriptor : public Data {
 public:
  Local<DeclaredAccessorDescriptor> NewHandleDereference(Isolate* isolate);
  Local<RawOperationDescriptor> NewRawDereference(Isolate* isolate);
  Local<RawOperationDescriptor> NewRawShift(Isolate* isolate,
                                            int16_t byte_offset);
  Local<DeclaredAccessorDescriptor> NewPointerCompare(Isolate* isolate,
                                                      void* compare_value);
  Local<DeclaredAccessorDescriptor> NewPrimitiveValue(
      Isolate* isolate,
      DeclaredAccessorDescriptorDataType data_type,
      uint8_t bool_offset = 0);
  Local<DeclaredAccessorDescriptor> NewBitmaskCompare8(Isolate* isolate,
                                                       uint8_t bitmask,
                                                       uint8_t compare_value);
  Local<DeclaredAccessorDescriptor> NewBitmaskCompare16(
      Isolate* isolate,
      uint16_t bitmask,
      uint16_t compare_value);
  Local<DeclaredAccessorDescriptor> NewBitmaskCompare32(
      Isolate* isolate,
      uint32_t bitmask,
      uint32_t compare_value);

 private:
  RawOperationDescriptor();
};


3551
/**
3552 3553
 * A utility for determining the type of objects based on the template
 * they were constructed from.
3554
 */
3555
class V8EXPORT TypeSwitch : public Data {
3556 3557 3558 3559 3560 3561 3562 3563 3564
 public:
  static Local<TypeSwitch> New(Handle<FunctionTemplate> type);
  static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]);
  int match(Handle<Value> value);
 private:
  TypeSwitch();
};


3565
// --- Extensions ---
3566

3567
class V8EXPORT ExternalAsciiStringResourceImpl
3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579
    : public String::ExternalAsciiStringResource {
 public:
  ExternalAsciiStringResourceImpl() : data_(0), length_(0) {}
  ExternalAsciiStringResourceImpl(const char* data, size_t length)
      : data_(data), length_(length) {}
  const char* data() const { return data_; }
  size_t length() const { return length_; }

 private:
  const char* data_;
  size_t length_;
};
3580 3581 3582 3583

/**
 * Ignore
 */
3584
class V8EXPORT Extension {  // NOLINT
3585
 public:
3586 3587
  // Note that the strings passed into this constructor must live as long
  // as the Extension itself.
3588
  Extension(const char* name,
3589
            const char* source = 0,
3590
            int dep_count = 0,
3591 3592
            const char** deps = 0,
            int source_length = -1);
3593 3594 3595 3596 3597 3598
  virtual ~Extension() { }
  virtual v8::Handle<v8::FunctionTemplate>
      GetNativeFunction(v8::Handle<v8::String> name) {
    return v8::Handle<v8::FunctionTemplate>();
  }

3599 3600 3601 3602
  const char* name() const { return name_; }
  size_t source_length() const { return source_length_; }
  const String::ExternalAsciiStringResource* source() const {
    return &source_; }
3603 3604 3605 3606 3607 3608 3609
  int dependency_count() { return dep_count_; }
  const char** dependencies() { return deps_; }
  void set_auto_enable(bool value) { auto_enable_ = value; }
  bool auto_enable() { return auto_enable_; }

 private:
  const char* name_;
3610 3611
  size_t source_length_;  // expected to initialize before source_
  ExternalAsciiStringResourceImpl source_;
3612 3613 3614
  int dep_count_;
  const char** deps_;
  bool auto_enable_;
3615 3616 3617 3618

  // Disallow copying and assigning.
  Extension(const Extension&);
  void operator=(const Extension&);
3619 3620 3621
};


3622
void V8EXPORT RegisterExtension(Extension* extension);
3623 3624 3625 3626 3627


/**
 * Ignore
 */
3628
class V8EXPORT DeclareExtension {
3629
 public:
3630
  V8_INLINE(DeclareExtension(Extension* extension)) {
3631 3632 3633 3634 3635
    RegisterExtension(extension);
  }
};


3636
// --- Statics ---
3637 3638


3639 3640 3641 3642
Handle<Primitive> V8EXPORT Undefined();
Handle<Primitive> V8EXPORT Null();
Handle<Boolean> V8EXPORT True();
Handle<Boolean> V8EXPORT False();
3643

3644 3645 3646 3647
V8_INLINE(Handle<Primitive> Undefined(Isolate* isolate));
V8_INLINE(Handle<Primitive> Null(Isolate* isolate));
V8_INLINE(Handle<Boolean> True(Isolate* isolate));
V8_INLINE(Handle<Boolean> False(Isolate* isolate));
3648

3649 3650

/**
3651 3652 3653 3654 3655 3656 3657
 * A set of constraints that specifies the limits of the runtime's memory use.
 * You must set the heap size before initializing the VM - the size cannot be
 * adjusted after the VM is initialized.
 *
 * If you are using threads then you should hold the V8::Locker lock while
 * setting the stack limit and you must set a non-default stack limit separately
 * for each thread.
3658
 */
3659
class V8EXPORT ResourceConstraints {
3660 3661
 public:
  ResourceConstraints();
3662
  int max_young_space_size() const { return max_young_space_size_; }
3663
  void set_max_young_space_size(int value) { max_young_space_size_ = value; }
3664
  int max_old_space_size() const { return max_old_space_size_; }
3665
  void set_max_old_space_size(int value) { max_old_space_size_ = value; }
3666 3667
  int max_executable_size() { return max_executable_size_; }
  void set_max_executable_size(int value) { max_executable_size_ = value; }
3668
  uint32_t* stack_limit() const { return stack_limit_; }
3669
  // Sets an address beyond which the VM's stack may not grow.
3670 3671 3672 3673
  void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
 private:
  int max_young_space_size_;
  int max_old_space_size_;
3674
  int max_executable_size_;
3675 3676 3677 3678
  uint32_t* stack_limit_;
};


3679
bool V8EXPORT SetResourceConstraints(ResourceConstraints* constraints);
3680 3681


3682
// --- Exceptions ---
3683 3684 3685 3686 3687


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


3688
typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error);
3689 3690 3691


/**
3692 3693
 * Schedules an exception to be thrown when returning to JavaScript.  When an
 * exception has been scheduled it is illegal to invoke any JavaScript
3694
 * operation; the caller must return immediately and only after the exception
3695
 * has been handled does it become legal to invoke JavaScript operations.
3696
 */
3697
Handle<Value> V8EXPORT ThrowException(Handle<Value> exception);
3698 3699 3700 3701 3702

/**
 * Create new error objects by calling the corresponding error object
 * constructor with the message.
 */
3703
class V8EXPORT Exception {
3704 3705 3706 3707 3708 3709 3710 3711 3712
 public:
  static Local<Value> RangeError(Handle<String> message);
  static Local<Value> ReferenceError(Handle<String> message);
  static Local<Value> SyntaxError(Handle<String> message);
  static Local<Value> TypeError(Handle<String> message);
  static Local<Value> Error(Handle<String> message);
};


3713
// --- Counters Callbacks ---
3714

3715
typedef int* (*CounterLookupCallback)(const char* name);
3716

3717 3718 3719 3720 3721 3722 3723
typedef void* (*CreateHistogramCallback)(const char* name,
                                         int min,
                                         int max,
                                         size_t buckets);

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

3724
// --- Memory Allocation Callback ---
3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747
  enum ObjectSpace {
    kObjectSpaceNewSpace = 1 << 0,
    kObjectSpaceOldPointerSpace = 1 << 1,
    kObjectSpaceOldDataSpace = 1 << 2,
    kObjectSpaceCodeSpace = 1 << 3,
    kObjectSpaceMapSpace = 1 << 4,
    kObjectSpaceLoSpace = 1 << 5,

    kObjectSpaceAll = kObjectSpaceNewSpace | kObjectSpaceOldPointerSpace |
      kObjectSpaceOldDataSpace | kObjectSpaceCodeSpace | kObjectSpaceMapSpace |
      kObjectSpaceLoSpace
  };

  enum AllocationAction {
    kAllocationActionAllocate = 1 << 0,
    kAllocationActionFree = 1 << 1,
    kAllocationActionAll = kAllocationActionAllocate | kAllocationActionFree
  };

typedef void (*MemoryAllocationCallback)(ObjectSpace space,
                                         AllocationAction action,
                                         int size);

3748 3749 3750
// --- Leave Script Callback ---
typedef void (*CallCompletedCallback)();

3751
// --- Failed Access Check Callback ---
3752 3753 3754 3755
typedef void (*FailedAccessCheckCallback)(Local<Object> target,
                                          AccessType type,
                                          Local<Value> data);

3756 3757 3758 3759 3760 3761 3762 3763 3764
// --- AllowCodeGenerationFromStrings callbacks ---

/**
 * Callback to check if code generation from strings is allowed. See
 * Context::AllowCodeGenerationFromStrings.
 */
typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context);

// --- Garbage Collection Callbacks ---
3765 3766

/**
3767 3768 3769
 * Applications can register callback functions which will be called
 * before and after a garbage collection.  Allocations are not
 * allowed in the callback functions, you therefore cannot manipulate
3770 3771
 * objects (set or delete properties for example) since it is possible
 * such operations will result in the allocation of objects.
3772
 */
3773 3774 3775 3776 3777 3778 3779 3780
enum GCType {
  kGCTypeScavenge = 1 << 0,
  kGCTypeMarkSweepCompact = 1 << 1,
  kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact
};

enum GCCallbackFlags {
  kNoGCCallbackFlags = 0,
3781 3782
  kGCCallbackFlagCompacted = 1 << 0,
  kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1
3783 3784 3785 3786 3787
};

typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags);
typedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags);

3788 3789 3790
typedef void (*GCCallback)();


3791 3792 3793 3794 3795 3796 3797 3798 3799 3800
/**
 * Collection of V8 heap information.
 *
 * Instances of this class can be passed to v8::V8::HeapStatistics to
 * get heap statistics from V8.
 */
class V8EXPORT HeapStatistics {
 public:
  HeapStatistics();
  size_t total_heap_size() { return total_heap_size_; }
3801
  size_t total_heap_size_executable() { return total_heap_size_executable_; }
3802
  size_t total_physical_size() { return total_physical_size_; }
3803
  size_t used_heap_size() { return used_heap_size_; }
3804
  size_t heap_size_limit() { return heap_size_limit_; }
3805 3806 3807

 private:
  size_t total_heap_size_;
3808
  size_t total_heap_size_executable_;
3809
  size_t total_physical_size_;
3810
  size_t used_heap_size_;
3811
  size_t heap_size_limit_;
3812 3813

  friend class V8;
3814
  friend class Isolate;
3815 3816 3817
};


3818 3819
class RetainedObjectInfo;

3820 3821 3822 3823 3824 3825 3826
/**
 * Isolate represents an isolated instance of the V8 engine.  V8
 * isolates have completely separate states.  Objects from one isolate
 * must not be used in other isolates.  When V8 is initialized a
 * default isolate is implicitly created and entered.  The embedder
 * can create additional isolates and use them in parallel in multiple
 * threads.  An isolate can be entered by at most one thread at any
3827
 * given time.  The Locker/Unlocker API must be used to synchronize.
3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892
 */
class V8EXPORT Isolate {
 public:
  /**
   * Stack-allocated class which sets the isolate for all operations
   * executed within a local scope.
   */
  class V8EXPORT Scope {
   public:
    explicit Scope(Isolate* isolate) : isolate_(isolate) {
      isolate->Enter();
    }

    ~Scope() { isolate_->Exit(); }

   private:
    Isolate* const isolate_;

    // Prevent copying of Scope objects.
    Scope(const Scope&);
    Scope& operator=(const Scope&);
  };

  /**
   * Creates a new isolate.  Does not change the currently entered
   * isolate.
   *
   * When an isolate is no longer used its resources should be freed
   * by calling Dispose().  Using the delete operator is not allowed.
   */
  static Isolate* New();

  /**
   * Returns the entered isolate for the current thread or NULL in
   * case there is no current isolate.
   */
  static Isolate* GetCurrent();

  /**
   * Methods below this point require holding a lock (using Locker) in
   * a multi-threaded environment.
   */

  /**
   * Sets this isolate as the entered one for the current thread.
   * Saves the previously entered one (if any), so that it can be
   * restored when exiting.  Re-entering an isolate is allowed.
   */
  void Enter();

  /**
   * Exits this isolate by restoring the previously entered one in the
   * current thread.  The isolate may still stay the same, if it was
   * entered more than once.
   *
   * Requires: this == Isolate::GetCurrent().
   */
  void Exit();

  /**
   * Disposes the isolate.  The isolate must not be entered by any
   * thread to be disposable.
   */
  void Dispose();

3893 3894 3895
  /**
   * Associate embedder-specific data with the isolate
   */
3896
  V8_INLINE(void SetData(void* data));
3897 3898

  /**
3899
   * Retrieve embedder-specific data from the isolate.
3900 3901
   * Returns NULL if SetData has never been called.
   */
3902
  V8_INLINE(void* GetData());
3903

3904 3905 3906 3907 3908
  /**
   * Get statistics about the heap memory usage.
   */
  void GetHeapStatistics(HeapStatistics* heap_statistics);

3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923
  /**
   * Adjusts the amount of registered external memory. Used to give V8 an
   * indication of the amount of externally allocated memory that is kept alive
   * by JavaScript objects. V8 uses this to decide when to perform global
   * garbage collections. Registering externally allocated memory will trigger
   * global garbage collections more often than it would otherwise in an attempt
   * to garbage collect the JavaScript objects that keep the externally
   * allocated memory alive.
   *
   * \param change_in_bytes the change in externally allocated memory that is
   *   kept alive by JavaScript objects.
   * \returns the adjusted value.
   */
  intptr_t AdjustAmountOfExternalAllocatedMemory(intptr_t change_in_bytes);

3924 3925 3926 3927 3928 3929
  /**
   * Returns heap profiler for this isolate. Will return NULL until the isolate
   * is initialized.
   */
  HeapProfiler* GetHeapProfiler();

3930 3931 3932 3933 3934 3935
  /**
   * Returns CPU profiler for this isolate. Will return NULL until the isolate
   * is initialized.
   */
  CpuProfiler* GetCpuProfiler();

3936 3937 3938
  /** Returns the context that is on the top of the stack. */
  Local<Context> GetCurrentContext();

3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971
  /**
   * Allows the host application to group objects together. If one
   * object in the group is alive, all objects in the group are alive.
   * After each garbage collection, object groups are removed. It is
   * intended to be used in the before-garbage-collection callback
   * function, for instance to simulate DOM tree connections among JS
   * wrapper objects. Object groups for all dependent handles need to
   * be provided for kGCTypeMarkSweepCompact collections, for all other
   * garbage collection types it is sufficient to provide object groups
   * for partially dependent handles only.
   */
  void SetObjectGroupId(const Persistent<Value>& object,
                        UniqueId id);

  /**
   * Allows the host application to declare implicit references from an object
   * group to an object. If the objects of the object group are alive, the child
   * object is alive too. After each garbage collection, all implicit references
   * are removed. It is intended to be used in the before-garbage-collection
   * callback function.
   */
  void SetReferenceFromGroup(UniqueId id,
                             const Persistent<Value>& child);

  /**
   * Allows the host application to declare implicit references from an object
   * to another object. If the parent object is alive, the child object is alive
   * too. After each garbage collection, all implicit references are removed. It
   * is intended to be used in the before-garbage-collection callback function.
   */
  void SetReference(const Persistent<Object>& parent,
                    const Persistent<Value>& child);

3972 3973 3974 3975 3976 3977 3978 3979 3980 3981
 private:
  Isolate();
  Isolate(const Isolate&);
  ~Isolate();
  Isolate& operator=(const Isolate&);
  void* operator new(size_t size);
  void operator delete(void*, size_t);
};


3982
class V8EXPORT StartupData {
3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993
 public:
  enum CompressionAlgorithm {
    kUncompressed,
    kBZip2
  };

  const char* data;
  int compressed_size;
  int raw_size;
};

3994 3995 3996 3997 3998 3999 4000 4001 4002

/**
 * A helper class for driving V8 startup data decompression.  It is based on
 * "CompressedStartupData" API functions from the V8 class.  It isn't mandatory
 * for an embedder to use this class, instead, API functions can be used
 * directly.
 *
 * For an example of the class usage, see the "shell.cc" sample application.
 */
4003
class V8EXPORT StartupDataDecompressor {  // NOLINT
4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018
 public:
  StartupDataDecompressor();
  virtual ~StartupDataDecompressor();
  int Decompress();

 protected:
  virtual int DecompressData(char* raw_data,
                             int* raw_data_size,
                             const char* compressed_data,
                             int compressed_data_size) = 0;

 private:
  char** raw_data;
};

4019 4020 4021 4022 4023 4024 4025

/**
 * EntropySource is used as a callback function when v8 needs a source
 * of entropy.
 */
typedef bool (*EntropySource)(unsigned char* buffer, size_t length);

4026

4027 4028 4029 4030 4031
/**
 * ReturnAddressLocationResolver is used as a callback function when v8 is
 * resolving the location of a return address on the stack. Profilers that
 * change the return address on the stack can use this to resolve the stack
 * location to whereever the profiler stashed the original return address.
4032 4033 4034 4035 4036 4037 4038
 *
 * \param return_addr_location points to a location on stack where a machine
 *    return address resides.
 * \returns either return_addr_location, or else a pointer to the profiler's
 *    copy of the original return address.
 *
 * \note the resolver function must not cause garbage collection.
4039 4040 4041 4042 4043
 */
typedef uintptr_t (*ReturnAddressLocationResolver)(
    uintptr_t return_addr_location);


4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058
/**
 * FunctionEntryHook is the type of the profile entry hook called at entry to
 * any generated function when function-level profiling is enabled.
 *
 * \param function the address of the function that's being entered.
 * \param return_addr_location points to a location on stack where the machine
 *    return address resides. This can be used to identify the caller of
 *    \p function, and/or modified to divert execution when \p function exits.
 *
 * \note the entry hook must not cause garbage collection.
 */
typedef void (*FunctionEntryHook)(uintptr_t function,
                                  uintptr_t return_addr_location);


4059 4060 4061 4062 4063 4064 4065 4066 4067
/**
 * A JIT code event is issued each time code is added, moved or removed.
 *
 * \note removal events are not currently issued.
 */
struct JitCodeEvent {
  enum EventType {
    CODE_ADDED,
    CODE_MOVED,
4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080
    CODE_REMOVED,
    CODE_ADD_LINE_POS_INFO,
    CODE_START_LINE_INFO_RECORDING,
    CODE_END_LINE_INFO_RECORDING
  };
  // Definition of the code position type. The "POSITION" type means the place
  // in the source code which are of interest when making stack traces to
  // pin-point the source location of a stack frame as close as possible.
  // The "STATEMENT_POSITION" means the place at the beginning of each
  // statement, and is used to indicate possible break locations.
  enum PositionType {
    POSITION,
    STATEMENT_POSITION
4081 4082 4083 4084 4085 4086 4087 4088
  };

  // Type of event.
  EventType type;
  // Start of the instructions.
  void* code_start;
  // Size of the instructions.
  size_t code_len;
4089 4090 4091 4092 4093 4094 4095
  // Script info for CODE_ADDED event.
  Handle<Script> script;
  // User-defined data for *_LINE_INFO_* event. It's used to hold the source
  // code line information which is returned from the
  // CODE_START_LINE_INFO_RECORDING event. And it's passed to subsequent
  // CODE_ADD_LINE_POS_INFO and CODE_END_LINE_INFO_RECORDING events.
  void* user_data;
4096

4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113
  struct name_t {
    // Name of the object associated with the code, note that the string is not
    // zero-terminated.
    const char* str;
    // Number of chars in str.
    size_t len;
  };

  struct line_info_t {
    // PC offset
    size_t offset;
    // Code postion
    size_t pos;
    // The position type.
    PositionType position_type;
  };

4114 4115
  union {
    // Only valid for CODE_ADDED.
4116
    struct name_t name;
4117 4118

    // Only valid for CODE_ADD_LINE_POS_INFO
4119
    struct line_info_t line_info;
4120

4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143
    // New location of instructions. Only valid for CODE_MOVED.
    void* new_code_start;
  };
};

/**
 * Option flags passed to the SetJitCodeEventHandler function.
 */
enum JitCodeEventOptions {
  kJitCodeEventDefault = 0,
  // Generate callbacks for already existent code.
  kJitCodeEventEnumExisting = 1
};


/**
 * Callback function passed to SetJitCodeEventHandler.
 *
 * \param event code add, move or removal event.
 */
typedef void (*JitCodeEventHandler)(const JitCodeEvent* event);


4144
/**
4145
 * Interface for iterating through all external resources in the heap.
4146 4147 4148 4149 4150 4151 4152 4153
 */
class V8EXPORT ExternalResourceVisitor {  // NOLINT
 public:
  virtual ~ExternalResourceVisitor() {}
  virtual void VisitExternalString(Handle<String> string) {}
};


4154 4155 4156 4157 4158 4159
/**
 * Interface for iterating through all the persistent handles in the heap.
 */
class V8EXPORT PersistentHandleVisitor {  // NOLINT
 public:
  virtual ~PersistentHandleVisitor() {}
4160 4161
  virtual void VisitPersistentHandle(Persistent<Value>* value,
                                     uint16_t class_id) {}
4162 4163 4164
};


4165 4166 4167 4168 4169 4170 4171
/**
 * Asserts that no action is performed that could cause a handle's value
 * to be modified. Useful when otherwise unsafe handle operations need to
 * be performed.
 */
class V8EXPORT AssertNoGCScope {
#ifndef DEBUG
4172 4173
  // TODO(yangguo): remove isolate argument.
  V8_INLINE(AssertNoGCScope(Isolate* isolate)) { }
4174 4175 4176 4177
#else
  AssertNoGCScope(Isolate* isolate);
  ~AssertNoGCScope();
 private:
4178
  void* disallow_heap_allocation_;
4179 4180 4181 4182
#endif
};


4183 4184 4185
/**
 * Container class for static utility functions.
 */
4186
class V8EXPORT V8 {
4187
 public:
4188
  /** Set the callback to invoke in case of fatal errors. */
4189 4190
  static void SetFatalErrorHandler(FatalErrorCallback that);

4191 4192 4193 4194 4195 4196 4197
  /**
   * Set the callback to invoke to check if code generation from
   * strings should be allowed.
   */
  static void SetAllowCodeGenerationFromStringsCallback(
      AllowCodeGenerationFromStringsCallback that);

4198 4199 4200 4201 4202 4203 4204 4205
  /**
   * Set allocator to use for ArrayBuffer memory.
   * The allocator should be set only once. The allocator should be set
   * before any code tha uses ArrayBuffers is executed.
   * This allocator is used in all isolates.
   */
  static void SetArrayBufferAllocator(ArrayBuffer::Allocator* allocator);

4206 4207 4208 4209 4210 4211 4212
  /**
   * Ignore out-of-memory exceptions.
   *
   * V8 running out of memory is treated as a fatal error by default.
   * This means that the fatal error handler is called and that V8 is
   * terminated.
   *
4213
   * IgnoreOutOfMemoryException can be used to not treat an
4214 4215 4216 4217
   * out-of-memory situation as a fatal error.  This way, the contexts
   * that did not cause the out of memory problem might be able to
   * continue execution.
   */
4218 4219
  static void IgnoreOutOfMemoryException();

4220
  /**
4221
   * Check if V8 is dead and therefore unusable.  This is the case after
4222 4223
   * fatal errors such as out-of-memory situations.
   */
4224 4225
  static bool IsDead();

4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239
  /**
   * The following 4 functions are to be used when V8 is built with
   * the 'compress_startup_data' flag enabled. In this case, the
   * embedder must decompress startup data prior to initializing V8.
   *
   * This is how interaction with V8 should look like:
   *   int compressed_data_count = v8::V8::GetCompressedStartupDataCount();
   *   v8::StartupData* compressed_data =
   *     new v8::StartupData[compressed_data_count];
   *   v8::V8::GetCompressedStartupData(compressed_data);
   *   ... decompress data (compressed_data can be updated in-place) ...
   *   v8::V8::SetDecompressedStartupData(compressed_data);
   *   ... now V8 can be initialized
   *   ... make sure the decompressed data stays valid until V8 shutdown
4240 4241 4242 4243
   *
   * A helper class StartupDataDecompressor is provided. It implements
   * the protocol of the interaction described above, and can be used in
   * most cases instead of calling these API functions directly.
4244 4245 4246 4247 4248 4249
   */
  static StartupData::CompressionAlgorithm GetCompressedStartupDataAlgorithm();
  static int GetCompressedStartupDataCount();
  static void GetCompressedStartupData(StartupData* compressed_data);
  static void SetDecompressedStartupData(StartupData* decompressed_data);

4250
  /**
4251 4252
   * Adds a message listener.
   *
4253
   * The same message listener can be added more than once and in that
4254
   * case it will be called more than once for each message.
4255 4256 4257
   *
   * If data is specified, it will be passed to the callback when it is called.
   * Otherwise, the exception object will be passed to the callback instead.
4258
   */
4259 4260
  static bool AddMessageListener(MessageCallback that,
                                 Handle<Value> data = Handle<Value>());
4261 4262 4263 4264 4265 4266

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

4267 4268 4269 4270 4271 4272 4273 4274 4275
  /**
   * Tells V8 to capture current stack trace when uncaught exception occurs
   * and report it to the message listeners. The option is off by default.
   */
  static void SetCaptureStackTraceForUncaughtExceptions(
      bool capture,
      int frame_limit = 10,
      StackTrace::StackTraceOptions options = StackTrace::kOverview);

4276
  /**
4277
   * Sets V8 flags from a string.
4278 4279 4280
   */
  static void SetFlagsFromString(const char* str, int length);

4281
  /**
4282
   * Sets V8 flags from the command line.
4283 4284 4285 4286 4287
   */
  static void SetFlagsFromCommandLine(int* argc,
                                      char** argv,
                                      bool remove_flags);

4288 4289
  /** Get the version string. */
  static const char* GetVersion();
4290 4291 4292 4293 4294 4295

  /**
   * Enables the host application to provide a mechanism for recording
   * statistics counters.
   */
  static void SetCounterFunction(CounterLookupCallback);
4296 4297 4298 4299 4300 4301 4302 4303 4304

  /**
   * Enables the host application to provide a mechanism for recording
   * histograms. The CreateHistogram function returns a
   * histogram which will later be passed to the AddHistogramSample
   * function.
   */
  static void SetCreateHistogramFunction(CreateHistogramCallback);
  static void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
4305 4306 4307 4308 4309

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

  /**
4310
   * Enables the host application to receive a notification before a
4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331
   * garbage collection.  Allocations are not allowed in the
   * callback function, you therefore cannot manipulate objects (set
   * or delete properties for example) since it is possible such
   * operations will result in the allocation of objects. It is possible
   * to specify the GCType filter for your callback. But it is not possible to
   * register the same callback function two times with different
   * GCType filters.
   */
  static void AddGCPrologueCallback(
      GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll);

  /**
   * This function removes callback which was installed by
   * AddGCPrologueCallback function.
   */
  static void RemoveGCPrologueCallback(GCPrologueCallback callback);

  /**
   * The function is deprecated. Please use AddGCPrologueCallback instead.
   * Enables the host application to receive a notification before a
   * garbage collection.  Allocations are not allowed in the
mads.s.ager's avatar
mads.s.ager committed
4332 4333 4334
   * callback function, you therefore cannot manipulate objects (set
   * or delete properties for example) since it is possible such
   * operations will result in the allocation of objects.
4335
   */
4336
  V8_DEPRECATED(static void SetGlobalGCPrologueCallback(GCCallback));
4337 4338

  /**
4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358
   * Enables the host application to receive a notification after a
   * garbage collection.  Allocations are not allowed in the
   * callback function, you therefore cannot manipulate objects (set
   * or delete properties for example) since it is possible such
   * operations will result in the allocation of objects. It is possible
   * to specify the GCType filter for your callback. But it is not possible to
   * register the same callback function two times with different
   * GCType filters.
   */
  static void AddGCEpilogueCallback(
      GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll);

  /**
   * This function removes callback which was installed by
   * AddGCEpilogueCallback function.
   */
  static void RemoveGCEpilogueCallback(GCEpilogueCallback callback);

  /**
   * The function is deprecated. Please use AddGCEpilogueCallback instead.
4359
   * Enables the host application to receive a notification after a
mads.s.ager's avatar
mads.s.ager committed
4360 4361 4362 4363
   * major garbage collection.  Allocations are not allowed in the
   * callback function, you therefore cannot manipulate objects (set
   * or delete properties for example) since it is possible such
   * operations will result in the allocation of objects.
4364
   */
4365
  V8_DEPRECATED(static void SetGlobalGCEpilogueCallback(GCCallback));
4366

4367 4368 4369 4370 4371 4372 4373 4374 4375
  /**
   * Enables the host application to provide a mechanism to be notified
   * and perform custom logging when V8 Allocates Executable Memory.
   */
  static void AddMemoryAllocationCallback(MemoryAllocationCallback callback,
                                          ObjectSpace space,
                                          AllocationAction action);

  /**
4376
   * Removes callback that was installed by AddMemoryAllocationCallback.
4377 4378 4379
   */
  static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);

4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393
  /**
   * Adds a callback to notify the host application when a script finished
   * running.  If a script re-enters the runtime during executing, the
   * CallCompletedCallback is only invoked when the outer-most script
   * execution ends.  Executing scripts inside the callback do not trigger
   * further callbacks.
   */
  static void AddCallCompletedCallback(CallCompletedCallback callback);

  /**
   * Removes callback that was installed by AddCallCompletedCallback.
   */
  static void RemoveCallCompletedCallback(CallCompletedCallback callback);

4394
  /**
4395
   * Initializes from snapshot if possible. Otherwise, attempts to
4396 4397
   * initialize from scratch.  This function is called implicitly if
   * you use the API without calling it first.
4398 4399 4400
   */
  static bool Initialize();

4401 4402 4403 4404 4405 4406
  /**
   * Allows the host application to provide a callback which can be used
   * as a source of entropy for random number generators.
   */
  static void SetEntropySource(EntropySource source);

4407 4408 4409 4410 4411 4412 4413
  /**
   * Allows the host application to provide a callback that allows v8 to
   * cooperate with a profiler that rewrites return addresses on stack.
   */
  static void SetReturnAddressLocationResolver(
      ReturnAddressLocationResolver return_address_resolver);

4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427
  /**
   * Allows the host application to provide the address of a function that's
   * invoked on entry to every V8-generated function.
   * Note that \p entry_hook is invoked at the very start of each
   * generated function.
   *
   * \param entry_hook a function that will be invoked on entry to every
   *   V8-generated function.
   * \returns true on success on supported platforms, false on failure.
   * \note Setting a new entry hook function when one is already active will
   *   fail.
   */
  static bool SetFunctionEntryHook(FunctionEntryHook entry_hook);

4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450
  /**
   * Allows the host application to provide the address of a function that is
   * notified each time code is added, moved or removed.
   *
   * \param options options for the JIT code event handler.
   * \param event_handler the JIT code event handler, which will be invoked
   *     each time code is added, moved or removed.
   * \note \p event_handler won't get notified of existent code.
   * \note since code removal notifications are not currently issued, the
   *     \p event_handler may get notifications of code that overlaps earlier
   *     code notifications. This happens when code areas are reused, and the
   *     earlier overlapping code areas should therefore be discarded.
   * \note the events passed to \p event_handler and the strings they point to
   *     are not guaranteed to live past each call. The \p event_handler must
   *     copy strings and other parameters it needs to keep around.
   * \note the set of events declared in JitCodeEvent::EventType is expected to
   *     grow over time, and the JitCodeEvent structure is expected to accrue
   *     new members. The \p event_handler function must ignore event codes
   *     it does not recognize to maintain future compatibility.
   */
  static void SetJitCodeEventHandler(JitCodeEventOptions options,
                                     JitCodeEventHandler event_handler);

4451 4452
  // TODO(svenpanne) Really deprecate me when Chrome is fixed.
  /** Deprecated. Use Isolate::AdjustAmountOfExternalAllocatedMemory instead. */
4453 4454
  static intptr_t AdjustAmountOfExternalAllocatedMemory(
      intptr_t change_in_bytes);
4455

4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472
  /**
   * Suspends recording of tick samples in the profiler.
   * When the V8 profiling mode is enabled (usually via command line
   * switches) this function suspends recording of tick samples.
   * Profiling ticks are discarded until ResumeProfiler() is called.
   *
   * See also the --prof and --prof_auto command line switches to
   * enable V8 profiling.
   */
  static void PauseProfiler();

  /**
   * Resumes recording of tick samples in the profiler.
   * See also PauseProfiler().
   */
  static void ResumeProfiler();

4473 4474 4475 4476 4477
  /**
   * Return whether profiler is currently paused.
   */
  static bool IsProfilerPaused();

4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498
  /**
   * Retrieve the V8 thread id of the calling thread.
   *
   * The thread id for a thread should only be retrieved after the V8
   * lock has been acquired with a Locker object with that thread.
   */
  static int GetCurrentThreadId();

  /**
   * Forcefully terminate execution of a JavaScript thread.  This can
   * be used to terminate long-running scripts.
   *
   * TerminateExecution should only be called when then V8 lock has
   * been acquired with a Locker object.  Therefore, in order to be
   * able to terminate long-running threads, preemption must be
   * enabled to allow the user of TerminateExecution to acquire the
   * lock.
   *
   * The termination is achieved by throwing an exception that is
   * uncatchable by JavaScript exception handlers.  Termination
   * exceptions act as if they were caught by a C++ TryCatch exception
4499
   * handler.  If forceful termination is used, any C++ TryCatch
4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512
   * exception handler that catches an exception should check if that
   * exception is a termination exception and immediately return if
   * that is the case.  Returning immediately in that case will
   * continue the propagation of the termination exception if needed.
   *
   * The thread id passed to TerminateExecution must have been
   * obtained by calling GetCurrentThreadId on the thread in question.
   *
   * \param thread_id The thread id of the thread to terminate.
   */
  static void TerminateExecution(int thread_id);

  /**
4513 4514 4515
   * Forcefully terminate the current thread of JavaScript execution
   * in the given isolate. If no isolate is provided, the default
   * isolate is used.
4516 4517 4518
   *
   * This method can be used by any thread even if that thread has not
   * acquired the V8 lock with a Locker object.
4519 4520
   *
   * \param isolate The isolate in which to terminate the current JS execution.
4521
   */
4522
  static void TerminateExecution(Isolate* isolate = NULL);
4523

4524 4525 4526 4527 4528 4529 4530
  /**
   * Is V8 terminating JavaScript execution.
   *
   * Returns true if JavaScript execution is currently terminating
   * because of a call to TerminateExecution.  In that case there are
   * still JavaScript frames on the stack and the termination
   * exception is still active.
4531 4532
   *
   * \param isolate The isolate in which to check.
4533
   */
4534
  static bool IsExecutionTerminating(Isolate* isolate = NULL);
4535

4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553
  /**
   * Resume execution capability in the given isolate, whose execution
   * was previously forcefully terminated using TerminateExecution().
   *
   * When execution is forcefully terminated using TerminateExecution(),
   * the isolate can not resume execution until all JavaScript frames
   * have propagated the uncatchable exception which is generated.  This
   * method allows the program embedding the engine to handle the
   * termination event and resume execution capability, even if
   * JavaScript frames remain on the stack.
   *
   * This method can be used by any thread even if that thread has not
   * acquired the V8 lock with a Locker object.
   *
   * \param isolate The isolate in which to resume execution capability.
   */
  static void CancelTerminateExecution(Isolate* isolate);

4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564
  /**
   * Releases any resources used by v8 and stops any utility threads
   * that may be running.  Note that disposing v8 is permanent, it
   * cannot be reinitialized.
   *
   * It should generally not be necessary to dispose v8 before exiting
   * a process, this should happen automatically.  It is only necessary
   * to use if the process needs the resources taken up by v8.
   */
  static bool Dispose();

4565 4566
  /** Deprecated. Use Isolate::GetHeapStatistics instead. */
  V8_DEPRECATED(static void GetHeapStatistics(HeapStatistics* heap_statistics));
4567

4568 4569
  /**
   * Iterates through all external resources referenced from current isolate
4570 4571
   * heap.  GC is not invoked prior to iterating, therefore there is no
   * guarantee that visited objects are still alive.
4572 4573 4574
   */
  static void VisitExternalResources(ExternalResourceVisitor* visitor);

4575 4576 4577 4578 4579 4580
  /**
   * Iterates through all the persistent handles in the current isolate's heap
   * that have class_ids.
   */
  static void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);

4581 4582 4583 4584 4585 4586 4587 4588 4589 4590
  /**
   * Iterates through all the persistent handles in the current isolate's heap
   * that have class_ids and are candidates to be marked as partially dependent
   * handles. This will visit handles to young objects created since the last
   * garbage collection but is free to visit an arbitrary superset of these
   * objects.
   */
  static void VisitHandlesForPartialDependence(
      Isolate* isolate, PersistentHandleVisitor* visitor);

4591 4592 4593
  /**
   * Optional notification that the embedder is idle.
   * V8 uses the notification to reduce memory footprint.
4594 4595 4596 4597
   * This call can be used repeatedly if the embedder remains idle.
   * Returns true if the embedder should stop calling IdleNotification
   * until real work has been done.  This indicates that V8 has done
   * as much cleanup as it will be able to do.
4598 4599 4600 4601
   *
   * The hint argument specifies the amount of work to be done in the function
   * on scale from 1 to 1000. There is no guarantee that the actual work will
   * match the hint.
4602
   */
4603
  static bool IdleNotification(int hint = 1000);
4604

4605 4606 4607 4608 4609 4610
  /**
   * Optional notification that the system is running low on memory.
   * V8 uses these notifications to attempt to free memory.
   */
  static void LowMemoryNotification();

4611
  /**
4612
   * Optional notification that a context has been disposed. V8 uses
4613 4614 4615
   * these notifications to guide the GC heuristic. Returns the number
   * of context disposals - including this one - since the last time
   * V8 had a chance to clean up.
4616
   */
4617
  static int ContextDisposedNotification();
4618

4619 4620 4621
 private:
  V8();

4622 4623
  static internal::Object** GlobalizeReference(internal::Isolate* isolate,
                                               internal::Object** handle);
4624
  static void DisposeGlobal(internal::Object** global_handle);
4625
  typedef WeakReferenceCallbacks<Value, void>::Revivable RevivableCallback;
4626
  static void MakeWeak(internal::Object** global_handle,
4627
                       void* data,
4628
                       RevivableCallback weak_reference_callback);
4629
  static void ClearWeak(internal::Object** global_handle);
4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640

  template <class T> friend class Handle;
  template <class T> friend class Local;
  template <class T> friend class Persistent;
  friend class Context;
};


/**
 * An external exception handler.
 */
4641
class V8EXPORT TryCatch {
4642 4643
 public:
  /**
4644 4645 4646
   * Creates a new try/catch block and registers it with v8.  Note that
   * all TryCatch blocks should be stack allocated because the memory
   * location itself is compared against JavaScript try/catch blocks.
4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657
   */
  TryCatch();

  /**
   * Unregisters and deletes this try/catch block.
   */
  ~TryCatch();

  /**
   * Returns true if an exception has been caught by this try/catch block.
   */
4658
  bool HasCaught() const;
4659

4660
  /**
4661
   * For certain types of exceptions, it makes no sense to continue execution.
4662
   *
4663 4664 4665 4666
   * If CanContinue returns false, the correct action is to perform any C++
   * cleanup needed and then return.  If CanContinue returns false and
   * HasTerminated returns true, it is possible to call
   * CancelTerminateExecution in order to continue calling into the engine.
4667
   */
4668
  bool CanContinue() const;
4669

4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683
  /**
   * Returns true if an exception has been caught due to script execution
   * being terminated.
   *
   * There is no JavaScript representation of an execution termination
   * exception.  Such exceptions are thrown when the TerminateExecution
   * methods are called to terminate a long-running script.
   *
   * If such an exception has been thrown, HasTerminated will return true,
   * indicating that it is possible to call CancelTerminateExecution in order
   * to continue calling into the engine.
   */
  bool HasTerminated() const;

4684 4685 4686 4687 4688 4689 4690 4691 4692
  /**
   * Throws the exception caught by this TryCatch in a way that avoids
   * it being caught again by this same TryCatch.  As with ThrowException
   * it is illegal to execute any JavaScript operations after calling
   * ReThrow; the caller must return immediately to where the exception
   * is caught.
   */
  Handle<Value> ReThrow();

4693 4694 4695 4696 4697 4698
  /**
   * Returns the exception caught by this try/catch block.  If no exception has
   * been caught an empty handle is returned.
   *
   * The returned handle is valid until this TryCatch block has been destroyed.
   */
4699
  Local<Value> Exception() const;
4700

4701 4702 4703 4704 4705 4706
  /**
   * Returns the .stack property of the thrown object.  If no .stack
   * property is present an empty handle is returned.
   */
  Local<Value> StackTrace() const;

4707 4708 4709 4710 4711 4712 4713
  /**
   * Returns the message associated with this exception.  If there is
   * no message associated an empty handle is returned.
   *
   * The returned handle is valid until this TryCatch block has been
   * destroyed.
   */
4714
  Local<v8::Message> Message() const;
4715

4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726
  /**
   * Clears any exceptions that may have been caught by this try/catch block.
   * After this method has been called, HasCaught() will return false.
   *
   * It is not necessary to clear a try/catch block before using it again; if
   * another exception is thrown the previously caught exception will just be
   * overwritten.  However, it is often a good idea since it makes it easier
   * to determine which operation threw a given exception.
   */
  void Reset();

4727 4728 4729 4730 4731 4732 4733 4734
  /**
   * Set verbosity of the external exception handler.
   *
   * By default, exceptions that are caught by an external exception
   * handler are not reported.  Call SetVerbose with true on an
   * external exception handler to have exceptions caught by the
   * handler reported as if they were not caught.
   */
4735 4736
  void SetVerbose(bool value);

4737 4738 4739 4740 4741 4742 4743
  /**
   * Set whether or not this TryCatch should capture a Message object
   * which holds source information about where the exception
   * occurred.  True by default.
   */
  void SetCaptureMessage(bool value);

4744
 private:
4745 4746 4747 4748 4749 4750
  // Make it hard to create heap-allocated TryCatch blocks.
  TryCatch(const TryCatch&);
  void operator=(const TryCatch&);
  void* operator new(size_t size);
  void operator delete(void*, size_t);

4751
  v8::internal::Isolate* isolate_;
4752
  void* next_;
4753
  void* exception_;
4754
  void* message_;
4755 4756 4757 4758
  bool is_verbose_ : 1;
  bool can_continue_ : 1;
  bool capture_message_ : 1;
  bool rethrow_ : 1;
4759
  bool has_terminated_ : 1;
4760

4761
  friend class v8::internal::Isolate;
4762 4763 4764
};


4765
// --- Context ---
4766 4767 4768 4769 4770


/**
 * Ignore
 */
4771
class V8EXPORT ExtensionConfiguration {
4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785
 public:
  ExtensionConfiguration(int name_count, const char* names[])
      : name_count_(name_count), names_(names) { }
 private:
  friend class ImplementationUtilities;
  int name_count_;
  const char** names_;
};


/**
 * A sandboxed execution context with its own set of built-in objects
 * and functions.
 */
4786
class V8EXPORT Context {
4787
 public:
4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803
  /**
   * Returns the global proxy object or global object itself for
   * detached contexts.
   *
   * Global proxy object is a thin wrapper whose prototype points to
   * actual context's global object with the properties like Object, etc.
   * This is done that way for security reasons (for more details see
   * https://wiki.mozilla.org/Gecko:SplitWindow).
   *
   * Please note that changes to global proxy object prototype most probably
   * would break VM---v8 expects only global object as a prototype of
   * global proxy object.
   *
   * If DetachGlobal() has been invoked, Global() would return actual global
   * object until global is reattached with ReattachGlobal().
   */
4804 4805
  Local<Object> Global();

4806 4807 4808 4809 4810 4811
  /**
   * Detaches the global object from its context before
   * the global object can be reused to create a new context.
   */
  void DetachGlobal();

4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823
  /**
   * Reattaches a global object to a context.  This can be used to
   * restore the connection between a global object and a context
   * after DetachGlobal has been called.
   *
   * \param global_object The global object to reattach to the
   *   context.  For this to work, the global object must be the global
   *   object that was associated with this context before a call to
   *   DetachGlobal.
   */
  void ReattachGlobal(Handle<Object> global_object);

4824 4825 4826
  /**
   * Creates a new context and returns a handle to the newly allocated
   * context.
4827
   *
4828
   * \param isolate The isolate in which to create the context.
4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840
   *
   * \param extensions An optional extension configuration containing
   * the extensions to be installed in the newly created context.
   *
   * \param global_template An optional object template from which the
   * global object for the newly created context will be created.
   *
   * \param global_object An optional global object to be reused for
   * the newly created context. This global object must have been
   * created by a previous call to Context::New with the same global
   * template. The state of the global object will be completely reset
   * and only object identify will remain.
4841
   */
4842 4843 4844 4845 4846 4847 4848
  static Local<Context> New(
      Isolate* isolate,
      ExtensionConfiguration* extensions = NULL,
      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
      Handle<Value> global_object = Handle<Value>());

  /** Deprecated. Use Isolate version instead. */
4849
  V8_DEPRECATED(static Persistent<Context> New(
4850 4851
      ExtensionConfiguration* extensions = NULL,
      Handle<ObjectTemplate> global_template = Handle<ObjectTemplate>(),
4852
      Handle<Value> global_object = Handle<Value>()));
4853

4854 4855
  /** Returns the last entered context. */
  static Local<Context> GetEntered();
4856

4857 4858
  // TODO(svenpanne) Actually deprecate this.
  /** Deprecated. Use Isolate::GetCurrentContext instead. */
4859 4860
  static Local<Context> GetCurrent();

4861 4862 4863 4864 4865 4866 4867
  /**
   * Returns the context of the calling JavaScript code.  That is the
   * context of the top-most JavaScript frame.  If there are no
   * JavaScript frames an empty handle is returned.
   */
  static Local<Context> GetCalling();

4868 4869 4870 4871 4872 4873
  /**
   * Sets the security token for the context.  To access an object in
   * another context, the security tokens must match.
   */
  void SetSecurityToken(Handle<Value> token);

4874 4875 4876
  /** Restores the security token to the default value. */
  void UseDefaultSecurityToken();

4877 4878 4879
  /** Returns the security token of this context.*/
  Handle<Value> GetSecurityToken();

4880 4881 4882 4883 4884 4885
  /**
   * Enter this context.  After entering a context, all code compiled
   * and run is compiled and run in this context.  If another context
   * is already entered, this old context is saved so it can be
   * restored when the new context is exited.
   */
4886
  void Enter();
4887 4888 4889 4890 4891

  /**
   * Exit this context.  Exiting the current context restores the
   * context that was in place when entering the current context.
   */
4892 4893
  void Exit();

4894
  /** Returns true if the context has experienced an out of memory situation. */
4895 4896
  bool HasOutOfMemoryException();

4897
  /** Returns true if V8 has a current context. */
4898 4899
  static bool InContext();

4900 4901 4902
  /** Returns an isolate associated with a current context. */
  v8::Isolate* GetIsolate();

4903 4904 4905 4906 4907
  /**
   * Gets the embedder data with the given index, which must have been set by a
   * previous call to SetEmbedderData with the same index. Note that index 0
   * currently has a special meaning for Chrome's debugger.
   */
4908
  V8_INLINE(Local<Value> GetEmbedderData(int index));
4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922

  /**
   * Sets the embedder data with the given index, growing the data as
   * needed. Note that index 0 currently has a special meaning for Chrome's
   * debugger.
   */
  void SetEmbedderData(int index, Handle<Value> value);

  /**
   * Gets a 2-byte-aligned native pointer from the embedder data with the given
   * index, which must have bees set by a previous call to
   * SetAlignedPointerInEmbedderData with the same index. Note that index 0
   * currently has a special meaning for Chrome's debugger.
   */
4923
  V8_INLINE(void* GetAlignedPointerFromEmbedderData(int index));
4924 4925 4926 4927 4928 4929 4930

  /**
   * Sets a 2-byte-aligned native pointer in the embedder data with the given
   * index, growing the data as needed. Note that index 0 currently has a
   * special meaning for Chrome's debugger.
   */
  void SetAlignedPointerInEmbedderData(int index, void* value);
4931

4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946
  /**
   * Control whether code generation from strings is allowed. Calling
   * this method with false will disable 'eval' and the 'Function'
   * constructor for code running in this context. If 'eval' or the
   * 'Function' constructor are used an exception will be thrown.
   *
   * If code generation from strings is not allowed the
   * V8::AllowCodeGenerationFromStrings callback will be invoked if
   * set before blocking the call to 'eval' or the 'Function'
   * constructor. If that callback returns true, the call will be
   * allowed, otherwise an exception will be thrown. If no callback is
   * set an exception will be thrown.
   */
  void AllowCodeGenerationFromStrings(bool allow);

4947 4948 4949 4950 4951 4952
  /**
   * Returns true if code generation from strings is allowed for the context.
   * For more details see AllowCodeGenerationFromStrings(bool) documentation.
   */
  bool IsCodeGenerationFromStringsAllowed();

4953 4954 4955 4956 4957 4958 4959
  /**
   * Sets the error description for the exception that is thrown when
   * code generation from strings is not allowed and 'eval' or the 'Function'
   * constructor are called.
   */
  void SetErrorMessageForCodeGenerationFromStrings(Handle<String> message);

4960 4961 4962 4963
  /**
   * Stack-allocated class which sets the execution context for all
   * operations executed within a local scope.
   */
4964
  class Scope {
4965
   public:
4966
    explicit V8_INLINE(Scope(Handle<Context> context)) : context_(context) {
4967 4968
      context_->Enter();
    }
4969
    // TODO(dcarney): deprecate
4970 4971 4972 4973 4974 4975 4976 4977
    V8_INLINE(Scope(Isolate* isolate, Persistent<Context>& context)) // NOLINT
#ifndef V8_USE_UNSAFE_HANDLES
    : context_(Handle<Context>::New(isolate, context)) {
#else
    : context_(Local<Context>::New(isolate, context)) {
#endif
      context_->Enter();
    }
4978
    V8_INLINE(~Scope()) { context_->Exit(); }
4979

4980 4981 4982 4983 4984 4985 4986 4987 4988
   private:
    Handle<Context> context_;
  };

 private:
  friend class Value;
  friend class Script;
  friend class Object;
  friend class Function;
4989 4990 4991

  Local<Value> SlowGetEmbedderData(int index);
  void* SlowGetAlignedPointerFromEmbedderData(int index);
4992 4993 4994 4995
};


/**
4996 4997 4998 4999 5000 5001 5002 5003
 * Multiple threads in V8 are allowed, but only one thread at a time is allowed
 * to use any given V8 isolate, see the comments in the Isolate class. The
 * definition of 'using a V8 isolate' includes accessing handles or holding onto
 * object pointers obtained from V8 handles while in the particular V8 isolate.
 * It is up to the user of V8 to ensure, perhaps with locking, that this
 * constraint is not violated. In addition to any other synchronization
 * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be
 * used to signal thead switches to V8.
5004
 *
5005 5006 5007 5008
 * v8::Locker is a scoped lock object. While it's active, i.e. between its
 * construction and destruction, the current thread is allowed to use the locked
 * isolate. V8 guarantees that an isolate can be locked by at most one thread at
 * any time. In other words, the scope of a v8::Locker is a critical section.
5009
 *
5010 5011
 * Sample usage:
* \code
5012 5013
 * ...
 * {
5014 5015
 *   v8::Locker locker(isolate);
 *   v8::Isolate::Scope isolate_scope(isolate);
5016
 *   ...
5017
 *   // Code using V8 and isolate goes here.
5018 5019
 *   ...
 * } // Destructor called here
5020
 * \endcode
5021
 *
5022 5023 5024
 * If you wish to stop using V8 in a thread A you can do this either by
 * destroying the v8::Locker object as above or by constructing a v8::Unlocker
 * object:
5025
 *
5026
 * \code
5027
 * {
5028 5029
 *   isolate->Exit();
 *   v8::Unlocker unlocker(isolate);
5030 5031 5032 5033
 *   ...
 *   // Code not using V8 goes here while V8 can run in another thread.
 *   ...
 * } // Destructor called here.
5034
 * isolate->Enter();
5035
 * \endcode
5036
 *
5037 5038
 * The Unlocker object is intended for use in a long-running callback from V8,
 * where you want to release the V8 lock for other threads to use.
5039
 *
5040 5041 5042 5043 5044
 * The v8::Locker is a recursive lock, i.e. you can lock more than once in a
 * given thread. This can be useful if you have code that can be called either
 * from code that holds the lock or from code that does not. The Unlocker is
 * not recursive so you can not have several Unlockers on the stack at once, and
 * you can not use an Unlocker in a thread that is not inside a Locker's scope.
5045
 *
5046 5047
 * An unlocker will unlock several lockers if it has to and reinstate the
 * correct depth of locking on its destruction, e.g.:
5048
 *
5049
 * \code
5050 5051
 * // V8 not locked.
 * {
5052 5053
 *   v8::Locker locker(isolate);
 *   Isolate::Scope isolate_scope(isolate);
5054 5055
 *   // V8 locked.
 *   {
5056
 *     v8::Locker another_locker(isolate);
5057 5058
 *     // V8 still locked (2 levels).
 *     {
5059 5060
 *       isolate->Exit();
 *       v8::Unlocker unlocker(isolate);
5061 5062
 *       // V8 not locked.
 *     }
5063
 *     isolate->Enter();
5064 5065 5066 5067 5068
 *     // V8 locked again (2 levels).
 *   }
 *   // V8 still locked (1 level).
 * }
 * // V8 Now no longer locked.
5069
 * \endcode
5070
 */
5071
class V8EXPORT Unlocker {
5072
 public:
5073
  /**
5074
   * Initialize Unlocker for a given Isolate.
5075
   */
5076 5077
  V8_INLINE(explicit Unlocker(Isolate* isolate)) { Initialize(isolate); }

5078
  /** Deprecated. Use Isolate version instead. */
5079 5080
  V8_DEPRECATED(Unlocker());

5081
  ~Unlocker();
5082
 private:
5083 5084
  void Initialize(Isolate* isolate);

5085
  internal::Isolate* isolate_;
5086 5087 5088
};


5089
class V8EXPORT Locker {
5090
 public:
5091
  /**
5092 5093 5094 5095
   * Initialize Locker for a given Isolate.
   */
  V8_INLINE(explicit Locker(Isolate* isolate)) { Initialize(isolate); }

5096
  /** Deprecated. Use Isolate version instead. */
5097 5098
  V8_DEPRECATED(Locker());

5099
  ~Locker();
5100 5101 5102 5103

  /**
   * Start preemption.
   *
5104
   * When preemption is started, a timer is fired every n milliseconds
5105 5106 5107 5108 5109 5110 5111 5112 5113 5114
   * that will switch between multiple threads that are in contention
   * for the V8 lock.
   */
  static void StartPreemption(int every_n_ms);

  /**
   * Stop preemption.
   */
  static void StopPreemption();

5115
  /**
5116 5117
   * Returns whether or not the locker for a given isolate, is locked by the
   * current thread.
5118
   */
5119
  static bool IsLocked(Isolate* isolate);
5120

5121 5122 5123
  /**
   * Returns whether v8::Locker is being used by this V8 instance.
   */
5124
  static bool IsActive();
5125

5126
 private:
5127 5128
  void Initialize(Isolate* isolate);

5129 5130
  bool has_lock_;
  bool top_level_;
5131
  internal::Isolate* isolate_;
5132

5133 5134
  static bool active_;

5135 5136 5137
  // Disallow copying and assigning.
  Locker(const Locker&);
  void operator=(const Locker&);
5138 5139 5140
};


5141 5142 5143 5144 5145 5146
/**
 * A struct for exporting HeapStats data from V8, using "push" model.
 */
struct HeapStatsUpdate;


5147 5148 5149
/**
 * An interface for exporting data from V8, using "push" model.
 */
5150 5151
class V8EXPORT OutputStream {  // NOLINT
 public:
5152
  enum OutputEncoding {
5153
    kAscii = 0  // 7-bit ASCII.
5154
  };
5155 5156 5157 5158
  enum WriteResult {
    kContinue = 0,
    kAbort = 1
  };
5159 5160 5161 5162 5163 5164 5165
  virtual ~OutputStream() {}
  /** Notify about the end of stream. */
  virtual void EndOfStream() = 0;
  /** Get preferred output chunk size. Called only once. */
  virtual int GetChunkSize() { return 1024; }
  /** Get preferred output encoding. Called only once. */
  virtual OutputEncoding GetOutputEncoding() { return kAscii; }
5166 5167 5168 5169 5170 5171
  /**
   * Writes the next chunk of snapshot data into the stream. Writing
   * can be stopped by returning kAbort as function result. EndOfStream
   * will not be called in case writing was aborted.
   */
  virtual WriteResult WriteAsciiChunk(char* data, int size) = 0;
5172 5173 5174 5175 5176
  /**
   * Writes the next chunk of heap stats data into the stream. Writing
   * can be stopped by returning kAbort as function result. EndOfStream
   * will not be called in case writing was aborted.
   */
5177
  virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) {
5178 5179
    return kAbort;
  };
5180 5181 5182
};


5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200
/**
 * An interface for reporting progress and controlling long-running
 * activities.
 */
class V8EXPORT ActivityControl {  // NOLINT
 public:
  enum ControlOption {
    kContinue = 0,
    kAbort = 1
  };
  virtual ~ActivityControl() {}
  /**
   * Notify about current progress. The activity can be stopped by
   * returning kAbort as the callback result.
   */
  virtual ControlOption ReportProgressValue(int done, int total) = 0;
};

5201

5202
// --- Implementation ---
5203

5204 5205 5206

namespace internal {

5207 5208
const int kApiPointerSize = sizeof(void*);  // NOLINT
const int kApiIntSize = sizeof(int);  // NOLINT
5209 5210 5211 5212 5213 5214 5215 5216 5217 5218

// Tag information for HeapObject.
const int kHeapObjectTag = 1;
const int kHeapObjectTagSize = 2;
const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;

// Tag information for Smi.
const int kSmiTag = 0;
const int kSmiTagSize = 1;
const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
5219

5220
template <size_t ptr_size> struct SmiTagging;
5221

5222 5223 5224 5225 5226 5227 5228 5229
template<int kSmiShiftSize>
V8_INLINE(internal::Object* IntToSmi(int value)) {
  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
  intptr_t tagged_value =
      (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
  return reinterpret_cast<internal::Object*>(tagged_value);
}

5230
// Smi constants for 32-bit systems.
5231
template <> struct SmiTagging<4> {
5232 5233
  static const int kSmiShiftSize = 0;
  static const int kSmiValueSize = 31;
5234
  V8_INLINE(static int SmiToInt(internal::Object* value)) {
5235 5236 5237 5238
    int shift_bits = kSmiTagSize + kSmiShiftSize;
    // Throw away top 32 bits and shift down (requires >> to be sign extending).
    return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
  }
5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255
  V8_INLINE(static internal::Object* IntToSmi(int value)) {
    return internal::IntToSmi<kSmiShiftSize>(value);
  }
  V8_INLINE(static bool IsValidSmi(intptr_t value)) {
    // To be representable as an tagged small integer, the two
    // most-significant bits of 'value' must be either 00 or 11 due to
    // sign-extension. To check this we add 01 to the two
    // most-significant bits, and check if the most-significant bit is 0
    //
    // CAUTION: The original code below:
    // bool result = ((value + 0x40000000) & 0x80000000) == 0;
    // may lead to incorrect results according to the C language spec, and
    // in fact doesn't work correctly with gcc4.1.1 in some cases: The
    // compiler may produce undefined results in case of signed integer
    // overflow. The computation must be done w/ unsigned ints.
    return static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U;
  }
5256 5257 5258
};

// Smi constants for 64-bit systems.
5259
template <> struct SmiTagging<8> {
5260 5261
  static const int kSmiShiftSize = 31;
  static const int kSmiValueSize = 32;
5262
  V8_INLINE(static int SmiToInt(internal::Object* value)) {
5263 5264 5265 5266
    int shift_bits = kSmiTagSize + kSmiShiftSize;
    // Shift down and throw away top 32 bits.
    return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
  }
5267 5268 5269 5270 5271 5272 5273
  V8_INLINE(static internal::Object* IntToSmi(int value)) {
    return internal::IntToSmi<kSmiShiftSize>(value);
  }
  V8_INLINE(static bool IsValidSmi(intptr_t value)) {
    // To be representable as a long smi, the value must be a 32-bit integer.
    return (value == static_cast<int32_t>(value));
  }
5274 5275
};

5276 5277 5278
typedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289

/**
 * This class exports constants and functionality from within v8 that
 * is necessary to implement inline functions in the v8 api.  Don't
 * depend on functions and constants defined here.
 */
class Internals {
 public:
  // These values match non-compiler-dependent values defined within
  // the implementation of v8.
  static const int kHeapObjectMapOffset = 0;
5290
  static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
5291
  static const int kStringResourceOffset = 3 * kApiPointerSize;
5292

5293
  static const int kOddballKindOffset = 3 * kApiPointerSize;
5294
  static const int kForeignAddressOffset = kApiPointerSize;
5295
  static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
5296 5297
  static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
  static const int kContextHeaderSize = 2 * kApiPointerSize;
5298
  static const int kContextEmbedderDataIndex = 64;
5299
  static const int kFullStringRepresentationMask = 0x07;
5300
  static const int kStringEncodingMask = 0x4;
5301
  static const int kExternalTwoByteRepresentationTag = 0x02;
5302
  static const int kExternalAsciiRepresentationTag = 0x06;
5303

5304 5305 5306 5307 5308 5309 5310
  static const int kIsolateStateOffset = 0;
  static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
  static const int kIsolateRootsOffset = 3 * kApiPointerSize;
  static const int kUndefinedValueRootIndex = 5;
  static const int kNullValueRootIndex = 7;
  static const int kTrueValueRootIndex = 8;
  static const int kFalseValueRootIndex = 9;
5311
  static const int kEmptyStringRootIndex = 131;
5312

5313 5314 5315 5316 5317
  static const int kNodeClassIdOffset = 1 * kApiPointerSize;
  static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
  static const int kNodeStateMask = 0xf;
  static const int kNodeStateIsWeakValue = 2;
  static const int kNodeStateIsNearDeathValue = 4;
5318 5319 5320
  static const int kNodeIsIndependentShift = 4;
  static const int kNodeIsPartiallyDependentShift = 5;

5321
  static const int kJSObjectType = 0xb0;
5322
  static const int kFirstNonstringType = 0x80;
5323
  static const int kOddballType = 0x83;
5324
  static const int kForeignType = 0x88;
5325

5326 5327 5328
  static const int kUndefinedOddballKind = 5;
  static const int kNullOddballKind = 3;

5329
  V8_INLINE(static bool HasHeapObjectTag(internal::Object* value)) {
5330 5331 5332
    return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
            kHeapObjectTag);
  }
5333

5334
  V8_INLINE(static int SmiValue(internal::Object* value)) {
5335
    return PlatformSmiTagging::SmiToInt(value);
5336
  }
5337

5338 5339 5340 5341 5342 5343 5344 5345
  V8_INLINE(static internal::Object* IntToSmi(int value)) {
    return PlatformSmiTagging::IntToSmi(value);
  }

  V8_INLINE(static bool IsValidSmi(intptr_t value)) {
    return PlatformSmiTagging::IsValidSmi(value);
  }

5346
  V8_INLINE(static int GetInstanceType(internal::Object* obj)) {
5347 5348 5349 5350 5351
    typedef internal::Object O;
    O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
    return ReadField<uint8_t>(map, kMapInstanceTypeOffset);
  }

5352
  V8_INLINE(static int GetOddballKind(internal::Object* obj)) {
5353 5354 5355 5356
    typedef internal::Object O;
    return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
  }

5357
  V8_INLINE(static bool IsExternalTwoByteString(int instance_type)) {
5358 5359 5360 5361
    int representation = (instance_type & kFullStringRepresentationMask);
    return representation == kExternalTwoByteRepresentationTag;
  }

5362
  V8_INLINE(static bool IsInitialized(v8::Isolate* isolate)) {
5363 5364 5365 5366
    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateStateOffset;
    return *reinterpret_cast<int*>(addr) == 1;
  }

5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378
  V8_INLINE(static uint8_t GetNodeFlag(internal::Object** obj, int shift)) {
      uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
      return *addr & (1 << shift);
  }

  V8_INLINE(static void UpdateNodeFlag(internal::Object** obj,
                                       bool value, int shift)) {
      uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
      uint8_t mask = 1 << shift;
      *addr = (*addr & ~mask) | (value << shift);
  }

5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389
  V8_INLINE(static uint8_t GetNodeState(internal::Object** obj)) {
    uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
    return *addr & kNodeStateMask;
  }

  V8_INLINE(static void UpdateNodeState(internal::Object** obj,
                                        uint8_t value)) {
    uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
    *addr = (*addr & ~kNodeStateMask) | value;
  }

5390
  V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) {
5391 5392 5393 5394 5395
    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
        kIsolateEmbedderDataOffset;
    *reinterpret_cast<void**>(addr) = data;
  }

5396
  V8_INLINE(static void* GetEmbedderData(v8::Isolate* isolate)) {
5397 5398 5399 5400 5401
    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
        kIsolateEmbedderDataOffset;
    return *reinterpret_cast<void**>(addr);
  }

5402 5403
  V8_INLINE(static internal::Object** GetRoot(v8::Isolate* isolate,
                                              int index)) {
5404 5405 5406 5407
    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
    return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
  }

5408
  template <typename T>
5409
  V8_INLINE(static T ReadField(Object* ptr, int offset)) {
5410 5411 5412
    uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag;
    return *reinterpret_cast<T*>(addr);
  }
5413

5414
  template <typename T>
5415
  V8_INLINE(static T ReadEmbedderData(Context* context, int index)) {
5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426
    typedef internal::Object O;
    typedef internal::Internals I;
    O* ctx = *reinterpret_cast<O**>(context);
    int embedder_data_offset = I::kContextHeaderSize +
        (internal::kApiPointerSize * I::kContextEmbedderDataIndex);
    O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset);
    int value_offset =
        I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index);
    return I::ReadField<T>(embedder_data, value_offset);
  }

5427 5428 5429 5430 5431 5432 5433
  V8_INLINE(static bool CanCastToHeapObject(void* o)) { return false; }
  V8_INLINE(static bool CanCastToHeapObject(Context* o)) { return true; }
  V8_INLINE(static bool CanCastToHeapObject(String* o)) { return true; }
  V8_INLINE(static bool CanCastToHeapObject(Object* o)) { return true; }
  V8_INLINE(static bool CanCastToHeapObject(Message* o)) { return true; }
  V8_INLINE(static bool CanCastToHeapObject(StackTrace* o)) { return true; }
  V8_INLINE(static bool CanCastToHeapObject(StackFrame* o)) { return true; }
5434 5435
};

5436
}  // namespace internal
5437 5438


5439 5440 5441 5442 5443 5444 5445
template <class T>
Local<T>::Local() : Handle<T>() { }


template <class T>
Local<T> Local<T>::New(Handle<T> that) {
  if (that.IsEmpty()) return Local<T>();
5446 5447 5448 5449 5450 5451
  T* that_ptr = *that;
  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
  if (internal::Internals::CanCastToHeapObject(that_ptr)) {
    return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
        reinterpret_cast<internal::HeapObject*>(*p))));
  }
5452 5453 5454 5455
  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p)));
}


5456
template <class T>
5457
Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) {
5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481
  return New(isolate, that.val_);
}

#ifndef V8_USE_UNSAFE_HANDLES
template <class T>
Local<T> Local<T>::New(Isolate* isolate, const Persistent<T>& that) {
  return New(isolate, that.val_);
}

template <class T>
Handle<T> Handle<T>::New(Isolate* isolate, T* that) {
  if (that == NULL) return Handle<T>();
  T* that_ptr = that;
  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
  return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
      reinterpret_cast<internal::Isolate*>(isolate), *p)));
}
#endif


template <class T>
Local<T> Local<T>::New(Isolate* isolate, T* that) {
  if (that == NULL) return Local<T>();
  T* that_ptr = that;
5482 5483 5484 5485 5486 5487
  internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
      reinterpret_cast<internal::Isolate*>(isolate), *p)));
}


5488
#ifdef V8_USE_UNSAFE_HANDLES
5489 5490
template <class T>
Persistent<T> Persistent<T>::New(Handle<T> that) {
5491
  return New(Isolate::GetCurrent(), that.val_);
5492 5493 5494 5495 5496
}


template <class T>
Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) {
5497 5498 5499 5500 5501 5502 5503 5504 5505
  return New(Isolate::GetCurrent(), that.val_);
}

template <class T>
Persistent<T> Persistent<T>::New(Isolate* isolate, Persistent<T> that) {
  return New(Isolate::GetCurrent(), that.val_);
}
#endif

5506

5507
template <class T>
5508 5509
T* Persistent<T>::New(Isolate* isolate, T* that) {
  if (that == NULL) return NULL;
5510
  internal::Object** p = reinterpret_cast<internal::Object**>(that);
5511
  return reinterpret_cast<T*>(
5512
      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate),
5513
                             p));
5514 5515 5516
}


5517 5518
template <class T>
bool Persistent<T>::IsIndependent() const {
5519
  typedef internal::Internals I;
5520
  if (this->IsEmpty()) return false;
5521
  return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
5522
                        I::kNodeIsIndependentShift);
5523 5524 5525
}


5526
template <class T>
5527
bool Persistent<T>::IsNearDeath() const {
5528
  typedef internal::Internals I;
5529
  if (this->IsEmpty()) return false;
5530
  return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
5531
      I::kNodeStateIsNearDeathValue;
5532 5533 5534 5535
}


template <class T>
5536
bool Persistent<T>::IsWeak() const {
5537
  typedef internal::Internals I;
5538
  if (this->IsEmpty()) return false;
5539
  return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
5540
      I::kNodeStateIsWeakValue;
5541 5542 5543
}


5544 5545
template <class T>
void Persistent<T>::Dispose() {
5546 5547 5548 5549 5550
  if (this->IsEmpty()) return;
  V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
#ifndef V8_USE_UNSAFE_HANDLES
  val_ = 0;
#endif
5551 5552 5553 5554
}


template <class T>
5555 5556 5557 5558 5559 5560
template <typename S, typename P>
void Persistent<T>::MakeWeak(
    P* parameters,
    typename WeakReferenceCallbacks<S, P>::Revivable callback) {
  TYPE_CHECK(S, T);
  typedef typename WeakReferenceCallbacks<Value, void>::Revivable Revivable;
5561
  V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_),
5562
               parameters,
5563
               reinterpret_cast<Revivable>(callback));
5564 5565
}

5566 5567 5568 5569 5570 5571

template <class T>
template <typename P>
void Persistent<T>::MakeWeak(
    P* parameters,
    typename WeakReferenceCallbacks<T, P>::Revivable callback) {
5572
  MakeWeak<T, P>(parameters, callback);
5573 5574 5575
}


5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595
template <class T>
template <typename S, typename P>
void Persistent<T>::MakeWeak(
    Isolate* isolate,
    P* parameters,
    typename WeakReferenceCallbacks<S, P>::Revivable callback) {
  MakeWeak<S, P>(parameters, callback);
}


template <class T>
template<typename P>
void Persistent<T>::MakeWeak(
    Isolate* isolate,
    P* parameters,
    typename WeakReferenceCallbacks<T, P>::Revivable callback) {
  MakeWeak<P>(parameters, callback);
}


5596 5597
template <class T>
void Persistent<T>::ClearWeak() {
5598
  V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_));
5599 5600
}

5601

5602 5603
template <class T>
void Persistent<T>::MarkIndependent() {
5604 5605
  typedef internal::Internals I;
  if (this->IsEmpty()) return;
5606
  I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
5607 5608
                    true,
                    I::kNodeIsIndependentShift);
5609 5610
}

5611

5612
template <class T>
5613
void Persistent<T>::MarkPartiallyDependent() {
5614 5615
  typedef internal::Internals I;
  if (this->IsEmpty()) return;
5616
  I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
5617 5618
                    true,
                    I::kNodeIsPartiallyDependentShift);
5619 5620
}

5621

5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637
template <class T>
void Persistent<T>::Reset(Isolate* isolate, const Handle<T>& other) {
  Dispose(isolate);
#ifdef V8_USE_UNSAFE_HANDLES
  *this = *New(isolate, other);
#else
  if (other.IsEmpty()) {
    this->val_ = NULL;
    return;
  }
  internal::Object** p = reinterpret_cast<internal::Object**>(other.val_);
  this->val_ = reinterpret_cast<T*>(
      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
#endif
}

5638

5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653
#ifndef V8_USE_UNSAFE_HANDLES
template <class T>
void Persistent<T>::Reset(Isolate* isolate, const Persistent<T>& other) {
  Dispose(isolate);
  if (other.IsEmpty()) {
    this->val_ = NULL;
    return;
  }
  internal::Object** p = reinterpret_cast<internal::Object**>(other.val_);
  this->val_ = reinterpret_cast<T*>(
      V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
}
#endif


5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667
template <class T>
T* Persistent<T>::ClearAndLeak() {
  T* old;
#ifdef V8_USE_UNSAFE_HANDLES
  old = **this;
  *this = Persistent<T>();
#else
  old = val_;
  val_ = NULL;
#endif
  return old;
}


5668
template <class T>
5669
void Persistent<T>::SetWrapperClassId(uint16_t class_id) {
5670
  typedef internal::Internals I;
5671
  if (this->IsEmpty()) return;
5672
  internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
5673 5674
  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
  *reinterpret_cast<uint16_t*>(addr) = class_id;
5675
}
5676

5677 5678

template <class T>
5679
uint16_t Persistent<T>::WrapperClassId() const {
5680
  typedef internal::Internals I;
5681
  if (this->IsEmpty()) return 0;
5682
  internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
5683 5684
  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
  return *reinterpret_cast<uint16_t*>(addr);
5685 5686
}

5687

5688 5689 5690 5691
template<typename T>
ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {}

template<typename T>
5692 5693 5694
template<typename S>
void ReturnValue<T>::Set(const Persistent<S>& handle) {
  TYPE_CHECK(T, S);
5695
  if (V8_UNLIKELY(handle.IsEmpty())) {
5696
    *value_ = GetDefaultValue();
5697 5698 5699
  } else {
    *value_ = *reinterpret_cast<internal::Object**>(*handle);
  }
5700 5701 5702
}

template<typename T>
5703 5704 5705
template<typename S>
void ReturnValue<T>::Set(const Handle<S> handle) {
  TYPE_CHECK(T, S);
5706
  if (V8_UNLIKELY(handle.IsEmpty())) {
5707
    *value_ = GetDefaultValue();
5708 5709 5710
  } else {
    *value_ = *reinterpret_cast<internal::Object**>(*handle);
  }
5711 5712
}

5713
template<typename T>
5714 5715
void ReturnValue<T>::Set(double i) {
  Set(Number::New(GetIsolate(), i));
5716 5717 5718
}

template<typename T>
5719
void ReturnValue<T>::Set(int32_t i) {
5720 5721 5722 5723 5724
  typedef internal::Internals I;
  if (V8_LIKELY(I::IsValidSmi(i))) {
    *value_ = I::IntToSmi(i);
    return;
  }
5725
  Set(Integer::New(i, GetIsolate()));
5726 5727 5728
}

template<typename T>
5729
void ReturnValue<T>::Set(uint32_t i) {
5730
  typedef internal::Internals I;
5731 5732 5733
  // Can't simply use INT32_MAX here for whatever reason.
  bool fits_into_int32_t = (i & (1 << 31)) == 0;
  if (V8_LIKELY(fits_into_int32_t)) {
5734
    Set(static_cast<int32_t>(i));
5735 5736
    return;
  }
5737
  Set(Integer::NewFromUnsigned(i, GetIsolate()));
5738 5739 5740
}

template<typename T>
5741 5742 5743
void ReturnValue<T>::Set(bool value) {
  typedef internal::Internals I;
  int root_index;
5744
  if (value) {
5745
    root_index = I::kTrueValueRootIndex;
5746
  } else {
5747
    root_index = I::kFalseValueRootIndex;
5748
  }
5749
  *value_ = *I::GetRoot(GetIsolate(), root_index);
5750 5751 5752
}

template<typename T>
5753
void ReturnValue<T>::SetNull() {
5754
  typedef internal::Internals I;
5755
  *value_ = *I::GetRoot(GetIsolate(), I::kNullValueRootIndex);
5756 5757 5758
}

template<typename T>
5759
void ReturnValue<T>::SetUndefined() {
5760
  typedef internal::Internals I;
5761
  *value_ = *I::GetRoot(GetIsolate(), I::kUndefinedValueRootIndex);
5762 5763
}

5764 5765 5766 5767 5768 5769
template<typename T>
void ReturnValue<T>::SetEmptyString() {
  typedef internal::Internals I;
  *value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex);
}

5770
template<typename T>
5771
Isolate* ReturnValue<T>::GetIsolate() {
5772 5773 5774 5775 5776 5777 5778 5779
  // Isolate is always the pointer below the default value on the stack.
  return *reinterpret_cast<Isolate**>(&value_[-2]);
}

template<typename T>
internal::Object* ReturnValue<T>::GetDefaultValue() {
  // Default value is always the pointer below value_ on the stack.
  return value_[-1];
5780 5781 5782
}


5783 5784 5785 5786 5787
template<typename T>
FunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args,
                                              internal::Object** values,
                                              int length,
                                              bool is_construct_call)
5788 5789 5790 5791
    : implicit_args_(implicit_args),
      values_(values),
      length_(length),
      is_construct_call_(is_construct_call) { }
5792 5793


5794 5795 5796 5797 5798 5799 5800 5801 5802
Arguments::Arguments(internal::Object** args,
                     internal::Object** values,
                     int length,
                     bool is_construct_call)
    : FunctionCallbackInfo<Value>(args, values, length, is_construct_call) { }


template<typename T>
Local<Value> FunctionCallbackInfo<T>::operator[](int i) const {
5803 5804 5805 5806 5807
  if (i < 0 || length_ <= i) return Local<Value>(*Undefined());
  return Local<Value>(reinterpret_cast<Value*>(values_ - i));
}


5808 5809
template<typename T>
Local<Function> FunctionCallbackInfo<T>::Callee() const {
5810 5811
  return Local<Function>(reinterpret_cast<Function*>(
      &implicit_args_[kCalleeIndex]));
5812 5813 5814
}


5815 5816
template<typename T>
Local<Object> FunctionCallbackInfo<T>::This() const {
5817 5818 5819 5820
  return Local<Object>(reinterpret_cast<Object*>(values_ + 1));
}


5821 5822
template<typename T>
Local<Object> FunctionCallbackInfo<T>::Holder() const {
5823 5824
  return Local<Object>(reinterpret_cast<Object*>(
      &implicit_args_[kHolderIndex]));
5825 5826 5827
}


5828 5829
template<typename T>
Local<Value> FunctionCallbackInfo<T>::Data() const {
5830
  return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex]));
5831 5832 5833
}


5834 5835
template<typename T>
Isolate* FunctionCallbackInfo<T>::GetIsolate() const {
5836 5837 5838 5839
  return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]);
}


5840 5841 5842 5843 5844 5845 5846 5847
template<typename T>
ReturnValue<T> FunctionCallbackInfo<T>::GetReturnValue() const {
  return ReturnValue<T>(&implicit_args_[kReturnValueIndex]);
}


template<typename T>
bool FunctionCallbackInfo<T>::IsConstructCall() const {
5848 5849 5850 5851
  return is_construct_call_;
}


5852 5853
template<typename T>
int FunctionCallbackInfo<T>::Length() const {
5854 5855 5856 5857 5858 5859
  return length_;
}


template <class T>
Local<T> HandleScope::Close(Handle<T> value) {
5860 5861
  internal::Object** before = reinterpret_cast<internal::Object**>(*value);
  internal::Object** after = RawClose(before);
5862 5863 5864
  return Local<T>(reinterpret_cast<T*>(after));
}

5865
Handle<Value> ScriptOrigin::ResourceName() const {
5866 5867 5868 5869
  return resource_name_;
}


5870
Handle<Integer> ScriptOrigin::ResourceLineOffset() const {
5871 5872 5873 5874
  return resource_line_offset_;
}


5875
Handle<Integer> ScriptOrigin::ResourceColumnOffset() const {
5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889
  return resource_column_offset_;
}


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


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


5890 5891 5892 5893 5894
Local<Value> Object::GetInternalField(int index) {
#ifndef V8_ENABLE_CHECKS
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(this);
5895 5896
  // Fast path: If the object is a plain JSObject, which is the common case, we
  // know where to find the internal fields and can return the value directly.
5897
  if (I::GetInstanceType(obj) == I::kJSObjectType) {
5898
    int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
5899 5900 5901 5902 5903
    O* value = I::ReadField<O*>(obj, offset);
    O** result = HandleScope::CreateHandle(value);
    return Local<Value>(reinterpret_cast<Value*>(result));
  }
#endif
5904
  return SlowGetInternalField(index);
5905 5906 5907
}


5908 5909
void* Object::GetAlignedPointerFromInternalField(int index) {
#ifndef V8_ENABLE_CHECKS
5910 5911 5912
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(this);
5913 5914
  // Fast path: If the object is a plain JSObject, which is the common case, we
  // know where to find the internal fields and can return the value directly.
5915
  if (V8_LIKELY(I::GetInstanceType(obj) == I::kJSObjectType)) {
5916
    int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
5917
    return I::ReadField<void*>(obj, offset);
5918
  }
5919 5920
#endif
  return SlowGetAlignedPointerFromInternalField(index);
5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931
}


String* String::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<String*>(value);
}


5932 5933 5934 5935
Local<String> String::Empty(Isolate* isolate) {
  typedef internal::Object* S;
  typedef internal::Internals I;
  if (!I::IsInitialized(isolate)) return Empty();
5936
  S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex);
5937 5938 5939 5940
  return Local<String>(reinterpret_cast<String*>(slot));
}


5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966
Local<String> String::New(const char* data, int length) {
  return NewFromUtf8(Isolate::GetCurrent(), data, kNormalString, length);
}


Local<String> String::New(const uint16_t* data, int length) {
  return NewFromTwoByte(Isolate::GetCurrent(), data, kNormalString, length);
}


Local<String> String::NewSymbol(const char* data, int length) {
  return NewFromUtf8(Isolate::GetCurrent(), data, kInternalizedString, length);
}


Local<String> String::NewUndetectable(const char* data, int length) {
  return NewFromUtf8(Isolate::GetCurrent(), data, kUndetectableString, length);
}


Local<String> String::NewUndetectable(const uint16_t* data, int length) {
  return NewFromTwoByte(
      Isolate::GetCurrent(), data, kUndetectableString, length);
}


5967 5968 5969 5970
String::ExternalStringResource* String::GetExternalStringResource() const {
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
5971 5972 5973 5974 5975 5976
  String::ExternalStringResource* result;
  if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
    void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
    result = reinterpret_cast<String::ExternalStringResource*>(value);
  } else {
    result = NULL;
5977 5978
  }
#ifdef V8_ENABLE_CHECKS
5979
  VerifyExternalStringResource(result);
5980 5981 5982 5983 5984
#endif
  return result;
}


5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004
String::ExternalStringResourceBase* String::GetExternalStringResourceBase(
    String::Encoding* encoding_out) const {
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
  int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
  *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
  ExternalStringResourceBase* resource = NULL;
  if (type == I::kExternalAsciiRepresentationTag ||
      type == I::kExternalTwoByteRepresentationTag) {
    void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
    resource = static_cast<ExternalStringResourceBase*>(value);
  }
#ifdef V8_ENABLE_CHECKS
    VerifyExternalStringResourceBase(resource, *encoding_out);
#endif
  return resource;
}


6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040
bool Value::IsUndefined() const {
#ifdef V8_ENABLE_CHECKS
  return FullIsUndefined();
#else
  return QuickIsUndefined();
#endif
}

bool Value::QuickIsUndefined() const {
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
  if (!I::HasHeapObjectTag(obj)) return false;
  if (I::GetInstanceType(obj) != I::kOddballType) return false;
  return (I::GetOddballKind(obj) == I::kUndefinedOddballKind);
}


bool Value::IsNull() const {
#ifdef V8_ENABLE_CHECKS
  return FullIsNull();
#else
  return QuickIsNull();
#endif
}

bool Value::QuickIsNull() const {
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
  if (!I::HasHeapObjectTag(obj)) return false;
  if (I::GetInstanceType(obj) != I::kOddballType) return false;
  return (I::GetOddballKind(obj) == I::kNullOddballKind);
}


6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053
bool Value::IsString() const {
#ifdef V8_ENABLE_CHECKS
  return FullIsString();
#else
  return QuickIsString();
#endif
}

bool Value::QuickIsString() const {
  typedef internal::Object O;
  typedef internal::Internals I;
  O* obj = *reinterpret_cast<O**>(const_cast<Value*>(this));
  if (!I::HasHeapObjectTag(obj)) return false;
6054
  return (I::GetInstanceType(obj) < I::kFirstNonstringType);
6055 6056 6057
}


dcarney@chromium.org's avatar
dcarney@chromium.org committed
6058 6059 6060 6061 6062
template <class T> Value* Value::Cast(T* value) {
  return static_cast<Value*>(value);
}


6063 6064 6065 6066 6067 6068 6069 6070
Symbol* Symbol::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Symbol*>(value);
}


6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094
Number* Number::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Number*>(value);
}


Integer* Integer::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Integer*>(value);
}


Date* Date::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Date*>(value);
}


6095 6096 6097 6098 6099 6100 6101 6102
StringObject* StringObject::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<StringObject*>(value);
}


6103 6104 6105 6106 6107 6108 6109 6110
SymbolObject* SymbolObject::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<SymbolObject*>(value);
}


6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126
NumberObject* NumberObject::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<NumberObject*>(value);
}


BooleanObject* BooleanObject::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<BooleanObject*>(value);
}


6127 6128 6129 6130 6131 6132 6133 6134
RegExp* RegExp::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<RegExp*>(value);
}


6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150
Object* Object::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Object*>(value);
}


Array* Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Array*>(value);
}


6151 6152 6153 6154 6155 6156 6157 6158
ArrayBuffer* ArrayBuffer::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<ArrayBuffer*>(value);
}


6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230
TypedArray* TypedArray::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<TypedArray*>(value);
}


Uint8Array* Uint8Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Uint8Array*>(value);
}


Int8Array* Int8Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Int8Array*>(value);
}


Uint16Array* Uint16Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Uint16Array*>(value);
}


Int16Array* Int16Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Int16Array*>(value);
}


Uint32Array* Uint32Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Uint32Array*>(value);
}


Int32Array* Int32Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Int32Array*>(value);
}


Float32Array* Float32Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Float32Array*>(value);
}


Float64Array* Float64Array::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Float64Array*>(value);
}


6231 6232 6233 6234 6235 6236 6237 6238
Uint8ClampedArray* Uint8ClampedArray::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Uint8ClampedArray*>(value);
}


6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254
Function* Function::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<Function*>(value);
}


External* External::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
  CheckCast(value);
#endif
  return static_cast<External*>(value);
}


6255 6256 6257 6258 6259 6260 6261 6262 6263
template<typename T>
Isolate* PropertyCallbackInfo<T>::GetIsolate() const {
  return *reinterpret_cast<Isolate**>(&args_[kIsolateIndex]);
}


template<typename T>
Local<Value> PropertyCallbackInfo<T>::Data() const {
  return Local<Value>(reinterpret_cast<Value*>(&args_[kDataIndex]));
6264 6265 6266
}


6267 6268 6269
template<typename T>
Local<Object> PropertyCallbackInfo<T>::This() const {
  return Local<Object>(reinterpret_cast<Object*>(&args_[kThisIndex]));
6270 6271 6272
}


6273 6274 6275
template<typename T>
Local<Object> PropertyCallbackInfo<T>::Holder() const {
  return Local<Object>(reinterpret_cast<Object*>(&args_[kHolderIndex]));
6276 6277 6278
}


6279 6280 6281
template<typename T>
ReturnValue<T> PropertyCallbackInfo<T>::GetReturnValue() const {
  return ReturnValue<T>(&args_[kReturnValueIndex]);
6282 6283 6284
}


6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320
Handle<Primitive> Undefined(Isolate* isolate) {
  typedef internal::Object* S;
  typedef internal::Internals I;
  if (!I::IsInitialized(isolate)) return Undefined();
  S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex);
  return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
}


Handle<Primitive> Null(Isolate* isolate) {
  typedef internal::Object* S;
  typedef internal::Internals I;
  if (!I::IsInitialized(isolate)) return Null();
  S* slot = I::GetRoot(isolate, I::kNullValueRootIndex);
  return Handle<Primitive>(reinterpret_cast<Primitive*>(slot));
}


Handle<Boolean> True(Isolate* isolate) {
  typedef internal::Object* S;
  typedef internal::Internals I;
  if (!I::IsInitialized(isolate)) return True();
  S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex);
  return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
}


Handle<Boolean> False(Isolate* isolate) {
  typedef internal::Object* S;
  typedef internal::Internals I;
  if (!I::IsInitialized(isolate)) return False();
  S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex);
  return Handle<Boolean>(reinterpret_cast<Boolean*>(slot));
}


6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332
void Isolate::SetData(void* data) {
  typedef internal::Internals I;
  I::SetEmbedderData(this, data);
}


void* Isolate::GetData() {
  typedef internal::Internals I;
  return I::GetEmbedderData(this);
}


6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354
Local<Value> Context::GetEmbedderData(int index) {
#ifndef V8_ENABLE_CHECKS
  typedef internal::Object O;
  typedef internal::Internals I;
  O** result = HandleScope::CreateHandle(I::ReadEmbedderData<O*>(this, index));
  return Local<Value>(reinterpret_cast<Value*>(result));
#else
  return SlowGetEmbedderData(index);
#endif
}


void* Context::GetAlignedPointerFromEmbedderData(int index) {
#ifndef V8_ENABLE_CHECKS
  typedef internal::Internals I;
  return I::ReadEmbedderData<void*>(this, index);
#else
  return SlowGetAlignedPointerFromEmbedderData(index);
#endif
}


6355
/**
6356 6357
 * \example shell.cc
 * A simple shell that takes a list of expressions on the
6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369
 * command-line and executes them.
 */


/**
 * \example process.cc
 */


}  // namespace v8


6370
#undef V8EXPORT
6371 6372 6373
#undef TYPE_CHECK


6374
#endif  // V8_H_