slang_rs_reflection.cpp revision 9c631ff2e65a8fa766981c9683c3b255ce0a2388
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp" 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_var.hpp" 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_reflection.hpp" 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_func.hpp" 53f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang#include "slang_rs_reflect_utils.hpp" 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <ctype.h> 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <utility> 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdarg> 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 122239ecece40c177e071f56326cd5ef423806394dShih-wei Liao#include "llvm/ADT/APFloat.h" 138b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::make_pair; 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::endl; 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX "ScriptC_" 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC" 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_NAME_PREFIX "ScriptField_" 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME "android.renderscript.Script.FieldBase" 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME "Item" 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME "mItemArray" 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME "mIOBuffer" 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX "mExportVarIdx_" 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_PREFIX "mExportVar_" 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX "mExportFuncIdx_" 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX "mAlloction_" 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_" 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/* Some utility function using internal in RSReflection */ 403f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wangstatic bool GetClassNameFromFileName(const std::string& FileName, std::string& ClassName) { 413f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang ClassName.clear(); 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FileName.empty() || (FileName == "-")) 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 463f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang ClassName = RSSlangReflectUtils::JavaClassNameFromRSFileName(FileName.c_str()); 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPrimitiveTypeName(const RSExportPrimitiveType* EPT) { 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveTypeJavaNameMap[] = { 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "float", /* RSExportPrimitiveType::DataTypeFloat32 */ 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "double", /* RSExportPrimitiveType::DataTypeFloat64 */ 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "byte", /* RSExportPrimitiveType::DataTypeSigned8 */ 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "short", /* RSExportPrimitiveType::DataTypeSigned16 */ 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", /* RSExportPrimitiveType::DataTypeSigned32 */ 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "long", /* RSExportPrimitiveType::DataTypeSigned64 */ 61c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "short", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 62c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 63c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "long", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "long", /* RSExportPrimitiveType::DataTypeUnsigned64 */ 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 66c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 67c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 68c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 701f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao "boolean", /* RSExportPrimitiveType::DataTypeBool */ 71dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element", /* RSExportPrimitiveType::DataTypeRSElement */ 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Type", /* RSExportPrimitiveType::DataTypeRSType */ 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Allocation", /* RSExportPrimitiveType::DataTypeRSAllocation */ 75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Sampler", /* RSExportPrimitiveType::DataTypeRSSampler */ 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Script", /* RSExportPrimitiveType::DataTypeRSScript */ 77f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "Mesh", /* RSExportPrimitiveType::DataTypeRSMesh */ 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramFragment", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramVertex", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramRaster", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramStore", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 82bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "Font", /* RSExportPrimitiveType::DataTypeRSFont */ 83ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao "Matrix2f", /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */ 84ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao "Matrix3f", /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */ 85ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao "Matrix4f", /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */ 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 881f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypeJavaNameMap) / sizeof(const char*)))) { 891f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao // printf("Type %d\n", EPT->getType()); 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveTypeJavaNameMap[ EPT->getType() ]; 911f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao } 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "GetPrimitiveTypeName : Unknown primitive data type"); 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetVectorTypeName(const RSExportVectorType* EVT) { 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* VectorTypeJavaNameMap[][3] = { 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 0 */ { "Byte2", "Byte3", "Byte4" }, 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 1 */ { "Short2", "Short3", "Short4" }, 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 2 */ { "Int2", "Int3", "Int4" }, 102c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao /* 3 */ { "Long2", "Long3", "Long4" }, 103c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao /* 4 */ { "Float2", "Float3", "Float4" }, 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char** BaseElement; 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(EVT->getType()) { 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned8: 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[0]; 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned16: 114c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned8: 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[1]; 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned32: 119c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned16: 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[2]; 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 123c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned32: 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[3]; 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1272dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao case RSExportPrimitiveType::DataTypeFloat32: 128c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao BaseElement = VectorTypeJavaNameMap[4]; 129c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao break; 130c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao 1311f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao case RSExportPrimitiveType::DataTypeBool: 1321f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao BaseElement = VectorTypeJavaNameMap[0]; 1331f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao break; 1341f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "RSReflection::genElementTypeName : Unsupported vector element data type"); 137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EVT->getNumElement() > 1) && (EVT->getNumElement() <= 4) && "Number of element in vector type is invalid"); 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return BaseElement[EVT->getNumElement() - 2]; 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 145324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaostatic const char* GetVectorAccessor(int Index) { 146324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao static const char* VectorAccessorMap[] = { 147324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 0 */ "x", 148324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 1 */ "y", 149324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 2 */ "z", 150324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 3 */ "w", 151324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao }; 152324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 153324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert((Index >= 0) && (Index < (sizeof(VectorAccessorMap) / sizeof(const char*))) && "Out-of-bound index to access vector member"); 154324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 155324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao return VectorAccessorMap[Index]; 156324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 157324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPackerAPIName(const RSExportPrimitiveType* EPT) { 159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveTypePackerAPINameMap[] = { 160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addF32", /* RSExportPrimitiveType::DataTypeFloat32 */ 163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addF64", /* RSExportPrimitiveType::DataTypeFloat64 */ 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI8", /* RSExportPrimitiveType::DataTypeSigned8 */ 165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI16", /* RSExportPrimitiveType::DataTypeSigned16 */ 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI32", /* RSExportPrimitiveType::DataTypeSigned32 */ 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI64", /* RSExportPrimitiveType::DataTypeSigned64 */ 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU64", /* RSExportPrimitiveType::DataTypeUnsigned64 */ 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 177dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao "addBoolean", /* RSExportPrimitiveType::DataTypeBool */ 178dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSElement */ 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSType */ 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSAllocation */ 182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSSampler */ 183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSScript */ 184f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSMesh */ 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 189bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSFont */ 190ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */ 191ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */ 192ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */ 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*)))) 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveTypePackerAPINameMap[ EPT->getType() ]; 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "GetPackerAPIName : Unknown primitive data type"); 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic std::string GetTypeName(const RSExportType* ET) { 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 205f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao case RSExportType::ExportClassConstantArray: 206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetPrimitiveTypeName(static_cast<const RSExportPrimitiveType*>(ET)); 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() != RSExportType::ExportClassRecord) 214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "Allocation"; 215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName(); 217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET)); 222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ""; 234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetBuiltinElementConstruct(const RSExportType* ET) { 237f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (ET->getClass() == RSExportType::ExportClassPrimitive || ET->getClass() == RSExportType::ExportClassConstantArray) { 238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 239f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EPT->getKind() == RSExportPrimitiveType::DataKindUser) { 240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveBuiltinElementConstructMap[] = { 241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 243bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "F32", /* RSExportPrimitiveType::DataTypeFloat32 */ 244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeFloat64 */ 245bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "I8", /* RSExportPrimitiveType::DataTypeSigned8 */ 246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned16 */ 247bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "I32", /* RSExportPrimitiveType::DataTypeSigned32 */ 248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned64 */ 249bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "U8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned16 */ 251bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "U32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned64 */ 253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned565 */ 255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 258dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao "BOOLEAN", /* RSExportPrimitiveType::DataTypeBool */ 259dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 260bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */ 261bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "TYPE", /* RSExportPrimitiveType::DataTypeRSType */ 262bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "ALLOCATION", /* RSExportPrimitiveType::DataTypeRSAllocation */ 263bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "SAMPLER", /* RSExportPrimitiveType::DataTypeRSSampler */ 264bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "SCRIPT", /* RSExportPrimitiveType::DataTypeRSScript */ 265f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "MESH", /* RSExportPrimitiveType::DataTypeRSMesh */ 266bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 267bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_VERTEX", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 268bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_RASTER", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 269bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_STORE", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 270bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "FONT", /* RSExportPrimitiveType::DataTypeRSFont */ 271fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao "MATRIX_2X2", /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */ 272fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao "MATRIX_3X3", /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */ 273fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao "MATRIX_4X4", /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */ 274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 276f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if ((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*)))) 277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveBuiltinElementConstructMap[ EPT->getType() ]; 278f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) { 279f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "A_8"; 281f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) { 282f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565) 283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_565"; 284f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_888"; 286f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) { 287f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551) 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_5551"; 289f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444) 290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_4444"; 291f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_8888"; 293f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindIndex) { 294f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned16) 295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "INDEX_16"; 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 297f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassVector) { 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET); 299f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getKind() == RSExportPrimitiveType::DataKindPosition) { 300f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 301f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getNumElement() == 2) 302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_POSITION_2"; 303f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao else if (EVT->getNumElement() == 3) 304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_POSITION_3"; 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 306f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EVT->getKind() == RSExportPrimitiveType::DataKindTexture) { 307f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 308f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getNumElement() == 2) 309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_TEXTURE_2"; 310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 311f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EVT->getKind() == RSExportPrimitiveType::DataKindNormal) { 312f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 313f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getNumElement() == 3) 314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_NORMAL_3"; 315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 316f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EVT->getKind() == RSExportPrimitiveType::DataKindColor) { 317f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 318f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getNumElement() == 4) 319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_COLOR_F32_4"; 320f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) { 321f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EVT->getNumElement() == 4) 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_COLOR_U8_4"; 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 325f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 326c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao return "USER_I32"; /* tread pointer type variable as unsigned int (TODO: this is target dependent) */ 327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataKindName(RSExportPrimitiveType::DataKind DK) { 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* ElementDataKindNameMap[] = { 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.USER", /* RSExportPrimitiveType::DataKindUser */ 335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.COLOR", /* RSExportPrimitiveType::DataKindColor */ 336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.POSITION", /* RSExportPrimitiveType::DataKindPosition */ 337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.TEXTURE", /* RSExportPrimitiveType::DataKindTexture */ 338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.NORMAL", /* RSExportPrimitiveType::DataKindNormal */ 339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.INDEX", /* RSExportPrimitiveType::DataKindIndex */ 340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.POINT_SIZE", /* RSExportPrimitiveType::DataKindPointSize */ 341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_L", /* RSExportPrimitiveType::DataKindPixelL */ 342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_A", /* RSExportPrimitiveType::DataKindPixelA */ 343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_LA", /* RSExportPrimitiveType::DataKindPixelLA */ 344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_RGB", /* RSExportPrimitiveType::DataKindPixelRGB */ 345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_RGBA", /* RSExportPrimitiveType::DataKindPixelRGBA */ 346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DK >= 0) && (DK < (sizeof(ElementDataKindNameMap) / sizeof(const char*)))) 349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ElementDataKindNameMap[ DK ]; 350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataTypeName(RSExportPrimitiveType::DataType DT) { 355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* ElementDataTypeNameMap[] = { 356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.FLOAT_32", /* RSExportPrimitiveType::DataTypeFloat32 */ 359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeFloat64 */ 360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_8", /* RSExportPrimitiveType::DataTypeSigned8 */ 361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_16", /* RSExportPrimitiveType::DataTypeSigned16 */ 362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_32", /* RSExportPrimitiveType::DataTypeSigned32 */ 363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned64 */ 364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_16", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned64 */ 368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_5_6_5", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_5_5_5_1", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_4_4_4_4", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 373dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao "Element.DataType.BOOLEAN", /* RSExportPrimitiveType::DataTypeBool */ 374dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */ 376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_TYPE", /* RSExportPrimitiveType::DataTypeRSType */ 377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_ALLOCATION", /* RSExportPrimitiveType::DataTypeRSAllocation */ 378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_SAMPLER", /* RSExportPrimitiveType::DataTypeRSSampler */ 379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_SCRIPT", /* RSExportPrimitiveType::DataTypeRSScript */ 380f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "Element.DataType.RS_MESH", /* RSExportPrimitiveType::DataTypeRSMesh */ 381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_VERTEX", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_RASTER", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 384462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_STORE", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 385bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "Element.DataType.RS_FONT", /* RSExportPrimitiveType::DataTypeRSFont */ 386fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao "Element.DataType.RS_MATRIX_2X2", /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */ 387fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao "Element.DataType.RS_MATRIX_3X3", /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */ 388fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao "Element.DataType.RS_MATRIX_4X4", /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */ 389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DT >= 0) && (DT < (sizeof(ElementDataTypeNameMap) / sizeof(const char*)))) 392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ElementDataTypeNameMap[ DT ]; 393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 395462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 396462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3978b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liaobool RSReflection::openScriptFile(Context&C, const std::string& ClassName, std::string& ErrorMsg) { 3986de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao if(!C.mUseStdout) { 3996de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao C.mOF.clear(); 4003f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang std::string _path = RSSlangReflectUtils::ComputePackagedPath( 4010877f0557e5c406fc8ff33c928a8ae969a5f4905Ying Wang mRSContext->getReflectJavaPathName().c_str(), C.getPackageName().c_str()); 4028b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4033f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang RSSlangReflectUtils::mkdir_p(_path.c_str()); 4048b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao C.mOF.open(( _path + "/" + ClassName + ".java" ).c_str()); 4056de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao if(!C.mOF.good()) { 4068b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao ErrorMsg = "failed to open file '" + _path + "/" + ClassName + ".java' for write"; 4078b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4086de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao return false; 4096de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao } 4106de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao } 4118b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao return true; 4128b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao} 4138b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4148b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao/****************************** Methods to generate script class ******************************/ 4158b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liaobool RSReflection::genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg) { 4168b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao /* Open the file */ 4178b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if (!openScriptFile(C, ClassName, ErrorMsg)) { 4188b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao return false; 4198b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao } 4206de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 4212dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!C.startClass(Context::AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 422462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 423462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genScriptClassConstructor(C); 425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Reflect export variable */ 427462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(); 428462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mRSContext->export_vars_end(); 429462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 430462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genExportVariable(C, *I); 431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 432462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Reflect export function */ 433462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_func_iterator I = mRSContext->export_funcs_begin(); 434462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mRSContext->export_funcs_end(); 435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 436462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genExportFunction(C, *I); 437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endClass(); 439462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 440462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 441462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 442462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 443462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genScriptClassConstructor(Context& C) { 444462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "// Constructor" << endl; 4452dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 4, "RenderScript", "rs", 446462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Resources", "resources", 4472dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao "int", "id", 448462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "boolean", "isRoot"); 449462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Call constructor of super class */ 4502dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.indent() << "super(rs, resources, id, isRoot);" << endl; 451324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 452324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* If an exported variable has initial value, reflect it */ 453324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 454324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(); 455324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I != mRSContext->export_vars_end(); 456324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I++) 457324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 458324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportVar* EV = *I; 459324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao if(!EV->getInit().isUninit()) 460324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit()); 461324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 462324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 463462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 46748bac230fe966771f3074975fc2426ffde519edfShih-wei Liaovoid RSReflection::genInitBoolExportVariable(Context& C, const std::string& VarName, const APValue& Val) { 46848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao assert(!Val.isUninit() && "Not a valid initializer"); 46948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 47048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 47148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao assert((Val.getKind() == APValue::Int) && "Bool type has wrong initial APValue"); 47248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 47348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao if (Val.getInt().getSExtValue() == 0) { 47448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.out() << "false"; 47548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } else { 47648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.out() << "true"; 47748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 47848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.out() << ";" << endl; 47948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 48048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao return; 48148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 48248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 483324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaovoid RSReflection::genInitPrimitiveExportVariable(Context& C, const std::string& VarName, const APValue& Val) { 484324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(!Val.isUninit() && "Not a valid initializer"); 485324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 486324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 487324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao switch(Val.getKind()) { 4882239ecece40c177e071f56326cd5ef423806394dShih-wei Liao case APValue::Int: C.out() << Val.getInt().getSExtValue(); break; 4892239ecece40c177e071f56326cd5ef423806394dShih-wei Liao 4902239ecece40c177e071f56326cd5ef423806394dShih-wei Liao case APValue::Float: { 4912239ecece40c177e071f56326cd5ef423806394dShih-wei Liao llvm::APFloat apf = Val.getFloat(); 4922239ecece40c177e071f56326cd5ef423806394dShih-wei Liao if (apf.semanticsPrecision(apf.getSemantics()) == 24 /*llvm::APFloat::IEEEsingle*/) { 4932239ecece40c177e071f56326cd5ef423806394dShih-wei Liao C.out() << apf.convertToFloat(); 4942239ecece40c177e071f56326cd5ef423806394dShih-wei Liao } else { 4952239ecece40c177e071f56326cd5ef423806394dShih-wei Liao C.out() << apf.convertToDouble(); 4962239ecece40c177e071f56326cd5ef423806394dShih-wei Liao } 497324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 4982239ecece40c177e071f56326cd5ef423806394dShih-wei Liao } 499324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 5002239ecece40c177e071f56326cd5ef423806394dShih-wei Liao case APValue::ComplexInt: 5012239ecece40c177e071f56326cd5ef423806394dShih-wei Liao case APValue::ComplexFloat: 5022239ecece40c177e071f56326cd5ef423806394dShih-wei Liao case APValue::LValue: 5032239ecece40c177e071f56326cd5ef423806394dShih-wei Liao case APValue::Vector: 5042239ecece40c177e071f56326cd5ef423806394dShih-wei Liao assert(false && "Primitive type cannot have such kind of initializer"); 5052239ecece40c177e071f56326cd5ef423806394dShih-wei Liao break; 5062239ecece40c177e071f56326cd5ef423806394dShih-wei Liao 5072239ecece40c177e071f56326cd5ef423806394dShih-wei Liao default: 5082239ecece40c177e071f56326cd5ef423806394dShih-wei Liao assert(false && "Unknown kind of initializer"); 509324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 510324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 511324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.out() << ";" << endl; 512324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 513324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao return; 514324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 515324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 516324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaovoid RSReflection::genInitExportVariable(Context& C, const RSExportType* ET, const std::string& VarName, const APValue& Val) { 517324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(!Val.isUninit() && "Not a valid initializer"); 518324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 519324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao switch(ET->getClass()) { 520f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao case RSExportType::ExportClassPrimitive: 521f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao case RSExportType::ExportClassConstantArray: 522f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao { 52348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 52448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeBool) { 52548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao genInitBoolExportVariable(C, VarName, Val); 52648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } else { 52748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao genInitPrimitiveExportVariable(C, VarName, Val); 52848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 52948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao break; 53048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 531324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 532324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case RSExportType::ExportClassPointer: 533324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao if(!Val.isInt() || Val.getInt().getSExtValue() != 0) 534324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::cout << "Initializer which is non-NULL to pointer type variable will be ignored" << endl; 535324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 536324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 537324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case RSExportType::ExportClassVector: 538324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 539324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET); 540324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao switch(Val.getKind()) { 541324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Int: 542324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Float: 543324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(int i=0;i<EVT->getNumElement();i++) { 544324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 545324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitPrimitiveExportVariable(C, Name, Val); 546324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 547324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 548324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 549324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Vector: 550324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 551324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " << GetVectorTypeName(EVT) << "();" << endl; 552324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 553324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao unsigned NumElements = std::min(static_cast<unsigned>(EVT->getNumElement()), Val.getVectorLength()); 554324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(unsigned i=0;i<NumElements;i++) { 555324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const APValue& ElementVal = Val.getVectorElt(i); 556324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 557324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitPrimitiveExportVariable(C, Name, ElementVal); 558324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 559324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 560324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 561324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 562324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 563324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 564324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 565324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* TODO: Resolving initializer of a record type variable is complex. It cannot obtain by just simply evaluating the initializer expression. */ 566324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case RSExportType::ExportClassRecord: 567324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 568324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 569324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao unsigned InitIndex = 0; 570324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 571324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 572324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert((Val.getKind() == APValue::Vector) && "Unexpected type of initializer for record type variable"); 573324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 574324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new "RS_TYPE_CLASS_NAME_PREFIX << ERT->getName() << "."RS_TYPE_ITEM_CLASS_NAME"();" << endl; 575324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 576324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 577324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I != ERT->fields_end(); 578324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I++) 579324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 580324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportRecordType::Field* F = *I; 581324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::string FieldName = VarName + "." + F->getName(); 582324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 583324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao if(InitIndex > Val.getVectorLength()) 584324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 585324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 586324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitPrimitiveExportVariable(C, FieldName, Val.getVectorElt(InitIndex++)); 587324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 588324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao */ 589324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(false && "Unsupported initializer for record type variable currently"); 590324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 591324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 592324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 593324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao default: 594324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(false && "Unknown class of type"); 595324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 596324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 597324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao return; 598324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 599324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 600462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportVariable(Context& C, const RSExportVar* EV) { 601462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 602462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 603462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << " = " << C.getNextExportVarSlot() << ";" << endl; 604462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 605462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 606462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 607f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao case RSExportType::ExportClassConstantArray: 608462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPrimitiveTypeExportVariable(C, EV); 609462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 610462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 611462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 612462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPointerTypeExportVariable(C, EV); 613462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 614462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 615462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 616462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genVectorTypeExportVariable(C, EV); 617462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 620462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genRecordTypeExportVariable(C, EV); 621462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 622462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 624462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 625462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 626462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 627462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 628462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 629462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 630462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 631462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportFunction(Context& C, const RSExportFunc* EF) { 632462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" << endl; 633462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 634462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* invoke_*() */ 635462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context::ArgTy Args; 636462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 637462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportFunc::const_param_iterator I = EF->params_begin(); 638462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != EF->params_end(); 6392dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao I++) 640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 641462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportFunc::Parameter* P = *I; 642462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Args.push_back( make_pair(GetTypeName(P->getType()), P->getName()) ); 643462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 644462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 645462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "invoke_" + EF->getName(), Args); 646462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 647462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!EF->hasParam()) { 6482dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" << endl; 649462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else { 650462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = EF->getParamPacketType(); 651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 652462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 655462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 656bdd788877b3f18980836a3ed0d46627169483653Shih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " << FieldPackerName << ");" << endl; 657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 659462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 661462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 662462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 663462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV) { 664f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao assert(( EV->getType()->getClass() == RSExportType::ExportClassPrimitive || 665f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao EV->getType()->getClass() == RSExportType::ExportClassConstantArray 666f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao ) && "Variable should be type of primitive here"); 667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(EV->getType()); 669462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* TypeName = GetPrimitiveTypeName(EPT); 670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 671462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 672462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 674c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(!EV->isConst()) { 675c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v"); 676c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 677462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 678c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(EPT->isRSObjectType()) 679c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", (v == null) ? 0 : v.getID());" << endl; 680c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao else 681c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", v);" << endl; 682462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 683c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.endFunction(); 684c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 685462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 686462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 687462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 688462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 689462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 690462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 691462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context& C, const RSExportVar* EV) { 692462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 693462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType; 694462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string TypeName; 695462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 696462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((ET->getClass() == RSExportType::ExportClassPointer) && "Variable should be type of pointer here"); 697462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 699462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TypeName = GetTypeName(ET); 700462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 701462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* bind_*() */ 702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 703462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 704462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "bind_" + EV->getName(), 1, TypeName.c_str(), "v"); 705462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 707462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if(v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 708462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 709462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() == RSExportType::ExportClassRecord) 710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "else bindAllocation(v.getAllocation(), "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 713462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 714462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 715462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 716462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 717462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 718462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context& C, const RSExportVar* EV) { 722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassVector) && "Variable should be type of vector here"); 723462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 724462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(EV->getType()); 725462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* TypeName = GetVectorTypeName(EVT); 726462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* FieldPackerName = "fp"; 727462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 728462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 729462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 731c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(!EV->isConst()) { 732c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v"); 733c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 734462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 735c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(genCreateFieldPacker(C, EVT, FieldPackerName)) 736c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao genPackVarOfType(C, EVT, "v", FieldPackerName); 737c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl; 738462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 739c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.endFunction(); 740c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 741462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 742462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 743462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 744462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 745462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 746462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context& C, const RSExportVar* EV) { 747462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && "Variable should be type of struct here"); 748462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 749462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(EV->getType()); 750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string TypeName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* FieldPackerName = "fp"; 752462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 753462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 754462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 755462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 756c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(!EV->isConst()) { 757c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName.c_str(), "v"); 758c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 759462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 760c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(genCreateFieldPacker(C, ERT, FieldPackerName)) 761c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao genPackVarOfType(C, ERT, "v", FieldPackerName); 762c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl; 763462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 764c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.endFunction(); 765c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 766462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 767462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName.c_str(), EV->getName()); 768462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 769462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 771462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName) { 772462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 773462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 774462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << endl; 775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 776462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 777462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 778462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 779462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 780462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class /end ******************************/ 781462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 782462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genCreateFieldPacker(Context& C, const RSExportType* ET, const char* FieldPackerName) { 783462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t AllocSize = RSExportType::GetTypeAllocSize(ET); 784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(AllocSize > 0) 785462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" << AllocSize << ");" << endl; 786462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 787462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 788462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 789462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 790462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 791462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPackVarOfType(Context& C, const RSExportType* ET, const char* VarName, const char* FieldPackerName) { 792462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 793462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 794462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 795462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << "." << GetPackerAPIName(static_cast<const RSExportPrimitiveType*>(ET)) << "(" << VarName << ");" << endl; 796462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 797462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7981ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao case RSExportType::ExportClassConstantArray: { 7991ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao if (ET->getName().compare("addObj") == 0) { 8001ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao C.indent() << FieldPackerName << "." << "addObj" << "(" << VarName << ");" << endl; 8011ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao } else { 8021ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao C.indent() << FieldPackerName << "." << GetPackerAPIName(static_cast<const RSExportPrimitiveType*>(ET)) << "(" << VarName << ");" << endl; 8031ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao } 8041ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao break; 8051ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao } 8061ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 807462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 808462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 809462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Must reflect as type Allocation in Java */ 810462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 811462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 812462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() != RSExportType::ExportClassRecord) 813c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());" << endl; 814462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 815c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName << ".getAllocation().getPtr());" << endl; 816462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 817462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 818462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 819462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 820462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 821462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 822462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao int Pos = 0; /* relative pos from now on in field packer */ 823462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 824462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 825462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != ERT->fields_end(); 826462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 827462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 828462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *I; 829462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string FieldName; 830462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 831462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 832462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 833462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 834462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(VarName != NULL) 835462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldName = VarName + ("." + F->getName()); 836462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 837462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldName = F->getName(); 838462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 839462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FieldOffset > Pos) 840462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) << ");" << endl; 841462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 842462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName); 843462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 844462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FieldAllocSize > FieldStoreSize) /* there's padding in the field type */ 845462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << (FieldAllocSize - FieldStoreSize) << ");" << endl; 846462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 847462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Pos = FieldOffset + FieldAllocSize; 848462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 849462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 850462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* There maybe some padding after the struct */ 851462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos; 852462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(Padding > 0) 853462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << Padding << ");" << endl; 854462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 855462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 856462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 857462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 858462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 859462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 861462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 862462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 863462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 864462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8659c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genNewItemBufferIfNull(Context& C, const char* Index) { 8669c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) " 8679c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao RS_TYPE_ITEM_BUFFER_NAME" = new "RS_TYPE_ITEM_CLASS_NAME"[mType.getX() /* count */];" << endl; 8689c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao if (Index != NULL) 8699c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] == null) " 8709c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] = new "RS_TYPE_ITEM_CLASS_NAME"();" << endl; 8719c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao return; 8729c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 8739c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 8749c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genNewItemBufferPackerIfNull(Context& C) { 8759c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_PACKER_NAME" == null) " 8769c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao RS_TYPE_ITEM_BUFFER_PACKER_NAME" = new FieldPacker("RS_TYPE_ITEM_CLASS_NAME".sizeof * mType.getX() /* count */);" << endl; 8779c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao return; 8789c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 8799c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 880462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class ******************************/ 881462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) { 882462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8846de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao /* Open the file */ 8858b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if (!openScriptFile(C, ClassName, ErrorMsg)) { 8868b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao return false; 8876de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao } 8886de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 8892dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!C.startClass(Context::AM_Public, false, ClassName, RS_TYPE_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 891462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!genTypeItemClass(C, ERT, ErrorMsg)) 893462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Declare item buffer and item buffer packer */ 896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[];" << endl; 897462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" << endl; 898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClassConstructor(C, ERT); 900462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClassCopyToArray(C, ERT); 9019c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genTypeClassItemSetter(C, ERT); 9029c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genTypeClassItemGetter(C, ERT); 9039c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genTypeClassComponentSetter(C, ERT); 9049c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genTypeClassComponentGetter(C, ERT); 9059c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genTypeClassCopyAll(C, ERT); 906462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 907462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endClass(); 908462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 909462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 910462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 911462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 912462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) { 913462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME; 914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 915462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 916462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "public static final int sizeof = " << RSExportType::GetTypeAllocSize(ERT) << ";" << endl; 917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 918462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Member elements */ 919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.out() << endl; 920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 921462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 922f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao FI++) { 923462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() << ";" << endl; 924f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } 925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Constructor */ 927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.out() << endl; 928462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_CLASS_NAME"()"; 929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 932462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 9332dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao FI++) 934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 935462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *FI; 936f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if( (F->getType()->getClass() == RSExportType::ExportClassVector) || 937f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao (F->getType()->getClass() == RSExportType::ExportClassRecord) || 938f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao (F->getType()->getClass() == RSExportType::ExportClassConstantArray) 939f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao ) { 940f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao C.indent() << F->getName() << " = new " << GetTypeName(F->getType()) << "();" << endl; 941f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } 942462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 943462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 944462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end Constructor */ 945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 946462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end Item class */ 947462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 951462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassConstructor(Context& C, const RSExportRecordType* ERT) { 953462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* RenderScriptVar = "rs"; 954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9559e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.startFunction(Context::AM_Public, true, "Element", "createElement", 1, "RenderScript", RenderScriptVar); 9569e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao genBuildElement(C, ERT, RenderScriptVar); 9579e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.endFunction(); 9589e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 959462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 2, "RenderScript", RenderScriptVar, 960462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "count"); 961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 962462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << endl; 963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << endl; 9649e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.indent() << "mElement = createElement(" << RenderScriptVar << ");" << endl; 965462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Call init() in super class */ 966462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "init(" << RenderScriptVar << ", count);" << endl; 967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 968462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 969462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 970462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 971462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 972462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT) { 973462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Private, false, "void", "copyToArray", 2, RS_TYPE_ITEM_CLASS_NAME, "i", 974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "index"); 975462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9769c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genNewItemBufferPackerIfNull(C); 977462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" << endl; 978462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 982462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 983462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9859c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genTypeClassItemSetter(Context& C, const RSExportRecordType* ERT) { 986462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set", 3, RS_TYPE_ITEM_CLASS_NAME, "i", 987462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "index", 988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "boolean", "copyNow"); 9899c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genNewItemBufferIfNull(C, NULL); 990462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << endl; 991462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if (copyNow) "; 993462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 9942dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "copyToArray(i, index);" << endl; 9969e98e006c1dd889ecac1bebf353500e7a54d490eShih-wei Liao C.indent() << "mAllocation.subData1D(index, 1, "RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 998462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end if (copyNow) */ 999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1000462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 1001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10049c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genTypeClassItemGetter(Context& C, const RSExportRecordType* ERT) { 10059b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao C.startFunction(Context::AM_Public, false, RS_TYPE_ITEM_CLASS_NAME, "get", 1, "int", "index"); 10069c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao //C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return null;" << endl; 10079b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index];" << endl; 10089b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao C.endFunction(); 10099b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao return; 10109b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao} 10119c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genTypeClassComponentSetter(Context& C, const RSExportRecordType* ERT) { 10129c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 10139c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao FI != ERT->fields_end(); 10149c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao FI++) 10159c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao { 10169c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao const RSExportRecordType::Field* F = *FI; 10179c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 10189c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 10199c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao unsigned FieldIndex = C.getFieldIndex(F); 10209c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10219c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + F->getName(), 3, "int", "index", 10229c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao GetTypeName(F->getType()).c_str(), "v", 10239c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao "boolean", "copyNow"); 10249c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genNewItemBufferPackerIfNull(C); 10259c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genNewItemBufferIfNull(C, "index"); 10269c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName() << " = v;" << endl; 10279c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10289c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "if (copyNow) "; 10299c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.startBlock(); 10309c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10319c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao if(FieldOffset > 0) 10329c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof + " << FieldOffset << ");" << endl; 10339c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao else 10349c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" << endl; 10359c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genPackVarOfType(C, F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 10369c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10379c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize << ");" << endl; 10389c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genPackVarOfType(C, F->getType(), "v", "fp"); 10399c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "mAllocation.subElementData(index, " << FieldIndex << ", fp);" << endl; 10409c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10419c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.endBlock(); /* end if (copyNow) */ 10429c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10439c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.endFunction(); 10449c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao } 10459c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao return; 10469c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10479c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10489c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genTypeClassComponentGetter(Context& C, const RSExportRecordType* ERT) { 10499c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 10509c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao FI != ERT->fields_end(); 10519c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao FI++) 10529c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao { 10539c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao const RSExportRecordType::Field* F = *FI; 10549c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.startFunction(Context::AM_Public, false, GetTypeName(F->getType()).c_str(), "get_" + F->getName(), 1, "int", "index"); 10559c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return null;" << endl; 10569c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName() << ";" << endl; 10579c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.endFunction(); 10589c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao } 10599c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao return; 10609c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10619b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 10629c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liaovoid RSReflection::genTypeClassCopyAll(Context& C, const RSExportRecordType* ERT) { 1063462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "copyAll", 0); 1064462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1065462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "for (int ct=0; ct < "RS_TYPE_ITEM_BUFFER_NAME".length; ct++) copyToArray("RS_TYPE_ITEM_BUFFER_NAME"[ct], ct);" << endl; 1066462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "mAllocation.data("RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 1067462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1068462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 1069462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1070462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1071462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1072462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class /end ******************************/ 1073462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1074462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type ********************/ 10759e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liaovoid RSReflection::genBuildElement(Context& C, const RSExportRecordType* ERT, const char* RenderScriptVar) { 1076462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ElementBuilderName = "eb"; 1077462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1078462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Create element builder */ 10799e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao // C.startBlock(true); 1080462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1081462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "Element.Builder " << ElementBuilderName << " = new Element.Builder(" << RenderScriptVar << ");" << endl; 1082462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1083462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* eb.add(...) */ 1084462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genAddElementToElementBuilder(C, ERT, "", ElementBuilderName, RenderScriptVar); 1085462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10869e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.indent() << "return " << ElementBuilderName << ".create();" << endl; 1087462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10889e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao // C.endBlock(); 1089462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1090462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1091462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1092462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define EB_ADD(x, ...) \ 10939c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.indent() << ElementBuilderName << ".add(Element." << x ##__VA_ARGS__ ", \"" << VarName << "\");" << endl; \ 10949c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.incFieldIndex() 1095b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao 1096462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context& C, const RSExportType* ET, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar) { 1097b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao const char* ElementConstruct = GetBuiltinElementConstruct(ET); 1098b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao 1099bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(ElementConstruct != NULL) { 1100bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 1101b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } else { 1102f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if ((ET->getClass() == RSExportType::ExportClassPrimitive) || 1103f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao (ET->getClass() == RSExportType::ExportClassVector) || 1104f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao (ET->getClass() == RSExportType::ExportClassConstantArray) 1105f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao ) { 1106bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 1107bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const char* DataKindName = GetElementDataKindName(EPT->getKind()); 1108bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const char* DataTypeName = GetElementDataTypeName(EPT->getType()); 1109bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao int Size = (ET->getClass() == RSExportType::ExportClassVector) ? static_cast<const RSExportVectorType*>(ET)->getNumElement() : 1; 1110bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1111bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao switch(EPT->getKind()) { 1112bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindColor: 1113bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPosition: 1114bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindTexture: 1115bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindNormal: 1116bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPointSize: 1117bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createAttrib() */ 1118bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createAttrib(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ", " << Size << ")"); 1119bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1120bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1121bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindIndex: 1122bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createIndex() */ 1123bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createAttrib(" << RenderScriptVar << ")"); 1124bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1125bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1126bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelL: 1127bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelA: 1128bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelLA: 1129bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelRGB: 1130bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelRGBA: 1131bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createPixel() */ 1132bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ")"); 1133bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1134bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1135bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindUser: 1136bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao default: 1137f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao if (EPT->getClass() == RSExportType::ExportClassPrimitive || EPT->getClass() == RSExportType::ExportClassConstantArray) { 1138bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createUser() */ 1139bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createUser(" << RenderScriptVar << ", " << DataTypeName << ")"); 1140f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } else { /* (ET->getClass() == RSExportType::ExportClassVector) must hold here */ 1141bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createVector() */ 1142bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << Size << ")"); 1143f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } 1144bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1145bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 1146bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassPointer) { 1147bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Pointer type variable should be resolved in GetBuiltinElementConstruct() */ 1148bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao assert(false && "??"); 1149bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassRecord) { 1150bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* 11519c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao * Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 1152bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * TODO: Generalize these two function such that there's no duplicated codes. 1153bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao */ 1154bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 1155bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao int Pos = 0; /* relative pos from now on */ 1156bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1157bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 1158bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao I != ERT->fields_end(); 1159bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao I++) 1160bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao { 1161bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportRecordType::Field* F = *I; 1162bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao std::string FieldName; 1163bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 1164bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 1165bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 1166bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1167bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(!VarName.empty()) 1168bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao FieldName = VarName + "." + F->getName(); 1169bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao else 1170bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao FieldName = F->getName(); 1171bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1172bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* alignment */ 1173bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (FieldOffset - Pos), ElementBuilderName, RenderScriptVar); 1174bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1175bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* eb.add(...) */ 11769c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao C.addFieldIndexMapping(F); 11779c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao genAddElementToElementBuilder(C, F->getType(), FieldName, ElementBuilderName, RenderScriptVar); 1178bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 11790a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao /* There is padding within the field type */ 1180bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (FieldAllocSize - FieldStoreSize), ElementBuilderName, RenderScriptVar); 1181bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1182bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao Pos = FieldOffset + FieldAllocSize; 1183bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 1184bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1185bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* There maybe some padding after the struct */ 11860a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao //unsigned char align = RSExportType::GetTypeAlignment(ERT); 11870a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao //size_t siz = RSExportType::GetTypeAllocSize(ERT); 11880a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao size_t siz1 = RSExportType::GetTypeStoreSize(ERT); 11890a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 11900a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao genAddPaddingToElementBuiler(C, siz1 - Pos, ElementBuilderName, RenderScriptVar); 1191bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else { 1192bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao assert(false && "Unknown class of type"); 1193bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 1194b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 1195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar) { 1198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao while(PaddingSize > 0) { 1199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const std::string& VarName = C.createPaddingField(); 1200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PaddingSize >= 4) { 1201bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U32(" << RenderScriptVar << ")"); 1202bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao PaddingSize -= 4; 1203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(PaddingSize >= 2) { 1204bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U16(" << RenderScriptVar << ")"); 1205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PaddingSize -= 2; 1206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(PaddingSize >= 1) { 1207bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U8(" << RenderScriptVar << ")"); 1208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PaddingSize -= 1; 1209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 1215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type /end ********************/ 1216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName) { 1218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context *C = NULL; 1219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ResourceId = ""; 1220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12213f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang if(!GetClassNameFromFileName(OutputBCFileName, ResourceId)) 1222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ResourceId.empty()) 1225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ResourceId = "<Resource ID>"; 1226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12272dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if((OutputPackageName == NULL) || (*OutputPackageName == '\0') || strcmp(OutputPackageName, "-") == 0) 12284e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang C = new Context(InputFileName, "<Package Name>", ResourceId, true); 12292dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao else 12304e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang C = new Context(InputFileName, OutputPackageName, ResourceId, false); 1231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(C != NULL) { 1233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ErrorMsg, ScriptClassName; 1234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* class ScriptC_<ScriptName> */ 12353f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang if(!GetClassNameFromFileName(InputFileName, ScriptClassName)) 1236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ScriptClassName.empty()) 1239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName = "<Input Script Name>"; 1240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 1242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12434c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao if (mRSContext->getLicenseNote() != NULL) { 12444c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao C->setLicenseNote(*(mRSContext->getLicenseNote())); 12454c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao } 1246d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 1247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!genScriptClass(*C, ScriptClassName, ErrorMsg)) { 1248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cerr << "Failed to generate class " << ScriptClassName << " (" << ErrorMsg << ")" << endl; 1249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* class ScriptField_<TypeName> */ 1253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_type_iterator TI = mRSContext->export_types_begin(); 1254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TI != mRSContext->export_types_end(); 12552dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao TI++) 1256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 1257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = TI->getValue(); 1258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassRecord) { 1260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 1261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) { 1263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cerr << "Failed to generate type class for struct '" << ERT->getName() << "' (" << ErrorMsg << ")" << endl; 1264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 1271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSReflection::Context ******************************/ 1274d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehconst char* const RSReflection::Context::ApacheLicenseNote = 1275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 1276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Copyright (C) 2010 The Android Open Source Project\n" 1277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 1278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 1279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * you may not use this file except in compliance with the License.\n" 1280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * You may obtain a copy of the License at\n" 1281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 1282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 1283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 1284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 1285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 1286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 1287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * See the License for the specific language governing permissions and\n" 1288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * limitations under the License.\n" 1289d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh " */\n" 1290d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh "\n"; 1291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* const RSReflection::Context::Import[] = { 1293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* RenderScript java class */ 1294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.renderscript.*", 1295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Import R */ 1296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.content.res.Resources", 1297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Import for debugging */ 1298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.util.Log", 1299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 1300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* RSReflection::Context::AccessModifierStr(AccessModifier AM) { 1302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(AM) { 1303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Public: return "public"; break; 1304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Protected: return "protected"; break; 1305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Private: return "private"; break; 1306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: return ""; break; 1307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg) { 13112dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(mVerbose) 1312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cout << "Generating " << ClassName << ".java ..." << endl; 1313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* License */ 1315d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh out() << mLicenseNote; 1316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13174e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang /* Notice of generated file */ 13184e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << "/*" << endl; 13194e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << " * This file is auto-generated. DO NOT MODIFY!" << endl; 13204e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << " * The source RenderScript file: " << mInputRSFile << endl; 13214e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << " */" << endl; 13224e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang 1323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Package */ 1324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mPackageName.empty()) 1325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << "package " << mPackageName << ";" << endl; 1326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << endl; 1327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Imports */ 1329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<(sizeof(Import)/sizeof(const char*));i++) 1330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << "import " << Import[i] << ";" << endl; 1331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << endl; 1332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13334e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang /* All reflected classes should be annotated as hidden, so that they won't be exposed in SDK. */ 13344e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << "/**" << endl; 13354e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << " * @hide" << endl; 13364e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang out() << " */" << endl; 13374e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang 1338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " << ClassName; 1339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(SuperClassName != NULL) 1340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << " extends " << SuperClassName; 1341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mClassName = ClassName; 1345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 1347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() { 1350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mUseStdout) 1352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mOF.close(); 1353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao clear(); 1354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) { 1358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ShouldIndent) 1359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "{" << endl; 1360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 1361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << " {" << endl; 1362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao incIndentLevel(); 1363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() { 1367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao decIndentLevel(); 1368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "}" << endl << endl; 1369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string& ClassName) { 1373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "public static class " << ClassName; 1374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() { 1379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...) { 1384462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ArgTy Args; 1385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_list vl; 1386462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_start(vl, Argc); 1387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<Argc;i++) { 1389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ArgType = va_arg(vl, const char*); 1390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ArgName = va_arg(vl, const char*); 1391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Args.push_back( make_pair(ArgType, ArgName) ); 1393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_end(vl); 1395462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1396462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 1397462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1398462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1399462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14012dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 14022dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao bool IsStatic, 14032dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const char* ReturnType, 14042dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const std::string& FunctionName, 14052dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const ArgTy& Args) 1406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{ 1407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 1408462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1409462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool FirstArg = true; 1410462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(ArgTy::const_iterator I = Args.begin(); 1411462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != Args.end(); 1412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 1413462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 14142dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!FirstArg) 1415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << ", "; 1416462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 1417462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FirstArg = false; 1418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1419462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << I->first << " " << I->second; 1420462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1421462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1422462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << ")"; 1423462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1427462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1428462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() { 1429462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1430462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1432462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1433462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 1434