Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 148 ref->set_raw(object); | 148 ref->set_raw(object); |
| 149 return reinterpret_cast<Dart_Handle>(ref); | 149 return reinterpret_cast<Dart_Handle>(ref); |
| 150 } | 150 } |
| 151 | 151 |
| 152 RawObject* Api::UnwrapHandle(Dart_Handle object) { | 152 RawObject* Api::UnwrapHandle(Dart_Handle object) { |
| 153 #ifdef DEBUG | 153 #ifdef DEBUG |
| 154 Isolate* isolate = Isolate::Current(); | 154 Isolate* isolate = Isolate::Current(); |
| 155 ASSERT(isolate != NULL); | 155 ASSERT(isolate != NULL); |
| 156 ApiState* state = isolate->api_state(); | 156 ApiState* state = isolate->api_state(); |
| 157 ASSERT(state != NULL); | 157 ASSERT(state != NULL); |
| 158 ASSERT(state->IsValidPersistentHandle(object) || | 158 ASSERT(state->IsValidWeakPersistentHandle(object) || |
| 159 state->IsValidPersistentHandle(object) || | |
| 159 state->IsValidLocalHandle(object)); | 160 state->IsValidLocalHandle(object)); |
| 160 ASSERT(PersistentHandle::raw_offset() == 0 && | 161 ASSERT(WeakPersistentHandle::raw_offset() == 0 && |
| 162 PersistentHandle::raw_offset() == 0 && | |
| 161 LocalHandle::raw_offset() == 0); | 163 LocalHandle::raw_offset() == 0); |
| 162 #endif | 164 #endif |
| 163 return *(reinterpret_cast<RawObject**>(object)); | 165 return *(reinterpret_cast<RawObject**>(object)); |
| 164 } | 166 } |
| 165 | 167 |
| 166 #define DEFINE_UNWRAP(Type) \ | 168 #define DEFINE_UNWRAP(Type) \ |
| 167 const Type& Api::Unwrap##Type##Handle(Dart_Handle dart_handle) { \ | 169 const Type& Api::Unwrap##Type##Handle(Dart_Handle dart_handle) { \ |
| 168 const Object& tmp = Object::Handle(Api::UnwrapHandle(dart_handle)); \ | 170 const Object& tmp = Object::Handle(Api::UnwrapHandle(dart_handle)); \ |
| 169 Type& typed_handle = Type::Handle(); \ | 171 Type& typed_handle = Type::Handle(); \ |
| 170 if (tmp.Is##Type()) { \ | 172 if (tmp.Is##Type()) { \ |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 183 } | 185 } |
| 184 | 186 |
| 185 | 187 |
| 186 PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state, | 188 PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state, |
| 187 Dart_Handle object) { | 189 Dart_Handle object) { |
| 188 ASSERT(state.IsValidPersistentHandle(object)); | 190 ASSERT(state.IsValidPersistentHandle(object)); |
| 189 return reinterpret_cast<PersistentHandle*>(object); | 191 return reinterpret_cast<PersistentHandle*>(object); |
| 190 } | 192 } |
| 191 | 193 |
| 192 | 194 |
| 195 WeakPersistentHandle* Api::UnwrapAsWeakPersistentHandle(const ApiState& state, | |
| 196 Dart_Handle object) { | |
| 197 ASSERT(state.IsValidWeakPersistentHandle(object)); | |
| 198 return reinterpret_cast<WeakPersistentHandle*>(object); | |
| 199 } | |
| 200 | |
| 201 | |
| 193 Dart_Isolate Api::CastIsolate(Isolate* isolate) { | 202 Dart_Isolate Api::CastIsolate(Isolate* isolate) { |
| 194 return reinterpret_cast<Dart_Isolate>(isolate); | 203 return reinterpret_cast<Dart_Isolate>(isolate); |
| 195 } | 204 } |
| 196 | 205 |
| 197 | 206 |
| 198 Dart_Message Api::CastMessage(uint8_t* message) { | 207 Dart_Message Api::CastMessage(uint8_t* message) { |
| 199 return reinterpret_cast<Dart_Message>(message); | 208 return reinterpret_cast<Dart_Message>(message); |
| 200 } | 209 } |
| 201 | 210 |
| 202 | 211 |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 450 DART_EXPORT Dart_Handle Dart_IsSame(Dart_Handle obj1, Dart_Handle obj2, | 459 DART_EXPORT Dart_Handle Dart_IsSame(Dart_Handle obj1, Dart_Handle obj2, |
| 451 bool* value) { | 460 bool* value) { |
| 452 DARTSCOPE(Isolate::Current()); | 461 DARTSCOPE(Isolate::Current()); |
| 453 const Object& expected = Object::Handle(Api::UnwrapHandle(obj1)); | 462 const Object& expected = Object::Handle(Api::UnwrapHandle(obj1)); |
| 454 const Object& actual = Object::Handle(Api::UnwrapHandle(obj2)); | 463 const Object& actual = Object::Handle(Api::UnwrapHandle(obj2)); |
| 455 *value = (expected.raw() == actual.raw()); | 464 *value = (expected.raw() == actual.raw()); |
| 456 return Api::Success(); | 465 return Api::Success(); |
| 457 } | 466 } |
| 458 | 467 |
| 459 | 468 |
| 460 static PersistentHandle* AllocatePersistentHandle(Dart_Handle object) { | 469 DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
| 461 Isolate* isolate = Isolate::Current(); | 470 Isolate* isolate = Isolate::Current(); |
| 462 CHECK_ISOLATE(isolate); | 471 CHECK_ISOLATE(isolate); |
| 463 DARTSCOPE_NOCHECKS(isolate); | 472 DARTSCOPE_NOCHECKS(isolate); |
| 464 ApiState* state = isolate->api_state(); | 473 ApiState* state = isolate->api_state(); |
| 465 ASSERT(state != NULL); | 474 ASSERT(state != NULL); |
| 466 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); | 475 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); |
| 467 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); | 476 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); |
| 468 new_ref->set_raw(old_ref); | 477 new_ref->set_raw(old_ref); |
| 469 return new_ref; | |
| 470 } | |
| 471 | |
| 472 | |
| 473 DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { | |
| 474 PersistentHandle* new_ref = AllocatePersistentHandle(object); | |
| 475 return reinterpret_cast<Dart_Handle>(new_ref); | 478 return reinterpret_cast<Dart_Handle>(new_ref); |
| 476 } | 479 } |
| 477 | 480 |
| 478 | 481 |
| 479 DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( | 482 DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
| 480 Dart_Handle object, | 483 Dart_Handle object, |
| 481 void* peer, | 484 void* peer, |
| 482 Dart_PeerFinalizer callback) { | 485 Dart_PeerFinalizer callback) { |
| 483 PersistentHandle* new_ref = AllocatePersistentHandle(object); | 486 Isolate* isolate = Isolate::Current(); |
| 484 new_ref->set_kind(PersistentHandle::WeakReference); | 487 CHECK_ISOLATE(isolate); |
| 488 DARTSCOPE_NOCHECKS(isolate); | |
| 489 ApiState* state = isolate->api_state(); | |
| 490 ASSERT(state != NULL); | |
| 491 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); | |
| 492 WeakPersistentHandle* new_ref = | |
| 493 state->weak_persistent_handles().AllocateHandle(); | |
| 494 new_ref->set_raw(old_ref); | |
| 485 new_ref->set_peer(peer); | 495 new_ref->set_peer(peer); |
| 486 new_ref->set_callback(callback); | 496 new_ref->set_callback(callback); |
| 487 return reinterpret_cast<Dart_Handle>(new_ref); | 497 return reinterpret_cast<Dart_Handle>(new_ref); |
| 488 } | 498 } |
| 489 | 499 |
| 490 | 500 |
| 491 DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { | 501 DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { |
| 492 Isolate* isolate = Isolate::Current(); | 502 Isolate* isolate = Isolate::Current(); |
| 493 CHECK_ISOLATE(isolate); | 503 CHECK_ISOLATE(isolate); |
| 494 ApiState* state = isolate->api_state(); | 504 ApiState* state = isolate->api_state(); |
| 495 ASSERT(state != NULL); | 505 ASSERT(state != NULL); |
| 496 PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); | 506 if (state->IsValidWeakPersistentHandle(object)) { |
| 497 ASSERT(!ref->IsProtected()); | 507 WeakPersistentHandle* weak_ref = |
| 498 if (!ref->IsProtected()) { | 508 Api::UnwrapAsWeakPersistentHandle(*state, object); |
| 509 state->weak_persistent_handles().FreeHandle(weak_ref); | |
| 510 } else { | |
| 511 PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); | |
| 512 ASSERT(!state->IsProtectedHandle(ref)); | |
| 499 state->persistent_handles().FreeHandle(ref); | 513 state->persistent_handles().FreeHandle(ref); |
|
Ivan Posva
2012/01/12 23:30:38
Why not checking for protected handles?
cshapiro
2012/01/13 01:30:03
A good idea. Done. This makes the diff a bit mor
| |
| 500 } | 514 } |
| 501 } | 515 } |
| 502 | 516 |
| 503 | 517 |
| 504 DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) { | 518 DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) { |
| 505 Isolate* isolate = Isolate::Current(); | 519 Isolate* isolate = Isolate::Current(); |
| 506 CHECK_ISOLATE(isolate); | 520 CHECK_ISOLATE(isolate); |
| 507 ApiState* state = isolate->api_state(); | 521 ApiState* state = isolate->api_state(); |
| 508 ASSERT(state != NULL); | 522 ASSERT(state != NULL); |
| 509 if (state->IsValidPersistentHandle(object)) { | 523 return state->IsValidWeakPersistentHandle(object); |
| 510 PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); | |
| 511 return ref->kind() == PersistentHandle::WeakReference; | |
| 512 } | |
| 513 return false; | |
| 514 } | 524 } |
| 515 | 525 |
| 516 | 526 |
| 517 // --- Initialization and Globals --- | 527 // --- Initialization and Globals --- |
| 518 | 528 |
| 519 | 529 |
| 520 DART_EXPORT bool Dart_Initialize(Dart_IsolateCreateCallback create, | 530 DART_EXPORT bool Dart_Initialize(Dart_IsolateCreateCallback create, |
| 521 Dart_IsolateInterruptCallback interrupt) { | 531 Dart_IsolateInterruptCallback interrupt) { |
| 522 return Dart::InitOnce(create, interrupt); | 532 return Dart::InitOnce(create, interrupt); |
| 523 } | 533 } |
| (...skipping 1978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2502 } | 2512 } |
| 2503 delete debug_region; | 2513 delete debug_region; |
| 2504 } else { | 2514 } else { |
| 2505 *buffer = NULL; | 2515 *buffer = NULL; |
| 2506 *buffer_size = 0; | 2516 *buffer_size = 0; |
| 2507 } | 2517 } |
| 2508 } | 2518 } |
| 2509 | 2519 |
| 2510 | 2520 |
| 2511 } // namespace dart | 2521 } // namespace dart |
| OLD | NEW |