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 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 3569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3580 void* data_copy_; | 3580 void* data_copy_; |
3581 | 3581 |
3582 DISALLOW_COPY_AND_ASSIGN(AcquiredData); | 3582 DISALLOW_COPY_AND_ASSIGN(AcquiredData); |
3583 }; | 3583 }; |
3584 | 3584 |
3585 | 3585 |
3586 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, | 3586 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, |
3587 Dart_TypedData_Type* type, | 3587 Dart_TypedData_Type* type, |
3588 void** data, | 3588 void** data, |
3589 intptr_t* len) { | 3589 intptr_t* len) { |
3590 Isolate* isolate = Isolate::Current(); | 3590 Thread* thread = Thread::Current(); |
| 3591 Isolate* isolate = thread->isolate(); |
3591 DARTSCOPE(isolate); | 3592 DARTSCOPE(isolate); |
3592 intptr_t class_id = Api::ClassId(object); | 3593 intptr_t class_id = Api::ClassId(object); |
3593 if (!RawObject::IsExternalTypedDataClassId(class_id) && | 3594 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
3594 !RawObject::IsTypedDataViewClassId(class_id) && | 3595 !RawObject::IsTypedDataViewClassId(class_id) && |
3595 !RawObject::IsTypedDataClassId(class_id)) { | 3596 !RawObject::IsTypedDataClassId(class_id)) { |
3596 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); | 3597 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); |
3597 } | 3598 } |
3598 if (type == NULL) { | 3599 if (type == NULL) { |
3599 RETURN_NULL_ERROR(type); | 3600 RETURN_NULL_ERROR(type); |
3600 } | 3601 } |
(...skipping 17 matching lines...) Expand all Loading... |
3618 length = obj.Length(); | 3619 length = obj.Length(); |
3619 size_in_bytes = length * ExternalTypedData::ElementSizeInBytes(class_id); | 3620 size_in_bytes = length * ExternalTypedData::ElementSizeInBytes(class_id); |
3620 data_tmp = obj.DataAddr(0); | 3621 data_tmp = obj.DataAddr(0); |
3621 external = true; | 3622 external = true; |
3622 } else if (RawObject::IsTypedDataClassId(class_id)) { | 3623 } else if (RawObject::IsTypedDataClassId(class_id)) { |
3623 // Regular typed data object, set up some GC and API callback guards. | 3624 // Regular typed data object, set up some GC and API callback guards. |
3624 const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, object); | 3625 const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, object); |
3625 ASSERT(!obj.IsNull()); | 3626 ASSERT(!obj.IsNull()); |
3626 length = obj.Length(); | 3627 length = obj.Length(); |
3627 size_in_bytes = length * TypedData::ElementSizeInBytes(class_id); | 3628 size_in_bytes = length * TypedData::ElementSizeInBytes(class_id); |
3628 isolate->IncrementNoSafepointScopeDepth(); | 3629 thread->IncrementNoSafepointScopeDepth(); |
3629 START_NO_CALLBACK_SCOPE(isolate); | 3630 START_NO_CALLBACK_SCOPE(isolate); |
3630 data_tmp = obj.DataAddr(0); | 3631 data_tmp = obj.DataAddr(0); |
3631 } else { | 3632 } else { |
3632 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); | 3633 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); |
3633 const Instance& view_obj = Api::UnwrapInstanceHandle(isolate, object); | 3634 const Instance& view_obj = Api::UnwrapInstanceHandle(isolate, object); |
3634 ASSERT(!view_obj.IsNull()); | 3635 ASSERT(!view_obj.IsNull()); |
3635 Smi& val = Smi::Handle(); | 3636 Smi& val = Smi::Handle(); |
3636 val ^= TypedDataView::Length(view_obj); | 3637 val ^= TypedDataView::Length(view_obj); |
3637 length = val.Value(); | 3638 length = val.Value(); |
3638 size_in_bytes = length * TypedDataView::ElementSizeInBytes(class_id); | 3639 size_in_bytes = length * TypedDataView::ElementSizeInBytes(class_id); |
3639 val ^= TypedDataView::OffsetInBytes(view_obj); | 3640 val ^= TypedDataView::OffsetInBytes(view_obj); |
3640 intptr_t offset_in_bytes = val.Value(); | 3641 intptr_t offset_in_bytes = val.Value(); |
3641 const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj)); | 3642 const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj)); |
3642 isolate->IncrementNoSafepointScopeDepth(); | 3643 thread->IncrementNoSafepointScopeDepth(); |
3643 START_NO_CALLBACK_SCOPE(isolate); | 3644 START_NO_CALLBACK_SCOPE(isolate); |
3644 if (TypedData::IsTypedData(obj)) { | 3645 if (TypedData::IsTypedData(obj)) { |
3645 const TypedData& data_obj = TypedData::Cast(obj); | 3646 const TypedData& data_obj = TypedData::Cast(obj); |
3646 data_tmp = data_obj.DataAddr(offset_in_bytes); | 3647 data_tmp = data_obj.DataAddr(offset_in_bytes); |
3647 } else { | 3648 } else { |
3648 ASSERT(ExternalTypedData::IsExternalTypedData(obj)); | 3649 ASSERT(ExternalTypedData::IsExternalTypedData(obj)); |
3649 const ExternalTypedData& data_obj = ExternalTypedData::Cast(obj); | 3650 const ExternalTypedData& data_obj = ExternalTypedData::Cast(obj); |
3650 data_tmp = data_obj.DataAddr(offset_in_bytes); | 3651 data_tmp = data_obj.DataAddr(offset_in_bytes); |
3651 external = true; | 3652 external = true; |
3652 } | 3653 } |
(...skipping 17 matching lines...) Expand all Loading... |
3670 table->SetValue(obj.raw(), reinterpret_cast<intptr_t>(ad)); | 3671 table->SetValue(obj.raw(), reinterpret_cast<intptr_t>(ad)); |
3671 data_tmp = ad->GetData(); | 3672 data_tmp = ad->GetData(); |
3672 } | 3673 } |
3673 *data = data_tmp; | 3674 *data = data_tmp; |
3674 *len = length; | 3675 *len = length; |
3675 return Api::Success(); | 3676 return Api::Success(); |
3676 } | 3677 } |
3677 | 3678 |
3678 | 3679 |
3679 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) { | 3680 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) { |
3680 Isolate* isolate = Isolate::Current(); | 3681 Thread* thread = Thread::Current(); |
| 3682 Isolate* isolate = thread->isolate(); |
3681 DARTSCOPE(isolate); | 3683 DARTSCOPE(isolate); |
3682 intptr_t class_id = Api::ClassId(object); | 3684 intptr_t class_id = Api::ClassId(object); |
3683 if (!RawObject::IsExternalTypedDataClassId(class_id) && | 3685 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
3684 !RawObject::IsTypedDataViewClassId(class_id) && | 3686 !RawObject::IsTypedDataViewClassId(class_id) && |
3685 !RawObject::IsTypedDataClassId(class_id)) { | 3687 !RawObject::IsTypedDataClassId(class_id)) { |
3686 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); | 3688 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); |
3687 } | 3689 } |
3688 if (!RawObject::IsExternalTypedDataClassId(class_id)) { | 3690 if (!RawObject::IsExternalTypedDataClassId(class_id)) { |
3689 isolate->DecrementNoSafepointScopeDepth(); | 3691 thread->DecrementNoSafepointScopeDepth(); |
3690 END_NO_CALLBACK_SCOPE(isolate); | 3692 END_NO_CALLBACK_SCOPE(isolate); |
3691 } | 3693 } |
3692 if (FLAG_verify_acquired_data) { | 3694 if (FLAG_verify_acquired_data) { |
3693 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); | 3695 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); |
3694 WeakTable* table = isolate->api_state()->acquired_table(); | 3696 WeakTable* table = isolate->api_state()->acquired_table(); |
3695 intptr_t current = table->GetValue(obj.raw()); | 3697 intptr_t current = table->GetValue(obj.raw()); |
3696 if (current == 0) { | 3698 if (current == 0) { |
3697 return Api::NewError("Data was not acquired for this object."); | 3699 return Api::NewError("Data was not acquired for this object."); |
3698 } | 3700 } |
3699 AcquiredData* ad = reinterpret_cast<AcquiredData*>(current); | 3701 AcquiredData* ad = reinterpret_cast<AcquiredData*>(current); |
(...skipping 2153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5853 ASSERT(stream != NULL); | 5855 ASSERT(stream != NULL); |
5854 TimelineEvent* event = stream->StartEvent(); | 5856 TimelineEvent* event = stream->StartEvent(); |
5855 if (event != NULL) { | 5857 if (event != NULL) { |
5856 event->AsyncEnd(label, async_id); | 5858 event->AsyncEnd(label, async_id); |
5857 event->Complete(); | 5859 event->Complete(); |
5858 } | 5860 } |
5859 return Api::Success(); | 5861 return Api::Success(); |
5860 } | 5862 } |
5861 | 5863 |
5862 } // namespace dart | 5864 } // namespace dart |
OLD | NEW |