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

Side by Side Diff: samples/shell.cc

Issue 1209403005: Let the second pass phantom callbacks run in a separate task on the foreground thread. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Run second pass callbacks synchronously when GC is forced. Created 5 years, 5 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 | « samples/process.cc ('k') | src/d8.h » ('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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 27 matching lines...) Expand all
38 /** 38 /**
39 * This sample program shows how to implement a simple javascript shell 39 * This sample program shows how to implement a simple javascript shell
40 * based on V8. This includes initializing V8 with command line options, 40 * based on V8. This includes initializing V8 with command line options,
41 * creating global functions, compiling and executing strings. 41 * creating global functions, compiling and executing strings.
42 * 42 *
43 * For a more sophisticated shell, consider using the debug shell D8. 43 * For a more sophisticated shell, consider using the debug shell D8.
44 */ 44 */
45 45
46 46
47 v8::Local<v8::Context> CreateShellContext(v8::Isolate* isolate); 47 v8::Local<v8::Context> CreateShellContext(v8::Isolate* isolate);
48 void RunShell(v8::Local<v8::Context> context); 48 void RunShell(v8::Local<v8::Context> context, v8::Platform* platform);
49 int RunMain(v8::Isolate* isolate, int argc, char* argv[]); 49 int RunMain(v8::Isolate* isolate, v8::Platform* platform, int argc,
50 char* argv[]);
50 bool ExecuteString(v8::Isolate* isolate, v8::Local<v8::String> source, 51 bool ExecuteString(v8::Isolate* isolate, v8::Local<v8::String> source,
51 v8::Local<v8::Value> name, bool print_result, 52 v8::Local<v8::Value> name, bool print_result,
52 bool report_exceptions); 53 bool report_exceptions);
53 void Print(const v8::FunctionCallbackInfo<v8::Value>& args); 54 void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
54 void Read(const v8::FunctionCallbackInfo<v8::Value>& args); 55 void Read(const v8::FunctionCallbackInfo<v8::Value>& args);
55 void Load(const v8::FunctionCallbackInfo<v8::Value>& args); 56 void Load(const v8::FunctionCallbackInfo<v8::Value>& args);
56 void Quit(const v8::FunctionCallbackInfo<v8::Value>& args); 57 void Quit(const v8::FunctionCallbackInfo<v8::Value>& args);
57 void Version(const v8::FunctionCallbackInfo<v8::Value>& args); 58 void Version(const v8::FunctionCallbackInfo<v8::Value>& args);
58 v8::MaybeLocal<v8::String> ReadFile(v8::Isolate* isolate, const char* name); 59 v8::MaybeLocal<v8::String> ReadFile(v8::Isolate* isolate, const char* name);
59 void ReportException(v8::Isolate* isolate, v8::TryCatch* handler); 60 void ReportException(v8::Isolate* isolate, v8::TryCatch* handler);
(...skipping 27 matching lines...) Expand all
87 int result; 88 int result;
88 { 89 {
89 v8::Isolate::Scope isolate_scope(isolate); 90 v8::Isolate::Scope isolate_scope(isolate);
90 v8::HandleScope handle_scope(isolate); 91 v8::HandleScope handle_scope(isolate);
91 v8::Local<v8::Context> context = CreateShellContext(isolate); 92 v8::Local<v8::Context> context = CreateShellContext(isolate);
92 if (context.IsEmpty()) { 93 if (context.IsEmpty()) {
93 fprintf(stderr, "Error creating context\n"); 94 fprintf(stderr, "Error creating context\n");
94 return 1; 95 return 1;
95 } 96 }
96 v8::Context::Scope context_scope(context); 97 v8::Context::Scope context_scope(context);
97 result = RunMain(isolate, argc, argv); 98 result = RunMain(isolate, platform, argc, argv);
98 if (run_shell) RunShell(context); 99 if (run_shell) RunShell(context, platform);
99 } 100 }
100 isolate->Dispose(); 101 isolate->Dispose();
101 v8::V8::Dispose(); 102 v8::V8::Dispose();
102 v8::V8::ShutdownPlatform(); 103 v8::V8::ShutdownPlatform();
103 delete platform; 104 delete platform;
104 return result; 105 return result;
105 } 106 }
106 107
107 108
108 // Extracts a C string from a V8 Utf8Value. 109 // Extracts a C string from a V8 Utf8Value.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 } 263 }
263 fclose(file); 264 fclose(file);
264 v8::MaybeLocal<v8::String> result = v8::String::NewFromUtf8( 265 v8::MaybeLocal<v8::String> result = v8::String::NewFromUtf8(
265 isolate, chars, v8::NewStringType::kNormal, static_cast<int>(size)); 266 isolate, chars, v8::NewStringType::kNormal, static_cast<int>(size));
266 delete[] chars; 267 delete[] chars;
267 return result; 268 return result;
268 } 269 }
269 270
270 271
271 // Process remaining command line arguments and execute files 272 // Process remaining command line arguments and execute files
272 int RunMain(v8::Isolate* isolate, int argc, char* argv[]) { 273 int RunMain(v8::Isolate* isolate, v8::Platform* platform, int argc,
274 char* argv[]) {
273 for (int i = 1; i < argc; i++) { 275 for (int i = 1; i < argc; i++) {
274 const char* str = argv[i]; 276 const char* str = argv[i];
275 if (strcmp(str, "--shell") == 0) { 277 if (strcmp(str, "--shell") == 0) {
276 run_shell = true; 278 run_shell = true;
277 } else if (strcmp(str, "-f") == 0) { 279 } else if (strcmp(str, "-f") == 0) {
278 // Ignore any -f flags for compatibility with the other stand- 280 // Ignore any -f flags for compatibility with the other stand-
279 // alone JavaScript engines. 281 // alone JavaScript engines.
280 continue; 282 continue;
281 } else if (strncmp(str, "--", 2) == 0) { 283 } else if (strncmp(str, "--", 2) == 0) {
282 fprintf(stderr, 284 fprintf(stderr,
283 "Warning: unknown flag %s.\nTry --help for options\n", str); 285 "Warning: unknown flag %s.\nTry --help for options\n", str);
284 } else if (strcmp(str, "-e") == 0 && i + 1 < argc) { 286 } else if (strcmp(str, "-e") == 0 && i + 1 < argc) {
285 // Execute argument given to -e option directly. 287 // Execute argument given to -e option directly.
286 v8::Local<v8::String> file_name = 288 v8::Local<v8::String> file_name =
287 v8::String::NewFromUtf8(isolate, "unnamed", 289 v8::String::NewFromUtf8(isolate, "unnamed",
288 v8::NewStringType::kNormal).ToLocalChecked(); 290 v8::NewStringType::kNormal).ToLocalChecked();
289 v8::Local<v8::String> source; 291 v8::Local<v8::String> source;
290 if (!v8::String::NewFromUtf8(isolate, argv[++i], 292 if (!v8::String::NewFromUtf8(isolate, argv[++i],
291 v8::NewStringType::kNormal) 293 v8::NewStringType::kNormal)
292 .ToLocal(&source)) { 294 .ToLocal(&source)) {
293 return 1; 295 return 1;
294 } 296 }
295 if (!ExecuteString(isolate, source, file_name, false, true)) return 1; 297 bool success = ExecuteString(isolate, source, file_name, false, true);
298 while (v8::platform::PumpMessageLoop(platform, isolate)) continue;
299 if (!success) return 1;
296 } else { 300 } else {
297 // Use all other arguments as names of files to load and run. 301 // Use all other arguments as names of files to load and run.
298 v8::Local<v8::String> file_name = 302 v8::Local<v8::String> file_name =
299 v8::String::NewFromUtf8(isolate, str, v8::NewStringType::kNormal) 303 v8::String::NewFromUtf8(isolate, str, v8::NewStringType::kNormal)
300 .ToLocalChecked(); 304 .ToLocalChecked();
301 v8::Local<v8::String> source; 305 v8::Local<v8::String> source;
302 if (!ReadFile(isolate, str).ToLocal(&source)) { 306 if (!ReadFile(isolate, str).ToLocal(&source)) {
303 fprintf(stderr, "Error reading '%s'\n", str); 307 fprintf(stderr, "Error reading '%s'\n", str);
304 continue; 308 continue;
305 } 309 }
306 if (!ExecuteString(isolate, source, file_name, false, true)) return 1; 310 bool success = ExecuteString(isolate, source, file_name, false, true);
311 while (v8::platform::PumpMessageLoop(platform, isolate)) continue;
312 if (!success) return 1;
307 } 313 }
308 } 314 }
309 return 0; 315 return 0;
310 } 316 }
311 317
312 318
313 // The read-eval-execute loop of the shell. 319 // The read-eval-execute loop of the shell.
314 void RunShell(v8::Local<v8::Context> context) { 320 void RunShell(v8::Local<v8::Context> context, v8::Platform* platform) {
315 fprintf(stderr, "V8 version %s [sample shell]\n", v8::V8::GetVersion()); 321 fprintf(stderr, "V8 version %s [sample shell]\n", v8::V8::GetVersion());
316 static const int kBufferSize = 256; 322 static const int kBufferSize = 256;
317 // Enter the execution environment before evaluating any code. 323 // Enter the execution environment before evaluating any code.
318 v8::Context::Scope context_scope(context); 324 v8::Context::Scope context_scope(context);
319 v8::Local<v8::String> name( 325 v8::Local<v8::String> name(
320 v8::String::NewFromUtf8(context->GetIsolate(), "(shell)", 326 v8::String::NewFromUtf8(context->GetIsolate(), "(shell)",
321 v8::NewStringType::kNormal).ToLocalChecked()); 327 v8::NewStringType::kNormal).ToLocalChecked());
322 while (true) { 328 while (true) {
323 char buffer[kBufferSize]; 329 char buffer[kBufferSize];
324 fprintf(stderr, "> "); 330 fprintf(stderr, "> ");
325 char* str = fgets(buffer, kBufferSize, stdin); 331 char* str = fgets(buffer, kBufferSize, stdin);
326 if (str == NULL) break; 332 if (str == NULL) break;
327 v8::HandleScope handle_scope(context->GetIsolate()); 333 v8::HandleScope handle_scope(context->GetIsolate());
328 ExecuteString( 334 ExecuteString(
329 context->GetIsolate(), 335 context->GetIsolate(),
330 v8::String::NewFromUtf8(context->GetIsolate(), str, 336 v8::String::NewFromUtf8(context->GetIsolate(), str,
331 v8::NewStringType::kNormal).ToLocalChecked(), 337 v8::NewStringType::kNormal).ToLocalChecked(),
332 name, true, true); 338 name, true, true);
339 while (v8::platform::PumpMessageLoop(platform, context->GetIsolate()))
340 continue;
333 } 341 }
334 fprintf(stderr, "\n"); 342 fprintf(stderr, "\n");
335 } 343 }
336 344
337 345
338 // Executes a string within the current v8 context. 346 // Executes a string within the current v8 context.
339 bool ExecuteString(v8::Isolate* isolate, v8::Local<v8::String> source, 347 bool ExecuteString(v8::Isolate* isolate, v8::Local<v8::String> source,
340 v8::Local<v8::Value> name, bool print_result, 348 v8::Local<v8::Value> name, bool print_result,
341 bool report_exceptions) { 349 bool report_exceptions) {
342 v8::HandleScope handle_scope(isolate); 350 v8::HandleScope handle_scope(isolate);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 } 412 }
405 fprintf(stderr, "\n"); 413 fprintf(stderr, "\n");
406 v8::String::Utf8Value stack_trace( 414 v8::String::Utf8Value stack_trace(
407 try_catch->StackTrace(context).ToLocalChecked()); 415 try_catch->StackTrace(context).ToLocalChecked());
408 if (stack_trace.length() > 0) { 416 if (stack_trace.length() > 0) {
409 const char* stack_trace_string = ToCString(stack_trace); 417 const char* stack_trace_string = ToCString(stack_trace);
410 fprintf(stderr, "%s\n", stack_trace_string); 418 fprintf(stderr, "%s\n", stack_trace_string);
411 } 419 }
412 } 420 }
413 } 421 }
OLDNEW
« no previous file with comments | « samples/process.cc ('k') | src/d8.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698