2025-07-03 12:53:49 +04:00

60 lines
1.8 KiB
C++

#include "il2cpp-config.h"
#include "vm/Class.h"
#include "vm/Domain.h"
#include "vm/Object.h"
#include "vm/Runtime.h"
#include "vm/Thread.h"
#include "gc/GarbageCollector.h"
#include "gc/WriteBarrier.h"
#include "il2cpp-class-internals.h"
#include "il2cpp-object-internals.h"
namespace il2cpp
{
namespace vm
{
Il2CppDomain* Domain::S_domain = NULL;
Il2CppDomain* Domain::GetCurrent()
{
if (S_domain)
return S_domain;
// allocate using gc memory since we hold onto object references
S_domain = (Il2CppDomain*)il2cpp::gc::GarbageCollector::AllocateFixed(sizeof(Il2CppDomain), NULL);
gc::WriteBarrier::GenericStore(&S_domain->ephemeron_tombstone, Object::New(il2cpp_defaults.object_class));
return S_domain;
}
Il2CppDomain* Domain::GetRoot()
{
// just one domain for now
return GetCurrent();
}
void Domain::ContextInit(Il2CppDomain *domain)
{
Il2CppClass* klass = Class::FromName(il2cpp_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context");
Il2CppAppContext* context = (Il2CppAppContext*)Object::New(klass);
// To match Mono's implementation we do not call the constructor here. If we do, context_id will be 1, which
// is not correct.
context->domain_id = domain->domain_id;
context->context_id = 0;
gc::WriteBarrier::GenericStore(&domain->default_context, context);
}
void Domain::ContextSet(Il2CppAppContext* context)
{
IL2CPP_OBJECT_SETREF(il2cpp::vm::Thread::Current()->GetInternalThread(), current_appcontext, (Il2CppObject*)context);
}
Il2CppAppContext* Domain::ContextGet()
{
return (Il2CppAppContext*)il2cpp::vm::Thread::Current()->GetInternalThread()->current_appcontext;
}
} /* namespace vm */
} /* namespace il2cpp */