123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #include "reference.h"
- #include "core/script_language.h"
- bool Reference::init_ref() {
- if (reference()) {
-
-
-
- if (refcount_init.get() > 0) {
- refcount_init.unref();
- unreference();
- }
- return true;
- } else {
- return false;
- }
- }
- void Reference::_bind_methods() {
- ClassDB::bind_method(D_METHOD("init_ref"), &Reference::init_ref);
- ClassDB::bind_method(D_METHOD("reference"), &Reference::reference);
- ClassDB::bind_method(D_METHOD("unreference"), &Reference::unreference);
- }
- int Reference::reference_get_count() const {
- return refcount.get();
- }
- bool Reference::reference() {
- bool success = refcount.ref();
- if (success && refcount.get() <= 2 ) {
- if (get_script_instance()) {
- get_script_instance()->refcount_incremented();
- }
- if (instance_binding_count > 0) {
- for (int i = 0; i < MAX_SCRIPT_INSTANCE_BINDINGS; i++) {
- if (_script_instance_bindings[i]) {
- ScriptServer::get_language(i)->refcount_incremented_instance_binding(this);
- }
- }
- }
- }
- return success;
- }
- bool Reference::unreference() {
- bool die = refcount.unref();
- if (refcount.get() <= 1 ) {
- if (get_script_instance()) {
- bool script_ret = get_script_instance()->refcount_decremented();
- die = die && script_ret;
- }
- if (instance_binding_count > 0) {
- for (int i = 0; i < MAX_SCRIPT_INSTANCE_BINDINGS; i++) {
- if (_script_instance_bindings[i]) {
- bool script_ret = ScriptServer::get_language(i)->refcount_decremented_instance_binding(this);
- die = die && script_ret;
- }
- }
- }
- }
- return die;
- }
- Reference::Reference() {
- refcount.init();
- refcount_init.init();
- }
- Reference::~Reference() {
- }
- Variant WeakRef::get_ref() const {
- if (ref == 0)
- return Variant();
- Object *obj = ObjectDB::get_instance(ref);
- if (!obj)
- return Variant();
- Reference *r = cast_to<Reference>(obj);
- if (r) {
- return REF(r);
- }
- return obj;
- }
- void WeakRef::set_obj(Object *p_object) {
- ref = p_object ? p_object->get_instance_id() : 0;
- }
- void WeakRef::set_ref(const REF &p_ref) {
- ref = p_ref.is_valid() ? p_ref->get_instance_id() : 0;
- }
- WeakRef::WeakRef() :
- ref(0) {
- }
- void WeakRef::_bind_methods() {
- ClassDB::bind_method(D_METHOD("get_ref"), &WeakRef::get_ref);
- }
|