Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/d8.cc

Issue 2208873002: [Tracing] Create TraceConfig JSON string parser in D8. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/d8.h ('k') | src/libplatform/tracing/trace-config.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 5
6 // Defined when linking against shared lib on Windows. 6 // Defined when linking against shared lib on Windows.
7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED)
8 #define V8_SHARED 8 #define V8_SHARED
9 #endif 9 #endif
10 10
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 return NULL; 199 return NULL;
200 } 200 }
201 201
202 return worker; 202 return worker;
203 } 203 }
204 #endif // !V8_SHARED 204 #endif // !V8_SHARED
205 205
206 206
207 } // namespace 207 } // namespace
208 208
209 namespace tracing {
210
211 namespace {
212
213 // String options that can be used to initialize TraceOptions.
214 const char kRecordUntilFull[] = "record-until-full";
215 const char kRecordContinuously[] = "record-continuously";
216 const char kRecordAsMuchAsPossible[] = "record-as-much-as-possible";
217
218 const char kRecordModeParam[] = "record_mode";
219 const char kEnableSamplingParam[] = "enable_sampling";
220 const char kEnableSystraceParam[] = "enable_systrace";
221 const char kEnableArgumentFilterParam[] = "enable_argument_filter";
222 const char kIncludedCategoriesParam[] = "included_categories";
223 const char kExcludedCategoriesParam[] = "excluded_categories";
224
225 class TraceConfigParser {
226 public:
227 static void FillTraceConfig(v8::Isolate* isolate,
228 platform::tracing::TraceConfig* trace_config,
229 const char* json_str) {
230 HandleScope outer_scope(isolate);
231 Local<Context> context = Context::New(isolate);
232 Context::Scope context_scope(context);
233 HandleScope inner_scope(isolate);
234
235 Local<String> source =
236 String::NewFromUtf8(isolate, json_str, NewStringType::kNormal)
237 .ToLocalChecked();
238 Local<Value> result = JSON::Parse(context, source).ToLocalChecked();
239 Local<v8::Object> trace_config_object = Local<v8::Object>::Cast(result);
240
241 trace_config->SetTraceRecordMode(
242 GetTraceRecordMode(isolate, context, trace_config_object));
243 if (GetBoolean(isolate, context, trace_config_object,
244 kEnableSamplingParam)) {
245 trace_config->EnableSampling();
246 }
247 if (GetBoolean(isolate, context, trace_config_object,
248 kEnableSystraceParam)) {
249 trace_config->EnableSystrace();
250 }
251 if (GetBoolean(isolate, context, trace_config_object,
252 kEnableArgumentFilterParam)) {
253 trace_config->EnableArgumentFilter();
254 }
255 UpdateCategoriesList(isolate, context, trace_config_object,
256 kIncludedCategoriesParam,
257 trace_config->GetIncludedCategories());
fmeawad 2016/08/04 13:01:06 Instead of Getting the categories list, and append
lpy 2016/08/04 17:48:30 Then it will need to update categories list method
lpy 2016/08/08 18:39:56 Done.
258 UpdateCategoriesList(isolate, context, trace_config_object,
259 kExcludedCategoriesParam,
260 trace_config->GetExcludedCategories());
261 }
262
263 private:
264 static bool GetBoolean(v8::Isolate* isolate, Local<Context> context,
265 Local<v8::Object> object, const char* property) {
266 Local<Value> value = GetValue(isolate, context, object, property);
267 if (value->IsNumber()) {
268 Local<Boolean> v8_boolean = value->ToBoolean(context).ToLocalChecked();
269 return v8_boolean->Value();
270 }
271 return false;
272 }
273
274 static int UpdateCategoriesList(
275 v8::Isolate* isolate, Local<Context> context, Local<v8::Object> object,
276 const char* property,
277 platform::tracing::TraceConfig::StringList& categories_list) {
278 Local<Value> value = GetValue(isolate, context, object, property);
279 if (value->IsArray()) {
280 Local<Array> v8_array = Local<Array>::Cast(value);
281 for (int i = 0, length = v8_array->Length(); i < length; ++i) {
282 Local<Value> v = v8_array->Get(context, i)
283 .ToLocalChecked()
284 ->ToString(context)
285 .ToLocalChecked();
286 String::Utf8Value str(v->ToString(context).ToLocalChecked());
287 categories_list.push_back(std::string(*str));
288 }
289 return v8_array->Length();
290 }
291 return 0;
292 }
293
294 static platform::tracing::TraceRecordMode GetTraceRecordMode(
295 v8::Isolate* isolate, Local<Context> context, Local<v8::Object> object) {
296 Local<Value> value = GetValue(isolate, context, object, kRecordModeParam);
297 if (value->IsString()) {
298 Local<String> v8_string = value->ToString(context).ToLocalChecked();
299 String::Utf8Value str(v8_string);
300 if (strcmp(kRecordUntilFull, *str) == 0) {
301 return platform::tracing::TraceRecordMode::RECORD_UNTIL_FULL;
302 } else if (strcmp(kRecordContinuously, *str) == 0) {
303 return platform::tracing::TraceRecordMode::RECORD_CONTINUOUSLY;
304 } else if (strcmp(kRecordAsMuchAsPossible, *str) == 0) {
305 return platform::tracing::TraceRecordMode::RECORD_AS_MUCH_AS_POSSIBLE;
306 }
307 }
308 return platform::tracing::TraceRecordMode::RECORD_UNTIL_FULL;
309 }
310
311 static Local<Value> GetValue(v8::Isolate* isolate, Local<Context> context,
312 Local<v8::Object> object, const char* property) {
313 Local<String> v8_str =
314 String::NewFromUtf8(isolate, property, NewStringType::kNormal)
315 .ToLocalChecked();
316 return object->Get(context, v8_str).ToLocalChecked();
317 }
318 };
319
320 } // namespace
321
322 static platform::tracing::TraceConfig* CreateTraceConfigFromJSON(
323 v8::Isolate* isolate, const char* json_str) {
324 platform::tracing::TraceConfig* trace_config =
325 new platform::tracing::TraceConfig();
326 TraceConfigParser::FillTraceConfig(isolate, trace_config, json_str);
327 return trace_config;
328 }
329
330 } // namespace tracing
209 331
210 class PerIsolateData { 332 class PerIsolateData {
211 public: 333 public:
212 explicit PerIsolateData(Isolate* isolate) : isolate_(isolate), realms_(NULL) { 334 explicit PerIsolateData(Isolate* isolate) : isolate_(isolate), realms_(NULL) {
213 HandleScope scope(isolate); 335 HandleScope scope(isolate);
214 isolate->SetData(0, this); 336 isolate->SetData(0, this);
215 } 337 }
216 338
217 ~PerIsolateData() { 339 ~PerIsolateData() {
218 isolate_->SetData(0, NULL); // Not really needed, just to be sure... 340 isolate_->SetData(0, NULL); // Not really needed, just to be sure...
(...skipping 1769 matching lines...) Expand 10 before | Expand all | Expand 10 after
1988 } else if (strncmp(value, "=none", 6) == 0) { 2110 } else if (strncmp(value, "=none", 6) == 0) {
1989 options.compile_options = v8::ScriptCompiler::kNoCompileOptions; 2111 options.compile_options = v8::ScriptCompiler::kNoCompileOptions;
1990 } else { 2112 } else {
1991 printf("Unknown option to --cache.\n"); 2113 printf("Unknown option to --cache.\n");
1992 return false; 2114 return false;
1993 } 2115 }
1994 argv[i] = NULL; 2116 argv[i] = NULL;
1995 } else if (strcmp(argv[i], "--enable-tracing") == 0) { 2117 } else if (strcmp(argv[i], "--enable-tracing") == 0) {
1996 options.trace_enabled = true; 2118 options.trace_enabled = true;
1997 argv[i] = NULL; 2119 argv[i] = NULL;
2120 } else if (strncmp(argv[i], "--trace-config=", 15) == 0) {
2121 options.trace_config = argv[i] + 15;
2122 argv[i] = NULL;
1998 } 2123 }
1999 } 2124 }
2000 2125
2001 v8::V8::SetFlagsFromCommandLine(&argc, argv, true); 2126 v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
2002 2127
2003 // Set up isolated source groups. 2128 // Set up isolated source groups.
2004 options.isolate_sources = new SourceGroup[options.num_isolates]; 2129 options.isolate_sources = new SourceGroup[options.num_isolates];
2005 SourceGroup* current = options.isolate_sources; 2130 SourceGroup* current = options.isolate_sources;
2006 current->Begin(argv, 1); 2131 current->Begin(argv, 1);
2007 for (int i = 1; i < argc; i++) { 2132 for (int i = 1; i < argc; i++) {
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
2482 if (options.trace_enabled) { 2607 if (options.trace_enabled) {
2483 trace_file.open("v8_trace.json"); 2608 trace_file.open("v8_trace.json");
2484 platform::tracing::TracingController* tracing_controller = 2609 platform::tracing::TracingController* tracing_controller =
2485 new platform::tracing::TracingController(); 2610 new platform::tracing::TracingController();
2486 platform::tracing::TraceBuffer* trace_buffer = 2611 platform::tracing::TraceBuffer* trace_buffer =
2487 platform::tracing::TraceBuffer::CreateTraceBufferRingBuffer( 2612 platform::tracing::TraceBuffer::CreateTraceBufferRingBuffer(
2488 platform::tracing::TraceBuffer::kRingBufferChunks, 2613 platform::tracing::TraceBuffer::kRingBufferChunks,
2489 platform::tracing::TraceWriter::CreateJSONTraceWriter( 2614 platform::tracing::TraceWriter::CreateJSONTraceWriter(
2490 trace_file)); 2615 trace_file));
2491 platform::tracing::TraceConfig* trace_config; 2616 platform::tracing::TraceConfig* trace_config;
2492 trace_config = new platform::tracing::TraceConfig(); 2617 if (options.trace_config) {
2493 trace_config->AddIncludedCategory("v8"); 2618 int size = 0;
2619 char* trace_config_json_str =
2620 ReadChars(nullptr, options.trace_config, &size);
2621 trace_config =
2622 tracing::CreateTraceConfigFromJSON(isolate, trace_config_json_str);
2623 delete[] trace_config_json_str;
2624 } else {
2625 trace_config =
2626 platform::tracing::TraceConfig::CreateDefaultTraceConfig();
2627 }
2494 tracing_controller->Initialize(trace_buffer); 2628 tracing_controller->Initialize(trace_buffer);
2495 tracing_controller->StartTracing(trace_config); 2629 tracing_controller->StartTracing(trace_config);
2496 #ifndef V8_SHARED 2630 #ifndef V8_SHARED
2497 if (!i::FLAG_verify_predictable) { 2631 if (!i::FLAG_verify_predictable) {
2498 platform::SetTracingController(g_platform, tracing_controller); 2632 platform::SetTracingController(g_platform, tracing_controller);
2499 } 2633 }
2500 #else 2634 #else
2501 platform::SetTracingController(g_platform, tracing_controller); 2635 platform::SetTracingController(g_platform, tracing_controller);
2502 #endif 2636 #endif
2503 } 2637 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2576 } 2710 }
2577 2711
2578 } // namespace v8 2712 } // namespace v8
2579 2713
2580 2714
2581 #ifndef GOOGLE3 2715 #ifndef GOOGLE3
2582 int main(int argc, char* argv[]) { 2716 int main(int argc, char* argv[]) {
2583 return v8::Shell::Main(argc, argv); 2717 return v8::Shell::Main(argc, argv);
2584 } 2718 }
2585 #endif 2719 #endif
OLDNEW
« no previous file with comments | « src/d8.h ('k') | src/libplatform/tracing/trace-config.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698