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

Commit 6bc3a48

Browse files
committed
[[ Script ]] Added MCScriptInitialize / MCScriptFinalize which load in all builtin modules.
1 parent 3f664eb commit 6bc3a48

2 files changed

Lines changed: 75 additions & 0 deletions

File tree

libscript/include/script.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ typedef MCScriptInstance *MCScriptInstanceRef;
1919

2020
////////////////////////////////////////////////////////////////////////////////
2121

22+
bool MCScriptInitialize(void);
23+
void MCScriptFinalize(void);
24+
25+
////////////////////////////////////////////////////////////////////////////////
26+
2227
// Packages are a collection of modules which share a common set of foreign
2328
// code and resources.
2429
//

libscript/src/script-object.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,52 @@
33

44
////////////////////////////////////////////////////////////////////////////////
55

6+
struct MCBuiltinModule
7+
{
8+
unsigned char *data;
9+
unsigned long size;
10+
};
11+
12+
static MCScriptModuleRef *s_builtin_modules = nil;
13+
static uindex_t s_builtin_module_count = 0;
14+
static bool MCFetchBuiltinModuleSection(MCBuiltinModule*& r_modules, unsigned int& r_count);
15+
16+
bool MCScriptInitialize(void)
17+
{
18+
MCBuiltinModule *t_modules;
19+
unsigned int t_module_count;
20+
if (!MCFetchBuiltinModuleSection(t_modules, t_module_count))
21+
return true;
22+
23+
if (!MCMemoryNewArray(t_module_count, s_builtin_modules))
24+
return false;
25+
26+
for(uindex_t i = 0; i < t_module_count; i++)
27+
{
28+
MCStreamRef t_stream;
29+
if (!MCMemoryInputStreamCreate(t_modules[i] . data, t_modules[i] . size, t_stream))
30+
return false;
31+
32+
if (!MCScriptCreateModuleFromStream(t_stream, s_builtin_modules[i]))
33+
return false;
34+
35+
MCValueRelease(t_stream);
36+
}
37+
38+
s_builtin_module_count = t_module_count;
39+
40+
return false;
41+
}
42+
43+
void MCScriptFinalize(void)
44+
{
45+
for(uindex_t i = 0; i < s_builtin_module_count; i++)
46+
MCScriptReleaseModule(s_builtin_modules[i]);
47+
MCMemoryDeleteArray(s_builtin_modules);
48+
}
49+
50+
////////////////////////////////////////////////////////////////////////////////
51+
652
bool MCScriptCreateObject(MCScriptObjectKind p_kind, size_t p_size, MCScriptObject*& r_object)
753
{
854
MCScriptObject *self;
@@ -97,3 +143,27 @@ void __MCScriptAssertFailed__(const char *label, const char *expr, const char *f
97143
}
98144

99145
////////////////////////////////////////////////////////////////////////////////
146+
147+
#if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
148+
149+
#include <mach-o/loader.h>
150+
#include <mach-o/getsect.h>
151+
#include <mach-o/dyld.h>
152+
153+
static bool MCFetchBuiltinModuleSection(MCBuiltinModule*& r_modules, unsigned int& r_count)
154+
{
155+
156+
unsigned long t_section_data_size;
157+
char *t_section_data;
158+
t_section_data = getsectdata("__MODULES", "__modules", &t_section_data_size);
159+
if (t_section_data != nil)
160+
{
161+
t_section_data += (unsigned long)_dyld_get_image_vmaddr_slide(0);
162+
r_modules = (MCBuiltinModule *)t_section_data;
163+
r_count = t_section_data_size / sizeof(MCBuiltinModule);
164+
return true;
165+
}
166+
167+
return false;
168+
}
169+
#endif

0 commit comments

Comments
 (0)