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
test-accessors.cc
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 #include <stdlib.h>
29 
30 #include "v8.h"
31 
32 #include "api.h"
33 #include "cctest.h"
34 #include "frames-inl.h"
35 #include "string-stream.h"
36 
37 using ::v8::ObjectTemplate;
38 using ::v8::Value;
39 using ::v8::Context;
40 using ::v8::Local;
41 using ::v8::String;
42 using ::v8::Script;
43 using ::v8::Function;
44 using ::v8::AccessorInfo;
45 using ::v8::Extension;
46 
47 static v8::Handle<Value> handle_property(Local<String> name,
48  const AccessorInfo&) {
50  return v8_num(900);
51 }
52 
53 
54 THREADED_TEST(PropertyHandler) {
55  v8::HandleScope scope;
56  Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
57  fun_templ->InstanceTemplate()->SetAccessor(v8_str("foo"), handle_property);
58  LocalContext env;
59  Local<Function> fun = fun_templ->GetFunction();
60  env->Global()->Set(v8_str("Fun"), fun);
61  Local<Script> getter = v8_compile("var obj = new Fun(); obj.foo;");
62  CHECK_EQ(900, getter->Run()->Int32Value());
63  Local<Script> setter = v8_compile("obj.foo = 901;");
64  CHECK_EQ(901, setter->Run()->Int32Value());
65 }
66 
67 
68 static v8::Handle<Value> GetIntValue(Local<String> property,
69  const AccessorInfo& info) {
71  int* value =
72  static_cast<int*>(v8::Handle<v8::External>::Cast(info.Data())->Value());
73  return v8_num(*value);
74 }
75 
76 
77 static void SetIntValue(Local<String> property,
78  Local<Value> value,
79  const AccessorInfo& info) {
80  int* field =
81  static_cast<int*>(v8::Handle<v8::External>::Cast(info.Data())->Value());
82  *field = value->Int32Value();
83 }
84 
85 int foo, bar, baz;
86 
87 THREADED_TEST(GlobalVariableAccess) {
88  foo = 0;
89  bar = -4;
90  baz = 10;
91  v8::HandleScope scope;
93  templ->InstanceTemplate()->SetAccessor(v8_str("foo"),
94  GetIntValue,
95  SetIntValue,
96  v8::External::New(&foo));
97  templ->InstanceTemplate()->SetAccessor(v8_str("bar"),
98  GetIntValue,
99  SetIntValue,
100  v8::External::New(&bar));
101  templ->InstanceTemplate()->SetAccessor(v8_str("baz"),
102  GetIntValue,
103  SetIntValue,
104  v8::External::New(&baz));
105  LocalContext env(0, templ->InstanceTemplate());
106  v8_compile("foo = (++bar) + baz")->Run();
107  CHECK_EQ(bar, -3);
108  CHECK_EQ(foo, 7);
109 }
110 
111 
112 static int x_register = 0;
113 static v8::Handle<v8::Object> x_receiver;
114 static v8::Handle<v8::Object> x_holder;
115 
116 
117 static v8::Handle<Value> XGetter(Local<String> name, const AccessorInfo& info) {
120  CHECK_EQ(isolate, info.GetIsolate());
121  CHECK_EQ(x_receiver, info.This());
122  CHECK_EQ(x_holder, info.Holder());
123  return v8_num(x_register);
124 }
125 
126 
127 static void XSetter(Local<String> name,
128  Local<Value> value,
129  const AccessorInfo& info) {
131  CHECK_EQ(isolate, info.GetIsolate());
132  CHECK_EQ(x_holder, info.This());
133  CHECK_EQ(x_holder, info.Holder());
134  x_register = value->Int32Value();
135 }
136 
137 
138 THREADED_TEST(AccessorIC) {
139  v8::HandleScope scope;
140  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
141  obj->SetAccessor(v8_str("x"), XGetter, XSetter);
142  LocalContext context;
143  x_holder = obj->NewInstance();
144  context->Global()->Set(v8_str("holder"), x_holder);
145  x_receiver = v8::Object::New();
146  context->Global()->Set(v8_str("obj"), x_receiver);
148  "obj.__proto__ = holder;"
149  "var result = [];"
150  "for (var i = 0; i < 10; i++) {"
151  " holder.x = i;"
152  " result.push(obj.x);"
153  "}"
154  "result"));
155  CHECK_EQ(10, array->Length());
156  for (int i = 0; i < 10; i++) {
157  v8::Handle<Value> entry = array->Get(v8::Integer::New(i));
158  CHECK_EQ(v8::Integer::New(i), entry);
159  }
160 }
161 
162 
163 static v8::Handle<Value> AccessorProhibitsOverwritingGetter(
164  Local<String> name,
165  const AccessorInfo& info) {
167  return v8::True();
168 }
169 
170 
171 THREADED_TEST(AccessorProhibitsOverwriting) {
172  v8::HandleScope scope;
173  LocalContext context;
174  Local<ObjectTemplate> templ = ObjectTemplate::New();
175  templ->SetAccessor(v8_str("x"),
176  AccessorProhibitsOverwritingGetter,
177  0,
180  v8::ReadOnly);
181  Local<v8::Object> instance = templ->NewInstance();
182  context->Global()->Set(v8_str("obj"), instance);
183  Local<Value> value = CompileRun(
184  "obj.__defineGetter__('x', function() { return false; });"
185  "obj.x");
186  CHECK(value->BooleanValue());
187  value = CompileRun(
188  "var setter_called = false;"
189  "obj.__defineSetter__('x', function() { setter_called = true; });"
190  "obj.x = 42;"
191  "setter_called");
192  CHECK(!value->BooleanValue());
193  value = CompileRun(
194  "obj2 = {};"
195  "obj2.__proto__ = obj;"
196  "obj2.__defineGetter__('x', function() { return false; });"
197  "obj2.x");
198  CHECK(value->BooleanValue());
199  value = CompileRun(
200  "var setter_called = false;"
201  "obj2 = {};"
202  "obj2.__proto__ = obj;"
203  "obj2.__defineSetter__('x', function() { setter_called = true; });"
204  "obj2.x = 42;"
205  "setter_called");
206  CHECK(!value->BooleanValue());
207 }
208 
209 
210 template <int C>
211 static v8::Handle<Value> HandleAllocatingGetter(Local<String> name,
212  const AccessorInfo& info) {
214  for (int i = 0; i < C; i++)
215  v8::String::New("foo");
216  return v8::String::New("foo");
217 }
218 
219 
220 THREADED_TEST(HandleScopePop) {
221  v8::HandleScope scope;
222  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
223  obj->SetAccessor(v8_str("one"), HandleAllocatingGetter<1>);
224  obj->SetAccessor(v8_str("many"), HandleAllocatingGetter<1024>);
225  LocalContext context;
226  v8::Handle<v8::Object> inst = obj->NewInstance();
227  context->Global()->Set(v8::String::New("obj"), inst);
228  int count_before = i::HandleScope::NumberOfHandles();
229  {
230  v8::HandleScope scope;
231  CompileRun(
232  "for (var i = 0; i < 1000; i++) {"
233  " obj.one;"
234  " obj.many;"
235  "}");
236  }
237  int count_after = i::HandleScope::NumberOfHandles();
238  CHECK_EQ(count_before, count_after);
239 }
240 
241 static v8::Handle<Value> CheckAccessorArgsCorrect(Local<String> name,
242  const AccessorInfo& info) {
243  CHECK(info.GetIsolate() == v8::Isolate::GetCurrent());
244  CHECK(info.This() == info.Holder());
245  CHECK(info.Data()->Equals(v8::String::New("data")));
247  CHECK(info.GetIsolate() == v8::Isolate::GetCurrent());
248  CHECK(info.This() == info.Holder());
249  CHECK(info.Data()->Equals(v8::String::New("data")));
250  HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
251  CHECK(info.GetIsolate() == v8::Isolate::GetCurrent());
252  CHECK(info.This() == info.Holder());
253  CHECK(info.Data()->Equals(v8::String::New("data")));
254  return v8::Integer::New(17);
255 }
256 
257 THREADED_TEST(DirectCall) {
258  v8::HandleScope scope;
259  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
260  obj->SetAccessor(v8_str("xxx"),
261  CheckAccessorArgsCorrect,
262  NULL,
263  v8::String::New("data"));
264  LocalContext context;
265  v8::Handle<v8::Object> inst = obj->NewInstance();
266  context->Global()->Set(v8::String::New("obj"), inst);
267  Local<Script> scr = v8::Script::Compile(v8::String::New("obj.xxx"));
268  for (int i = 0; i < 10; i++) {
269  Local<Value> result = scr->Run();
270  CHECK(!result.IsEmpty());
271  CHECK_EQ(17, result->Int32Value());
272  }
273 }
274 
275 static v8::Handle<Value> EmptyGetter(Local<String> name,
276  const AccessorInfo& info) {
277  CheckAccessorArgsCorrect(name, info);
279  CheckAccessorArgsCorrect(name, info);
280  return v8::Handle<v8::Value>();
281 }
282 
283 THREADED_TEST(EmptyResult) {
284  v8::HandleScope scope;
285  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
286  obj->SetAccessor(v8_str("xxx"), EmptyGetter, NULL, v8::String::New("data"));
287  LocalContext context;
288  v8::Handle<v8::Object> inst = obj->NewInstance();
289  context->Global()->Set(v8::String::New("obj"), inst);
290  Local<Script> scr = v8::Script::Compile(v8::String::New("obj.xxx"));
291  for (int i = 0; i < 10; i++) {
292  Local<Value> result = scr->Run();
293  CHECK(result == v8::Undefined());
294  }
295 }
296 
297 
298 THREADED_TEST(NoReuseRegress) {
299  // Check that the IC generated for the one test doesn't get reused
300  // for the other.
301  v8::HandleScope scope;
302  {
303  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
304  obj->SetAccessor(v8_str("xxx"), EmptyGetter, NULL, v8::String::New("data"));
305  LocalContext context;
306  v8::Handle<v8::Object> inst = obj->NewInstance();
307  context->Global()->Set(v8::String::New("obj"), inst);
308  Local<Script> scr = v8::Script::Compile(v8::String::New("obj.xxx"));
309  for (int i = 0; i < 2; i++) {
310  Local<Value> result = scr->Run();
311  CHECK(result == v8::Undefined());
312  }
313  }
314  {
315  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
316  obj->SetAccessor(v8_str("xxx"),
317  CheckAccessorArgsCorrect,
318  NULL,
319  v8::String::New("data"));
320  LocalContext context;
321  v8::Handle<v8::Object> inst = obj->NewInstance();
322  context->Global()->Set(v8::String::New("obj"), inst);
323  Local<Script> scr = v8::Script::Compile(v8::String::New("obj.xxx"));
324  for (int i = 0; i < 10; i++) {
325  Local<Value> result = scr->Run();
326  CHECK(!result.IsEmpty());
327  CHECK_EQ(17, result->Int32Value());
328  }
329  }
330 }
331 
332 static v8::Handle<Value> ThrowingGetAccessor(Local<String> name,
333  const AccessorInfo& info) {
335  return v8::ThrowException(v8_str("g"));
336 }
337 
338 
339 static void ThrowingSetAccessor(Local<String> name,
340  Local<Value> value,
341  const AccessorInfo& info) {
342  v8::ThrowException(value);
343 }
344 
345 
346 THREADED_TEST(Regress1054726) {
347  v8::HandleScope scope;
348  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
349  obj->SetAccessor(v8_str("x"),
350  ThrowingGetAccessor,
351  ThrowingSetAccessor,
352  Local<Value>());
353 
354  LocalContext env;
355  env->Global()->Set(v8_str("obj"), obj->NewInstance());
356 
357  // Use the throwing property setter/getter in a loop to force
358  // the accessor ICs to be initialized.
359  v8::Handle<Value> result;
360  result = Script::Compile(v8_str(
361  "var result = '';"
362  "for (var i = 0; i < 5; i++) {"
363  " try { obj.x; } catch (e) { result += e; }"
364  "}; result"))->Run();
365  CHECK_EQ(v8_str("ggggg"), result);
366 
367  result = Script::Compile(String::New(
368  "var result = '';"
369  "for (var i = 0; i < 5; i++) {"
370  " try { obj.x = i; } catch (e) { result += e; }"
371  "}; result"))->Run();
372  CHECK_EQ(v8_str("01234"), result);
373 }
374 
375 
376 static v8::Handle<Value> AllocGetter(Local<String> name,
377  const AccessorInfo& info) {
379  return v8::Array::New(1000);
380 }
381 
382 
384  v8::HandleScope scope;
385  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
386  obj->SetAccessor(v8_str("xxx"), AllocGetter);
387  LocalContext env;
388  env->Global()->Set(v8_str("obj"), obj->NewInstance());
389  Script::Compile(String::New(
390  "var last = [];"
391  "for (var i = 0; i < 2048; i++) {"
392  " var result = obj.xxx;"
393  " result[0] = last;"
394  " last = result;"
395  "}"))->Run();
396 }
397 
398 
399 static v8::Handle<Value> StackCheck(Local<String> name,
400  const AccessorInfo& info) {
401  i::StackFrameIterator iter;
402  for (int i = 0; !iter.done(); i++) {
403  i::StackFrame* frame = iter.frame();
404  CHECK(i != 0 || (frame->type() == i::StackFrame::EXIT));
405  i::Code* code = frame->LookupCode();
406  CHECK(code->IsCode());
407  i::Address pc = frame->pc();
408  CHECK(code->contains(pc));
409  iter.Advance();
410  }
411  return v8::Undefined();
412 }
413 
414 
415 THREADED_TEST(StackIteration) {
416  v8::HandleScope scope;
417  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
419  obj->SetAccessor(v8_str("xxx"), StackCheck);
420  LocalContext env;
421  env->Global()->Set(v8_str("obj"), obj->NewInstance());
422  Script::Compile(String::New(
423  "function foo() {"
424  " return obj.xxx;"
425  "}"
426  "for (var i = 0; i < 100; i++) {"
427  " foo();"
428  "}"))->Run();
429 }
430 
431 
432 static v8::Handle<Value> AllocateHandles(Local<String> name,
433  const AccessorInfo& info) {
434  for (int i = 0; i < i::kHandleBlockSize + 1; i++) {
436  }
437  return v8::Integer::New(100);
438 }
439 
440 
441 THREADED_TEST(HandleScopeSegment) {
442  // Check that we can return values past popping of handle scope
443  // segments.
444  v8::HandleScope scope;
445  v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
446  obj->SetAccessor(v8_str("xxx"), AllocateHandles);
447  LocalContext env;
448  env->Global()->Set(v8_str("obj"), obj->NewInstance());
449  v8::Handle<v8::Value> result = Script::Compile(String::New(
450  "var result;"
451  "for (var i = 0; i < 4; i++)"
452  " result = obj.xxx;"
453  "result;"))->Run();
454  CHECK_EQ(100, result->Int32Value());
455 }
byte * Address
Definition: globals.h:172
static Isolate * GetCurrent()
Definition: api.cc:5380
static Local< Script > Compile(Handle< String > source, ScriptOrigin *origin=NULL, ScriptData *pre_data=NULL, Handle< String > script_data=Handle< String >())
Definition: api.cc:1560
static int NumberOfHandles()
Definition: handles.cc:48
#define CHECK_EQ(expected, value)
Definition: checks.h:219
static Local< FunctionTemplate > New(InvocationCallback callback=0, Handle< Value > data=Handle< Value >(), Handle< Signature > signature=Handle< Signature >())
Definition: api.cc:943
Handle< Boolean > V8EXPORT True()
Definition: api.cc:566
V8EXPORT Local< Value > Get(Handle< Value > key)
Definition: api.cc:2845
Local< Object > NewInstance()
Definition: api.cc:4536
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
static V8EXPORT Local< String > New(const char *data, int length=-1)
Definition: api.cc:4655
Local< ObjectTemplate > InstanceTemplate()
Definition: api.cc:1115
static Handle< T > Cast(Handle< S > that)
Definition: v8.h:243
#define CHECK(condition)
Definition: checks.h:56
bool contains(byte *pc)
Definition: objects-inl.h:4417
int foo
HANDLE HANDLE LPSTACKFRAME64 StackFrame
static void Fuzz()
Definition: test-api.cc:10412
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
static const int kNoGCFlags
Definition: heap.h:1049
void SetAccessor(Handle< String > name, AccessorGetter getter, AccessorSetter setter=0, Handle< Value > data=Handle< Value >(), AccessControl settings=DEFAULT, PropertyAttribute attribute=None, Handle< AccessorSignature > signature=Handle< AccessorSignature >())
Definition: api.cc:1284
V8EXPORT int32_t Int32Value() const
Definition: api.cc:2654
Local< Object > Global()
Definition: api.cc:4467
const Register pc
static Local< T > New(Handle< T > that)
Definition: v8.h:4030
int baz
#define HEAP
Definition: isolate.h:1408
const int kHandleBlockSize
Definition: api.h:491
static V8EXPORT Local< Integer > New(int32_t value)
Definition: api.cc:5100
Handle< Primitive > V8EXPORT Undefined()
Definition: api.cc:546
static void ClearMentionedObjectCache()
V8EXPORT uint32_t Length() const
Definition: api.cc:5040
static V8EXPORT Local< External > New(void *value)
Definition: api.cc:4628
int bar
Handle< Value > V8EXPORT ThrowException(Handle< Value > exception)
Definition: api.cc:485
THREADED_TEST(PropertyHandler)
static V8EXPORT Local< Object > New()
Definition: api.cc:4829