dmd/compiler/test/dshell/extra-files/dll_cxx/cppnew.d

68 lines
1.6 KiB
D

module cppnew;
/* This module contains copies from core.stdcpp.new_.d, but with
* modifications for DMC. */
T* cpp_new(T, Args...)(auto ref Args args) if (!is(T == class))
{
import core.lifetime : emplace, forward;
T* mem = cast(T*)__cpp_new(T.sizeof);
return mem.emplace(forward!args);
}
T cpp_new(T, Args...)(auto ref Args args) if (is(T == class))
{
import core.lifetime : emplace, forward;
T mem = cast(T)__cpp_new(__traits(classInstanceSize, T));
return mem.emplace(forward!args);
}
void cpp_delete(T)(T* ptr) if (!is(T == class))
{
destroy!false(*ptr);
__cpp_delete(ptr);
}
void cpp_delete(T)(T instance) if (is(T == class))
{
destroy!false(instance);
__cpp_delete(cast(void*) instance);
}
/// Binding for ::operator new(std::size_t count)
pragma(mangle, __new_mangle)
extern(C++) void* __cpp_new(size_t count);
/// Binding for ::operator delete(void* ptr)
pragma(mangle, __delete_mangle)
extern(C++) void __cpp_delete(void* ptr);
// we have to hard-code the mangling for the global new/delete operators
version (CppRuntime_Microsoft)
{
version (D_LP64)
{
enum __new_mangle = "??2@YAPEAX_K@Z";
enum __delete_mangle = "??3@YAXPEAX@Z";
}
else
{
enum __new_mangle = "??2@YAPAXI@Z";
enum __delete_mangle = "??3@YAXPAX@Z";
}
}
else
{
version (D_LP64)
{
enum __new_mangle = "_Znwm";
enum __delete_mangle = "_ZdlPv";
}
else
{
enum __new_mangle = "_Znwj";
enum __delete_mangle = "_ZdlPv";
}
}