Skip to content

Commit 5af9f69

Browse files
committed
[[ VM ]] Use builtins array if present for ordinal bindings
This patch adds the idea of a builtins array to a ScriptModule and changes how binding strings are resolved for foreign handlers. If the module containing the handler definition has a builtins array and the binding string is an integer, then it will use the pointer in the builtins array as the function pointer when resolving.
1 parent 2f457b7 commit 5af9f69

File tree

5 files changed

+39
-10
lines changed

5 files changed

+39
-10
lines changed

libscript/include/libscript/script.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ bool MCScriptCreateModuleFromStream(MCStreamRef stream, MCScriptModuleRef& r_mod
171171
// Load a module from a blob
172172
MC_DLLEXPORT bool MCScriptCreateModuleFromData(MCDataRef data, MCScriptModuleRef & r_module);
173173

174-
// Set initializer / finalizer
175-
void MCScriptSetModuleLifecycleFunctions(MCScriptModuleRef module, bool (*initializer)(void), void (*finalizer)(void));
174+
// Set initializer / finalizer / builtins
175+
void MCScriptConfigureBuiltinModule(MCScriptModuleRef module, bool (*initializer)(void), void (*finalizer)(void), void **builtins);
176176

177177
// Lookup the module with the given name. Returns false if no such module exists.
178178
bool MCScriptLookupModule(MCNameRef name, MCScriptModuleRef& r_module);

libscript/src/script-instance.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,19 @@ __MCScriptResolveForeignFunctionBinding(MCScriptInstanceRef p_instance,
647647
ffi_abi& r_abi,
648648
bool* r_bound)
649649
{
650+
integer_t t_ordinal = 0;
651+
if (p_instance->module->builtins != nullptr &&
652+
MCTypeConvertStringToLongInteger(p_handler->binding, t_ordinal))
653+
{
654+
p_handler->native.function = p_instance->module->builtins[t_ordinal];
655+
r_abi = FFI_DEFAULT_ABI;
656+
if (r_bound != nullptr)
657+
{
658+
*r_bound = true;
659+
}
660+
return true;
661+
}
662+
650663
MCStringRef t_rest;
651664
t_rest = MCValueRetain(p_handler -> binding);
652665

libscript/src/script-module.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -500,12 +500,14 @@ MCScriptCreateModulesFromData(MCDataRef p_data,
500500
}
501501

502502
void
503-
MCScriptSetModuleLifecycleFunctions(MCScriptModuleRef p_module,
504-
bool (*p_initializer)(void),
505-
void (*p_finalizer)(void))
503+
MCScriptConfigureBuiltinModule(MCScriptModuleRef p_module,
504+
bool (*p_initializer)(void),
505+
void (*p_finalizer)(void),
506+
void **p_builtins)
506507
{
507508
p_module->initializer = p_initializer;
508509
p_module->finalizer = p_finalizer;
510+
p_module->builtins = p_builtins;
509511
}
510512

511513
bool MCScriptLookupModule(MCNameRef p_name, MCScriptModuleRef& r_module)
@@ -734,8 +736,17 @@ bool MCScriptEnsureModuleIsUsable(MCScriptModuleRef self)
734736
t_type = static_cast<MCScriptForeignType *>(self -> types[i]);
735737

736738
void *t_symbol = nullptr;
737-
t_symbol = MCSLibraryLookupSymbol(MCScriptGetLibrary(),
738-
t_type->binding);
739+
integer_t t_ordinal = 0;
740+
if (self->builtins != nullptr &&
741+
MCTypeConvertStringToLongInteger(t_type->binding, t_ordinal))
742+
{
743+
t_symbol = self->builtins[t_ordinal];
744+
}
745+
else
746+
{
747+
t_symbol = MCSLibraryLookupSymbol(MCScriptGetLibrary(),
748+
t_type->binding);
749+
}
739750

740751
if (t_symbol == nullptr)
741752
{

libscript/src/script-object.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct MCBuiltinModule
4949
long size;
5050
bool (*initializer)(void);
5151
void (*finalizer)(void);
52+
void **builtins;
5253
};
5354

5455
static MCBuiltinModule *s_builtin_modules = nil;
@@ -85,9 +86,10 @@ bool MCScriptInitialize(void)
8586
if (!MCScriptCreateModuleFromStream(t_stream, t_module->handle))
8687
return false;
8788

88-
MCScriptSetModuleLifecycleFunctions(t_module->handle,
89-
t_module->initializer,
90-
t_module->finalizer);
89+
MCScriptConfigureBuiltinModule(t_module->handle,
90+
t_module->initializer,
91+
t_module->finalizer,
92+
t_module->builtins);
9193

9294
MCValueRelease(t_stream);
9395
}

libscript/src/script-private.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,9 @@ struct MCScriptModule: public MCScriptObject
449449
// These are the native code initializer/finalizer (if any) -- not pickled
450450
bool (*initializer)(void);
451451
void (*finalizer)(void);
452+
453+
// This is the ordinal mapping array (if any) -- not pickled
454+
void **builtins;
452455
};
453456

454457
bool MCScriptWriteRawModule(MCStreamRef stream, MCScriptModule *module);

0 commit comments

Comments
 (0)