Assembly *AssemblyReader::deserialize(LSLuaState *vm, const utString& sjson) { json_error_t jerror; json_t *json = json_loadb(sjson.c_str(), sjson.size(), 0, &jerror); lmAssert(json, "Error loading Assembly json: %s\n %s %i\n", jerror.source, jerror.text, jerror.line); utString type = json_string_value(json_object_get(json, "type")); utString name = json_string_value(json_object_get(json, "name")); utString version = json_string_value(json_object_get(json, "version")); utString loomconfig = json_string_value(json_object_get(json, "loomconfig")); bool executable = false; if (json_object_get(json, "executable") && json_is_true(json_object_get(json, "executable"))) { executable = true; parseLinkedAssemblies(json); printf("Loading executable assembly: %s.loom\n", name.c_str()); } if (type != "ASSEMBLY") { LSError("Assembly %s type string not found", name.c_str()); } #ifdef LOOM_ENABLE_JIT if (!json_is_true(json_object_get(json, "jit"))) { LSError("Assembly %s.loom has interpreted bytecode, JIT required", name.c_str()); } #else if (json_is_true(json_object_get(json, "jit"))) { LSError("Assembly %s.loom has JIT bytecode, interpreted required", name.c_str()); } #endif Assembly *assembly = Assembly::create(vm, name); assembly->setLoomConfig(loomconfig); if (json_is_false(json_object_get(json, "debugbuild"))) { assembly->setDebugBuild(false); } else { assembly->setDebugBuild(true); } // load references json_t *refArray = json_object_get(json, "references"); for (UTsize i = 0; i < json_array_size(refArray); i++) { Assembly *rasm = NULL; json_t *ref = json_array_get(refArray, i); utString refname = json_string_value(json_object_get(ref, "name")); assembly->addReference(refname); // if we've already loaded this assembly continue if (vm->getAssembly(refname)) { continue; } utString *sjson = linkedAssemblies.get(utHashedString(refname)); if (sjson) { rasm = vm->loadAssemblyJSON(*sjson); } else { utString fileJSON; if (loadLibraryAssemblyJSON(refname, fileJSON)) { rasm = vm->loadAssemblyJSON(fileJSON); } else { lmAssert(0, "Unable to load assembly '%s' as either a library or an executable!'", refname.c_str()); } } } // modules json_t *moduleArray = json_object_get(json, "modules"); // first pass is to declare module types for (UTsize i = 0; i < json_array_size(moduleArray); i++) { json_t *jmodule = json_array_get(moduleArray, i); ModuleReader::declareTypes(assembly, jmodule); } // next pass is to deserialize fully for (UTsize i = 0; i < json_array_size(moduleArray); i++) { json_t *jmodule = json_array_get(moduleArray, i); ModuleReader::deserialize(assembly, jmodule); } if (executable) { linkedAssemblies.clear(); } return assembly; }