OLD | NEW |
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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 * fixes this issue. | 92 * fixes this issue. |
93 */ | 93 */ |
94 | 94 |
95 enum MainCycleType { | 95 enum MainCycleType { |
96 CycleInCpp, | 96 CycleInCpp, |
97 CycleInJs | 97 CycleInJs |
98 }; | 98 }; |
99 | 99 |
100 const char* ToCString(const v8::String::Utf8Value& value); | 100 const char* ToCString(const v8::String::Utf8Value& value); |
101 void ReportException(v8::Isolate* isolate, v8::TryCatch* handler); | 101 void ReportException(v8::Isolate* isolate, v8::TryCatch* handler); |
102 v8::Handle<v8::String> ReadFile(const char* name); | 102 v8::Handle<v8::String> ReadFile(v8::Isolate* isolate, const char* name); |
103 v8::Handle<v8::String> ReadLine(); | 103 v8::Handle<v8::String> ReadLine(); |
104 | 104 |
105 void Print(const v8::FunctionCallbackInfo<v8::Value>& args); | 105 void Print(const v8::FunctionCallbackInfo<v8::Value>& args); |
106 void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args); | 106 void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args); |
107 bool RunCppCycle(v8::Handle<v8::Script> script, | 107 bool RunCppCycle(v8::Handle<v8::Script> script, |
108 v8::Local<v8::Context> context, | 108 v8::Local<v8::Context> context, |
109 bool report_exceptions); | 109 bool report_exceptions); |
110 | 110 |
111 | 111 |
112 #ifdef ENABLE_DEBUGGER_SUPPORT | 112 #ifdef ENABLE_DEBUGGER_SUPPORT |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 support_callback = true; | 167 support_callback = true; |
168 } else if (strcmp(str, "--wait-for-connection") == 0) { | 168 } else if (strcmp(str, "--wait-for-connection") == 0) { |
169 wait_for_connection = true; | 169 wait_for_connection = true; |
170 } else if (strcmp(str, "-p") == 0 && i + 1 < argc) { | 170 } else if (strcmp(str, "-p") == 0 && i + 1 < argc) { |
171 port_number = atoi(argv[i + 1]); // NOLINT | 171 port_number = atoi(argv[i + 1]); // NOLINT |
172 i++; | 172 i++; |
173 #endif // ENABLE_DEBUGGER_SUPPORT | 173 #endif // ENABLE_DEBUGGER_SUPPORT |
174 } else if (strncmp(str, "--", 2) == 0) { | 174 } else if (strncmp(str, "--", 2) == 0) { |
175 printf("Warning: unknown flag %s.\nTry --help for options\n", str); | 175 printf("Warning: unknown flag %s.\nTry --help for options\n", str); |
176 } else if (strcmp(str, "-e") == 0 && i + 1 < argc) { | 176 } else if (strcmp(str, "-e") == 0 && i + 1 < argc) { |
177 script_source = v8::String::New(argv[i + 1]); | 177 script_source = v8::String::NewFromUtf8(isolate, argv[i + 1]); |
178 script_name = v8::String::New("unnamed"); | 178 script_name = v8::String::NewFromUtf8(isolate, "unnamed"); |
179 i++; | 179 i++; |
180 script_param_counter++; | 180 script_param_counter++; |
181 } else { | 181 } else { |
182 // Use argument as a name of file to load. | 182 // Use argument as a name of file to load. |
183 script_source = ReadFile(str); | 183 script_source = ReadFile(isolate, str); |
184 script_name = v8::String::New(str); | 184 script_name = v8::String::NewFromUtf8(isolate, str); |
185 if (script_source.IsEmpty()) { | 185 if (script_source.IsEmpty()) { |
186 printf("Error reading '%s'\n", str); | 186 printf("Error reading '%s'\n", str); |
187 return 1; | 187 return 1; |
188 } | 188 } |
189 script_param_counter++; | 189 script_param_counter++; |
190 } | 190 } |
191 } | 191 } |
192 | 192 |
193 if (script_param_counter == 0) { | 193 if (script_param_counter == 0) { |
194 printf("Script is not specified\n"); | 194 printf("Script is not specified\n"); |
195 return 1; | 195 return 1; |
196 } | 196 } |
197 if (script_param_counter != 1) { | 197 if (script_param_counter != 1) { |
198 printf("Only one script may be specified\n"); | 198 printf("Only one script may be specified\n"); |
199 return 1; | 199 return 1; |
200 } | 200 } |
201 | 201 |
202 // Create a template for the global object. | 202 // Create a template for the global object. |
203 v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); | 203 v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); |
204 | 204 |
205 // Bind the global 'print' function to the C++ Print callback. | 205 // Bind the global 'print' function to the C++ Print callback. |
206 global->Set(v8::String::New("print"), v8::FunctionTemplate::New(Print)); | 206 global->Set(v8::String::NewFromUtf8(isolate, "print"), |
| 207 v8::FunctionTemplate::New(Print)); |
207 | 208 |
208 if (cycle_type == CycleInJs) { | 209 if (cycle_type == CycleInJs) { |
209 // Bind the global 'read_line' function to the C++ Print callback. | 210 // Bind the global 'read_line' function to the C++ Print callback. |
210 global->Set(v8::String::New("read_line"), | 211 global->Set(v8::String::NewFromUtf8(isolate, "read_line"), |
211 v8::FunctionTemplate::New(ReadLine)); | 212 v8::FunctionTemplate::New(ReadLine)); |
212 } | 213 } |
213 | 214 |
214 // Create a new execution environment containing the built-in | 215 // Create a new execution environment containing the built-in |
215 // functions | 216 // functions |
216 v8::Handle<v8::Context> context = v8::Context::New(isolate, NULL, global); | 217 v8::Handle<v8::Context> context = v8::Context::New(isolate, NULL, global); |
217 // Enter the newly created execution environment. | 218 // Enter the newly created execution environment. |
218 v8::Context::Scope context_scope(context); | 219 v8::Context::Scope context_scope(context); |
219 | 220 |
220 #ifdef ENABLE_DEBUGGER_SUPPORT | 221 #ifdef ENABLE_DEBUGGER_SUPPORT |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 | 271 |
271 | 272 |
272 bool RunCppCycle(v8::Handle<v8::Script> script, | 273 bool RunCppCycle(v8::Handle<v8::Script> script, |
273 v8::Local<v8::Context> context, | 274 v8::Local<v8::Context> context, |
274 bool report_exceptions) { | 275 bool report_exceptions) { |
275 v8::Isolate* isolate = context->GetIsolate(); | 276 v8::Isolate* isolate = context->GetIsolate(); |
276 #ifdef ENABLE_DEBUGGER_SUPPORT | 277 #ifdef ENABLE_DEBUGGER_SUPPORT |
277 v8::Locker lock(isolate); | 278 v8::Locker lock(isolate); |
278 #endif // ENABLE_DEBUGGER_SUPPORT | 279 #endif // ENABLE_DEBUGGER_SUPPORT |
279 | 280 |
280 v8::Handle<v8::String> fun_name = v8::String::New("ProcessLine"); | 281 v8::Handle<v8::String> fun_name = |
| 282 v8::String::NewFromUtf8(isolate, "ProcessLine"); |
281 v8::Handle<v8::Value> process_val = context->Global()->Get(fun_name); | 283 v8::Handle<v8::Value> process_val = context->Global()->Get(fun_name); |
282 | 284 |
283 // If there is no Process function, or if it is not a function, | 285 // If there is no Process function, or if it is not a function, |
284 // bail out | 286 // bail out |
285 if (!process_val->IsFunction()) { | 287 if (!process_val->IsFunction()) { |
286 printf("Error: Script does not declare 'ProcessLine' global function.\n"); | 288 printf("Error: Script does not declare 'ProcessLine' global function.\n"); |
287 return 1; | 289 return 1; |
288 } | 290 } |
289 | 291 |
290 // It is a function; cast it to a Function | 292 // It is a function; cast it to a Function |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 } | 333 } |
332 | 334 |
333 | 335 |
334 // Extracts a C string from a V8 Utf8Value. | 336 // Extracts a C string from a V8 Utf8Value. |
335 const char* ToCString(const v8::String::Utf8Value& value) { | 337 const char* ToCString(const v8::String::Utf8Value& value) { |
336 return *value ? *value : "<string conversion failed>"; | 338 return *value ? *value : "<string conversion failed>"; |
337 } | 339 } |
338 | 340 |
339 | 341 |
340 // Reads a file into a v8 string. | 342 // Reads a file into a v8 string. |
341 v8::Handle<v8::String> ReadFile(const char* name) { | 343 v8::Handle<v8::String> ReadFile(v8::Isolate* isolate, const char* name) { |
342 FILE* file = fopen(name, "rb"); | 344 FILE* file = fopen(name, "rb"); |
343 if (file == NULL) return v8::Handle<v8::String>(); | 345 if (file == NULL) return v8::Handle<v8::String>(); |
344 | 346 |
345 fseek(file, 0, SEEK_END); | 347 fseek(file, 0, SEEK_END); |
346 int size = ftell(file); | 348 int size = ftell(file); |
347 rewind(file); | 349 rewind(file); |
348 | 350 |
349 char* chars = new char[size + 1]; | 351 char* chars = new char[size + 1]; |
350 chars[size] = '\0'; | 352 chars[size] = '\0'; |
351 for (int i = 0; i < size;) { | 353 for (int i = 0; i < size;) { |
352 int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); | 354 int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); |
353 i += read; | 355 i += read; |
354 } | 356 } |
355 fclose(file); | 357 fclose(file); |
356 v8::Handle<v8::String> result = v8::String::New(chars, size); | 358 v8::Handle<v8::String> result = |
| 359 v8::String::NewFromUtf8(isolate, chars, v8::String::kNormalString, size); |
357 delete[] chars; | 360 delete[] chars; |
358 return result; | 361 return result; |
359 } | 362 } |
360 | 363 |
361 | 364 |
362 void ReportException(v8::Isolate* isolate, v8::TryCatch* try_catch) { | 365 void ReportException(v8::Isolate* isolate, v8::TryCatch* try_catch) { |
363 v8::HandleScope handle_scope(isolate); | 366 v8::HandleScope handle_scope(isolate); |
364 v8::String::Utf8Value exception(try_catch->Exception()); | 367 v8::String::Utf8Value exception(try_catch->Exception()); |
365 const char* exception_string = ToCString(exception); | 368 const char* exception_string = ToCString(exception); |
366 v8::Handle<v8::Message> message = try_catch->Message(); | 369 v8::Handle<v8::Message> message = try_catch->Message(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 } | 413 } |
411 printf("\n"); | 414 printf("\n"); |
412 fflush(stdout); | 415 fflush(stdout); |
413 } | 416 } |
414 | 417 |
415 | 418 |
416 // The callback that is invoked by v8 whenever the JavaScript 'read_line' | 419 // The callback that is invoked by v8 whenever the JavaScript 'read_line' |
417 // function is called. Reads a string from standard input and returns. | 420 // function is called. Reads a string from standard input and returns. |
418 void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args) { | 421 void ReadLine(const v8::FunctionCallbackInfo<v8::Value>& args) { |
419 if (args.Length() > 0) { | 422 if (args.Length() > 0) { |
420 args.GetIsolate()->ThrowException(v8::String::New("Unexpected arguments")); | 423 args.GetIsolate()->ThrowException( |
| 424 v8::String::NewFromUtf8(args.GetIsolate(), "Unexpected arguments")); |
421 return; | 425 return; |
422 } | 426 } |
423 args.GetReturnValue().Set(ReadLine()); | 427 args.GetReturnValue().Set(ReadLine()); |
424 } | 428 } |
425 | 429 |
426 | 430 |
427 v8::Handle<v8::String> ReadLine() { | 431 v8::Handle<v8::String> ReadLine() { |
428 const int kBufferSize = 1024 + 1; | 432 const int kBufferSize = 1024 + 1; |
429 char buffer[kBufferSize]; | 433 char buffer[kBufferSize]; |
430 | 434 |
431 char* res; | 435 char* res; |
432 { | 436 { |
433 #ifdef ENABLE_DEBUGGER_SUPPORT | 437 #ifdef ENABLE_DEBUGGER_SUPPORT |
434 v8::Unlocker unlocker(v8::Isolate::GetCurrent()); | 438 v8::Unlocker unlocker(v8::Isolate::GetCurrent()); |
435 #endif // ENABLE_DEBUGGER_SUPPORT | 439 #endif // ENABLE_DEBUGGER_SUPPORT |
436 res = fgets(buffer, kBufferSize, stdin); | 440 res = fgets(buffer, kBufferSize, stdin); |
437 } | 441 } |
| 442 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
438 if (res == NULL) { | 443 if (res == NULL) { |
439 v8::Handle<v8::Primitive> t = v8::Undefined(v8::Isolate::GetCurrent()); | 444 v8::Handle<v8::Primitive> t = v8::Undefined(isolate); |
440 return v8::Handle<v8::String>::Cast(t); | 445 return v8::Handle<v8::String>::Cast(t); |
441 } | 446 } |
442 // Remove newline char | 447 // Remove newline char |
443 for (char* pos = buffer; *pos != '\0'; pos++) { | 448 for (char* pos = buffer; *pos != '\0'; pos++) { |
444 if (*pos == '\n') { | 449 if (*pos == '\n') { |
445 *pos = '\0'; | 450 *pos = '\0'; |
446 break; | 451 break; |
447 } | 452 } |
448 } | 453 } |
449 return v8::String::New(buffer); | 454 return v8::String::NewFromUtf8(isolate, buffer); |
450 } | 455 } |
OLD | NEW |