v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
api.h
Go to the documentation of this file.
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_API_H_
29 #define V8_API_H_
30 
31 #include "v8.h"
32 
33 #include "../include/v8-testing.h"
34 #include "apiutils.h"
35 #include "contexts.h"
36 #include "factory.h"
37 #include "isolate.h"
38 #include "list-inl.h"
39 
40 namespace v8 {
41 
42 // Constants used in the implementation of the API. The most natural thing
43 // would usually be to place these with the classes that use them, but
44 // we want to keep them out of v8.h because it is an externally
45 // visible file.
46 class Consts {
47  public:
48  enum TemplateType {
51  };
52 };
53 
54 
55 // Utilities for working with neander-objects, primitive
56 // env-independent JSObjects used by the api.
58  public:
59  explicit NeanderObject(int size);
61  explicit inline NeanderObject(v8::internal::Object* obj);
62  inline v8::internal::Object* get(int index);
63  inline void set(int index, v8::internal::Object* value);
65  int size();
66  private:
68 };
69 
70 
71 // Utilities for working with neander-arrays, a simple extensible
72 // array abstraction built on neander-objects.
73 class NeanderArray {
74  public:
75  NeanderArray();
78  return obj_.value();
79  }
80 
82 
83  int length();
84 
85  v8::internal::Object* get(int index);
86  // Change the value at an index to undefined value. If the index is
87  // out of bounds, the request is ignored. Returns the old value.
88  void set(int index, v8::internal::Object* value);
89  private:
90  NeanderObject obj_;
91 };
92 
93 
95  : value_(v8::internal::Handle<v8::internal::JSObject>::cast(obj)) { }
96 
97 
99  : value_(v8::internal::Handle<v8::internal::JSObject>(
100  v8::internal::JSObject::cast(obj))) { }
101 
102 
104  : obj_(obj) { }
105 
106 
108  ASSERT(value()->HasFastObjectElements());
109  return v8::internal::FixedArray::cast(value()->elements())->get(offset);
110 }
111 
112 
113 void NeanderObject::set(int offset, v8::internal::Object* value) {
114  ASSERT(value_->HasFastObjectElements());
115  v8::internal::FixedArray::cast(value_->elements())->set(offset, value);
116 }
117 
118 
119 template <typename T> inline T ToCData(v8::internal::Object* obj) {
120  STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
121  return reinterpret_cast<T>(
122  reinterpret_cast<intptr_t>(
124 }
125 
126 
127 template <typename T>
129  STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
130  return FACTORY->NewForeign(
131  reinterpret_cast<v8::internal::Address>(reinterpret_cast<intptr_t>(obj)));
132 }
133 
134 
135 class ApiFunction {
136  public:
137  explicit ApiFunction(v8::internal::Address addr) : addr_(addr) { }
138  v8::internal::Address address() { return addr_; }
139  private:
140  v8::internal::Address addr_;
141 };
142 
143 
144 
146  public:
148  static void Register(RegisteredExtension* that);
149  static void UnregisterAll();
150  Extension* extension() { return extension_; }
151  RegisteredExtension* next() { return next_; }
152  RegisteredExtension* next_auto() { return next_auto_; }
153  static RegisteredExtension* first_extension() { return first_extension_; }
154  private:
155  Extension* extension_;
156  RegisteredExtension* next_;
157  RegisteredExtension* next_auto_;
158  static RegisteredExtension* first_extension_;
159 };
160 
161 
162 class Utils {
163  public:
164  static bool ReportApiFailure(const char* location, const char* message);
165 
168 
169  static inline Local<Context> ToLocal(
171  static inline Local<Value> ToLocal(
173  static inline Local<Function> ToLocal(
175  static inline Local<String> ToLocal(
177  static inline Local<RegExp> ToLocal(
179  static inline Local<Object> ToLocal(
181  static inline Local<Array> ToLocal(
183  static inline Local<External> ToLocal(
185  static inline Local<Message> MessageToLocal(
187  static inline Local<StackTrace> StackTraceToLocal(
189  static inline Local<StackFrame> StackFrameToLocal(
191  static inline Local<Number> NumberToLocal(
193  static inline Local<Integer> IntegerToLocal(
195  static inline Local<Uint32> Uint32ToLocal(
197  static inline Local<FunctionTemplate> ToLocal(
199  static inline Local<ObjectTemplate> ToLocal(
201  static inline Local<Signature> ToLocal(
205  static inline Local<TypeSwitch> ToLocal(
207 
209  OpenHandle(const Template* that);
211  OpenHandle(const FunctionTemplate* that);
213  OpenHandle(const ObjectTemplate* that);
215  OpenHandle(const Data* data);
217  OpenHandle(const RegExp* data);
219  OpenHandle(const v8::Object* data);
221  OpenHandle(const v8::Array* data);
223  OpenHandle(const String* data);
225  OpenHandle(const Script* data);
227  OpenHandle(const Function* data);
229  OpenHandle(const Message* message);
231  OpenHandle(const StackTrace* stack_trace);
233  OpenHandle(const StackFrame* stack_frame);
235  OpenHandle(const v8::Context* context);
237  OpenHandle(const v8::Signature* sig);
239  OpenHandle(const v8::AccessorSignature* sig);
241  OpenHandle(const v8::TypeSwitch* that);
243  OpenHandle(const v8::External* that);
244 };
245 
246 
247 template <class T>
249  return reinterpret_cast<T*>(obj.location());
250 }
251 
252 
253 template <class T>
255  v8::HandleScope* scope) {
257  if (!is_null()) {
258  handle = *this;
259  }
260  return Utils::OpenHandle(*scope->Close(Utils::ToLocal(handle)));
261 }
262 
263 
264 // Implementations of ToLocal
265 
266 #define MAKE_TO_LOCAL(Name, From, To) \
267  Local<v8::To> Utils::Name(v8::internal::Handle<v8::internal::From> obj) { \
268  ASSERT(obj.is_null() || !obj->IsTheHole()); \
269  return Local<To>(reinterpret_cast<To*>(obj.location())); \
270  }
271 
272 MAKE_TO_LOCAL(ToLocal, Context, Context)
273 MAKE_TO_LOCAL(ToLocal, Object, Value)
274 MAKE_TO_LOCAL(ToLocal, JSFunction, Function)
275 MAKE_TO_LOCAL(ToLocal, String, String)
276 MAKE_TO_LOCAL(ToLocal, JSRegExp, RegExp)
277 MAKE_TO_LOCAL(ToLocal, JSObject, Object)
278 MAKE_TO_LOCAL(ToLocal, JSArray, Array)
279 MAKE_TO_LOCAL(ToLocal, Foreign, External)
280 MAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate)
281 MAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate)
282 MAKE_TO_LOCAL(ToLocal, SignatureInfo, Signature)
283 MAKE_TO_LOCAL(AccessorSignatureToLocal, FunctionTemplateInfo, AccessorSignature)
284 MAKE_TO_LOCAL(ToLocal, TypeSwitchInfo, TypeSwitch)
285 MAKE_TO_LOCAL(MessageToLocal, Object, Message)
286 MAKE_TO_LOCAL(StackTraceToLocal, JSArray, StackTrace)
287 MAKE_TO_LOCAL(StackFrameToLocal, JSObject, StackFrame)
288 MAKE_TO_LOCAL(NumberToLocal, Object, Number)
289 MAKE_TO_LOCAL(IntegerToLocal, Object, Integer)
290 MAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32)
291 
292 #undef MAKE_TO_LOCAL
293 
294 
295 // Implementations of OpenHandle
296 
297 #define MAKE_OPEN_HANDLE(From, To) \
298  v8::internal::Handle<v8::internal::To> Utils::OpenHandle(\
299  const v8::From* that) { \
300  return v8::internal::Handle<v8::internal::To>( \
301  reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \
302  }
303 
304 MAKE_OPEN_HANDLE(Template, TemplateInfo)
305 MAKE_OPEN_HANDLE(FunctionTemplate, FunctionTemplateInfo)
306 MAKE_OPEN_HANDLE(ObjectTemplate, ObjectTemplateInfo)
307 MAKE_OPEN_HANDLE(Signature, SignatureInfo)
308 MAKE_OPEN_HANDLE(AccessorSignature, FunctionTemplateInfo)
309 MAKE_OPEN_HANDLE(TypeSwitch, TypeSwitchInfo)
310 MAKE_OPEN_HANDLE(Data, Object)
311 MAKE_OPEN_HANDLE(RegExp, JSRegExp)
312 MAKE_OPEN_HANDLE(Object, JSObject)
313 MAKE_OPEN_HANDLE(Array, JSArray)
314 MAKE_OPEN_HANDLE(String, String)
315 MAKE_OPEN_HANDLE(Script, Object)
316 MAKE_OPEN_HANDLE(Function, JSFunction)
317 MAKE_OPEN_HANDLE(Message, JSObject)
318 MAKE_OPEN_HANDLE(Context, Context)
319 MAKE_OPEN_HANDLE(External, Foreign)
320 MAKE_OPEN_HANDLE(StackTrace, JSArray)
321 MAKE_OPEN_HANDLE(StackFrame, JSObject)
322 
323 #undef MAKE_OPEN_HANDLE
324 
325 
326 namespace internal {
327 
328 // Tracks string usage to help make better decisions when
329 // externalizing strings.
330 //
331 // Implementation note: internally this class only tracks fresh
332 // strings and keeps a single use counter for them.
334  public:
335  // Records that the given string's characters were copied to some
336  // external buffer. If this happens often we should honor
337  // externalization requests for the string.
339  Address address = reinterpret_cast<Address>(*string);
340  Address top = isolate_->heap()->NewSpaceTop();
341  if (IsFreshString(address, top)) {
342  IncrementUseCount(top);
343  }
344  }
345 
346  // Estimates freshness and use frequency of the given string based
347  // on how close it is to the new space top and the recorded usage
348  // history.
349  inline bool IsFreshUnusedString(Handle<String> string) {
350  Address address = reinterpret_cast<Address>(*string);
351  Address top = isolate_->heap()->NewSpaceTop();
352  return IsFreshString(address, top) && IsUseCountLow(top);
353  }
354 
355  private:
356  StringTracker() : use_count_(0), last_top_(NULL), isolate_(NULL) { }
357 
358  static inline bool IsFreshString(Address string, Address top) {
359  return top - kFreshnessLimit <= string && string <= top;
360  }
361 
362  inline bool IsUseCountLow(Address top) {
363  if (last_top_ != top) return true;
364  return use_count_ < kUseLimit;
365  }
366 
367  inline void IncrementUseCount(Address top) {
368  if (last_top_ != top) {
369  use_count_ = 0;
370  last_top_ = top;
371  }
372  ++use_count_;
373  }
374 
375  // Single use counter shared by all fresh strings.
376  int use_count_;
377 
378  // Last new space top when the use count above was valid.
379  Address last_top_;
380 
381  Isolate* isolate_;
382 
383  // How close to the new space top a fresh string has to be.
384  static const int kFreshnessLimit = 1024;
385 
386  // The number of uses required to consider a string useful.
387  static const int kUseLimit = 32;
388 
389  friend class Isolate;
390 
392 };
393 
394 
395 // This class is here in order to be able to declare it a friend of
396 // HandleScope. Moving these methods to be members of HandleScope would be
397 // neat in some ways, but it would expose internal implementation details in
398 // our public header file, which is undesirable.
399 //
400 // An isolate has a single instance of this class to hold the current thread's
401 // data. In multithreaded V8 programs this data is copied in and out of storage
402 // so that the currently executing thread always has its own copy of this
403 // data.
405  public:
406  explicit HandleScopeImplementer(Isolate* isolate)
407  : isolate_(isolate),
408  blocks_(0),
409  entered_contexts_(0),
410  saved_contexts_(0),
411  spare_(NULL),
412  call_depth_(0) { }
413 
415  DeleteArray(spare_);
416  }
417 
418  // Threading support for handle data.
419  static int ArchiveSpacePerThread();
420  char* RestoreThread(char* from);
421  char* ArchiveThread(char* to);
422  void FreeThreadResources();
423 
424  // Garbage collection support.
425  void Iterate(v8::internal::ObjectVisitor* v);
426  static char* Iterate(v8::internal::ObjectVisitor* v, char* data);
427 
428 
430  inline void DeleteExtensions(internal::Object** prev_limit);
431 
432  inline void IncrementCallDepth() {call_depth_++;}
433  inline void DecrementCallDepth() {call_depth_--;}
434  inline bool CallDepthIsZero() { return call_depth_ == 0; }
435 
436  inline void EnterContext(Handle<Object> context);
437  inline bool LeaveLastContext();
438 
439  // Returns the last entered context or an empty handle if no
440  // contexts have been entered.
442 
443  inline void SaveContext(Context* context);
444  inline Context* RestoreContext();
445  inline bool HasSavedContexts();
446 
447  inline List<internal::Object**>* blocks() { return &blocks_; }
448 
449  private:
450  void ResetAfterArchive() {
451  blocks_.Initialize(0);
452  entered_contexts_.Initialize(0);
453  saved_contexts_.Initialize(0);
454  spare_ = NULL;
455  call_depth_ = 0;
456  }
457 
458  void Free() {
459  ASSERT(blocks_.length() == 0);
460  ASSERT(entered_contexts_.length() == 0);
461  ASSERT(saved_contexts_.length() == 0);
462  blocks_.Free();
463  entered_contexts_.Free();
464  saved_contexts_.Free();
465  if (spare_ != NULL) {
466  DeleteArray(spare_);
467  spare_ = NULL;
468  }
469  ASSERT(call_depth_ == 0);
470  }
471 
472  Isolate* isolate_;
473  List<internal::Object**> blocks_;
474  // Used as a stack to keep track of entered contexts.
475  List<Handle<Object> > entered_contexts_;
476  // Used as a stack to keep track of saved contexts.
477  List<Context*> saved_contexts_;
478  Object** spare_;
479  int call_depth_;
480  // This is only used for threading support.
482 
483  void IterateThis(ObjectVisitor* v);
484  char* RestoreThreadHelper(char* from);
485  char* ArchiveThreadHelper(char* to);
486 
487  DISALLOW_COPY_AND_ASSIGN(HandleScopeImplementer);
488 };
489 
490 
491 const int kHandleBlockSize = v8::internal::KB - 2; // fit in one page
492 
493 
494 void HandleScopeImplementer::SaveContext(Context* context) {
495  saved_contexts_.Add(context);
496 }
497 
498 
500  return saved_contexts_.RemoveLast();
501 }
502 
503 
505  return !saved_contexts_.is_empty();
506 }
507 
508 
510  entered_contexts_.Add(context);
511 }
512 
513 
515  if (entered_contexts_.is_empty()) return false;
516  entered_contexts_.RemoveLast();
517  return true;
518 }
519 
520 
522  if (entered_contexts_.is_empty()) return Handle<Object>::null();
523  return entered_contexts_.last();
524 }
525 
526 
527 // If there's a spare block, use it for growing the current scope.
529  internal::Object** block = (spare_ != NULL) ?
530  spare_ :
531  NewArray<internal::Object*>(kHandleBlockSize);
532  spare_ = NULL;
533  return block;
534 }
535 
536 
538  while (!blocks_.is_empty()) {
539  internal::Object** block_start = blocks_.last();
540  internal::Object** block_limit = block_start + kHandleBlockSize;
541 #ifdef DEBUG
542  // NoHandleAllocation may make the prev_limit to point inside the block.
543  if (block_start <= prev_limit && prev_limit <= block_limit) break;
544 #else
545  if (prev_limit == block_limit) break;
546 #endif
547 
548  blocks_.RemoveLast();
549 #ifdef DEBUG
550  v8::ImplementationUtilities::ZapHandleRange(block_start, block_limit);
551 #endif
552  if (spare_ != NULL) {
553  DeleteArray(spare_);
554  }
555  spare_ = block_start;
556  }
557  ASSERT((blocks_.is_empty() && prev_limit == NULL) ||
558  (!blocks_.is_empty() && prev_limit != NULL));
559 }
560 
561 
562 class Testing {
563  public:
564  static v8::Testing::StressType stress_type() { return stress_type_; }
566  stress_type_ = stress_type;
567  }
568 
569  private:
570  static v8::Testing::StressType stress_type_;
571 };
572 
573 } } // namespace v8::internal
574 
575 #endif // V8_API_H_
byte * Address
Definition: globals.h:172
void SaveContext(Context *context)
Definition: api.h:494
static void set_stress_type(v8::Testing::StressType stress_type)
Definition: api.h:565
RegisteredExtension * next()
Definition: api.h:151
internal::Object ** GetSpareOrNewBlock()
Definition: api.h:528
HandleScopeImplementer(Isolate *isolate)
Definition: api.h:406
void RecordWrite(Handle< String > string)
Definition: api.h:338
v8::internal::Handle< v8::internal::JSObject > value()
Definition: api.h:77
void set(int index, v8::internal::Object *value)
Definition: api.cc:880
static Local< Number > NumberToLocal(v8::internal::Handle< v8::internal::Object > obj)
const int KB
Definition: globals.h:221
char * ArchiveThread(char *to)
Definition: api.cc:6351
friend class Isolate
Definition: api.h:389
static Local< AccessorSignature > AccessorSignatureToLocal(v8::internal::Handle< v8::internal::FunctionTemplateInfo > obj)
char * RestoreThread(char *from)
Definition: api.cc:6369
Definition: v8.h:506
Definition: api.h:46
v8::HandleScope::Data HandleScopeData
Definition: apiutils.h:69
static Foreign * cast(Object *obj)
int length()
Definition: api.cc:849
void DeleteExtensions(internal::Object **prev_limit)
Definition: api.h:537
T ToCData(v8::internal::Object *obj)
Definition: api.h:119
#define ASSERT(condition)
Definition: checks.h:270
void EnterContext(Handle< Object > context)
Definition: api.h:509
Handle< Object > LastEnteredContext()
Definition: api.h:521
v8::internal::Address address()
Definition: api.h:138
v8::internal::Handle< v8::internal::JSObject > value()
Definition: api.h:64
Extension * extension()
Definition: api.h:150
#define MAKE_OPEN_HANDLE(From, To)
Definition: api.h:297
static Local< StackFrame > StackFrameToLocal(v8::internal::Handle< v8::internal::JSObject > obj)
T ** location() const
Definition: handles.h:75
HANDLE HANDLE LPSTACKFRAME64 StackFrame
static Local< StackTrace > StackTraceToLocal(v8::internal::Handle< v8::internal::JSArray > obj)
static Local< Message > MessageToLocal(v8::internal::Handle< v8::internal::Object > obj)
ApiFunction(v8::internal::Address addr)
Definition: api.h:137
static Local< Uint32 > Uint32ToLocal(v8::internal::Handle< v8::internal::Object > obj)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: globals.h:321
TemplateType
Definition: api.h:48
static Local< Integer > IntegerToLocal(v8::internal::Handle< v8::internal::Object > obj)
Definition: v8.h:104
static void UnregisterAll()
Definition: api.cc:515
NeanderObject(int size)
Definition: api.cc:829
Definition: v8.h:592
static Local< Context > ToLocal(v8::internal::Handle< v8::internal::Context > obj)
#define T(name, string, precedence)
Definition: token.cc:48
RegisteredExtension(Extension *extension)
Definition: api.cc:505
Definition: v8.h:1714
List< internal::Object ** > * blocks()
Definition: api.h:447
bool IsFreshUnusedString(Handle< String > string)
Definition: api.h:349
void add(v8::internal::Handle< v8::internal::Object > value)
Definition: api.cc:866
Address NewSpaceTop()
Definition: heap.h:497
static RegisteredExtension * first_extension()
Definition: api.h:153
v8::internal::Handle< v8::internal::Object > FromCData(T obj)
Definition: api.h:128
void Iterate(v8::internal::ObjectVisitor *v)
Handle< T > EscapeFrom(v8::HandleScope *scope)
Definition: api.h:254
RegisteredExtension * next_auto()
Definition: api.h:152
const int kHandleBlockSize
Definition: api.h:491
void set(int index, v8::internal::Object *value)
Definition: api.h:113
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
Definition: flags.cc:274
static void Register(RegisteredExtension *that)
Definition: api.cc:509
Local< T > Close(Handle< T > value)
Definition: v8.h:4149
static FixedArray * cast(Object *obj)
static bool ReportApiFailure(const char *location, const char *message)
Definition: api.cc:219
#define FACTORY
Definition: isolate.h:1409
Object * get(int index)
Definition: objects-inl.h:1675
Definition: api.h:162
static Local< FunctionTemplate > ToFunctionTemplate(NeanderObject obj)
#define STATIC_ASSERT(test)
Definition: checks.h:283
void DeleteArray(T *array)
Definition: allocation.h:91
Definition: v8.h:105
static Local< ObjectTemplate > ToObjectTemplate(NeanderObject obj)
v8::internal::Object * get(int index)
Definition: api.h:107
int size()
Definition: api.cc:839
static v8::internal::Handle< v8::internal::TemplateInfo > OpenHandle(const Template *that)
#define MAKE_TO_LOCAL(Name, From, To)
Definition: api.h:266
T * ToApi(v8::internal::Handle< v8::internal::Object > obj)
Definition: api.h:248
static v8::Testing::StressType stress_type()
Definition: api.h:564