OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 #include "vm/bigint_operations.h" | 8 #include "vm/bigint_operations.h" |
9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 2344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2355 | 2355 |
2356 | 2356 |
2357 // --- Typed Data --- | 2357 // --- Typed Data --- |
2358 | 2358 |
2359 | 2359 |
2360 // Helper method to get the type of a TypedData object. | 2360 // Helper method to get the type of a TypedData object. |
2361 static Dart_TypedData_Type GetType(intptr_t class_id) { | 2361 static Dart_TypedData_Type GetType(intptr_t class_id) { |
2362 Dart_TypedData_Type type; | 2362 Dart_TypedData_Type type; |
2363 switch (class_id) { | 2363 switch (class_id) { |
2364 case kByteDataViewCid : | 2364 case kByteDataViewCid : |
2365 type = kByteData; | 2365 type = Dart_TypedData_kByteData; |
2366 break; | 2366 break; |
2367 case kTypedDataInt8ArrayCid : | 2367 case kTypedDataInt8ArrayCid : |
2368 case kTypedDataInt8ArrayViewCid : | 2368 case kTypedDataInt8ArrayViewCid : |
2369 case kExternalTypedDataInt8ArrayCid : | 2369 case kExternalTypedDataInt8ArrayCid : |
2370 type = kInt8; | 2370 type = Dart_TypedData_kInt8; |
2371 break; | 2371 break; |
2372 case kTypedDataUint8ArrayCid : | 2372 case kTypedDataUint8ArrayCid : |
2373 case kTypedDataUint8ArrayViewCid : | 2373 case kTypedDataUint8ArrayViewCid : |
2374 case kExternalTypedDataUint8ArrayCid : | 2374 case kExternalTypedDataUint8ArrayCid : |
2375 type = kUint8; | 2375 type = Dart_TypedData_kUint8; |
2376 break; | 2376 break; |
2377 case kTypedDataUint8ClampedArrayCid : | 2377 case kTypedDataUint8ClampedArrayCid : |
2378 case kTypedDataUint8ClampedArrayViewCid : | 2378 case kTypedDataUint8ClampedArrayViewCid : |
2379 case kExternalTypedDataUint8ClampedArrayCid : | 2379 case kExternalTypedDataUint8ClampedArrayCid : |
2380 type = kUint8Clamped; | 2380 type = Dart_TypedData_kUint8Clamped; |
2381 break; | 2381 break; |
2382 case kTypedDataInt16ArrayCid : | 2382 case kTypedDataInt16ArrayCid : |
2383 case kTypedDataInt16ArrayViewCid : | 2383 case kTypedDataInt16ArrayViewCid : |
2384 case kExternalTypedDataInt16ArrayCid : | 2384 case kExternalTypedDataInt16ArrayCid : |
2385 type = kInt16; | 2385 type = Dart_TypedData_kInt16; |
2386 break; | 2386 break; |
2387 case kTypedDataUint16ArrayCid : | 2387 case kTypedDataUint16ArrayCid : |
2388 case kTypedDataUint16ArrayViewCid : | 2388 case kTypedDataUint16ArrayViewCid : |
2389 case kExternalTypedDataUint16ArrayCid : | 2389 case kExternalTypedDataUint16ArrayCid : |
2390 type = kUint16; | 2390 type = Dart_TypedData_kUint16; |
2391 break; | 2391 break; |
2392 case kTypedDataInt32ArrayCid : | 2392 case kTypedDataInt32ArrayCid : |
2393 case kTypedDataInt32ArrayViewCid : | 2393 case kTypedDataInt32ArrayViewCid : |
2394 case kExternalTypedDataInt32ArrayCid : | 2394 case kExternalTypedDataInt32ArrayCid : |
2395 type = kInt32; | 2395 type = Dart_TypedData_kInt32; |
2396 break; | 2396 break; |
2397 case kTypedDataUint32ArrayCid : | 2397 case kTypedDataUint32ArrayCid : |
2398 case kTypedDataUint32ArrayViewCid : | 2398 case kTypedDataUint32ArrayViewCid : |
2399 case kExternalTypedDataUint32ArrayCid : | 2399 case kExternalTypedDataUint32ArrayCid : |
2400 type = kUint32; | 2400 type = Dart_TypedData_kUint32; |
2401 break; | 2401 break; |
2402 case kTypedDataInt64ArrayCid : | 2402 case kTypedDataInt64ArrayCid : |
2403 case kTypedDataInt64ArrayViewCid : | 2403 case kTypedDataInt64ArrayViewCid : |
2404 case kExternalTypedDataInt64ArrayCid : | 2404 case kExternalTypedDataInt64ArrayCid : |
2405 type = kInt64; | 2405 type = Dart_TypedData_kInt64; |
2406 break; | 2406 break; |
2407 case kTypedDataUint64ArrayCid : | 2407 case kTypedDataUint64ArrayCid : |
2408 case kTypedDataUint64ArrayViewCid : | 2408 case kTypedDataUint64ArrayViewCid : |
2409 case kExternalTypedDataUint64ArrayCid : | 2409 case kExternalTypedDataUint64ArrayCid : |
2410 type = kUint64; | 2410 type = Dart_TypedData_kUint64; |
2411 break; | 2411 break; |
2412 case kTypedDataFloat32ArrayCid : | 2412 case kTypedDataFloat32ArrayCid : |
2413 case kTypedDataFloat32ArrayViewCid : | 2413 case kTypedDataFloat32ArrayViewCid : |
2414 case kExternalTypedDataFloat32ArrayCid : | 2414 case kExternalTypedDataFloat32ArrayCid : |
2415 type = kFloat32; | 2415 type = Dart_TypedData_kFloat32; |
2416 break; | 2416 break; |
2417 case kTypedDataFloat64ArrayCid : | 2417 case kTypedDataFloat64ArrayCid : |
2418 case kTypedDataFloat64ArrayViewCid : | 2418 case kTypedDataFloat64ArrayViewCid : |
2419 case kExternalTypedDataFloat64ArrayCid : | 2419 case kExternalTypedDataFloat64ArrayCid : |
2420 type = kFloat64; | 2420 type = Dart_TypedData_kFloat64; |
2421 break; | 2421 break; |
2422 case kTypedDataFloat32x4ArrayCid : | 2422 case kTypedDataFloat32x4ArrayCid : |
2423 case kTypedDataFloat32x4ArrayViewCid : | 2423 case kTypedDataFloat32x4ArrayViewCid : |
2424 case kExternalTypedDataFloat32x4ArrayCid : | 2424 case kExternalTypedDataFloat32x4ArrayCid : |
2425 type = kFloat32x4; | 2425 type = Dart_TypedData_kFloat32x4; |
2426 break; | 2426 break; |
2427 default: | 2427 default: |
2428 type = kInvalid; | 2428 type = Dart_TypedData_kInvalid; |
2429 break; | 2429 break; |
2430 } | 2430 } |
2431 return type; | 2431 return type; |
2432 } | 2432 } |
2433 | 2433 |
2434 | 2434 |
2435 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) { | 2435 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) { |
2436 intptr_t class_id = Api::ClassId(object); | 2436 intptr_t class_id = Api::ClassId(object); |
2437 if (RawObject::IsTypedDataClassId(class_id) || | 2437 if (RawObject::IsTypedDataClassId(class_id) || |
2438 RawObject::IsTypedDataViewClassId(class_id)) { | 2438 RawObject::IsTypedDataViewClassId(class_id)) { |
2439 return GetType(class_id); | 2439 return GetType(class_id); |
2440 } | 2440 } |
2441 return kInvalid; | 2441 return Dart_TypedData_kInvalid; |
2442 } | 2442 } |
2443 | 2443 |
2444 | 2444 |
2445 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( | 2445 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( |
2446 Dart_Handle object) { | 2446 Dart_Handle object) { |
2447 intptr_t class_id = Api::ClassId(object); | 2447 intptr_t class_id = Api::ClassId(object); |
2448 if (RawObject::IsExternalTypedDataClassId(class_id) || | 2448 if (RawObject::IsExternalTypedDataClassId(class_id) || |
2449 RawObject::IsTypedDataViewClassId(class_id)) { | 2449 RawObject::IsTypedDataViewClassId(class_id)) { |
2450 return GetType(class_id); | 2450 return GetType(class_id); |
2451 } | 2451 } |
2452 return kInvalid; | 2452 return Dart_TypedData_kInvalid; |
2453 } | 2453 } |
2454 | 2454 |
2455 | 2455 |
2456 static RawObject* GetByteDataConstructor(Isolate* isolate, | 2456 static RawObject* GetByteDataConstructor(Isolate* isolate, |
2457 const String& constructor_name, | 2457 const String& constructor_name, |
2458 intptr_t num_args) { | 2458 intptr_t num_args) { |
2459 const Library& lib = | 2459 const Library& lib = |
2460 Library::Handle(isolate->object_store()->typed_data_library()); | 2460 Library::Handle(isolate->object_store()->typed_data_library()); |
2461 ASSERT(!lib.IsNull()); | 2461 ASSERT(!lib.IsNull()); |
2462 const Class& cls = | 2462 const Class& cls = |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2544 return Api::NewHandle(isolate, result.raw()); | 2544 return Api::NewHandle(isolate, result.raw()); |
2545 } | 2545 } |
2546 | 2546 |
2547 | 2547 |
2548 DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, | 2548 DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, |
2549 intptr_t length) { | 2549 intptr_t length) { |
2550 Isolate* isolate = Isolate::Current(); | 2550 Isolate* isolate = Isolate::Current(); |
2551 DARTSCOPE(isolate); | 2551 DARTSCOPE(isolate); |
2552 CHECK_CALLBACK_STATE(isolate); | 2552 CHECK_CALLBACK_STATE(isolate); |
2553 switch (type) { | 2553 switch (type) { |
2554 case kByteData : | 2554 case Dart_TypedData_kByteData : |
2555 return NewByteData(isolate, length); | 2555 return NewByteData(isolate, length); |
2556 case kInt8 : | 2556 case Dart_TypedData_kInt8 : |
2557 return NewTypedData(isolate, kTypedDataInt8ArrayCid, length); | 2557 return NewTypedData(isolate, kTypedDataInt8ArrayCid, length); |
2558 case kUint8 : | 2558 case Dart_TypedData_kUint8 : |
2559 return NewTypedData(isolate, kTypedDataUint8ArrayCid, length); | 2559 return NewTypedData(isolate, kTypedDataUint8ArrayCid, length); |
2560 case kUint8Clamped : | 2560 case Dart_TypedData_kUint8Clamped : |
2561 return NewTypedData(isolate, kTypedDataUint8ClampedArrayCid, length); | 2561 return NewTypedData(isolate, kTypedDataUint8ClampedArrayCid, length); |
2562 case kInt16 : | 2562 case Dart_TypedData_kInt16 : |
2563 return NewTypedData(isolate, kTypedDataInt16ArrayCid, length); | 2563 return NewTypedData(isolate, kTypedDataInt16ArrayCid, length); |
2564 case kUint16 : | 2564 case Dart_TypedData_kUint16 : |
2565 return NewTypedData(isolate, kTypedDataUint16ArrayCid, length); | 2565 return NewTypedData(isolate, kTypedDataUint16ArrayCid, length); |
2566 case kInt32 : | 2566 case Dart_TypedData_kInt32 : |
2567 return NewTypedData(isolate, kTypedDataInt32ArrayCid, length); | 2567 return NewTypedData(isolate, kTypedDataInt32ArrayCid, length); |
2568 case kUint32 : | 2568 case Dart_TypedData_kUint32 : |
2569 return NewTypedData(isolate, kTypedDataUint32ArrayCid, length); | 2569 return NewTypedData(isolate, kTypedDataUint32ArrayCid, length); |
2570 case kInt64 : | 2570 case Dart_TypedData_kInt64 : |
2571 return NewTypedData(isolate, kTypedDataInt64ArrayCid, length); | 2571 return NewTypedData(isolate, kTypedDataInt64ArrayCid, length); |
2572 case kUint64 : | 2572 case Dart_TypedData_kUint64 : |
2573 return NewTypedData(isolate, kTypedDataUint64ArrayCid, length); | 2573 return NewTypedData(isolate, kTypedDataUint64ArrayCid, length); |
2574 case kFloat32 : | 2574 case Dart_TypedData_kFloat32 : |
2575 return NewTypedData(isolate, kTypedDataFloat32ArrayCid, length); | 2575 return NewTypedData(isolate, kTypedDataFloat32ArrayCid, length); |
2576 case kFloat64 : | 2576 case Dart_TypedData_kFloat64 : |
2577 return NewTypedData(isolate, kTypedDataFloat64ArrayCid, length); | 2577 return NewTypedData(isolate, kTypedDataFloat64ArrayCid, length); |
2578 case kFloat32x4: | 2578 case Dart_TypedData_kFloat32x4: |
2579 return NewTypedData(isolate, kTypedDataFloat32x4ArrayCid, length); | 2579 return NewTypedData(isolate, kTypedDataFloat32x4ArrayCid, length); |
2580 default: | 2580 default: |
2581 return Api::NewError("%s expects argument 'type' to be of 'TypedData'", | 2581 return Api::NewError("%s expects argument 'type' to be of 'TypedData'", |
2582 CURRENT_FUNC); | 2582 CURRENT_FUNC); |
2583 } | 2583 } |
2584 UNREACHABLE(); | 2584 UNREACHABLE(); |
2585 return Api::Null(); | 2585 return Api::Null(); |
2586 } | 2586 } |
2587 | 2587 |
2588 | 2588 |
2589 DART_EXPORT Dart_Handle Dart_NewExternalTypedData( | 2589 DART_EXPORT Dart_Handle Dart_NewExternalTypedData( |
2590 Dart_TypedData_Type type, | 2590 Dart_TypedData_Type type, |
2591 void* data, | 2591 void* data, |
2592 intptr_t length) { | 2592 intptr_t length) { |
2593 Isolate* isolate = Isolate::Current(); | 2593 Isolate* isolate = Isolate::Current(); |
2594 DARTSCOPE(isolate); | 2594 DARTSCOPE(isolate); |
2595 if (data == NULL && length != 0) { | 2595 if (data == NULL && length != 0) { |
2596 RETURN_NULL_ERROR(data); | 2596 RETURN_NULL_ERROR(data); |
2597 } | 2597 } |
2598 CHECK_CALLBACK_STATE(isolate); | 2598 CHECK_CALLBACK_STATE(isolate); |
2599 switch (type) { | 2599 switch (type) { |
2600 case kByteData: | 2600 case Dart_TypedData_kByteData: |
2601 return NewExternalByteData(isolate, data, length); | 2601 return NewExternalByteData(isolate, data, length); |
2602 case kInt8: | 2602 case Dart_TypedData_kInt8: |
2603 return NewExternalTypedData(isolate, | 2603 return NewExternalTypedData(isolate, |
2604 kExternalTypedDataInt8ArrayCid, | 2604 kExternalTypedDataInt8ArrayCid, |
2605 data, | 2605 data, |
2606 length); | 2606 length); |
2607 case kUint8: | 2607 case Dart_TypedData_kUint8: |
2608 return NewExternalTypedData(isolate, | 2608 return NewExternalTypedData(isolate, |
2609 kExternalTypedDataUint8ArrayCid, | 2609 kExternalTypedDataUint8ArrayCid, |
2610 data, | 2610 data, |
2611 length); | 2611 length); |
2612 case kUint8Clamped: | 2612 case Dart_TypedData_kUint8Clamped: |
2613 return NewExternalTypedData(isolate, | 2613 return NewExternalTypedData(isolate, |
2614 kExternalTypedDataUint8ClampedArrayCid, | 2614 kExternalTypedDataUint8ClampedArrayCid, |
2615 data, | 2615 data, |
2616 length); | 2616 length); |
2617 case kInt16: | 2617 case Dart_TypedData_kInt16: |
2618 return NewExternalTypedData(isolate, | 2618 return NewExternalTypedData(isolate, |
2619 kExternalTypedDataInt16ArrayCid, | 2619 kExternalTypedDataInt16ArrayCid, |
2620 data, | 2620 data, |
2621 length); | 2621 length); |
2622 case kUint16: | 2622 case Dart_TypedData_kUint16: |
2623 return NewExternalTypedData(isolate, | 2623 return NewExternalTypedData(isolate, |
2624 kExternalTypedDataUint16ArrayCid, | 2624 kExternalTypedDataUint16ArrayCid, |
2625 data, | 2625 data, |
2626 length); | 2626 length); |
2627 case kInt32: | 2627 case Dart_TypedData_kInt32: |
2628 return NewExternalTypedData(isolate, | 2628 return NewExternalTypedData(isolate, |
2629 kExternalTypedDataInt32ArrayCid, | 2629 kExternalTypedDataInt32ArrayCid, |
2630 data, | 2630 data, |
2631 length); | 2631 length); |
2632 case kUint32: | 2632 case Dart_TypedData_kUint32: |
2633 return NewExternalTypedData(isolate, | 2633 return NewExternalTypedData(isolate, |
2634 kExternalTypedDataUint32ArrayCid, | 2634 kExternalTypedDataUint32ArrayCid, |
2635 data, | 2635 data, |
2636 length); | 2636 length); |
2637 case kInt64: | 2637 case Dart_TypedData_kInt64: |
2638 return NewExternalTypedData(isolate, | 2638 return NewExternalTypedData(isolate, |
2639 kExternalTypedDataInt64ArrayCid, | 2639 kExternalTypedDataInt64ArrayCid, |
2640 data, | 2640 data, |
2641 length); | 2641 length); |
2642 case kUint64: | 2642 case Dart_TypedData_kUint64: |
2643 return NewExternalTypedData(isolate, | 2643 return NewExternalTypedData(isolate, |
2644 kExternalTypedDataUint64ArrayCid, | 2644 kExternalTypedDataUint64ArrayCid, |
2645 data, | 2645 data, |
2646 length); | 2646 length); |
2647 case kFloat32: | 2647 case Dart_TypedData_kFloat32: |
2648 return NewExternalTypedData(isolate, | 2648 return NewExternalTypedData(isolate, |
2649 kExternalTypedDataFloat32ArrayCid, | 2649 kExternalTypedDataFloat32ArrayCid, |
2650 data, | 2650 data, |
2651 length); | 2651 length); |
2652 case kFloat64: | 2652 case Dart_TypedData_kFloat64: |
2653 return NewExternalTypedData(isolate, | 2653 return NewExternalTypedData(isolate, |
2654 kExternalTypedDataFloat64ArrayCid, | 2654 kExternalTypedDataFloat64ArrayCid, |
2655 data, | 2655 data, |
2656 length); | 2656 length); |
2657 case kFloat32x4: | 2657 case Dart_TypedData_kFloat32x4: |
2658 return NewExternalTypedData(isolate, | 2658 return NewExternalTypedData(isolate, |
2659 kExternalTypedDataFloat32x4ArrayCid, | 2659 kExternalTypedDataFloat32x4ArrayCid, |
2660 data, | 2660 data, |
2661 length); | 2661 length); |
2662 default: | 2662 default: |
2663 return Api::NewError("%s expects argument 'type' to be of" | 2663 return Api::NewError("%s expects argument 'type' to be of" |
2664 " 'external TypedData'", CURRENT_FUNC); | 2664 " 'external TypedData'", CURRENT_FUNC); |
2665 } | 2665 } |
2666 UNREACHABLE(); | 2666 UNREACHABLE(); |
2667 return Api::Null(); | 2667 return Api::Null(); |
(...skipping 2169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4837 } | 4837 } |
4838 { | 4838 { |
4839 NoGCScope no_gc; | 4839 NoGCScope no_gc; |
4840 RawObject* raw_obj = obj.raw(); | 4840 RawObject* raw_obj = obj.raw(); |
4841 isolate->heap()->SetPeer(raw_obj, peer); | 4841 isolate->heap()->SetPeer(raw_obj, peer); |
4842 } | 4842 } |
4843 return Api::Success(); | 4843 return Api::Success(); |
4844 } | 4844 } |
4845 | 4845 |
4846 } // namespace dart | 4846 } // namespace dart |
OLD | NEW |