Skip to content
This repository was archived by the owner on Dec 29, 2024. It is now read-only.

Commit a1ad3ca

Browse files
committed
Use memnew_placement instead of memmove (#140)
1 parent 7d1a811 commit a1ad3ca

2 files changed

Lines changed: 24 additions & 73 deletions

File tree

src/luaState.cpp

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -292,61 +292,37 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
292292
}
293293
case Variant::Type::VECTOR2: {
294294
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
295-
#ifndef LAPI_GDEXTENSION
296-
*userdata = var;
297-
#else
298-
memmove(userdata, (void *)&var, sizeof(Variant));
299-
#endif
295+
memnew_placement(userdata, Variant(var));
300296
luaL_setmetatable(state, "mt_Vector2");
301297
break;
302298
}
303299
case Variant::Type::VECTOR3: {
304300
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
305-
#ifndef LAPI_GDEXTENSION
306-
*userdata = var;
307-
#else
308-
memmove(userdata, (void *)&var, sizeof(Variant));
309-
#endif
301+
memnew_placement(userdata, Variant(var));
310302
luaL_setmetatable(state, "mt_Vector3");
311303
break;
312304
}
313305
case Variant::Type::COLOR: {
314306
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
315-
#ifndef LAPI_GDEXTENSION
316-
*userdata = var;
317-
#else
318-
memmove(userdata, (void *)&var, sizeof(Variant));
319-
#endif
307+
memnew_placement(userdata, Variant(var));
320308
luaL_setmetatable(state, "mt_Color");
321309
break;
322310
}
323311
case Variant::Type::RECT2: {
324312
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
325-
#ifndef LAPI_GDEXTENSION
326-
*userdata = var;
327-
#else
328-
memmove(userdata, (void *)&var, sizeof(Variant));
329-
#endif
313+
memnew_placement(userdata, Variant(var));
330314
luaL_setmetatable(state, "mt_Rect2");
331315
break;
332316
}
333317
case Variant::Type::PLANE: {
334318
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
335-
#ifndef LAPI_GDEXTENSION
336-
*userdata = var;
337-
#else
338-
memmove(userdata, (void *)&var, sizeof(Variant));
339-
#endif
319+
memnew_placement(userdata, Variant(var));
340320
luaL_setmetatable(state, "mt_Plane");
341321
break;
342322
}
343323
case Variant::Type::SIGNAL: {
344324
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
345-
#ifndef LAPI_GDEXTENSION
346-
*userdata = var;
347-
#else
348-
memmove(userdata, (void *)&var, sizeof(Variant));
349-
#endif
325+
memnew_placement(userdata, Variant(var));
350326
luaL_setmetatable(state, "mt_Signal");
351327
break;
352328
}
@@ -393,11 +369,6 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
393369
break;
394370
}
395371

396-
// If the type being pushed is a RefCounted, increase its refcount.
397-
if (Ref<RefCounted> ref = Object::cast_to<RefCounted>(var.operator Object *()); ref.is_valid()) {
398-
ref->reference();
399-
}
400-
401372
// If the type being pushed is a LuaCallableExtra. use mt_CallableExtra instead
402373
#ifndef LAPI_GDEXTENSION
403374
if (Ref<LuaCallableExtra> func = Object::cast_to<LuaCallableExtra>(var.operator Object *()); func.is_valid()) {
@@ -406,13 +377,13 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
406377
if (Ref<LuaCallableExtra> func = dynamic_cast<LuaCallableExtra *>(var.operator Object *()); func.is_valid()) {
407378
#endif
408379
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
409-
memmove(userdata, (void *)&var, sizeof(Variant));
380+
memnew_placement(userdata, Variant(var));
410381
luaL_setmetatable(state, "mt_CallableExtra");
411382
break;
412383
}
413384

414385
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
415-
memmove(userdata, (void *)&var, sizeof(Variant));
386+
memnew_placement(userdata, Variant(var));
416387
luaL_setmetatable(state, "mt_Object");
417388
break;
418389
}
@@ -425,7 +396,7 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
425396
}
426397

427398
if (callable.is_custom()) {
428-
// If the type being pushed is a lua function ref, push the ref instead.
399+
// If the type being pushed is a lua function ref, push the ref instead.
429400
#ifndef LAPI_GDEXTENSION
430401
LuaAPI *callObj = Object::cast_to<LuaAPI>(callable.get_object());
431402
#else
@@ -439,6 +410,7 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
439410
}
440411
}
441412

413+
// A work around to preserve ref count of CallableCustoms
442414
Ref<LuaCallableExtra> callableCustom;
443415
callableCustom.instantiate();
444416
callableCustom->setInfo(callable, 0, false, false);
@@ -447,7 +419,7 @@ LuaError *LuaState::pushVariant(lua_State *state, Variant var) {
447419
}
448420

449421
Variant *userdata = (Variant *)lua_newuserdata(state, sizeof(Variant));
450-
memmove(userdata, (void *)&var, sizeof(Variant));
422+
memnew_placement(userdata, Variant(var));
451423
luaL_setmetatable(state, "mt_Callable");
452424
break;
453425
}

src/metatables.cpp

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -31,43 +31,19 @@ LuaError *LuaState::exposeObjectConstructor(String name, Object *obj) {
3131
}
3232
lua_pushlightuserdata(L, obj);
3333

34-
#ifndef LAPI_GDEXTENSION
35-
36-
lua_pushcclosure(L, LUA_LAMBDA_TEMPLATE({
37-
Object *inner_obj = (Object *)lua_touserdata(inner_state, lua_upvalueindex(1));
38-
39-
Variant *userdata = (Variant *)lua_newuserdata(inner_state, sizeof(Variant));
40-
Variant ret = inner_obj->call("new");
41-
42-
*userdata = ret;
43-
44-
luaL_setmetatable(inner_state, "mt_Object");
45-
46-
return 1;
47-
}),
48-
1);
49-
50-
#else
51-
5234
lua_pushcclosure(L, LUA_LAMBDA_TEMPLATE({
5335
Object *inner_obj = (Object *)lua_touserdata(inner_state, lua_upvalueindex(1));
5436

5537
Variant *userdata = (Variant *)lua_newuserdata(inner_state, sizeof(Variant));
5638
Variant ret = inner_obj->call("new");
5739

58-
// If the type being created is a RefCounted, increase its refcount.
59-
if (RefCounted *ref = Object::cast_to<RefCounted>(ret.operator Object *()); ref != nullptr) {
60-
ref->reference();
61-
}
62-
63-
memmove(userdata, (void *)&ret, sizeof(Variant));
40+
memnew_placement(userdata, Variant(ret));
6441

6542
luaL_setmetatable(inner_state, "mt_Object");
6643

6744
return 1;
6845
}),
6946
1);
70-
#endif
7147

7248
lua_setglobal(L, name.ascii().get_data());
7349
return nullptr;
@@ -521,18 +497,21 @@ void LuaState::createObjectMetatable() {
521497
});
522498

523499
LUA_METAMETHOD_TEMPLATE(L, -1, "__gc", {
524-
// If object is a RefCounted
525-
Ref<RefCounted> ref = Object::cast_to<RefCounted>(arg1);
526-
if (ref != nullptr) {
527-
ref->unreference();
500+
// We need to manually uncount the ref
501+
if (Ref<RefCounted> ref = Object::cast_to<RefCounted>(arg1); ref.is_valid()) {
502+
ref->~RefCounted();
528503
}
529504

530505
if (!arg1.has_method("__gc")) {
531506
return 0;
532507
}
533508

534-
LuaState::pushVariant(inner_state, arg1.call("__gc", api));
535-
return 1;
509+
// just in case they want to raise an error
510+
Variant ret = arg1.call("__gc", api);
511+
if (LuaError *err = dynamic_cast<LuaError *>(ret.operator Object *())) {
512+
LuaState::pushVariant(inner_state, ret);
513+
}
514+
return 0;
536515
});
537516

538517
LUA_METAMETHOD_TEMPLATE(L, -1, "__tostring", {
@@ -764,9 +743,9 @@ void LuaState::createCallableExtraMetatable() {
764743
luaL_newmetatable(L, "mt_CallableExtra");
765744

766745
LUA_METAMETHOD_TEMPLATE(L, -1, "__gc", {
767-
Ref<RefCounted> ref = Object::cast_to<RefCounted>(arg1);
768-
if (ref != nullptr) {
769-
ref->unreference();
746+
// We need to manually uncount the ref
747+
if (Ref<RefCounted> ref = Object::cast_to<RefCounted>(arg1); ref.is_valid()) {
748+
ref->~RefCounted();
770749
}
771750

772751
return 0;

0 commit comments

Comments
 (0)