Handle nullptr in StablePointer API (#4671)
This commit is contained in:
committed by
Vasily Levchenko
parent
9295d7cf60
commit
3bf1f55990
@@ -292,23 +292,35 @@ extern "C" RUNTIME_NOTHROW bool ClearSubgraphReferences(ObjHeader* root, bool ch
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern "C" RUNTIME_NOTHROW void* CreateStablePointer(ObjHeader* object) {
|
extern "C" RUNTIME_NOTHROW void* CreateStablePointer(ObjHeader* object) {
|
||||||
|
if (!object)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
||||||
return mm::StableRefRegistry::Instance().RegisterStableRef(threadData, object);
|
return mm::StableRefRegistry::Instance().RegisterStableRef(threadData, object);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" RUNTIME_NOTHROW void DisposeStablePointer(void* pointer) {
|
extern "C" RUNTIME_NOTHROW void DisposeStablePointer(void* pointer) {
|
||||||
|
if (!pointer)
|
||||||
|
return;
|
||||||
|
|
||||||
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
||||||
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
||||||
mm::StableRefRegistry::Instance().UnregisterStableRef(threadData, node);
|
mm::StableRefRegistry::Instance().UnregisterStableRef(threadData, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" RUNTIME_NOTHROW OBJ_GETTER(DerefStablePointer, void* pointer) {
|
extern "C" RUNTIME_NOTHROW OBJ_GETTER(DerefStablePointer, void* pointer) {
|
||||||
|
if (!pointer)
|
||||||
|
RETURN_OBJ(nullptr);
|
||||||
|
|
||||||
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
||||||
ObjHeader* object = **node;
|
ObjHeader* object = **node;
|
||||||
RETURN_OBJ(object);
|
RETURN_OBJ(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" RUNTIME_NOTHROW OBJ_GETTER(AdoptStablePointer, void* pointer) {
|
extern "C" RUNTIME_NOTHROW OBJ_GETTER(AdoptStablePointer, void* pointer) {
|
||||||
|
if (!pointer)
|
||||||
|
RETURN_OBJ(nullptr);
|
||||||
|
|
||||||
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
auto* threadData = mm::ThreadRegistry::Instance().CurrentThreadData();
|
||||||
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
auto* node = static_cast<mm::StableRefRegistry::Node*>(pointer);
|
||||||
ObjHeader* object = **node;
|
ObjHeader* object = **node;
|
||||||
|
|||||||
Reference in New Issue
Block a user