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-compiler.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 #include <wchar.h>
30 
31 #include "v8.h"
32 
33 #include "compiler.h"
34 #include "disasm.h"
35 #include "disassembler.h"
36 #include "execution.h"
37 #include "factory.h"
38 #include "platform.h"
39 #include "cctest.h"
40 
41 using namespace v8::internal;
42 
44 
45 // --- P r i n t E x t e n s i o n ---
46 
47 class PrintExtension : public v8::Extension {
48  public:
49  PrintExtension() : v8::Extension("v8/print", kSource) { }
50  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
52  static v8::Handle<v8::Value> Print(const v8::Arguments& args);
53  private:
54  static const char* kSource;
55 };
56 
57 
58 const char* PrintExtension::kSource = "native function print();";
59 
60 
64 }
65 
66 
68  for (int i = 0; i < args.Length(); i++) {
69  if (i != 0) printf(" ");
70  v8::HandleScope scope;
71  v8::Handle<v8::Value> arg = args[i];
72  v8::Handle<v8::String> string_obj = arg->ToString();
73  if (string_obj.IsEmpty()) return string_obj;
74  int length = string_obj->Length();
75  uint16_t* string = NewArray<uint16_t>(length + 1);
76  string_obj->Write(string);
77  for (int j = 0; j < length; j++)
78  printf("%lc", static_cast<wchar_t>(string[j]));
79  DeleteArray(string);
80  }
81  printf("\n");
82  return v8::Undefined();
83 }
84 
85 
86 static PrintExtension kPrintExtension;
87 v8::DeclareExtension kPrintExtensionDeclaration(&kPrintExtension);
88 
89 
90 static void InitializeVM() {
91  if (env.IsEmpty()) {
92  v8::HandleScope scope;
93  const char* extensions[] = { "v8/print", "v8/gc" };
94  v8::ExtensionConfiguration config(2, extensions);
95  env = v8::Context::New(&config);
96  }
97  v8::HandleScope scope;
98  env->Enter();
99 }
100 
101 
102 static MaybeObject* GetGlobalProperty(const char* name) {
103  Handle<String> symbol = FACTORY->LookupAsciiSymbol(name);
104  return Isolate::Current()->context()->global()->GetProperty(*symbol);
105 }
106 
107 
108 static void SetGlobalProperty(const char* name, Object* value) {
109  Handle<Object> object(value);
110  Handle<String> symbol = FACTORY->LookupAsciiSymbol(name);
111  Handle<JSObject> global(Isolate::Current()->context()->global());
112  SetProperty(global, symbol, object, NONE, kNonStrictMode);
113 }
114 
115 
116 static Handle<JSFunction> Compile(const char* source) {
117  Handle<String> source_code(FACTORY->NewStringFromUtf8(CStrVector(source)));
118  Handle<SharedFunctionInfo> shared_function =
119  Compiler::Compile(source_code,
120  Handle<String>(),
121  0,
122  0,
123  NULL,
124  NULL,
127  return FACTORY->NewFunctionFromSharedFunctionInfo(shared_function,
128  Isolate::Current()->global_context());
129 }
130 
131 
132 static double Inc(int x) {
133  const char* source = "result = %d + 1;";
135  OS::SNPrintF(buffer, source, x);
136 
137  Handle<JSFunction> fun = Compile(buffer.start());
138  if (fun.is_null()) return -1;
139 
140  bool has_pending_exception;
141  Handle<JSObject> global(Isolate::Current()->context()->global());
142  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
143  CHECK(!has_pending_exception);
144  return GetGlobalProperty("result")->ToObjectChecked()->Number();
145 }
146 
147 
148 TEST(Inc) {
149  InitializeVM();
150  v8::HandleScope scope;
151  CHECK_EQ(4.0, Inc(3));
152 }
153 
154 
155 static double Add(int x, int y) {
156  Handle<JSFunction> fun = Compile("result = x + y;");
157  if (fun.is_null()) return -1;
158 
159  SetGlobalProperty("x", Smi::FromInt(x));
160  SetGlobalProperty("y", Smi::FromInt(y));
161  bool has_pending_exception;
162  Handle<JSObject> global(Isolate::Current()->context()->global());
163  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
164  CHECK(!has_pending_exception);
165  return GetGlobalProperty("result")->ToObjectChecked()->Number();
166 }
167 
168 
169 TEST(Add) {
170  InitializeVM();
171  v8::HandleScope scope;
172  CHECK_EQ(5.0, Add(2, 3));
173 }
174 
175 
176 static double Abs(int x) {
177  Handle<JSFunction> fun = Compile("if (x < 0) result = -x; else result = x;");
178  if (fun.is_null()) return -1;
179 
180  SetGlobalProperty("x", Smi::FromInt(x));
181  bool has_pending_exception;
182  Handle<JSObject> global(Isolate::Current()->context()->global());
183  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
184  CHECK(!has_pending_exception);
185  return GetGlobalProperty("result")->ToObjectChecked()->Number();
186 }
187 
188 
189 TEST(Abs) {
190  InitializeVM();
191  v8::HandleScope scope;
192  CHECK_EQ(3.0, Abs(-3));
193 }
194 
195 
196 static double Sum(int n) {
197  Handle<JSFunction> fun =
198  Compile("s = 0; while (n > 0) { s += n; n -= 1; }; result = s;");
199  if (fun.is_null()) return -1;
200 
201  SetGlobalProperty("n", Smi::FromInt(n));
202  bool has_pending_exception;
203  Handle<JSObject> global(Isolate::Current()->context()->global());
204  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
205  CHECK(!has_pending_exception);
206  return GetGlobalProperty("result")->ToObjectChecked()->Number();
207 }
208 
209 
210 TEST(Sum) {
211  InitializeVM();
212  v8::HandleScope scope;
213  CHECK_EQ(5050.0, Sum(100));
214 }
215 
216 
218  InitializeVM();
219  v8::HandleScope scope;
220  const char* source = "for (n = 0; n < 100; ++n) print(n, 1, 2);";
221  Handle<JSFunction> fun = Compile(source);
222  if (fun.is_null()) return;
223  bool has_pending_exception;
224  Handle<JSObject> global(Isolate::Current()->context()->global());
225  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
226  CHECK(!has_pending_exception);
227 }
228 
229 
230 // The following test method stems from my coding efforts today. It
231 // tests all the functionality I have added to the compiler today
232 TEST(Stuff) {
233  InitializeVM();
234  v8::HandleScope scope;
235  const char* source =
236  "r = 0;\n"
237  "a = new Object;\n"
238  "if (a == a) r+=1;\n" // 1
239  "if (a != new Object()) r+=2;\n" // 2
240  "a.x = 42;\n"
241  "if (a.x == 42) r+=4;\n" // 4
242  "function foo() { var x = 87; return x; }\n"
243  "if (foo() == 87) r+=8;\n" // 8
244  "function bar() { var x; x = 99; return x; }\n"
245  "if (bar() == 99) r+=16;\n" // 16
246  "function baz() { var x = 1, y, z = 2; y = 3; return x + y + z; }\n"
247  "if (baz() == 6) r+=32;\n" // 32
248  "function Cons0() { this.x = 42; this.y = 87; }\n"
249  "if (new Cons0().x == 42) r+=64;\n" // 64
250  "if (new Cons0().y == 87) r+=128;\n" // 128
251  "function Cons2(x, y) { this.sum = x + y; }\n"
252  "if (new Cons2(3,4).sum == 7) r+=256;"; // 256
253 
254  Handle<JSFunction> fun = Compile(source);
255  CHECK(!fun.is_null());
256  bool has_pending_exception;
257  Handle<JSObject> global(Isolate::Current()->context()->global());
258  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
259  CHECK(!has_pending_exception);
260  CHECK_EQ(511.0, GetGlobalProperty("r")->ToObjectChecked()->Number());
261 }
262 
263 
264 TEST(UncaughtThrow) {
265  InitializeVM();
266  v8::HandleScope scope;
267 
268  const char* source = "throw 42;";
269  Handle<JSFunction> fun = Compile(source);
270  CHECK(!fun.is_null());
271  bool has_pending_exception;
272  Handle<JSObject> global(Isolate::Current()->context()->global());
273  Execution::Call(fun, global, 0, NULL, &has_pending_exception);
274  CHECK(has_pending_exception);
275  CHECK_EQ(42.0, Isolate::Current()->pending_exception()->
276  ToObjectChecked()->Number());
277 }
278 
279 
280 // Tests calling a builtin function from C/C++ code, and the builtin function
281 // performs GC. It creates a stack frame looks like following:
282 // | C (PerformGC) |
283 // | JS-to-C |
284 // | JS |
285 // | C-to-JS |
286 TEST(C2JSFrames) {
287  InitializeVM();
288  v8::HandleScope scope;
289 
290  const char* source = "function foo(a) { gc(), print(a); }";
291 
292  Handle<JSFunction> fun0 = Compile(source);
293  CHECK(!fun0.is_null());
294 
295  // Run the generated code to populate the global object with 'foo'.
296  bool has_pending_exception;
297  Handle<JSObject> global(Isolate::Current()->context()->global());
298  Execution::Call(fun0, global, 0, NULL, &has_pending_exception);
299  CHECK(!has_pending_exception);
300 
301  Object* foo_symbol = FACTORY->LookupAsciiSymbol("foo")->ToObjectChecked();
302  MaybeObject* fun1_object = Isolate::Current()->context()->global()->
303  GetProperty(String::cast(foo_symbol));
304  Handle<Object> fun1(fun1_object->ToObjectChecked());
305  CHECK(fun1->IsJSFunction());
306 
307  Handle<Object> argv[] = { FACTORY->LookupAsciiSymbol("hello") };
309  global,
310  ARRAY_SIZE(argv),
311  argv,
312  &has_pending_exception);
313  CHECK(!has_pending_exception);
314 }
315 
316 
317 // Regression 236. Calling InitLineEnds on a Script with undefined
318 // source resulted in crash.
319 TEST(Regression236) {
320  InitializeVM();
321  v8::HandleScope scope;
322 
323  Handle<Script> script = FACTORY->NewScript(FACTORY->empty_string());
324  script->set_source(HEAP->undefined_value());
325  CHECK_EQ(-1, GetScriptLineNumber(script, 0));
326  CHECK_EQ(-1, GetScriptLineNumber(script, 100));
327  CHECK_EQ(-1, GetScriptLineNumber(script, -1));
328 }
329 
330 
332  LocalContext env;
333  v8::HandleScope scope;
335  const char function_f[] = "function f() {}";
336  const int max_rows = 1000;
337  const int buffer_size = max_rows + sizeof(function_f);
338  ScopedVector<char> buffer(buffer_size);
339  memset(buffer.start(), '\n', buffer_size - 1);
340  buffer[buffer_size - 1] = '\0';
341 
342  for (int i = 0; i < max_rows; ++i) {
343  if (i > 0)
344  buffer[i - 1] = '\n';
345  memcpy(&buffer[i], function_f, sizeof(function_f) - 1);
346  v8::Handle<v8::String> script_body = v8::String::New(buffer.start());
347  v8::Script::Compile(script_body, &origin)->Run();
349  env->Global()->Get(v8::String::New("f")));
350  CHECK_EQ(i, f->GetScriptLineNumber());
351  }
352 }
353 
354 
355 #ifdef ENABLE_DISASSEMBLER
356 static Handle<JSFunction> GetJSFunction(v8::Handle<v8::Object> obj,
357  const char* property_name) {
359  v8::Local<v8::Function>::Cast(obj->Get(v8_str(property_name)));
360  return v8::Utils::OpenHandle(*fun);
361 }
362 
363 
364 static void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) {
365  // Create a disassembler with default name lookup.
366  disasm::NameConverter name_converter;
367  disasm::Disassembler d(name_converter);
368 
369  if (f->code()->kind() == Code::FUNCTION) {
370  Address pc = f->code()->instruction_start();
371  int decode_size =
372  Min(f->code()->instruction_size(),
373  static_cast<int>(f->code()->stack_check_table_offset()));
374  Address end = pc + decode_size;
375 
377  while (pc < end) {
378  int num_const = d.ConstantPoolSizeAt(pc);
379  if (num_const >= 0) {
380  pc += (num_const + 1) * kPointerSize;
381  } else {
382  pc += d.InstructionDecode(decode_buffer, pc);
383  CHECK(strstr(decode_buffer.start(), "mov eax,0x178c29c") == NULL);
384  CHECK(strstr(decode_buffer.start(), "push 0x178c29c") == NULL);
385  CHECK(strstr(decode_buffer.start(), "0x178c29c") == NULL);
386  }
387  }
388  }
389 }
390 
391 
392 TEST(SplitConstantsInFullCompiler) {
393  v8::HandleScope scope;
394  LocalContext env;
395 
396  CompileRun("function f() { a = 12345678 }; f();");
397  CheckCodeForUnsafeLiteral(GetJSFunction(env->Global(), "f"));
398  CompileRun("function f(x) { a = 12345678 + x}; f(1);");
399  CheckCodeForUnsafeLiteral(GetJSFunction(env->Global(), "f"));
400  CompileRun("function f(x) { var arguments = 1; x += 12345678}; f(1);");
401  CheckCodeForUnsafeLiteral(GetJSFunction(env->Global(), "f"));
402  CompileRun("function f(x) { var arguments = 1; x = 12345678}; f(1);");
403  CheckCodeForUnsafeLiteral(GetJSFunction(env->Global(), "f"));
404 }
405 #endif
byte * Address
Definition: globals.h:172
V8EXPORT int Length() const
Definition: api.cc:3718
static Local< Script > Compile(Handle< String > source, ScriptOrigin *origin=NULL, ScriptData *pre_data=NULL, Handle< String > script_data=Handle< String >())
Definition: api.cc:1560
#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
static String * cast(Object *obj)
V8EXPORT Local< Value > Get(Handle< Value > key)
Definition: api.cc:2845
static Smi * FromInt(int value)
Definition: objects-inl.h:973
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
v8::Handle< v8::Value > Print(const v8::Arguments &args)
unsigned short uint16_t
Definition: unicode.cc:46
V8EXPORT Local< String > ToString() const
Definition: api.cc:2305
#define CHECK(condition)
Definition: checks.h:56
Handle< Object > GetProperty(Handle< JSReceiver > obj, const char *name)
Definition: handles.cc:282
T * start() const
Definition: utils.h:389
virtual v8::Handle< v8::FunctionTemplate > GetNativeFunction(v8::Handle< v8::String > name)
const int kPointerSize
Definition: globals.h:234
Handle< Object > SetProperty(Handle< Object > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attributes, StrictModeFlag strict_mode)
Definition: handles.cc:232
int Length() const
Definition: v8.h:4143
Local< Object > Global()
Definition: api.cc:4467
const Register pc
Definition: v8.h:104
static Handle< Object > Call(Handle< Object > callable, Handle< Object > receiver, int argc, Handle< Object > argv[], bool *pending_exception, bool convert_receiver=false)
Definition: execution.cc:144
Vector< const char > CStrVector(const char *data)
Definition: utils.h:525
static Local< T > Cast(Local< S > that)
Definition: v8.h:281
static int SNPrintF(Vector< char > str, const char *format,...)
int GetScriptLineNumber(Handle< Script > script, int code_pos)
Definition: handles.cc:479
bool is_null() const
Definition: handles.h:87
static Handle< SharedFunctionInfo > Compile(Handle< String > source, Handle< Object > script_name, int line_offset, int column_offset, v8::Extension *extension, ScriptDataImpl *pre_data, Handle< Object > script_data, NativesFlag is_natives_code)
Definition: compiler.cc:473
#define HEAP
Definition: isolate.h:1408
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
V8EXPORT int GetScriptLineNumber() const
Definition: api.cc:3691
Handle< Primitive > V8EXPORT Undefined()
Definition: api.cc:546
bool IsEmpty() const
Definition: v8.h:208
#define FACTORY
Definition: isolate.h:1409
static v8::Handle< v8::Value > Print(const v8::Arguments &args)
static Persistent< Context > New(ExtensionConfiguration *extensions=NULL, Handle< ObjectTemplate > global_template=Handle< ObjectTemplate >(), Handle< Value > global_object=Handle< Value >())
Definition: api.cc:4308
void DeleteArray(T *array)
Definition: allocation.h:91
T Min(T a, T b)
Definition: utils.h:229
#define ARRAY_SIZE(a)
Definition: globals.h:295
Definition: v8.h:105
V8EXPORT int Write(uint16_t *buffer, int start=0, int length=-1, int options=NO_OPTIONS) const
Definition: api.cc:3994
static v8::internal::Handle< v8::internal::TemplateInfo > OpenHandle(const Template *that)