Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 5 additions & 12 deletions engine/src/exec-extension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "uuid.h"

#include "libscript/script.h"
#include "libscript/script-auto.h"

////////////////////////////////////////////////////////////////////////////////

Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions libscript/include/libscript/script.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
20 changes: 20 additions & 0 deletions libscript/src/script-module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <foundation-auto.h>

#include "libscript/script.h"
#include <libscript/script-auto.h>
#include "script-private.h"

#include <stddef.h>
Expand Down Expand Up @@ -502,6 +503,25 @@ bool MCScriptCreateModuleFromStream(MCStreamRef stream, MCScriptModuleRef& r_mod
return true;
}

MC_DLLEXPORT_DEF bool
MCScriptCreateModuleFromData (MCDataRef data,
MCScriptModuleRef & r_module)
{
MCAutoValueRefBase<MCStreamRef> 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)
Expand Down
8 changes: 1 addition & 7 deletions toolchain/lc-compile/src/lc-run.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,18 +348,12 @@ MCRunLoadModule (MCStringRef p_filename,
MCScriptModuleRef & r_module)
{
MCAutoDataRef t_module_data;
MCAutoValueRefBase<MCStreamRef> 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);
Expand Down