Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit dbbdb07

Browse files
committed
libscript: Add template for creating new script objects
Prevent strict aliasing violations when constructing new script modules and instances.
1 parent 00a8362 commit dbbdb07

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

libscript/src/script-instance.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ MCScriptCreateInstanceOfModule(MCScriptModuleRef p_module,
5959

6060
// Attempt to create a script object.
6161
if (t_success)
62-
t_success = MCScriptCreateObject(kMCScriptObjectKindInstance, sizeof(MCScriptInstance), (MCScriptObject*&)t_instance);
62+
t_success = MCScriptCreateObject(kMCScriptObjectKindInstance, t_instance);
6363

6464
// Now associate the script object with the module (so the 'slots' field make sense).
6565
if (t_success)

libscript/src/script-module.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ bool MCScriptCreateModuleFromStream(MCStreamRef stream, MCScriptModuleRef& r_mod
409409

410410
// If this fails then we've run out of memory (oh well - not much to be done!).
411411
MCScriptModule *t_module;
412-
if (!MCScriptCreateObject(kMCScriptObjectKindModule, sizeof(MCScriptModule), (MCScriptObject*&)t_module))
412+
if (!MCScriptCreateObject(kMCScriptObjectKindModule, t_module))
413413
return false;
414414

415415
// If the unpickling fails, there's nothing we can do.

libscript/src/script-private.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ struct MCScriptObject
7070
bool MCScriptCreateObject(MCScriptObjectKind kind, size_t size, MCScriptObject*& r_object);
7171
void MCScriptDestroyObject(MCScriptObject *object);
7272

73+
template <typename ScriptObjectType>
74+
bool MCScriptCreateObject(MCScriptObjectKind kind, ScriptObjectType*& r_object)
75+
{
76+
MCScriptObject* t_new = nullptr;
77+
if (!MCScriptCreateObject(kind, sizeof(ScriptObjectType), t_new))
78+
return false;
79+
r_object = reinterpret_cast<ScriptObjectType*>(t_new);
80+
return true;
81+
}
82+
7383
MCScriptObject *MCScriptRetainObject(MCScriptObject *object);
7484
void MCScriptReleaseObject(MCScriptObject *object);
7585
uint32_t MCScriptGetRetainCountOfObject(MCScriptObject *object);

0 commit comments

Comments
 (0)