Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 12937010: Handle TypedDataView objects in Dart_TypedDataAcquireData and (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 2315 matching lines...) Expand 10 before | Expand all | Expand 10 after
2326 2326
2327 2327
2328 // Helper method to get the type of a TypedData object. 2328 // Helper method to get the type of a TypedData object.
2329 static Dart_TypedData_Type GetType(intptr_t class_id) { 2329 static Dart_TypedData_Type GetType(intptr_t class_id) {
2330 Dart_TypedData_Type type; 2330 Dart_TypedData_Type type;
2331 switch (class_id) { 2331 switch (class_id) {
2332 case kByteArrayCid : 2332 case kByteArrayCid :
2333 type = kByteData; 2333 type = kByteData;
2334 break; 2334 break;
2335 case kTypedDataInt8ArrayCid : 2335 case kTypedDataInt8ArrayCid :
2336 case kTypedDataInt8ArrayViewCid :
2336 case kExternalTypedDataInt8ArrayCid : 2337 case kExternalTypedDataInt8ArrayCid :
2337 type = kInt8; 2338 type = kInt8;
2338 break; 2339 break;
2339 case kTypedDataUint8ArrayCid : 2340 case kTypedDataUint8ArrayCid :
2341 case kTypedDataUint8ArrayViewCid :
2340 case kExternalTypedDataUint8ArrayCid : 2342 case kExternalTypedDataUint8ArrayCid :
2341 type = kUint8; 2343 type = kUint8;
2342 break; 2344 break;
2343 case kTypedDataUint8ClampedArrayCid : 2345 case kTypedDataUint8ClampedArrayCid :
2346 case kTypedDataUint8ClampedArrayViewCid :
2344 case kExternalTypedDataUint8ClampedArrayCid : 2347 case kExternalTypedDataUint8ClampedArrayCid :
2345 type = kUint8Clamped; 2348 type = kUint8Clamped;
2346 break; 2349 break;
2347 case kTypedDataInt16ArrayCid : 2350 case kTypedDataInt16ArrayCid :
2351 case kTypedDataInt16ArrayViewCid :
2348 case kExternalTypedDataInt16ArrayCid : 2352 case kExternalTypedDataInt16ArrayCid :
2349 type = kInt16; 2353 type = kInt16;
2350 break; 2354 break;
2351 case kTypedDataUint16ArrayCid : 2355 case kTypedDataUint16ArrayCid :
2356 case kTypedDataUint16ArrayViewCid :
2352 case kExternalTypedDataUint16ArrayCid : 2357 case kExternalTypedDataUint16ArrayCid :
2353 type = kUint16; 2358 type = kUint16;
2354 break; 2359 break;
2355 case kTypedDataInt32ArrayCid : 2360 case kTypedDataInt32ArrayCid :
2361 case kTypedDataInt32ArrayViewCid :
2356 case kExternalTypedDataInt32ArrayCid : 2362 case kExternalTypedDataInt32ArrayCid :
2357 type = kInt32; 2363 type = kInt32;
2358 break; 2364 break;
2359 case kTypedDataUint32ArrayCid : 2365 case kTypedDataUint32ArrayCid :
2366 case kTypedDataUint32ArrayViewCid :
2360 case kExternalTypedDataUint32ArrayCid : 2367 case kExternalTypedDataUint32ArrayCid :
2361 type = kUint32; 2368 type = kUint32;
2362 break; 2369 break;
2363 case kTypedDataInt64ArrayCid : 2370 case kTypedDataInt64ArrayCid :
2371 case kTypedDataInt64ArrayViewCid :
2364 case kExternalTypedDataInt64ArrayCid : 2372 case kExternalTypedDataInt64ArrayCid :
2365 type = kInt64; 2373 type = kInt64;
2366 break; 2374 break;
2367 case kTypedDataUint64ArrayCid : 2375 case kTypedDataUint64ArrayCid :
2376 case kTypedDataUint64ArrayViewCid :
2368 case kExternalTypedDataUint64ArrayCid : 2377 case kExternalTypedDataUint64ArrayCid :
2369 type = kUint64; 2378 type = kUint64;
2370 break; 2379 break;
2371 case kTypedDataFloat32ArrayCid : 2380 case kTypedDataFloat32ArrayCid :
2381 case kTypedDataFloat32ArrayViewCid :
2372 case kExternalTypedDataFloat32ArrayCid : 2382 case kExternalTypedDataFloat32ArrayCid :
2373 type = kFloat32; 2383 type = kFloat32;
2374 break; 2384 break;
2375 case kTypedDataFloat64ArrayCid : 2385 case kTypedDataFloat64ArrayCid :
2386 case kTypedDataFloat64ArrayViewCid :
2376 case kExternalTypedDataFloat64ArrayCid : 2387 case kExternalTypedDataFloat64ArrayCid :
2377 type = kFloat64; 2388 type = kFloat64;
2378 break; 2389 break;
2379 default: 2390 default:
2380 type = kInvalid; 2391 type = kInvalid;
2381 break; 2392 break;
2382 } 2393 }
2383 return type; 2394 return type;
2384 } 2395 }
2385 2396
2386 2397
2387 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) { 2398 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) {
2388 intptr_t class_id = Api::ClassId(object); 2399 intptr_t class_id = Api::ClassId(object);
2389 if (!RawObject::IsTypedDataClassId(class_id)) { 2400 if (!RawObject::IsTypedDataClassId(class_id) &&
2401 !RawObject::IsTypedDataViewClassId(class_id)) {
2390 return kInvalid; 2402 return kInvalid;
2391 } 2403 }
2392 return GetType(class_id); 2404 return GetType(class_id);
2393 } 2405 }
2394 2406
2395 2407
2396 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( 2408 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData(
2397 Dart_Handle object) { 2409 Dart_Handle object) {
2398 intptr_t class_id = Api::ClassId(object); 2410 intptr_t class_id = Api::ClassId(object);
2399 if (!RawObject::IsExternalTypedDataClassId(class_id)) { 2411 if (!RawObject::IsExternalTypedDataClassId(class_id)) {
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2575 2587
2576 2588
2577 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, 2589 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object,
2578 Dart_TypedData_Type* type, 2590 Dart_TypedData_Type* type,
2579 void** data, 2591 void** data,
2580 intptr_t* len) { 2592 intptr_t* len) {
2581 Isolate* isolate = Isolate::Current(); 2593 Isolate* isolate = Isolate::Current();
2582 DARTSCOPE(isolate); 2594 DARTSCOPE(isolate);
2583 intptr_t class_id = Api::ClassId(object); 2595 intptr_t class_id = Api::ClassId(object);
2584 if (!RawObject::IsExternalTypedDataClassId(class_id) && 2596 if (!RawObject::IsExternalTypedDataClassId(class_id) &&
2597 !RawObject::IsTypedDataViewClassId(class_id) &&
2585 !RawObject::IsTypedDataClassId(class_id)) { 2598 !RawObject::IsTypedDataClassId(class_id)) {
2586 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); 2599 RETURN_TYPE_ERROR(isolate, object, 'TypedData');
2587 } 2600 }
2588 if (type == NULL) { 2601 if (type == NULL) {
2589 RETURN_NULL_ERROR(type); 2602 RETURN_NULL_ERROR(type);
2590 } 2603 }
2591 if (data == NULL) { 2604 if (data == NULL) {
2592 RETURN_NULL_ERROR(data); 2605 RETURN_NULL_ERROR(data);
2593 } 2606 }
2594 if (len == NULL) { 2607 if (len == NULL) {
2595 RETURN_NULL_ERROR(len); 2608 RETURN_NULL_ERROR(len);
2596 } 2609 }
2597 // Get the type of typed data object. 2610 // Get the type of typed data object.
2598 *type = GetType(class_id); 2611 *type = GetType(class_id);
2599 // If it is an external typed data object just return the data field. 2612 // If it is an external typed data object just return the data field.
2600 if (RawObject::IsExternalTypedDataClassId(class_id)) { 2613 if (RawObject::IsExternalTypedDataClassId(class_id)) {
2601 const ExternalTypedData& obj = 2614 const ExternalTypedData& obj =
2602 Api::UnwrapExternalTypedDataHandle(isolate, object); 2615 Api::UnwrapExternalTypedDataHandle(isolate, object);
2603 ASSERT(!obj.IsNull()); 2616 ASSERT(!obj.IsNull());
2604 *len = obj.Length(); 2617 *len = obj.Length();
2605 *data = reinterpret_cast<void*>(obj.DataAddr(0)); 2618 *data = obj.DataAddr(0);
2606 } else { 2619 } else if (RawObject::IsTypedDataClassId(class_id)) {
2607 // Regular typed data object, set up some GC and API callback guards. 2620 // Regular typed data object, set up some GC and API callback guards.
2608 const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, object); 2621 const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, object);
2609 ASSERT(!obj.IsNull()); 2622 ASSERT(!obj.IsNull());
2610 *len = obj.Length(); 2623 *len = obj.Length();
2611 isolate->IncrementNoGCScopeDepth(); 2624 isolate->IncrementNoGCScopeDepth();
2612 START_NO_CALLBACK_SCOPE(isolate); 2625 START_NO_CALLBACK_SCOPE(isolate);
2613 *data = reinterpret_cast<void*>(obj.DataAddr(0)); 2626 *data = obj.DataAddr(0);
2627 } else {
2628 // typed data view object, set up some GC and API callback guards.
2629 // TODO(asiva): Have to come up with a scheme to directly access
2630 // the fields using offsets for a more efficient implementation.
Ivan Posva 2013/03/22 04:50:01 How about making class _TypedListView known to the
siva 2013/03/25 17:20:35 I thought about this but for now choose against ad
2631 Dart_Handle field_name = Dart_NewStringFromCString("length");
2632 Dart_Handle field_value = Dart_GetField(object, field_name);
2633 ASSERT(Api::IsSmi(field_value));
2634 *len = Api::SmiValue(field_value);
2635 field_name = Dart_NewStringFromCString("offsetInBytes");
2636 field_value = Dart_GetField(object, field_name);
2637 ASSERT(Api::IsSmi(field_value));
2638 intptr_t offset_in_bytes = Api::SmiValue(field_value);
2639 field_name = Dart_NewStringFromCString("_typeddata");
2640 field_value = Dart_GetField(object, field_name);
2641 const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, field_value);
2642 isolate->IncrementNoGCScopeDepth();
2643 START_NO_CALLBACK_SCOPE(isolate);
2644 *data = obj.DataAddr(offset_in_bytes);
2614 } 2645 }
2615 return Api::Success(isolate); 2646 return Api::Success(isolate);
2616 } 2647 }
2617 2648
2618 2649
2619 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) { 2650 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) {
2620 Isolate* isolate = Isolate::Current(); 2651 Isolate* isolate = Isolate::Current();
2621 DARTSCOPE(isolate); 2652 DARTSCOPE(isolate);
2622 intptr_t class_id = Api::ClassId(object); 2653 intptr_t class_id = Api::ClassId(object);
2623 if (!RawObject::IsExternalTypedDataClassId(class_id) && 2654 if (!RawObject::IsExternalTypedDataClassId(class_id) &&
2655 !RawObject::IsTypedDataViewClassId(class_id) &&
2624 !RawObject::IsTypedDataClassId(class_id)) { 2656 !RawObject::IsTypedDataClassId(class_id)) {
2625 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); 2657 RETURN_TYPE_ERROR(isolate, object, 'TypedData');
2626 } 2658 }
2627 if (!RawObject::IsExternalTypedDataClassId(class_id)) { 2659 if (!RawObject::IsExternalTypedDataClassId(class_id)) {
2628 isolate->DecrementNoGCScopeDepth(); 2660 isolate->DecrementNoGCScopeDepth();
2629 END_NO_CALLBACK_SCOPE(isolate); 2661 END_NO_CALLBACK_SCOPE(isolate);
2630 } 2662 }
2631 return Api::Success(isolate); 2663 return Api::Success(isolate);
2632 } 2664 }
2633 2665
(...skipping 2046 matching lines...) Expand 10 before | Expand all | Expand 10 after
4680 } 4712 }
4681 { 4713 {
4682 NoGCScope no_gc; 4714 NoGCScope no_gc;
4683 RawObject* raw_obj = obj.raw(); 4715 RawObject* raw_obj = obj.raw();
4684 isolate->heap()->SetPeer(raw_obj, peer); 4716 isolate->heap()->SetPeer(raw_obj, peer);
4685 } 4717 }
4686 return Api::Success(isolate); 4718 return Api::Success(isolate);
4687 } 4719 }
4688 4720
4689 } // namespace dart 4721 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698