diff --git a/engine/src/exec-extension.cpp b/engine/src/exec-extension.cpp index 3db2bd19cc2..92f2f82272c 100644 --- a/engine/src/exec-extension.cpp +++ b/engine/src/exec-extension.cpp @@ -49,6 +49,7 @@ #include "uuid.h" #include "libscript/script.h" +#include "libscript/script-auto.h" //////////////////////////////////////////////////////////////////////////////// @@ -168,28 +169,20 @@ bool MCEngineLookupResourcePathForModule(MCScriptModuleRef p_module, MCStringRef void MCEngineLoadExtensionFromData(MCExecContext& ctxt, MCDataRef p_extension_data, MCStringRef p_resource_path) { - MCStreamRef t_stream; - /* UNCHECKED */ MCMemoryInputStreamCreate(MCDataGetBytePtr(p_extension_data), MCDataGetLength(p_extension_data), t_stream); - - MCScriptModuleRef t_module; - if (!MCScriptCreateModuleFromStream(t_stream, t_module)) + MCAutoScriptModuleRef t_module; + if (!MCScriptCreateModuleFromData(p_extension_data, &t_module)) { MCAutoErrorRef t_error; if (MCErrorCatch(Out(t_error))) ctxt . SetTheResultToValue(MCErrorGetMessage(In(t_error))); else ctxt . SetTheResultToStaticCString("failed to load module"); - MCValueRelease(t_stream); return; } - MCValueRelease(t_stream); - - MCEngineAddExtensionFromModule(t_module); + MCEngineAddExtensionFromModule(*t_module); if (p_resource_path != nil) - MCEngineAddResourcePathForModule(t_module, p_resource_path); - - MCScriptReleaseModule(t_module); + MCEngineAddResourcePathForModule(*t_module, p_resource_path); return; } diff --git a/libscript/include/libscript/script.h b/libscript/include/libscript/script.h index 2478a899771..af4f6a92b28 100644 --- a/libscript/include/libscript/script.h +++ b/libscript/include/libscript/script.h @@ -162,6 +162,9 @@ bool MCScriptUnloadPackage(MCScriptPackageRef package); // Load a module from a stream. bool MCScriptCreateModuleFromStream(MCStreamRef stream, MCScriptModuleRef& r_module); +// Load a module from a blob +MC_DLLEXPORT bool MCScriptCreateModuleFromData(MCDataRef data, MCScriptModuleRef & r_module); + // Lookup the module with the given name. Returns false if no such module exists. bool MCScriptLookupModule(MCNameRef name, MCScriptModuleRef& r_module); diff --git a/libscript/src/script-module.cpp b/libscript/src/script-module.cpp index ebd012a2042..a0be272b1df 100755 --- a/libscript/src/script-module.cpp +++ b/libscript/src/script-module.cpp @@ -18,6 +18,7 @@ #include #include "libscript/script.h" +#include #include "script-private.h" #include @@ -502,6 +503,25 @@ bool MCScriptCreateModuleFromStream(MCStreamRef stream, MCScriptModuleRef& r_mod return true; } +MC_DLLEXPORT_DEF bool +MCScriptCreateModuleFromData (MCDataRef data, + MCScriptModuleRef & r_module) +{ + MCAutoValueRefBase t_stream; + MCAutoScriptModuleRef t_module; + + if (!MCMemoryInputStreamCreate (MCDataGetBytePtr (data), + MCDataGetLength (data), + &t_stream)) + return false; + + if (!MCScriptCreateModuleFromStream (*t_stream, &t_module)) + return false; + + r_module = MCScriptRetainModule (*t_module); + return true; +} + bool MCScriptLookupModule(MCNameRef p_name, MCScriptModuleRef& r_module) { for(MCScriptModule *t_module = s_modules; t_module != nil; t_module = t_module -> next_module) diff --git a/toolchain/lc-compile/src/lc-run.cpp b/toolchain/lc-compile/src/lc-run.cpp index b2972d0815b..ea10e7e3641 100644 --- a/toolchain/lc-compile/src/lc-run.cpp +++ b/toolchain/lc-compile/src/lc-run.cpp @@ -348,18 +348,12 @@ MCRunLoadModule (MCStringRef p_filename, MCScriptModuleRef & r_module) { MCAutoDataRef t_module_data; - MCAutoValueRefBase t_stream; MCAutoScriptModuleRef t_module; if (!MCSFileGetContents (p_filename, &t_module_data)) return false; - if (!MCMemoryInputStreamCreate (MCDataGetBytePtr (*t_module_data), - MCDataGetLength (*t_module_data), - &t_stream)) - return false; - - if (!MCScriptCreateModuleFromStream (*t_stream, &t_module)) + if (!MCScriptCreateModuleFromData (*t_module_data, &t_module)) return false; r_module = MCScriptRetainModule (*t_module);