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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 ExternalArrayType type, | 323 ExternalArrayType type, |
324 size_t element_size) { | 324 size_t element_size) { |
325 TryCatch try_catch; | 325 TryCatch try_catch; |
326 bool is_array_buffer_construct = element_size == 0; | 326 bool is_array_buffer_construct = element_size == 0; |
327 if (is_array_buffer_construct) { | 327 if (is_array_buffer_construct) { |
328 type = v8::kExternalByteArray; | 328 type = v8::kExternalByteArray; |
329 element_size = 1; | 329 element_size = 1; |
330 } | 330 } |
331 ASSERT(element_size == 1 || element_size == 2 || element_size == 4 || | 331 ASSERT(element_size == 1 || element_size == 2 || element_size == 4 || |
332 element_size == 8); | 332 element_size == 8); |
333 if (args.Length() == 0) { | 333 |
334 return ThrowException( | |
335 String::New("Array constructor must have at least one " | |
336 "parameter.")); | |
337 } | |
338 bool first_arg_is_array_buffer = | 334 bool first_arg_is_array_buffer = |
| 335 args.Length() > 0 && |
339 args[0]->IsObject() && | 336 args[0]->IsObject() && |
340 args[0]->ToObject()->Get( | 337 args[0]->ToObject()->Get( |
341 String::New(kArrayBufferMarkerPropName))->IsTrue(); | 338 String::New(kArrayBufferMarkerPropName))->IsTrue(); |
342 // Currently, only the following constructors are supported: | 339 // Currently, only the following constructors are supported: |
| 340 // TypedArray() |
343 // TypedArray(unsigned long length) | 341 // TypedArray(unsigned long length) |
344 // TypedArray(ArrayBuffer buffer, | 342 // TypedArray(ArrayBuffer buffer, |
345 // optional unsigned long byteOffset, | 343 // optional unsigned long byteOffset, |
346 // optional unsigned long length) | 344 // optional unsigned long length) |
347 if (args.Length() > 3) { | 345 if (args.Length() > 3) { |
348 return ThrowException( | 346 return ThrowException( |
349 String::New("Array constructor from ArrayBuffer must " | 347 String::New("Array constructor from ArrayBuffer must " |
350 "have 1-3 parameters.")); | 348 "have 0-3 parameters.")); |
351 } | 349 } |
352 | 350 |
353 Local<Value> length_value = (args.Length() < 3) | 351 size_t length; |
354 ? (first_arg_is_array_buffer | 352 if (args.Length() > 0) { |
355 ? args[0]->ToObject()->Get(String::New("length")) | 353 Local<Value> length_value = (args.Length() < 3) |
356 : args[0]) | 354 ? (first_arg_is_array_buffer |
357 : args[2]; | 355 ? args[0]->ToObject()->Get(String::New("length")) |
358 size_t length = convertToUint(length_value, &try_catch); | 356 : args[0]) |
359 if (try_catch.HasCaught()) return try_catch.Exception(); | 357 : args[2]; |
| 358 length = convertToUint(length_value, &try_catch); |
| 359 if (try_catch.HasCaught()) return try_catch.Exception(); |
| 360 } else { |
| 361 length = 0; |
| 362 } |
360 | 363 |
361 void* data = NULL; | 364 void* data = NULL; |
362 size_t offset = 0; | 365 size_t offset = 0; |
363 | 366 |
364 Handle<Object> array = Object::New(); | 367 Handle<Object> array = Object::New(); |
365 if (first_arg_is_array_buffer) { | 368 if (first_arg_is_array_buffer) { |
366 Handle<Object> derived_from = args[0]->ToObject(); | 369 Handle<Object> derived_from = args[0]->ToObject(); |
367 data = derived_from->GetIndexedPropertiesExternalArrayData(); | 370 data = derived_from->GetIndexedPropertiesExternalArrayData(); |
368 | 371 |
369 size_t array_buffer_length = convertToUint( | 372 size_t array_buffer_length = convertToUint( |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 array->Set(String::New(kArrayBufferReferencePropName), args[0], ReadOnly); | 424 array->Set(String::New(kArrayBufferReferencePropName), args[0], ReadOnly); |
422 } | 425 } |
423 | 426 |
424 if (is_array_buffer_construct) { | 427 if (is_array_buffer_construct) { |
425 array->Set(String::New(kArrayBufferMarkerPropName), True(), ReadOnly); | 428 array->Set(String::New(kArrayBufferMarkerPropName), True(), ReadOnly); |
426 } | 429 } |
427 | 430 |
428 Persistent<Object> persistent_array = Persistent<Object>::New(array); | 431 Persistent<Object> persistent_array = Persistent<Object>::New(array); |
429 persistent_array.MakeWeak(data, ExternalArrayWeakCallback); | 432 persistent_array.MakeWeak(data, ExternalArrayWeakCallback); |
430 persistent_array.MarkIndependent(); | 433 persistent_array.MarkIndependent(); |
431 if (data == NULL && length != 0) { | 434 if (data == NULL) { |
432 data = calloc(length, element_size); | 435 data = calloc(length, element_size); |
433 if (data == NULL) { | 436 if (data == NULL) { |
434 return ThrowException(String::New("Memory allocation failed.")); | 437 return ThrowException(String::New("Memory allocation failed.")); |
435 } | 438 } |
436 } | 439 } |
437 | 440 |
438 array->SetIndexedPropertiesToExternalArrayData( | 441 array->SetIndexedPropertiesToExternalArrayData( |
439 reinterpret_cast<uint8_t*>(data) + offset, type, | 442 reinterpret_cast<uint8_t*>(data) + offset, type, |
440 static_cast<int>(length)); | 443 static_cast<int>(length)); |
441 array->Set(String::New("length"), | 444 array->Set(String::New("length"), |
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1531 } | 1534 } |
1532 | 1535 |
1533 } // namespace v8 | 1536 } // namespace v8 |
1534 | 1537 |
1535 | 1538 |
1536 #ifndef GOOGLE3 | 1539 #ifndef GOOGLE3 |
1537 int main(int argc, char* argv[]) { | 1540 int main(int argc, char* argv[]) { |
1538 return v8::Shell::Main(argc, argv); | 1541 return v8::Shell::Main(argc, argv); |
1539 } | 1542 } |
1540 #endif | 1543 #endif |
OLD | NEW |