Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include <errno.h> | 5 #include <errno.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 415 ShellOptions Shell::options; | 415 ShellOptions Shell::options; |
| 416 base::OnceType Shell::quit_once_ = V8_ONCE_INIT; | 416 base::OnceType Shell::quit_once_ = V8_ONCE_INIT; |
| 417 | 417 |
| 418 bool CounterMap::Match(void* key1, void* key2) { | 418 bool CounterMap::Match(void* key1, void* key2) { |
| 419 const char* name1 = reinterpret_cast<const char*>(key1); | 419 const char* name1 = reinterpret_cast<const char*>(key1); |
| 420 const char* name2 = reinterpret_cast<const char*>(key2); | 420 const char* name2 = reinterpret_cast<const char*>(key2); |
| 421 return strcmp(name1, name2) == 0; | 421 return strcmp(name1, name2) == 0; |
| 422 } | 422 } |
| 423 | 423 |
| 424 | 424 |
| 425 // Converts a V8 value to a C string. | |
| 426 const char* Shell::ToCString(const v8::String::Utf8Value& value) { | |
| 427 return *value ? *value : "<string conversion failed>"; | |
| 428 } | |
| 429 | |
| 430 | |
| 431 ScriptCompiler::CachedData* CompileForCachedData( | 425 ScriptCompiler::CachedData* CompileForCachedData( |
| 432 Local<String> source, Local<Value> name, | 426 Local<String> source, Local<Value> name, |
| 433 ScriptCompiler::CompileOptions compile_options) { | 427 ScriptCompiler::CompileOptions compile_options) { |
| 434 int source_length = source->Length(); | 428 int source_length = source->Length(); |
| 435 uint16_t* source_buffer = new uint16_t[source_length]; | 429 uint16_t* source_buffer = new uint16_t[source_length]; |
| 436 source->Write(source_buffer, 0, source_length); | 430 source->Write(source_buffer, 0, source_length); |
| 437 int name_length = 0; | 431 int name_length = 0; |
| 438 uint16_t* name_buffer = NULL; | 432 uint16_t* name_buffer = NULL; |
| 439 if (name->IsString()) { | 433 if (name->IsString()) { |
| 440 Local<String> name_string = Local<String>::Cast(name); | 434 Local<String> name_string = Local<String>::Cast(name); |
| (...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1249 | 1243 |
| 1250 void Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1244 void Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 1251 args.GetReturnValue().Set( | 1245 args.GetReturnValue().Set( |
| 1252 String::NewFromUtf8(args.GetIsolate(), V8::GetVersion(), | 1246 String::NewFromUtf8(args.GetIsolate(), V8::GetVersion(), |
| 1253 NewStringType::kNormal).ToLocalChecked()); | 1247 NewStringType::kNormal).ToLocalChecked()); |
| 1254 } | 1248 } |
| 1255 | 1249 |
| 1256 | 1250 |
| 1257 void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) { | 1251 void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) { |
| 1258 HandleScope handle_scope(isolate); | 1252 HandleScope handle_scope(isolate); |
| 1259 Local<Context> context; | 1253 Local<Context> context = isolate->GetCurrentContext(); |
| 1260 bool enter_context = !isolate->InContext(); | 1254 bool enter_context = context.IsEmpty(); |
| 1261 if (enter_context) { | 1255 if (enter_context) { |
| 1262 context = Local<Context>::New(isolate, evaluation_context_); | 1256 context = Local<Context>::New(isolate, evaluation_context_); |
| 1263 context->Enter(); | 1257 context->Enter(); |
| 1264 } | 1258 } |
| 1259 // Converts a V8 value to a C string. | |
| 1260 auto ToCString = [](const v8::String::Utf8Value& value) { | |
|
titzer
2016/12/12 11:51:33
Finally a decent use of C++ lambda!
| |
| 1261 return *value ? *value : "<string conversion failed>"; | |
| 1262 }; | |
| 1263 | |
| 1265 v8::String::Utf8Value exception(try_catch->Exception()); | 1264 v8::String::Utf8Value exception(try_catch->Exception()); |
| 1266 const char* exception_string = ToCString(exception); | 1265 const char* exception_string = ToCString(exception); |
| 1267 Local<Message> message = try_catch->Message(); | 1266 Local<Message> message = try_catch->Message(); |
| 1268 if (message.IsEmpty()) { | 1267 if (message.IsEmpty()) { |
| 1269 // V8 didn't provide any extra information about this error; just | 1268 // V8 didn't provide any extra information about this error; just |
| 1270 // print the exception. | 1269 // print the exception. |
| 1271 printf("%s\n", exception_string); | 1270 printf("%s\n", exception_string); |
| 1271 } else if (message->GetScriptOrigin().Options().IsWasm()) { | |
| 1272 // Print <WASM>[(function index)]((function name))+(offset): (message). | |
| 1273 int function_index = message->GetLineNumber(context).FromJust() - 1; | |
| 1274 int offset = message->GetStartColumn(context).FromJust(); | |
| 1275 printf("<WASM>[%d]+%d: %s\n", function_index, offset, exception_string); | |
| 1272 } else { | 1276 } else { |
| 1273 // Print (filename):(line number): (message). | 1277 // Print (filename):(line number): (message). |
| 1274 v8::String::Utf8Value filename(message->GetScriptOrigin().ResourceName()); | 1278 v8::String::Utf8Value filename(message->GetScriptOrigin().ResourceName()); |
| 1275 const char* filename_string = ToCString(filename); | 1279 const char* filename_string = ToCString(filename); |
| 1276 Maybe<int> maybeline = message->GetLineNumber(isolate->GetCurrentContext()); | 1280 int linenum = message->GetLineNumber(context).FromMaybe(-1); |
| 1277 int linenum = maybeline.IsJust() ? maybeline.FromJust() : -1; | |
| 1278 printf("%s:%i: %s\n", filename_string, linenum, exception_string); | 1281 printf("%s:%i: %s\n", filename_string, linenum, exception_string); |
| 1279 Local<String> sourceline; | 1282 Local<String> sourceline; |
| 1280 if (message->GetSourceLine(isolate->GetCurrentContext()) | 1283 if (message->GetSourceLine(context).ToLocal(&sourceline)) { |
| 1281 .ToLocal(&sourceline)) { | |
| 1282 // Print line of source code. | 1284 // Print line of source code. |
| 1283 v8::String::Utf8Value sourcelinevalue(sourceline); | 1285 v8::String::Utf8Value sourcelinevalue(sourceline); |
| 1284 const char* sourceline_string = ToCString(sourcelinevalue); | 1286 const char* sourceline_string = ToCString(sourcelinevalue); |
| 1285 printf("%s\n", sourceline_string); | 1287 printf("%s\n", sourceline_string); |
| 1286 // Print wavy underline (GetUnderline is deprecated). | 1288 // Print wavy underline (GetUnderline is deprecated). |
| 1287 int start = | 1289 int start = message->GetStartColumn(context).FromJust(); |
| 1288 message->GetStartColumn(isolate->GetCurrentContext()).FromJust(); | |
| 1289 for (int i = 0; i < start; i++) { | 1290 for (int i = 0; i < start; i++) { |
| 1290 printf(" "); | 1291 printf(" "); |
| 1291 } | 1292 } |
| 1292 int end = message->GetEndColumn(isolate->GetCurrentContext()).FromJust(); | 1293 int end = message->GetEndColumn(context).FromJust(); |
| 1293 for (int i = start; i < end; i++) { | 1294 for (int i = start; i < end; i++) { |
| 1294 printf("^"); | 1295 printf("^"); |
| 1295 } | 1296 } |
| 1296 printf("\n"); | 1297 printf("\n"); |
| 1297 } | 1298 } |
| 1298 Local<Value> stack_trace_string; | 1299 } |
| 1299 if (try_catch->StackTrace(isolate->GetCurrentContext()) | 1300 Local<Value> stack_trace_string; |
| 1300 .ToLocal(&stack_trace_string) && | 1301 if (try_catch->StackTrace(context).ToLocal(&stack_trace_string) && |
| 1301 stack_trace_string->IsString()) { | 1302 stack_trace_string->IsString()) { |
| 1302 v8::String::Utf8Value stack_trace( | 1303 v8::String::Utf8Value stack_trace(Local<String>::Cast(stack_trace_string)); |
| 1303 Local<String>::Cast(stack_trace_string)); | 1304 printf("%s\n", ToCString(stack_trace)); |
| 1304 printf("%s\n", ToCString(stack_trace)); | |
| 1305 } | |
| 1306 } | 1305 } |
| 1307 printf("\n"); | 1306 printf("\n"); |
| 1308 if (enter_context) context->Exit(); | 1307 if (enter_context) context->Exit(); |
| 1309 } | 1308 } |
| 1310 | 1309 |
| 1311 | 1310 |
| 1312 int32_t* Counter::Bind(const char* name, bool is_histogram) { | 1311 int32_t* Counter::Bind(const char* name, bool is_histogram) { |
| 1313 int i; | 1312 int i; |
| 1314 for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) | 1313 for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) |
| 1315 name_[i] = static_cast<char>(name[i]); | 1314 name_[i] = static_cast<char>(name[i]); |
| (...skipping 1705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3021 } | 3020 } |
| 3022 | 3021 |
| 3023 } // namespace v8 | 3022 } // namespace v8 |
| 3024 | 3023 |
| 3025 | 3024 |
| 3026 #ifndef GOOGLE3 | 3025 #ifndef GOOGLE3 |
| 3027 int main(int argc, char* argv[]) { | 3026 int main(int argc, char* argv[]) { |
| 3028 return v8::Shell::Main(argc, argv); | 3027 return v8::Shell::Main(argc, argv); |
| 3029 } | 3028 } |
| 3030 #endif | 3029 #endif |
| OLD | NEW |