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 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 Handle<String> str_obj = args[i]->ToString(); | 261 Handle<String> str_obj = args[i]->ToString(); |
262 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 262 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
263 | 263 |
264 v8::String::Utf8Value str(str_obj); | 264 v8::String::Utf8Value str(str_obj); |
265 int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout)); | 265 int n = static_cast<int>(fwrite(*str, sizeof(**str), str.length(), stdout)); |
266 if (n != str.length()) { | 266 if (n != str.length()) { |
267 printf("Error in fwrite\n"); | 267 printf("Error in fwrite\n"); |
268 Exit(1); | 268 Exit(1); |
269 } | 269 } |
270 } | 270 } |
271 return Undefined(); | 271 return Undefined(args.GetIsolate()); |
272 } | 272 } |
273 | 273 |
274 | 274 |
275 Handle<Value> Shell::EnableProfiler(const Arguments& args) { | 275 Handle<Value> Shell::EnableProfiler(const Arguments& args) { |
276 V8::ResumeProfiler(); | 276 V8::ResumeProfiler(); |
277 return Undefined(); | 277 return Undefined(args.GetIsolate()); |
278 } | 278 } |
279 | 279 |
280 | 280 |
281 Handle<Value> Shell::DisableProfiler(const Arguments& args) { | 281 Handle<Value> Shell::DisableProfiler(const Arguments& args) { |
282 V8::PauseProfiler(); | 282 V8::PauseProfiler(); |
283 return Undefined(); | 283 return Undefined(args.GetIsolate()); |
284 } | 284 } |
285 | 285 |
286 | 286 |
287 Handle<Value> Shell::Read(const Arguments& args) { | 287 Handle<Value> Shell::Read(const Arguments& args) { |
288 String::Utf8Value file(args[0]); | 288 String::Utf8Value file(args[0]); |
289 if (*file == NULL) { | 289 if (*file == NULL) { |
290 return Throw("Error loading file"); | 290 return Throw("Error loading file"); |
291 } | 291 } |
292 Handle<String> source = ReadFile(args.GetIsolate(), *file); | 292 Handle<String> source = ReadFile(args.GetIsolate(), *file); |
293 if (source.IsEmpty()) { | 293 if (source.IsEmpty()) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 return Throw("Error loading file"); | 335 return Throw("Error loading file"); |
336 } | 336 } |
337 Handle<String> source = ReadFile(args.GetIsolate(), *file); | 337 Handle<String> source = ReadFile(args.GetIsolate(), *file); |
338 if (source.IsEmpty()) { | 338 if (source.IsEmpty()) { |
339 return Throw("Error loading file"); | 339 return Throw("Error loading file"); |
340 } | 340 } |
341 if (!ExecuteString(source, String::New(*file), false, true)) { | 341 if (!ExecuteString(source, String::New(*file), false, true)) { |
342 return Throw("Error executing file"); | 342 return Throw("Error executing file"); |
343 } | 343 } |
344 } | 344 } |
345 return Undefined(); | 345 return Undefined(args.GetIsolate()); |
346 } | 346 } |
347 | 347 |
348 static int32_t convertToInt(Local<Value> value_in, TryCatch* try_catch) { | 348 static int32_t convertToInt(Local<Value> value_in, TryCatch* try_catch) { |
349 if (value_in->IsInt32()) { | 349 if (value_in->IsInt32()) { |
350 return value_in->Int32Value(); | 350 return value_in->Int32Value(); |
351 } | 351 } |
352 | 352 |
353 Local<Value> number = value_in->ToNumber(); | 353 Local<Value> number = value_in->ToNumber(); |
354 if (try_catch->HasCaught()) return 0; | 354 if (try_catch->HasCaught()) return 0; |
355 | 355 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 | 400 |
401 buffer->SetHiddenValue(Symbols::ArrayBufferMarkerPropName(isolate), True()); | 401 buffer->SetHiddenValue(Symbols::ArrayBufferMarkerPropName(isolate), True()); |
402 Persistent<Object> persistent_array = | 402 Persistent<Object> persistent_array = |
403 Persistent<Object>::New(isolate, buffer); | 403 Persistent<Object>::New(isolate, buffer); |
404 persistent_array.MakeWeak(isolate, data, ExternalArrayWeakCallback); | 404 persistent_array.MakeWeak(isolate, data, ExternalArrayWeakCallback); |
405 persistent_array.MarkIndependent(isolate); | 405 persistent_array.MarkIndependent(isolate); |
406 V8::AdjustAmountOfExternalAllocatedMemory(length); | 406 V8::AdjustAmountOfExternalAllocatedMemory(length); |
407 | 407 |
408 buffer->SetIndexedPropertiesToExternalArrayData( | 408 buffer->SetIndexedPropertiesToExternalArrayData( |
409 data, v8::kExternalByteArray, length); | 409 data, v8::kExternalByteArray, length); |
410 buffer->Set(Symbols::byteLength(isolate), Int32::New(length), ReadOnly); | 410 buffer->Set(Symbols::byteLength(isolate), |
| 411 Int32::New(length, isolate), |
| 412 ReadOnly); |
411 | 413 |
412 return buffer; | 414 return buffer; |
413 } | 415 } |
414 | 416 |
415 | 417 |
416 Handle<Value> Shell::ArrayBuffer(const Arguments& args) { | 418 Handle<Value> Shell::ArrayBuffer(const Arguments& args) { |
417 if (!args.IsConstructCall()) { | 419 if (!args.IsConstructCall()) { |
418 Handle<Value>* rec_args = new Handle<Value>[args.Length()]; | 420 Handle<Value>* rec_args = new Handle<Value>[args.Length()]; |
419 for (int i = 0; i < args.Length(); ++i) rec_args[i] = args[i]; | 421 for (int i = 0; i < args.Length(); ++i) rec_args[i] = args[i]; |
420 Handle<Value> result = args.Callee()->NewInstance(args.Length(), rec_args); | 422 Handle<Value> result = args.Callee()->NewInstance(args.Length(), rec_args); |
(...skipping 23 matching lines...) Expand all Loading... |
444 ASSERT(element_size == 1 || element_size == 2 || | 446 ASSERT(element_size == 1 || element_size == 2 || |
445 element_size == 4 || element_size == 8); | 447 element_size == 4 || element_size == 8); |
446 ASSERT(byteLength == length * element_size); | 448 ASSERT(byteLength == length * element_size); |
447 | 449 |
448 void* data = buffer->GetIndexedPropertiesExternalArrayData(); | 450 void* data = buffer->GetIndexedPropertiesExternalArrayData(); |
449 ASSERT(data != NULL); | 451 ASSERT(data != NULL); |
450 | 452 |
451 array->SetIndexedPropertiesToExternalArrayData( | 453 array->SetIndexedPropertiesToExternalArrayData( |
452 static_cast<uint8_t*>(data) + byteOffset, type, length); | 454 static_cast<uint8_t*>(data) + byteOffset, type, length); |
453 array->SetHiddenValue(Symbols::ArrayMarkerPropName(isolate), | 455 array->SetHiddenValue(Symbols::ArrayMarkerPropName(isolate), |
454 Int32::New(type)); | 456 Int32::New(type, isolate)); |
455 array->Set(Symbols::byteLength(isolate), Int32::New(byteLength), ReadOnly); | 457 array->Set(Symbols::byteLength(isolate), |
456 array->Set(Symbols::byteOffset(isolate), Int32::New(byteOffset), ReadOnly); | 458 Int32::New(byteLength, isolate), |
457 array->Set(Symbols::length(isolate), Int32::New(length), ReadOnly); | 459 ReadOnly); |
458 array->Set(Symbols::BYTES_PER_ELEMENT(isolate), Int32::New(element_size)); | 460 array->Set(Symbols::byteOffset(isolate), |
459 array->Set(Symbols::buffer(isolate), buffer, ReadOnly); | 461 Int32::New(byteOffset, isolate), |
| 462 ReadOnly); |
| 463 array->Set(Symbols::length(isolate), |
| 464 Int32::New(length, isolate), |
| 465 ReadOnly); |
| 466 array->Set(Symbols::BYTES_PER_ELEMENT(isolate), |
| 467 Int32::New(element_size, isolate)); |
| 468 array->Set(Symbols::buffer(isolate), |
| 469 buffer, |
| 470 ReadOnly); |
460 | 471 |
461 return array; | 472 return array; |
462 } | 473 } |
463 | 474 |
464 | 475 |
465 Handle<Value> Shell::CreateExternalArray(const Arguments& args, | 476 Handle<Value> Shell::CreateExternalArray(const Arguments& args, |
466 ExternalArrayType type, | 477 ExternalArrayType type, |
467 int32_t element_size) { | 478 int32_t element_size) { |
468 Isolate* isolate = args.GetIsolate(); | 479 Isolate* isolate = args.GetIsolate(); |
469 if (!args.IsConstructCall()) { | 480 if (!args.IsConstructCall()) { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 // Construct from size. | 553 // Construct from size. |
543 length = convertToUint(args[0], &try_catch); | 554 length = convertToUint(args[0], &try_catch); |
544 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 555 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
545 } | 556 } |
546 byteLength = length * element_size; | 557 byteLength = length * element_size; |
547 byteOffset = 0; | 558 byteOffset = 0; |
548 | 559 |
549 Handle<Object> global = Context::GetCurrent()->Global(); | 560 Handle<Object> global = Context::GetCurrent()->Global(); |
550 Handle<Value> array_buffer = global->Get(Symbols::ArrayBuffer(isolate)); | 561 Handle<Value> array_buffer = global->Get(Symbols::ArrayBuffer(isolate)); |
551 ASSERT(!try_catch.HasCaught() && array_buffer->IsFunction()); | 562 ASSERT(!try_catch.HasCaught() && array_buffer->IsFunction()); |
552 Handle<Value> buffer_args[] = { Uint32::New(byteLength) }; | 563 Handle<Value> buffer_args[] = { Uint32::New(byteLength, isolate) }; |
553 Handle<Value> result = Handle<Function>::Cast(array_buffer)->NewInstance( | 564 Handle<Value> result = Handle<Function>::Cast(array_buffer)->NewInstance( |
554 1, buffer_args); | 565 1, buffer_args); |
555 if (try_catch.HasCaught()) return result; | 566 if (try_catch.HasCaught()) return result; |
556 buffer = result->ToObject(); | 567 buffer = result->ToObject(); |
557 } | 568 } |
558 | 569 |
559 Handle<Object> array = | 570 Handle<Object> array = |
560 CreateExternalArray(isolate, args.This(), buffer, type, length, | 571 CreateExternalArray(isolate, args.This(), buffer, type, length, |
561 byteLength, byteOffset, element_size); | 572 byteLength, byteOffset, element_size); |
562 | 573 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 } else { | 618 } else { |
608 end = convertToInt(args[1], &try_catch); | 619 end = convertToInt(args[1], &try_catch); |
609 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 620 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
610 if (end < 0) end += length; | 621 if (end < 0) end += length; |
611 if (end < 0) end = 0; | 622 if (end < 0) end = 0; |
612 if (end > length) end = length; | 623 if (end > length) end = length; |
613 if (end < begin) end = begin; | 624 if (end < begin) end = begin; |
614 } | 625 } |
615 | 626 |
616 Local<Function> constructor = Local<Function>::Cast(self->GetConstructor()); | 627 Local<Function> constructor = Local<Function>::Cast(self->GetConstructor()); |
617 Handle<Value> new_args[] = { Uint32::New(end - begin) }; | 628 Handle<Value> new_args[] = { Uint32::New(end - begin, isolate) }; |
618 Handle<Value> result = constructor->NewInstance(1, new_args); | 629 Handle<Value> result = constructor->NewInstance(1, new_args); |
619 if (try_catch.HasCaught()) return result; | 630 if (try_catch.HasCaught()) return result; |
620 Handle<Object> buffer = result->ToObject(); | 631 Handle<Object> buffer = result->ToObject(); |
621 uint8_t* dest = | 632 uint8_t* dest = |
622 static_cast<uint8_t*>(buffer->GetIndexedPropertiesExternalArrayData()); | 633 static_cast<uint8_t*>(buffer->GetIndexedPropertiesExternalArrayData()); |
623 uint8_t* src = begin + static_cast<uint8_t*>( | 634 uint8_t* src = begin + static_cast<uint8_t*>( |
624 self->GetIndexedPropertiesExternalArrayData()); | 635 self->GetIndexedPropertiesExternalArrayData()); |
625 memcpy(dest, src, end - begin); | 636 memcpy(dest, src, end - begin); |
626 | 637 |
627 return buffer; | 638 return buffer; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 if (end < 0) end = 0; | 685 if (end < 0) end = 0; |
675 if (end > length) end = length; | 686 if (end > length) end = length; |
676 if (end < begin) end = begin; | 687 if (end < begin) end = begin; |
677 } | 688 } |
678 | 689 |
679 length = end - begin; | 690 length = end - begin; |
680 byteOffset += begin * element_size; | 691 byteOffset += begin * element_size; |
681 | 692 |
682 Local<Function> constructor = Local<Function>::Cast(self->GetConstructor()); | 693 Local<Function> constructor = Local<Function>::Cast(self->GetConstructor()); |
683 Handle<Value> construct_args[] = { | 694 Handle<Value> construct_args[] = { |
684 buffer, Uint32::New(byteOffset), Uint32::New(length) | 695 buffer, Uint32::New(byteOffset, isolate), Uint32::New(length, isolate) |
685 }; | 696 }; |
686 return constructor->NewInstance(3, construct_args); | 697 return constructor->NewInstance(3, construct_args); |
687 } | 698 } |
688 | 699 |
689 | 700 |
690 Handle<Value> Shell::ArraySet(const Arguments& args) { | 701 Handle<Value> Shell::ArraySet(const Arguments& args) { |
691 TryCatch try_catch; | 702 TryCatch try_catch; |
692 | 703 |
693 if (!args.This()->IsObject()) { | 704 if (!args.This()->IsObject()) { |
694 return Throw("'set' invoked on non-object receiver"); | 705 return Throw("'set' invoked on non-object receiver"); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 for (int k = i; k <= j; ++k) { | 827 for (int k = i; k <= j; ++k) { |
817 self->Set(offset + k, temp[k - i]); | 828 self->Set(offset + k, temp[k - i]); |
818 } | 829 } |
819 } else { | 830 } else { |
820 // Different backing stores, safe to copy element-wise sequentially. | 831 // Different backing stores, safe to copy element-wise sequentially. |
821 for (int i = 0; i < source_length; ++i) | 832 for (int i = 0; i < source_length; ++i) |
822 self->Set(offset + i, source->Get(i)); | 833 self->Set(offset + i, source->Get(i)); |
823 } | 834 } |
824 } | 835 } |
825 | 836 |
826 return Undefined(); | 837 return Undefined(args.GetIsolate()); |
827 } | 838 } |
828 | 839 |
829 | 840 |
830 void Shell::ExternalArrayWeakCallback(v8::Isolate* isolate, | 841 void Shell::ExternalArrayWeakCallback(v8::Isolate* isolate, |
831 Persistent<Value> object, | 842 Persistent<Value> object, |
832 void* data) { | 843 void* data) { |
833 HandleScope scope; | 844 HandleScope scope; |
834 int32_t length = | 845 int32_t length = |
835 object->ToObject()->Get(Symbols::byteLength(isolate))->Uint32Value(); | 846 object->ToObject()->Get(Symbols::byteLength(isolate))->Uint32Value(); |
836 V8::AdjustAmountOfExternalAllocatedMemory(-length); | 847 V8::AdjustAmountOfExternalAllocatedMemory(-length); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 } | 893 } |
883 | 894 |
884 | 895 |
885 Handle<Value> Shell::Uint8ClampedArray(const Arguments& args) { | 896 Handle<Value> Shell::Uint8ClampedArray(const Arguments& args) { |
886 return CreateExternalArray(args, kExternalPixelArray, sizeof(uint8_t)); | 897 return CreateExternalArray(args, kExternalPixelArray, sizeof(uint8_t)); |
887 } | 898 } |
888 | 899 |
889 | 900 |
890 Handle<Value> Shell::Yield(const Arguments& args) { | 901 Handle<Value> Shell::Yield(const Arguments& args) { |
891 v8::Unlocker unlocker(args.GetIsolate()); | 902 v8::Unlocker unlocker(args.GetIsolate()); |
892 return Undefined(); | 903 return Undefined(args.GetIsolate()); |
893 } | 904 } |
894 | 905 |
895 | 906 |
896 Handle<Value> Shell::Quit(const Arguments& args) { | 907 Handle<Value> Shell::Quit(const Arguments& args) { |
897 int exit_code = args[0]->Int32Value(); | 908 int exit_code = args[0]->Int32Value(); |
898 OnExit(); | 909 OnExit(); |
899 exit(exit_code); | 910 exit(exit_code); |
900 return Undefined(); | 911 return Undefined(args.GetIsolate()); |
901 } | 912 } |
902 | 913 |
903 | 914 |
904 Handle<Value> Shell::Version(const Arguments& args) { | 915 Handle<Value> Shell::Version(const Arguments& args) { |
905 return String::New(V8::GetVersion()); | 916 return String::New(V8::GetVersion()); |
906 } | 917 } |
907 | 918 |
908 | 919 |
909 void Shell::ReportException(v8::TryCatch* try_catch) { | 920 void Shell::ReportException(v8::TryCatch* try_catch) { |
910 HandleScope handle_scope; | 921 HandleScope handle_scope; |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1093 Counter* counter = reinterpret_cast<Counter*>(histogram); | 1104 Counter* counter = reinterpret_cast<Counter*>(histogram); |
1094 counter->AddSample(sample); | 1105 counter->AddSample(sample); |
1095 } | 1106 } |
1096 | 1107 |
1097 | 1108 |
1098 void Shell::InstallUtilityScript(Isolate* isolate) { | 1109 void Shell::InstallUtilityScript(Isolate* isolate) { |
1099 Locker lock(isolate); | 1110 Locker lock(isolate); |
1100 HandleScope scope; | 1111 HandleScope scope; |
1101 // If we use the utility context, we have to set the security tokens so that | 1112 // If we use the utility context, we have to set the security tokens so that |
1102 // utility, evaluation and debug context can all access each other. | 1113 // utility, evaluation and debug context can all access each other. |
1103 utility_context_->SetSecurityToken(Undefined()); | 1114 utility_context_->SetSecurityToken(Undefined(isolate)); |
1104 evaluation_context_->SetSecurityToken(Undefined()); | 1115 evaluation_context_->SetSecurityToken(Undefined(isolate)); |
1105 Context::Scope utility_scope(utility_context_); | 1116 Context::Scope utility_scope(utility_context_); |
1106 | 1117 |
1107 #ifdef ENABLE_DEBUGGER_SUPPORT | 1118 #ifdef ENABLE_DEBUGGER_SUPPORT |
1108 if (i::FLAG_debugger) printf("JavaScript debugger enabled\n"); | 1119 if (i::FLAG_debugger) printf("JavaScript debugger enabled\n"); |
1109 // Install the debugger object in the utility scope | 1120 // Install the debugger object in the utility scope |
1110 i::Debug* debug = i::Isolate::Current()->debug(); | 1121 i::Debug* debug = i::Isolate::Current()->debug(); |
1111 debug->Load(); | 1122 debug->Load(); |
1112 i::Handle<i::JSObject> js_debug | 1123 i::Handle<i::JSObject> js_debug |
1113 = i::Handle<i::JSObject>(debug->debug_context()->global_object()); | 1124 = i::Handle<i::JSObject>(debug->debug_context()->global_object()); |
1114 utility_context_->Global()->Set(String::New("$debug"), | 1125 utility_context_->Global()->Set(String::New("$debug"), |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1447 buffer->SetHiddenValue(Symbols::ArrayBufferMarkerPropName(isolate), True()); | 1458 buffer->SetHiddenValue(Symbols::ArrayBufferMarkerPropName(isolate), True()); |
1448 Persistent<Object> persistent_buffer = | 1459 Persistent<Object> persistent_buffer = |
1449 Persistent<Object>::New(isolate, buffer); | 1460 Persistent<Object>::New(isolate, buffer); |
1450 persistent_buffer.MakeWeak(isolate, data, ExternalArrayWeakCallback); | 1461 persistent_buffer.MakeWeak(isolate, data, ExternalArrayWeakCallback); |
1451 persistent_buffer.MarkIndependent(isolate); | 1462 persistent_buffer.MarkIndependent(isolate); |
1452 V8::AdjustAmountOfExternalAllocatedMemory(length); | 1463 V8::AdjustAmountOfExternalAllocatedMemory(length); |
1453 | 1464 |
1454 buffer->SetIndexedPropertiesToExternalArrayData( | 1465 buffer->SetIndexedPropertiesToExternalArrayData( |
1455 data, kExternalUnsignedByteArray, length); | 1466 data, kExternalUnsignedByteArray, length); |
1456 buffer->Set(Symbols::byteLength(isolate), | 1467 buffer->Set(Symbols::byteLength(isolate), |
1457 Int32::New(static_cast<int32_t>(length)), ReadOnly); | 1468 Int32::New(static_cast<int32_t>(length), isolate), ReadOnly); |
1458 return buffer; | 1469 return buffer; |
1459 } | 1470 } |
1460 | 1471 |
1461 | 1472 |
1462 #ifndef V8_SHARED | 1473 #ifndef V8_SHARED |
1463 static char* ReadToken(char* data, char token) { | 1474 static char* ReadToken(char* data, char token) { |
1464 char* next = i::OS::StrChr(data, token); | 1475 char* next = i::OS::StrChr(data, token); |
1465 if (next != NULL) { | 1476 if (next != NULL) { |
1466 *next = '\0'; | 1477 *next = '\0'; |
1467 return (next + 1); | 1478 return (next + 1); |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1965 } | 1976 } |
1966 | 1977 |
1967 } // namespace v8 | 1978 } // namespace v8 |
1968 | 1979 |
1969 | 1980 |
1970 #ifndef GOOGLE3 | 1981 #ifndef GOOGLE3 |
1971 int main(int argc, char* argv[]) { | 1982 int main(int argc, char* argv[]) { |
1972 return v8::Shell::Main(argc, argv); | 1983 return v8::Shell::Main(argc, argv); |
1973 } | 1984 } |
1974 #endif | 1985 #endif |
OLD | NEW |