vector<ByteCode> Program::binaries() const { vector<ByteCode> bins; cl_uint size; if((size = detail::programInfo<cl_uint>(_id, CL_PROGRAM_NUM_DEVICES)) == 0) return bins; vector<size_t> binSizes(size); if(!detail::programInfo(_id, CL_PROGRAM_BINARY_SIZES, binSizes.data(), size)) return bins; vector<unsigned char*> binPtrs; for(size_t i = 0; i < size; ++i) { bins.push_back(ByteCode(binSizes[i], '\0')); binPtrs.push_back(bins[i].data()); } cl_int error; if((error = clGetProgramInfo(_id, CL_PROGRAM_BINARIES, size * sizeof(unsigned char*), binPtrs.data(), nullptr)) != CL_SUCCESS) { detail::reportError("Program::binaries(): ", error); return vector<ByteCode>(); } return bins; }
void TypeReader::deserializeClass(Type *type, json_t *classJSON) { utString sbaseType = json_string_value( json_object_get(classJSON, "baseType")); if (sbaseType.size() > 0) { Type *baseType = type->getModule()->getAssembly()->getLuaState()->getType( sbaseType.c_str()); lmAssert(baseType != NULL, "Unable to resolve type '%s' referenced as base of type '%s'", sbaseType.c_str(), type->getFullName().c_str()); type->setBaseType(baseType); } json_t *jinterfaces = json_object_get(classJSON, "interfaces"); for (size_t i = 0; i < json_array_size(jinterfaces); i++) { json_t *o = json_array_get(jinterfaces, i); utString sface = json_string_value(o); Type *itype = type->getModule()->getAssembly()->getLuaState()->getType( sface.c_str()); assert(itype); type->addInterface(itype); } json_t *jdelegateTypes = json_object_get(classJSON, "delegateTypes"); for (size_t i = 0; i < json_array_size(jdelegateTypes); i++) { json_t *o = json_array_get(jdelegateTypes, i); utString stype = json_string_value(o); Type *itype = type->getModule()->getAssembly()->getLuaState()->getType( stype.c_str()); assert(itype); type->addDelegateType(itype); } utString sdelegateReturnType = json_string_value( json_object_get(classJSON, "delegateReturnType")); if (sdelegateReturnType.size() > 0) { Type *delegateReturnType = type->getModule()->getAssembly()->getLuaState()->getType( sdelegateReturnType.c_str()); assert(delegateReturnType); type->setDelegateReturnType(delegateReturnType); } // meta data MemberInfoReader::deserializeMetaInfo(type, json_object_get(classJSON, "metainfo")); // handle imports json_t *iarray = json_object_get(classJSON, "imports"); for (size_t i = 0; i < json_array_size(iarray); i++) { json_t *jimport = json_array_get(iarray, i); utString import = json_string_value(jimport); Type *timport = type->getModule()->getAssembly()->getLuaState()->getType( import.c_str()); type->addImport(timport); } json_t *jconstructor = json_object_get(classJSON, "constructor"); if (jconstructor) { MethodBase *m = NULL; m = MethodReader::deserializeConstructorInfo(type, jconstructor); type->addMember(m); } // handle fields json_t *farray = json_object_get(classJSON, "fields"); for (size_t i = 0; i < json_array_size(farray); i++) { json_t *fo = json_array_get(farray, i); FieldInfo *f = FieldInfoReader::deserializeFieldInfo(type, fo); type->addMember(f); } // handle properties json_t *parray = json_object_get(classJSON, "properties"); for (size_t i = 0; i < json_array_size(parray); i++) { json_t *po = json_array_get(parray, i); PropertyInfo *p = PropertyInfoReader::deserializePropertyInfo(type, po); type->addMember(p); } // handle methods farray = json_object_get(classJSON, "methods"); for (size_t i = 0; i < json_array_size(farray); i++) { json_t *fo = json_array_get(farray, i); MethodBase *m = NULL; m = MethodReader::deserializeMethodInfo(type, fo); type->addMember(m); } ByteCode *byteCode; byteCode = lmNew(NULL) ByteCode(); byteCode->setBase64(utString(json_string_value(json_object_get(classJSON, "bytecode_staticinitializer")))); #if LOOM_ENABLE_JIT byteCode->setBase64(utString(json_string_value(json_object_get(classJSON, "bytecode_staticinitializer_fr2")))); #endif type->setBCStaticInitializer(byteCode); byteCode = lmNew(NULL) ByteCode(); byteCode->setBase64(utString(json_string_value(json_object_get(classJSON, "bytecode_instanceinitializer")))); #if LOOM_ENABLE_JIT byteCode->setBase64(utString(json_string_value(json_object_get(classJSON, "bytecode_instanceinitializer_fr2")))); #endif type->setBCInstanceInitializer(byteCode); }