|
3 | 3 |
|
4 | 4 | //////////////////////////////////////////////////////////////////////////////// |
5 | 5 |
|
| 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 | + |
6 | 52 | bool MCScriptCreateObject(MCScriptObjectKind p_kind, size_t p_size, MCScriptObject*& r_object) |
7 | 53 | { |
8 | 54 | MCScriptObject *self; |
@@ -97,3 +143,27 @@ void __MCScriptAssertFailed__(const char *label, const char *expr, const char *f |
97 | 143 | } |
98 | 144 |
|
99 | 145 | //////////////////////////////////////////////////////////////////////////////// |
| 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