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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 #if !defined(_WIN32) && !defined(_WIN64) | 60 #if !defined(_WIN32) && !defined(_WIN64) |
61 #include <unistd.h> // NOLINT | 61 #include <unistd.h> // NOLINT |
62 #endif | 62 #endif |
63 | 63 |
64 #ifndef ASSERT | 64 #ifndef ASSERT |
65 #define ASSERT(condition) assert(condition) | 65 #define ASSERT(condition) assert(condition) |
66 #endif | 66 #endif |
67 | 67 |
68 namespace v8 { | 68 namespace v8 { |
69 | 69 |
| 70 |
| 71 static Handle<Value> Throw(const char* message) { |
| 72 return ThrowException(String::New(message)); |
| 73 } |
| 74 |
| 75 |
| 76 // TODO(rossberg): should replace these by proper uses of HasInstance, |
| 77 // once we figure out a good way to make the templates global. |
| 78 const char kArrayBufferMarkerPropName[] = "d8::_is_array_buffer_"; |
| 79 const char kArrayMarkerPropName[] = "d8::_is_typed_array_"; |
| 80 |
| 81 |
| 82 namespace Symbols { |
| 83 #define FOR_EACH_SYMBOL(V) \ |
| 84 V(ArrayBuffer, "ArrayBuffer") \ |
| 85 V(ArrayBufferMarkerPropName, kArrayBufferMarkerPropName) \ |
| 86 V(ArrayMarkerPropName, kArrayMarkerPropName) \ |
| 87 V(buffer, "buffer") \ |
| 88 V(byteLength, "byteLength") \ |
| 89 V(byteOffset, "byteOffset") \ |
| 90 V(BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT") \ |
| 91 V(length, "length") |
| 92 |
| 93 #define DEFINE_SYMBOL(name, value) Persistent<String> name; |
| 94 FOR_EACH_SYMBOL(DEFINE_SYMBOL) |
| 95 #undef DEFINE_SYMBOL |
| 96 |
| 97 void Initialize() { |
| 98 HandleScope scope; |
| 99 #define INIT_SYMBOL(name, value) \ |
| 100 name = Persistent<String>::New(String::NewSymbol(value)); |
| 101 FOR_EACH_SYMBOL(INIT_SYMBOL) |
| 102 #undef INIT_SYMBOL |
| 103 } |
| 104 |
| 105 void TearDown() { |
| 106 #define DISPOSE_SYMBOL(name, value) name.Dispose(); |
| 107 FOR_EACH_SYMBOL(DISPOSE_SYMBOL) |
| 108 #undef DISPOSE_SYMBOL |
| 109 } |
| 110 } |
| 111 |
| 112 |
70 LineEditor *LineEditor::first_ = NULL; | 113 LineEditor *LineEditor::first_ = NULL; |
71 | 114 |
72 | 115 |
73 LineEditor::LineEditor(Type type, const char* name) | 116 LineEditor::LineEditor(Type type, const char* name) |
74 : type_(type), | 117 : type_(type), |
75 name_(name), | 118 name_(name), |
76 next_(first_) { | 119 next_(first_) { |
77 first_ = this; | 120 first_ = this; |
78 } | 121 } |
79 | 122 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 | 268 |
226 Handle<Value> Shell::DisableProfiler(const Arguments& args) { | 269 Handle<Value> Shell::DisableProfiler(const Arguments& args) { |
227 V8::PauseProfiler(); | 270 V8::PauseProfiler(); |
228 return Undefined(); | 271 return Undefined(); |
229 } | 272 } |
230 | 273 |
231 | 274 |
232 Handle<Value> Shell::Read(const Arguments& args) { | 275 Handle<Value> Shell::Read(const Arguments& args) { |
233 String::Utf8Value file(args[0]); | 276 String::Utf8Value file(args[0]); |
234 if (*file == NULL) { | 277 if (*file == NULL) { |
235 return ThrowException(String::New("Error loading file")); | 278 return Throw("Error loading file"); |
236 } | 279 } |
237 Handle<String> source = ReadFile(*file); | 280 Handle<String> source = ReadFile(*file); |
238 if (source.IsEmpty()) { | 281 if (source.IsEmpty()) { |
239 return ThrowException(String::New("Error loading file")); | 282 return Throw("Error loading file"); |
240 } | 283 } |
241 return source; | 284 return source; |
242 } | 285 } |
243 | 286 |
244 | 287 |
245 Handle<String> Shell::ReadFromStdin() { | 288 Handle<String> Shell::ReadFromStdin() { |
246 static const int kBufferSize = 256; | 289 static const int kBufferSize = 256; |
247 char buffer[kBufferSize]; | 290 char buffer[kBufferSize]; |
248 Handle<String> accumulator = String::New(""); | 291 Handle<String> accumulator = String::New(""); |
249 int length; | 292 int length; |
(...skipping 20 matching lines...) Expand all Loading... |
270 } | 313 } |
271 } | 314 } |
272 } | 315 } |
273 | 316 |
274 | 317 |
275 Handle<Value> Shell::Load(const Arguments& args) { | 318 Handle<Value> Shell::Load(const Arguments& args) { |
276 for (int i = 0; i < args.Length(); i++) { | 319 for (int i = 0; i < args.Length(); i++) { |
277 HandleScope handle_scope; | 320 HandleScope handle_scope; |
278 String::Utf8Value file(args[i]); | 321 String::Utf8Value file(args[i]); |
279 if (*file == NULL) { | 322 if (*file == NULL) { |
280 return ThrowException(String::New("Error loading file")); | 323 return Throw("Error loading file"); |
281 } | 324 } |
282 Handle<String> source = ReadFile(*file); | 325 Handle<String> source = ReadFile(*file); |
283 if (source.IsEmpty()) { | 326 if (source.IsEmpty()) { |
284 return ThrowException(String::New("Error loading file")); | 327 return Throw("Error loading file"); |
285 } | 328 } |
286 if (!ExecuteString(source, String::New(*file), false, true)) { | 329 if (!ExecuteString(source, String::New(*file), false, true)) { |
287 return ThrowException(String::New("Error executing file")); | 330 return Throw("Error executing file"); |
288 } | 331 } |
289 } | 332 } |
290 return Undefined(); | 333 return Undefined(); |
291 } | 334 } |
292 | 335 |
293 static int32_t convertToInt(Local<Value> value_in, TryCatch* try_catch) { | 336 static int32_t convertToInt(Local<Value> value_in, TryCatch* try_catch) { |
294 if (value_in->IsInt32()) { | 337 if (value_in->IsInt32()) { |
295 return value_in->Int32Value(); | 338 return value_in->Int32Value(); |
296 } | 339 } |
297 | 340 |
298 Local<Value> number = value_in->ToNumber(); | 341 Local<Value> number = value_in->ToNumber(); |
299 if (try_catch->HasCaught()) return 0; | 342 if (try_catch->HasCaught()) return 0; |
300 | 343 |
301 ASSERT(number->IsNumber()); | 344 ASSERT(number->IsNumber()); |
302 Local<Int32> int32 = number->ToInt32(); | 345 Local<Int32> int32 = number->ToInt32(); |
303 if (try_catch->HasCaught() || int32.IsEmpty()) return 0; | 346 if (try_catch->HasCaught() || int32.IsEmpty()) return 0; |
304 | 347 |
305 int32_t value = int32->Int32Value(); | 348 int32_t value = int32->Int32Value(); |
306 if (try_catch->HasCaught()) return 0; | 349 if (try_catch->HasCaught()) return 0; |
307 | 350 |
308 return value; | 351 return value; |
309 } | 352 } |
310 | 353 |
311 | 354 |
312 static int32_t convertToUint(Local<Value> value_in, TryCatch* try_catch) { | 355 static int32_t convertToUint(Local<Value> value_in, TryCatch* try_catch) { |
313 int32_t raw_value = convertToInt(value_in, try_catch); | 356 int32_t raw_value = convertToInt(value_in, try_catch); |
314 if (try_catch->HasCaught()) return 0; | 357 if (try_catch->HasCaught()) return 0; |
315 | 358 |
316 if (raw_value < 0) { | 359 if (raw_value < 0) { |
317 ThrowException(String::New("Array length must not be negative.")); | 360 Throw("Array length must not be negative."); |
318 return 0; | 361 return 0; |
319 } | 362 } |
320 | 363 |
321 static const int kMaxLength = 0x3fffffff; | 364 static const int kMaxLength = 0x3fffffff; |
322 #ifndef V8_SHARED | 365 #ifndef V8_SHARED |
323 ASSERT(kMaxLength == i::ExternalArray::kMaxLength); | 366 ASSERT(kMaxLength == i::ExternalArray::kMaxLength); |
324 #endif // V8_SHARED | 367 #endif // V8_SHARED |
325 if (raw_value > static_cast<int32_t>(kMaxLength)) { | 368 if (raw_value > static_cast<int32_t>(kMaxLength)) { |
326 ThrowException( | 369 Throw("Array length exceeds maximum length."); |
327 String::New("Array length exceeds maximum length.")); | |
328 } | 370 } |
329 return raw_value; | 371 return raw_value; |
330 } | 372 } |
331 | 373 |
332 | 374 |
333 // TODO(rossberg): should replace these by proper uses of HasInstance, | |
334 // once we figure out a good way to make the templates global. | |
335 const char kArrayBufferMarkerPropName[] = "d8::_is_array_buffer_"; | |
336 const char kArrayMarkerPropName[] = "d8::_is_typed_array_"; | |
337 | |
338 | |
339 Handle<Value> Shell::CreateExternalArrayBuffer(Handle<Object> buffer, | 375 Handle<Value> Shell::CreateExternalArrayBuffer(Handle<Object> buffer, |
340 int32_t length) { | 376 int32_t length) { |
341 static const int32_t kMaxSize = 0x7fffffff; | 377 static const int32_t kMaxSize = 0x7fffffff; |
342 // Make sure the total size fits into a (signed) int. | 378 // Make sure the total size fits into a (signed) int. |
343 if (length < 0 || length > kMaxSize) { | 379 if (length < 0 || length > kMaxSize) { |
344 return ThrowException(String::New("ArrayBuffer exceeds maximum size (2G)")); | 380 return Throw("ArrayBuffer exceeds maximum size (2G)"); |
345 } | 381 } |
346 uint8_t* data = new uint8_t[length]; | 382 uint8_t* data = new uint8_t[length]; |
347 if (data == NULL) { | 383 if (data == NULL) { |
348 return ThrowException(String::New("Memory allocation failed")); | 384 return Throw("Memory allocation failed"); |
349 } | 385 } |
350 memset(data, 0, length); | 386 memset(data, 0, length); |
351 | 387 |
352 buffer->SetHiddenValue(String::New(kArrayBufferMarkerPropName), True()); | 388 buffer->SetHiddenValue(Symbols::ArrayBufferMarkerPropName, True()); |
353 Persistent<Object> persistent_array = Persistent<Object>::New(buffer); | 389 Persistent<Object> persistent_array = Persistent<Object>::New(buffer); |
354 persistent_array.MakeWeak(data, ExternalArrayWeakCallback); | 390 persistent_array.MakeWeak(data, ExternalArrayWeakCallback); |
355 persistent_array.MarkIndependent(); | 391 persistent_array.MarkIndependent(); |
356 V8::AdjustAmountOfExternalAllocatedMemory(length); | 392 V8::AdjustAmountOfExternalAllocatedMemory(length); |
357 | 393 |
358 buffer->SetIndexedPropertiesToExternalArrayData( | 394 buffer->SetIndexedPropertiesToExternalArrayData( |
359 data, v8::kExternalByteArray, length); | 395 data, v8::kExternalByteArray, length); |
360 buffer->Set(String::New("byteLength"), Int32::New(length), ReadOnly); | 396 buffer->Set(Symbols::byteLength, Int32::New(length), ReadOnly); |
361 | 397 |
362 return buffer; | 398 return buffer; |
363 } | 399 } |
364 | 400 |
365 | 401 |
366 Handle<Value> Shell::ArrayBuffer(const Arguments& args) { | 402 Handle<Value> Shell::ArrayBuffer(const Arguments& args) { |
367 if (!args.IsConstructCall()) { | 403 if (!args.IsConstructCall()) { |
368 Handle<Value>* rec_args = new Handle<Value>[args.Length()]; | 404 Handle<Value>* rec_args = new Handle<Value>[args.Length()]; |
369 for (int i = 0; i < args.Length(); ++i) rec_args[i] = args[i]; | 405 for (int i = 0; i < args.Length(); ++i) rec_args[i] = args[i]; |
370 Handle<Value> result = args.Callee()->NewInstance(args.Length(), rec_args); | 406 Handle<Value> result = args.Callee()->NewInstance(args.Length(), rec_args); |
371 delete[] rec_args; | 407 delete[] rec_args; |
372 return result; | 408 return result; |
373 } | 409 } |
374 | 410 |
375 if (args.Length() == 0) { | 411 if (args.Length() == 0) { |
376 return ThrowException( | 412 return Throw("ArrayBuffer constructor must have one argument"); |
377 String::New("ArrayBuffer constructor must have one argument")); | |
378 } | 413 } |
379 TryCatch try_catch; | 414 TryCatch try_catch; |
380 int32_t length = convertToUint(args[0], &try_catch); | 415 int32_t length = convertToUint(args[0], &try_catch); |
381 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 416 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
382 | 417 |
383 return CreateExternalArrayBuffer(args.This(), length); | 418 return CreateExternalArrayBuffer(args.This(), length); |
384 } | 419 } |
385 | 420 |
386 | 421 |
387 Handle<Object> Shell::CreateExternalArray(Handle<Object> array, | 422 Handle<Object> Shell::CreateExternalArray(Handle<Object> array, |
388 Handle<Object> buffer, | 423 Handle<Object> buffer, |
389 ExternalArrayType type, | 424 ExternalArrayType type, |
390 int32_t length, | 425 int32_t length, |
391 int32_t byteLength, | 426 int32_t byteLength, |
392 int32_t byteOffset, | 427 int32_t byteOffset, |
393 int32_t element_size) { | 428 int32_t element_size) { |
394 ASSERT(element_size == 1 || element_size == 2 || | 429 ASSERT(element_size == 1 || element_size == 2 || |
395 element_size == 4 || element_size == 8); | 430 element_size == 4 || element_size == 8); |
396 ASSERT(byteLength == length * element_size); | 431 ASSERT(byteLength == length * element_size); |
397 | 432 |
398 void* data = buffer->GetIndexedPropertiesExternalArrayData(); | 433 void* data = buffer->GetIndexedPropertiesExternalArrayData(); |
399 ASSERT(data != NULL); | 434 ASSERT(data != NULL); |
400 | 435 |
401 array->SetIndexedPropertiesToExternalArrayData( | 436 array->SetIndexedPropertiesToExternalArrayData( |
402 static_cast<uint8_t*>(data) + byteOffset, type, length); | 437 static_cast<uint8_t*>(data) + byteOffset, type, length); |
403 array->SetHiddenValue(String::New(kArrayMarkerPropName), Int32::New(type)); | 438 array->SetHiddenValue(Symbols::ArrayMarkerPropName, Int32::New(type)); |
404 array->Set(String::New("byteLength"), Int32::New(byteLength), ReadOnly); | 439 array->Set(Symbols::byteLength, Int32::New(byteLength), ReadOnly); |
405 array->Set(String::New("byteOffset"), Int32::New(byteOffset), ReadOnly); | 440 array->Set(Symbols::byteOffset, Int32::New(byteOffset), ReadOnly); |
406 array->Set(String::New("length"), Int32::New(length), ReadOnly); | 441 array->Set(Symbols::length, Int32::New(length), ReadOnly); |
407 array->Set(String::New("BYTES_PER_ELEMENT"), Int32::New(element_size)); | 442 array->Set(Symbols::BYTES_PER_ELEMENT, Int32::New(element_size)); |
408 array->Set(String::New("buffer"), buffer, ReadOnly); | 443 array->Set(Symbols::buffer, buffer, ReadOnly); |
409 | 444 |
410 return array; | 445 return array; |
411 } | 446 } |
412 | 447 |
413 | 448 |
414 Handle<Value> Shell::CreateExternalArray(const Arguments& args, | 449 Handle<Value> Shell::CreateExternalArray(const Arguments& args, |
415 ExternalArrayType type, | 450 ExternalArrayType type, |
416 int32_t element_size) { | 451 int32_t element_size) { |
417 if (!args.IsConstructCall()) { | 452 if (!args.IsConstructCall()) { |
418 Handle<Value>* rec_args = new Handle<Value>[args.Length()]; | 453 Handle<Value>* rec_args = new Handle<Value>[args.Length()]; |
(...skipping 13 matching lines...) Expand all Loading... |
432 // TypedArray(TypedArray array) | 467 // TypedArray(TypedArray array) |
433 // TypedArray(ArrayBuffer buffer, | 468 // TypedArray(ArrayBuffer buffer, |
434 // optional unsigned long byteOffset, | 469 // optional unsigned long byteOffset, |
435 // optional unsigned long length) | 470 // optional unsigned long length) |
436 Handle<Object> buffer; | 471 Handle<Object> buffer; |
437 int32_t length; | 472 int32_t length; |
438 int32_t byteLength; | 473 int32_t byteLength; |
439 int32_t byteOffset; | 474 int32_t byteOffset; |
440 bool init_from_array = false; | 475 bool init_from_array = false; |
441 if (args.Length() == 0) { | 476 if (args.Length() == 0) { |
442 return ThrowException( | 477 return Throw("Array constructor must have at least one argument"); |
443 String::New("Array constructor must have at least one argument")); | |
444 } | 478 } |
445 if (args[0]->IsObject() && | 479 if (args[0]->IsObject() && |
446 !args[0]->ToObject()->GetHiddenValue( | 480 !args[0]->ToObject()->GetHiddenValue( |
447 String::New(kArrayBufferMarkerPropName)).IsEmpty()) { | 481 Symbols::ArrayBufferMarkerPropName).IsEmpty()) { |
448 // Construct from ArrayBuffer. | 482 // Construct from ArrayBuffer. |
449 buffer = args[0]->ToObject(); | 483 buffer = args[0]->ToObject(); |
450 int32_t bufferLength = | 484 int32_t bufferLength = |
451 convertToUint(buffer->Get(String::New("byteLength")), &try_catch); | 485 convertToUint(buffer->Get(Symbols::byteLength), &try_catch); |
452 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 486 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
453 | 487 |
454 if (args.Length() < 2 || args[1]->IsUndefined()) { | 488 if (args.Length() < 2 || args[1]->IsUndefined()) { |
455 byteOffset = 0; | 489 byteOffset = 0; |
456 } else { | 490 } else { |
457 byteOffset = convertToUint(args[1], &try_catch); | 491 byteOffset = convertToUint(args[1], &try_catch); |
458 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 492 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
459 if (byteOffset > bufferLength) { | 493 if (byteOffset > bufferLength) { |
460 return ThrowException(String::New("byteOffset out of bounds")); | 494 return Throw("byteOffset out of bounds"); |
461 } | 495 } |
462 if (byteOffset % element_size != 0) { | 496 if (byteOffset % element_size != 0) { |
463 return ThrowException( | 497 return Throw("byteOffset must be multiple of element size"); |
464 String::New("byteOffset must be multiple of element size")); | |
465 } | 498 } |
466 } | 499 } |
467 | 500 |
468 if (args.Length() < 3 || args[2]->IsUndefined()) { | 501 if (args.Length() < 3 || args[2]->IsUndefined()) { |
469 byteLength = bufferLength - byteOffset; | 502 byteLength = bufferLength - byteOffset; |
470 length = byteLength / element_size; | 503 length = byteLength / element_size; |
471 if (byteLength % element_size != 0) { | 504 if (byteLength % element_size != 0) { |
472 return ThrowException( | 505 return Throw("buffer size must be multiple of element size"); |
473 String::New("buffer size must be multiple of element size")); | |
474 } | 506 } |
475 } else { | 507 } else { |
476 length = convertToUint(args[2], &try_catch); | 508 length = convertToUint(args[2], &try_catch); |
477 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 509 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
478 byteLength = length * element_size; | 510 byteLength = length * element_size; |
479 if (byteOffset + byteLength > bufferLength) { | 511 if (byteOffset + byteLength > bufferLength) { |
480 return ThrowException(String::New("length out of bounds")); | 512 return Throw("length out of bounds"); |
481 } | 513 } |
482 } | 514 } |
483 } else { | 515 } else { |
484 if (args[0]->IsObject() && | 516 if (args[0]->IsObject() && |
485 args[0]->ToObject()->Has(String::New("length"))) { | 517 args[0]->ToObject()->Has(Symbols::length)) { |
486 // Construct from array. | 518 // Construct from array. |
487 length = convertToUint( | 519 length = convertToUint( |
488 args[0]->ToObject()->Get(String::New("length")), &try_catch); | 520 args[0]->ToObject()->Get(Symbols::length), &try_catch); |
489 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 521 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
490 init_from_array = true; | 522 init_from_array = true; |
491 } else { | 523 } else { |
492 // Construct from size. | 524 // Construct from size. |
493 length = convertToUint(args[0], &try_catch); | 525 length = convertToUint(args[0], &try_catch); |
494 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 526 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
495 } | 527 } |
496 byteLength = length * element_size; | 528 byteLength = length * element_size; |
497 byteOffset = 0; | 529 byteOffset = 0; |
498 | 530 |
499 Handle<Object> global = Context::GetCurrent()->Global(); | 531 Handle<Object> global = Context::GetCurrent()->Global(); |
500 Handle<Value> array_buffer = global->Get(String::New("ArrayBuffer")); | 532 Handle<Value> array_buffer = global->Get(Symbols::ArrayBuffer); |
501 ASSERT(!try_catch.HasCaught() && array_buffer->IsFunction()); | 533 ASSERT(!try_catch.HasCaught() && array_buffer->IsFunction()); |
502 Handle<Value> buffer_args[] = { Uint32::New(byteLength) }; | 534 Handle<Value> buffer_args[] = { Uint32::New(byteLength) }; |
503 Handle<Value> result = Handle<Function>::Cast(array_buffer)->NewInstance( | 535 Handle<Value> result = Handle<Function>::Cast(array_buffer)->NewInstance( |
504 1, buffer_args); | 536 1, buffer_args); |
505 if (try_catch.HasCaught()) return result; | 537 if (try_catch.HasCaught()) return result; |
506 buffer = result->ToObject(); | 538 buffer = result->ToObject(); |
507 } | 539 } |
508 | 540 |
509 Handle<Object> array = CreateExternalArray( | 541 Handle<Object> array = CreateExternalArray( |
510 args.This(), buffer, type, length, byteLength, byteOffset, element_size); | 542 args.This(), buffer, type, length, byteLength, byteOffset, element_size); |
511 | 543 |
512 if (init_from_array) { | 544 if (init_from_array) { |
513 Handle<Object> init = args[0]->ToObject(); | 545 Handle<Object> init = args[0]->ToObject(); |
514 for (int i = 0; i < length; ++i) array->Set(i, init->Get(i)); | 546 for (int i = 0; i < length; ++i) array->Set(i, init->Get(i)); |
515 } | 547 } |
516 | 548 |
517 return array; | 549 return array; |
518 } | 550 } |
519 | 551 |
520 | 552 |
521 Handle<Value> Shell::ArrayBufferSlice(const Arguments& args) { | 553 Handle<Value> Shell::ArrayBufferSlice(const Arguments& args) { |
522 TryCatch try_catch; | 554 TryCatch try_catch; |
523 | 555 |
524 if (!args.This()->IsObject()) { | 556 if (!args.This()->IsObject()) { |
525 return ThrowException( | 557 return Throw("'slice' invoked on non-object receiver"); |
526 String::New("'slice' invoked on non-object receiver")); | |
527 } | 558 } |
528 | 559 |
529 Local<Object> self = args.This(); | 560 Local<Object> self = args.This(); |
530 Local<Value> marker = | 561 Local<Value> marker = |
531 self->GetHiddenValue(String::New(kArrayBufferMarkerPropName)); | 562 self->GetHiddenValue(Symbols::ArrayBufferMarkerPropName); |
532 if (marker.IsEmpty()) { | 563 if (marker.IsEmpty()) { |
533 return ThrowException( | 564 return Throw("'slice' invoked on wrong receiver type"); |
534 String::New("'slice' invoked on wrong receiver type")); | |
535 } | 565 } |
536 | 566 |
537 int32_t length = | 567 int32_t length = |
538 convertToUint(self->Get(String::New("byteLength")), &try_catch); | 568 convertToUint(self->Get(Symbols::byteLength), &try_catch); |
539 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 569 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
540 | 570 |
541 if (args.Length() == 0) { | 571 if (args.Length() == 0) { |
542 return ThrowException( | 572 return Throw("'slice' must have at least one argument"); |
543 String::New("'slice' must have at least one argument")); | |
544 } | 573 } |
545 int32_t begin = convertToInt(args[0], &try_catch); | 574 int32_t begin = convertToInt(args[0], &try_catch); |
546 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 575 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
547 if (begin < 0) begin += length; | 576 if (begin < 0) begin += length; |
548 if (begin < 0) begin = 0; | 577 if (begin < 0) begin = 0; |
549 if (begin > length) begin = length; | 578 if (begin > length) begin = length; |
550 | 579 |
551 int32_t end; | 580 int32_t end; |
552 if (args.Length() < 2 || args[1]->IsUndefined()) { | 581 if (args.Length() < 2 || args[1]->IsUndefined()) { |
553 end = length; | 582 end = length; |
(...skipping 18 matching lines...) Expand all Loading... |
572 memcpy(dest, src, end - begin); | 601 memcpy(dest, src, end - begin); |
573 | 602 |
574 return buffer; | 603 return buffer; |
575 } | 604 } |
576 | 605 |
577 | 606 |
578 Handle<Value> Shell::ArraySubArray(const Arguments& args) { | 607 Handle<Value> Shell::ArraySubArray(const Arguments& args) { |
579 TryCatch try_catch; | 608 TryCatch try_catch; |
580 | 609 |
581 if (!args.This()->IsObject()) { | 610 if (!args.This()->IsObject()) { |
582 return ThrowException( | 611 return Throw("'subarray' invoked on non-object receiver"); |
583 String::New("'subarray' invoked on non-object receiver")); | |
584 } | 612 } |
585 | 613 |
586 Local<Object> self = args.This(); | 614 Local<Object> self = args.This(); |
587 Local<Value> marker = self->GetHiddenValue(String::New(kArrayMarkerPropName)); | 615 Local<Value> marker = self->GetHiddenValue(Symbols::ArrayMarkerPropName); |
588 if (marker.IsEmpty()) { | 616 if (marker.IsEmpty()) { |
589 return ThrowException( | 617 return Throw("'subarray' invoked on wrong receiver type"); |
590 String::New("'subarray' invoked on wrong receiver type")); | |
591 } | 618 } |
592 | 619 |
593 Handle<Object> buffer = self->Get(String::New("buffer"))->ToObject(); | 620 Handle<Object> buffer = self->Get(Symbols::buffer)->ToObject(); |
594 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 621 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
595 int32_t length = | 622 int32_t length = |
596 convertToUint(self->Get(String::New("length")), &try_catch); | 623 convertToUint(self->Get(Symbols::length), &try_catch); |
597 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 624 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
598 int32_t byteOffset = | 625 int32_t byteOffset = |
599 convertToUint(self->Get(String::New("byteOffset")), &try_catch); | 626 convertToUint(self->Get(Symbols::byteOffset), &try_catch); |
600 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 627 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
601 int32_t element_size = | 628 int32_t element_size = |
602 convertToUint(self->Get(String::New("BYTES_PER_ELEMENT")), &try_catch); | 629 convertToUint(self->Get(Symbols::BYTES_PER_ELEMENT), &try_catch); |
603 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 630 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
604 | 631 |
605 if (args.Length() == 0) { | 632 if (args.Length() == 0) { |
606 return ThrowException( | 633 return Throw("'subarray' must have at least one argument"); |
607 String::New("'subarray' must have at least one argument")); | |
608 } | 634 } |
609 int32_t begin = convertToInt(args[0], &try_catch); | 635 int32_t begin = convertToInt(args[0], &try_catch); |
610 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 636 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
611 if (begin < 0) begin += length; | 637 if (begin < 0) begin += length; |
612 if (begin < 0) begin = 0; | 638 if (begin < 0) begin = 0; |
613 if (begin > length) begin = length; | 639 if (begin > length) begin = length; |
614 | 640 |
615 int32_t end; | 641 int32_t end; |
616 if (args.Length() < 2 || args[1]->IsUndefined()) { | 642 if (args.Length() < 2 || args[1]->IsUndefined()) { |
617 end = length; | 643 end = length; |
(...skipping 14 matching lines...) Expand all Loading... |
632 buffer, Uint32::New(byteOffset), Uint32::New(length) | 658 buffer, Uint32::New(byteOffset), Uint32::New(length) |
633 }; | 659 }; |
634 return constructor->NewInstance(3, construct_args); | 660 return constructor->NewInstance(3, construct_args); |
635 } | 661 } |
636 | 662 |
637 | 663 |
638 Handle<Value> Shell::ArraySet(const Arguments& args) { | 664 Handle<Value> Shell::ArraySet(const Arguments& args) { |
639 TryCatch try_catch; | 665 TryCatch try_catch; |
640 | 666 |
641 if (!args.This()->IsObject()) { | 667 if (!args.This()->IsObject()) { |
642 return ThrowException( | 668 return Throw("'set' invoked on non-object receiver"); |
643 String::New("'set' invoked on non-object receiver")); | |
644 } | 669 } |
645 | 670 |
646 Local<Object> self = args.This(); | 671 Local<Object> self = args.This(); |
647 Local<Value> marker = self->GetHiddenValue(String::New(kArrayMarkerPropName)); | 672 Local<Value> marker = self->GetHiddenValue(Symbols::ArrayMarkerPropName); |
648 if (marker.IsEmpty()) { | 673 if (marker.IsEmpty()) { |
649 return ThrowException( | 674 return Throw("'set' invoked on wrong receiver type"); |
650 String::New("'set' invoked on wrong receiver type")); | |
651 } | 675 } |
652 int32_t length = | 676 int32_t length = |
653 convertToUint(self->Get(String::New("length")), &try_catch); | 677 convertToUint(self->Get(Symbols::length), &try_catch); |
654 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 678 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
655 int32_t element_size = | 679 int32_t element_size = |
656 convertToUint(self->Get(String::New("BYTES_PER_ELEMENT")), &try_catch); | 680 convertToUint(self->Get(Symbols::BYTES_PER_ELEMENT), &try_catch); |
657 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 681 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
658 | 682 |
659 if (args.Length() == 0) { | 683 if (args.Length() == 0) { |
660 return ThrowException( | 684 return Throw("'set' must have at least one argument"); |
661 String::New("'set' must have at least one argument")); | |
662 } | 685 } |
663 if (!args[0]->IsObject() || | 686 if (!args[0]->IsObject() || |
664 !args[0]->ToObject()->Has(String::New("length"))) { | 687 !args[0]->ToObject()->Has(Symbols::length)) { |
665 return ThrowException( | 688 return Throw("'set' invoked with non-array argument"); |
666 String::New("'set' invoked with non-array argument")); | |
667 } | 689 } |
668 Handle<Object> source = args[0]->ToObject(); | 690 Handle<Object> source = args[0]->ToObject(); |
669 int32_t source_length = | 691 int32_t source_length = |
670 convertToUint(source->Get(String::New("length")), &try_catch); | 692 convertToUint(source->Get(Symbols::length), &try_catch); |
671 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 693 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
672 | 694 |
673 int32_t offset; | 695 int32_t offset; |
674 if (args.Length() < 2 || args[1]->IsUndefined()) { | 696 if (args.Length() < 2 || args[1]->IsUndefined()) { |
675 offset = 0; | 697 offset = 0; |
676 } else { | 698 } else { |
677 offset = convertToUint(args[1], &try_catch); | 699 offset = convertToUint(args[1], &try_catch); |
678 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 700 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
679 } | 701 } |
680 if (offset + source_length > length) { | 702 if (offset + source_length > length) { |
681 return ThrowException(String::New("offset or source length out of bounds")); | 703 return Throw("offset or source length out of bounds"); |
682 } | 704 } |
683 | 705 |
684 int32_t source_element_size; | 706 int32_t source_element_size; |
685 if (source->GetHiddenValue(String::New(kArrayMarkerPropName)).IsEmpty()) { | 707 if (source->GetHiddenValue(Symbols::ArrayMarkerPropName).IsEmpty()) { |
686 source_element_size = 0; | 708 source_element_size = 0; |
687 } else { | 709 } else { |
688 source_element_size = | 710 source_element_size = |
689 convertToUint(source->Get(String::New("BYTES_PER_ELEMENT")), &try_catch); | 711 convertToUint(source->Get(Symbols::BYTES_PER_ELEMENT), &try_catch); |
690 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 712 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
691 } | 713 } |
692 | 714 |
693 if (element_size == source_element_size && | 715 if (element_size == source_element_size && |
694 self->GetConstructor()->StrictEquals(source->GetConstructor())) { | 716 self->GetConstructor()->StrictEquals(source->GetConstructor())) { |
695 // Use memmove on the array buffers. | 717 // Use memmove on the array buffers. |
696 Handle<Object> buffer = self->Get(String::New("buffer"))->ToObject(); | 718 Handle<Object> buffer = self->Get(Symbols::buffer)->ToObject(); |
697 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 719 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
698 Handle<Object> source_buffer = | 720 Handle<Object> source_buffer = |
699 source->Get(String::New("buffer"))->ToObject(); | 721 source->Get(Symbols::buffer)->ToObject(); |
700 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 722 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
701 int32_t byteOffset = | 723 int32_t byteOffset = |
702 convertToUint(self->Get(String::New("byteOffset")), &try_catch); | 724 convertToUint(self->Get(Symbols::byteOffset), &try_catch); |
703 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 725 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
704 int32_t source_byteOffset = | 726 int32_t source_byteOffset = |
705 convertToUint(source->Get(String::New("byteOffset")), &try_catch); | 727 convertToUint(source->Get(Symbols::byteOffset), &try_catch); |
706 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 728 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
707 | 729 |
708 uint8_t* dest = byteOffset + offset * element_size + static_cast<uint8_t*>( | 730 uint8_t* dest = byteOffset + offset * element_size + static_cast<uint8_t*>( |
709 buffer->GetIndexedPropertiesExternalArrayData()); | 731 buffer->GetIndexedPropertiesExternalArrayData()); |
710 uint8_t* src = source_byteOffset + static_cast<uint8_t*>( | 732 uint8_t* src = source_byteOffset + static_cast<uint8_t*>( |
711 source_buffer->GetIndexedPropertiesExternalArrayData()); | 733 source_buffer->GetIndexedPropertiesExternalArrayData()); |
712 memmove(dest, src, source_length * element_size); | 734 memmove(dest, src, source_length * element_size); |
713 } else if (source_element_size == 0) { | 735 } else if (source_element_size == 0) { |
714 // Source is not a typed array, copy element-wise sequentially. | 736 // Source is not a typed array, copy element-wise sequentially. |
715 for (int i = 0; i < source_length; ++i) { | 737 for (int i = 0; i < source_length; ++i) { |
716 self->Set(offset + i, source->Get(i)); | 738 self->Set(offset + i, source->Get(i)); |
717 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 739 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
718 } | 740 } |
719 } else { | 741 } else { |
720 // Need to copy element-wise to make the right conversions. | 742 // Need to copy element-wise to make the right conversions. |
721 Handle<Object> buffer = self->Get(String::New("buffer"))->ToObject(); | 743 Handle<Object> buffer = self->Get(Symbols::buffer)->ToObject(); |
722 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 744 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
723 Handle<Object> source_buffer = | 745 Handle<Object> source_buffer = |
724 source->Get(String::New("buffer"))->ToObject(); | 746 source->Get(Symbols::buffer)->ToObject(); |
725 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 747 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
726 | 748 |
727 if (buffer->StrictEquals(source_buffer)) { | 749 if (buffer->StrictEquals(source_buffer)) { |
728 // Same backing store, need to handle overlap correctly. | 750 // Same backing store, need to handle overlap correctly. |
729 // This gets a bit tricky in the case of different element sizes | 751 // This gets a bit tricky in the case of different element sizes |
730 // (which, of course, is extremely unlikely to ever occur in practice). | 752 // (which, of course, is extremely unlikely to ever occur in practice). |
731 int32_t byteOffset = | 753 int32_t byteOffset = |
732 convertToUint(self->Get(String::New("byteOffset")), &try_catch); | 754 convertToUint(self->Get(Symbols::byteOffset), &try_catch); |
733 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 755 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
734 int32_t source_byteOffset = | 756 int32_t source_byteOffset = |
735 convertToUint(source->Get(String::New("byteOffset")), &try_catch); | 757 convertToUint(source->Get(Symbols::byteOffset), &try_catch); |
736 if (try_catch.HasCaught()) return try_catch.ReThrow(); | 758 if (try_catch.HasCaught()) return try_catch.ReThrow(); |
737 | 759 |
738 // Copy as much as we can from left to right. | 760 // Copy as much as we can from left to right. |
739 int i = 0; | 761 int i = 0; |
740 int32_t next_dest_offset = byteOffset + (offset + 1) * element_size; | 762 int32_t next_dest_offset = byteOffset + (offset + 1) * element_size; |
741 int32_t next_src_offset = source_byteOffset + source_element_size; | 763 int32_t next_src_offset = source_byteOffset + source_element_size; |
742 while (i < length && next_dest_offset <= next_src_offset) { | 764 while (i < length && next_dest_offset <= next_src_offset) { |
743 self->Set(offset + i, source->Get(i)); | 765 self->Set(offset + i, source->Get(i)); |
744 ++i; | 766 ++i; |
745 next_dest_offset += element_size; | 767 next_dest_offset += element_size; |
(...skipping 26 matching lines...) Expand all Loading... |
772 } | 794 } |
773 } | 795 } |
774 | 796 |
775 return Undefined(); | 797 return Undefined(); |
776 } | 798 } |
777 | 799 |
778 | 800 |
779 void Shell::ExternalArrayWeakCallback(Persistent<Value> object, void* data) { | 801 void Shell::ExternalArrayWeakCallback(Persistent<Value> object, void* data) { |
780 HandleScope scope; | 802 HandleScope scope; |
781 int32_t length = | 803 int32_t length = |
782 object->ToObject()->Get(String::New("byteLength"))->Uint32Value(); | 804 object->ToObject()->Get(Symbols::byteLength)->Uint32Value(); |
783 V8::AdjustAmountOfExternalAllocatedMemory(-length); | 805 V8::AdjustAmountOfExternalAllocatedMemory(-length); |
784 delete[] static_cast<uint8_t*>(data); | 806 delete[] static_cast<uint8_t*>(data); |
785 object.Dispose(); | 807 object.Dispose(); |
786 } | 808 } |
787 | 809 |
788 | 810 |
789 Handle<Value> Shell::Int8Array(const Arguments& args) { | 811 Handle<Value> Shell::Int8Array(const Arguments& args) { |
790 return CreateExternalArray(args, v8::kExternalByteArray, sizeof(int8_t)); | 812 return CreateExternalArray(args, v8::kExternalByteArray, sizeof(int8_t)); |
791 } | 813 } |
792 | 814 |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1158 global_template->Set(String::New("quit"), FunctionTemplate::New(Quit)); | 1180 global_template->Set(String::New("quit"), FunctionTemplate::New(Quit)); |
1159 global_template->Set(String::New("version"), FunctionTemplate::New(Version)); | 1181 global_template->Set(String::New("version"), FunctionTemplate::New(Version)); |
1160 global_template->Set(String::New("enableProfiler"), | 1182 global_template->Set(String::New("enableProfiler"), |
1161 FunctionTemplate::New(EnableProfiler)); | 1183 FunctionTemplate::New(EnableProfiler)); |
1162 global_template->Set(String::New("disableProfiler"), | 1184 global_template->Set(String::New("disableProfiler"), |
1163 FunctionTemplate::New(DisableProfiler)); | 1185 FunctionTemplate::New(DisableProfiler)); |
1164 | 1186 |
1165 // Bind the handlers for external arrays. | 1187 // Bind the handlers for external arrays. |
1166 PropertyAttribute attr = | 1188 PropertyAttribute attr = |
1167 static_cast<PropertyAttribute>(ReadOnly | DontDelete); | 1189 static_cast<PropertyAttribute>(ReadOnly | DontDelete); |
1168 global_template->Set(String::New("ArrayBuffer"), | 1190 global_template->Set(Symbols::ArrayBuffer, |
1169 CreateArrayBufferTemplate(ArrayBuffer), attr); | 1191 CreateArrayBufferTemplate(ArrayBuffer), attr); |
1170 global_template->Set(String::New("Int8Array"), | 1192 global_template->Set(String::New("Int8Array"), |
1171 CreateArrayTemplate(Int8Array), attr); | 1193 CreateArrayTemplate(Int8Array), attr); |
1172 global_template->Set(String::New("Uint8Array"), | 1194 global_template->Set(String::New("Uint8Array"), |
1173 CreateArrayTemplate(Uint8Array), attr); | 1195 CreateArrayTemplate(Uint8Array), attr); |
1174 global_template->Set(String::New("Int16Array"), | 1196 global_template->Set(String::New("Int16Array"), |
1175 CreateArrayTemplate(Int16Array), attr); | 1197 CreateArrayTemplate(Int16Array), attr); |
1176 global_template->Set(String::New("Uint16Array"), | 1198 global_template->Set(String::New("Uint16Array"), |
1177 CreateArrayTemplate(Uint16Array), attr); | 1199 CreateArrayTemplate(Uint16Array), attr); |
1178 global_template->Set(String::New("Int32Array"), | 1200 global_template->Set(String::New("Int32Array"), |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 Shell::counter_map_ = new CounterMap(); | 1238 Shell::counter_map_ = new CounterMap(); |
1217 // Set up counters | 1239 // Set up counters |
1218 if (i::StrLength(i::FLAG_map_counters) != 0) | 1240 if (i::StrLength(i::FLAG_map_counters) != 0) |
1219 MapCounters(i::FLAG_map_counters); | 1241 MapCounters(i::FLAG_map_counters); |
1220 if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) { | 1242 if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) { |
1221 V8::SetCounterFunction(LookupCounter); | 1243 V8::SetCounterFunction(LookupCounter); |
1222 V8::SetCreateHistogramFunction(CreateHistogram); | 1244 V8::SetCreateHistogramFunction(CreateHistogram); |
1223 V8::SetAddHistogramSampleFunction(AddHistogramSample); | 1245 V8::SetAddHistogramSampleFunction(AddHistogramSample); |
1224 } | 1246 } |
1225 #endif // V8_SHARED | 1247 #endif // V8_SHARED |
| 1248 |
| 1249 Symbols::Initialize(); |
1226 if (options.test_shell) return; | 1250 if (options.test_shell) return; |
1227 | 1251 |
1228 #ifndef V8_SHARED | 1252 #ifndef V8_SHARED |
1229 Locker lock; | 1253 Locker lock; |
1230 HandleScope scope; | 1254 HandleScope scope; |
1231 Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); | 1255 Handle<ObjectTemplate> global_template = CreateGlobalTemplate(); |
1232 utility_context_ = Context::New(NULL, global_template); | 1256 utility_context_ = Context::New(NULL, global_template); |
1233 | 1257 |
1234 #ifdef ENABLE_DEBUGGER_SUPPORT | 1258 #ifdef ENABLE_DEBUGGER_SUPPORT |
1235 // Start the debugger agent if requested. | 1259 // Start the debugger agent if requested. |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 *size_out = size; | 1398 *size_out = size; |
1375 return chars; | 1399 return chars; |
1376 } | 1400 } |
1377 | 1401 |
1378 | 1402 |
1379 Handle<Value> Shell::ReadBuffer(const Arguments& args) { | 1403 Handle<Value> Shell::ReadBuffer(const Arguments& args) { |
1380 ASSERT(sizeof(char) == sizeof(uint8_t)); // NOLINT | 1404 ASSERT(sizeof(char) == sizeof(uint8_t)); // NOLINT |
1381 String::Utf8Value filename(args[0]); | 1405 String::Utf8Value filename(args[0]); |
1382 int length; | 1406 int length; |
1383 if (*filename == NULL) { | 1407 if (*filename == NULL) { |
1384 return ThrowException(String::New("Error loading file")); | 1408 return Throw("Error loading file"); |
1385 } | 1409 } |
1386 | 1410 |
1387 uint8_t* data = reinterpret_cast<uint8_t*>(ReadChars(*filename, &length)); | 1411 uint8_t* data = reinterpret_cast<uint8_t*>(ReadChars(*filename, &length)); |
1388 if (data == NULL) { | 1412 if (data == NULL) { |
1389 return ThrowException(String::New("Error reading file")); | 1413 return Throw("Error reading file"); |
1390 } | 1414 } |
1391 Handle<Object> buffer = Object::New(); | 1415 Handle<Object> buffer = Object::New(); |
1392 buffer->SetHiddenValue(String::New(kArrayBufferMarkerPropName), True()); | 1416 buffer->SetHiddenValue(Symbols::ArrayBufferMarkerPropName, True()); |
1393 Persistent<Object> persistent_buffer = Persistent<Object>::New(buffer); | 1417 Persistent<Object> persistent_buffer = Persistent<Object>::New(buffer); |
1394 persistent_buffer.MakeWeak(data, ExternalArrayWeakCallback); | 1418 persistent_buffer.MakeWeak(data, ExternalArrayWeakCallback); |
1395 persistent_buffer.MarkIndependent(); | 1419 persistent_buffer.MarkIndependent(); |
1396 V8::AdjustAmountOfExternalAllocatedMemory(length); | 1420 V8::AdjustAmountOfExternalAllocatedMemory(length); |
1397 | 1421 |
1398 buffer->SetIndexedPropertiesToExternalArrayData( | 1422 buffer->SetIndexedPropertiesToExternalArrayData( |
1399 data, kExternalUnsignedByteArray, length); | 1423 data, kExternalUnsignedByteArray, length); |
1400 buffer->Set(String::New("byteLength"), | 1424 buffer->Set(Symbols::byteLength, |
1401 Int32::New(static_cast<int32_t>(length)), ReadOnly); | 1425 Int32::New(static_cast<int32_t>(length)), ReadOnly); |
1402 return buffer; | 1426 return buffer; |
1403 } | 1427 } |
1404 | 1428 |
1405 | 1429 |
1406 #ifndef V8_SHARED | 1430 #ifndef V8_SHARED |
1407 static char* ReadToken(char* data, char token) { | 1431 static char* ReadToken(char* data, char token) { |
1408 char* next = i::OS::StrChr(data, token); | 1432 char* next = i::OS::StrChr(data, token); |
1409 if (next != NULL) { | 1433 if (next != NULL) { |
1410 *next = '\0'; | 1434 *next = '\0'; |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1888 || !options.script_executed ) | 1912 || !options.script_executed ) |
1889 && !options.test_shell ) { | 1913 && !options.test_shell ) { |
1890 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) | 1914 #if !defined(V8_SHARED) && defined(ENABLE_DEBUGGER_SUPPORT) |
1891 if (!i::FLAG_debugger) { | 1915 if (!i::FLAG_debugger) { |
1892 InstallUtilityScript(); | 1916 InstallUtilityScript(); |
1893 } | 1917 } |
1894 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT | 1918 #endif // !V8_SHARED && ENABLE_DEBUGGER_SUPPORT |
1895 RunShell(); | 1919 RunShell(); |
1896 } | 1920 } |
1897 | 1921 |
| 1922 Symbols::TearDown(); |
1898 V8::Dispose(); | 1923 V8::Dispose(); |
1899 | 1924 |
1900 #ifndef V8_SHARED | 1925 #ifndef V8_SHARED |
1901 OnExit(); | 1926 OnExit(); |
1902 #endif // V8_SHARED | 1927 #endif // V8_SHARED |
1903 | 1928 |
1904 return result; | 1929 return result; |
1905 } | 1930 } |
1906 | 1931 |
1907 } // namespace v8 | 1932 } // namespace v8 |
1908 | 1933 |
1909 | 1934 |
1910 #ifndef GOOGLE3 | 1935 #ifndef GOOGLE3 |
1911 int main(int argc, char* argv[]) { | 1936 int main(int argc, char* argv[]) { |
1912 return v8::Shell::Main(argc, argv); | 1937 return v8::Shell::Main(argc, argv); |
1913 } | 1938 } |
1914 #endif | 1939 #endif |
OLD | NEW |