Callback finalizer on non-abstract type;
| 2773 | |
| 2774 | // Callback finalizer on non-abstract type; |
| 2775 | void GCSetFinalizer( hx::Object *obj, hx::finalizer f ) |
| 2776 | { |
| 2777 | if (!obj) |
| 2778 | throw Dynamic(HX_CSTRING("set_finalizer - invalid null object")); |
| 2779 | if (((unsigned int *)obj)[-1] & HX_GC_CONST_ALLOC_BIT) |
| 2780 | throw Dynamic(HX_CSTRING("set_finalizer - invalid const object")); |
| 2781 | |
| 2782 | std::lock_guard<std::mutex> lock(*gSpecialObjectLock); |
| 2783 | if (f==0) |
| 2784 | { |
| 2785 | FinalizerMap::iterator i = sFinalizerMap.find(obj); |
| 2786 | if (i!=sFinalizerMap.end()) |
| 2787 | sFinalizerMap.erase(i); |
| 2788 | } |
| 2789 | else |
| 2790 | sFinalizerMap[obj] = f; |
| 2791 | } |
| 2792 | |
| 2793 | |
| 2794 | // Callback finalizer on non-abstract type; |