slang_rs_reflection.cpp revision 68e8e9f98730b3672fb96d49e33b9db70a90ed3f
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" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <ctype.h> 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <utility> 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdarg> 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 118b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao#include <sys/stat.h> 128b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::make_pair; 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::endl; 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX "ScriptC_" 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC" 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_NAME_PREFIX "ScriptField_" 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME "android.renderscript.Script.FieldBase" 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME "Item" 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME "mItemArray" 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME "mIOBuffer" 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX "mExportVarIdx_" 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_PREFIX "mExportVar_" 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX "mExportFuncIdx_" 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX "mAlloction_" 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_" 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/* Some utility function using internal in RSReflection */ 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic bool GetFileNameWithoutExtension(const std::string& FileName, std::string& OutFileName) { 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutFileName.clear(); 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FileName.empty() || (FileName == "-")) 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* find last component in given path */ 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t SlashPos = FileName.find_last_of("/\\"); 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((SlashPos != std::string::npos) && ((SlashPos + 1) < FileName.length())) 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutFileName = FileName.substr(SlashPos + 1); 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutFileName = FileName; 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t DotPos = OutFileName.find_first_of('.'); 542dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(DotPos != std::string::npos) 552dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao OutFileName.erase(DotPos); 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPrimitiveTypeName(const RSExportPrimitiveType* EPT) { 61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveTypeJavaNameMap[] = { 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "float", /* RSExportPrimitiveType::DataTypeFloat32 */ 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "double", /* RSExportPrimitiveType::DataTypeFloat64 */ 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "byte", /* RSExportPrimitiveType::DataTypeSigned8 */ 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "short", /* RSExportPrimitiveType::DataTypeSigned16 */ 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", /* RSExportPrimitiveType::DataTypeSigned32 */ 69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "long", /* RSExportPrimitiveType::DataTypeSigned64 */ 70c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "short", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 71c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 72c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "long", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "long", /* RSExportPrimitiveType::DataTypeUnsigned64 */ 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 75c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 76c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 77c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 791f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao "boolean", /* RSExportPrimitiveType::DataTypeBool */ 80dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element", /* RSExportPrimitiveType::DataTypeRSElement */ 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Type", /* RSExportPrimitiveType::DataTypeRSType */ 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Allocation", /* RSExportPrimitiveType::DataTypeRSAllocation */ 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Sampler", /* RSExportPrimitiveType::DataTypeRSSampler */ 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Script", /* RSExportPrimitiveType::DataTypeRSScript */ 86f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "Mesh", /* RSExportPrimitiveType::DataTypeRSMesh */ 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramFragment", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramVertex", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramRaster", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramStore", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 91bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "Font", /* RSExportPrimitiveType::DataTypeRSFont */ 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 941f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypeJavaNameMap) / sizeof(const char*)))) { 951f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao // printf("Type %d\n", EPT->getType()); 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveTypeJavaNameMap[ EPT->getType() ]; 971f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao } 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "GetPrimitiveTypeName : Unknown primitive data type"); 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetVectorTypeName(const RSExportVectorType* EVT) { 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* VectorTypeJavaNameMap[][3] = { 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 0 */ { "Byte2", "Byte3", "Byte4" }, 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 1 */ { "Short2", "Short3", "Short4" }, 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 2 */ { "Int2", "Int3", "Int4" }, 108c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao /* 3 */ { "Long2", "Long3", "Long4" }, 109c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao /* 4 */ { "Float2", "Float3", "Float4" }, 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char** BaseElement; 113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(EVT->getType()) { 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned8: 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[0]; 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned16: 120c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned8: 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[1]; 122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned32: 125c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned16: 126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[2]; 127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 129c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned32: 130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[3]; 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1332dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao case RSExportPrimitiveType::DataTypeFloat32: 134c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao BaseElement = VectorTypeJavaNameMap[4]; 135c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao break; 136c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao 1371f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao case RSExportPrimitiveType::DataTypeBool: 1381f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao BaseElement = VectorTypeJavaNameMap[0]; 1391f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao break; 1401f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "RSReflection::genElementTypeName : Unsupported vector element data type"); 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EVT->getNumElement() > 1) && (EVT->getNumElement() <= 4) && "Number of element in vector type is invalid"); 147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return BaseElement[EVT->getNumElement() - 2]; 149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 151324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaostatic const char* GetVectorAccessor(int Index) { 152324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao static const char* VectorAccessorMap[] = { 153324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 0 */ "x", 154324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 1 */ "y", 155324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 2 */ "z", 156324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 3 */ "w", 157324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao }; 158324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 159324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert((Index >= 0) && (Index < (sizeof(VectorAccessorMap) / sizeof(const char*))) && "Out-of-bound index to access vector member"); 160324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 161324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao return VectorAccessorMap[Index]; 162324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 163324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPackerAPIName(const RSExportPrimitiveType* EPT) { 165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveTypePackerAPINameMap[] = { 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addF32", /* RSExportPrimitiveType::DataTypeFloat32 */ 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addF64", /* RSExportPrimitiveType::DataTypeFloat64 */ 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI8", /* RSExportPrimitiveType::DataTypeSigned8 */ 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI16", /* RSExportPrimitiveType::DataTypeSigned16 */ 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI32", /* RSExportPrimitiveType::DataTypeSigned32 */ 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI64", /* RSExportPrimitiveType::DataTypeSigned64 */ 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU64", /* RSExportPrimitiveType::DataTypeUnsigned64 */ 178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 183dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao "addBoolean", /* RSExportPrimitiveType::DataTypeBool */ 184dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSElement */ 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSType */ 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSAllocation */ 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSSampler */ 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSScript */ 190f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSMesh */ 191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 195bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSFont */ 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*)))) 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveTypePackerAPINameMap[ EPT->getType() ]; 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "GetPackerAPIName : Unknown primitive data type"); 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic std::string GetTypeName(const RSExportType* ET) { 206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetPrimitiveTypeName(static_cast<const RSExportPrimitiveType*>(ET)); 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() != RSExportType::ExportClassRecord) 216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "Allocation"; 217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName(); 219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET)); 224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ""; 236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetBuiltinElementConstruct(const RSExportType* ET) { 239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassPrimitive) { 240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getKind() == RSExportPrimitiveType::DataKindUser) { 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveBuiltinElementConstructMap[] = { 243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 245bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "F32", /* RSExportPrimitiveType::DataTypeFloat32 */ 246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeFloat64 */ 247bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "I8", /* RSExportPrimitiveType::DataTypeSigned8 */ 248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned16 */ 249bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "I32", /* RSExportPrimitiveType::DataTypeSigned32 */ 250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned64 */ 251bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "U8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned16 */ 253bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "U32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned64 */ 255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned565 */ 257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 260dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao "BOOLEAN", /* RSExportPrimitiveType::DataTypeBool */ 261dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 262bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */ 263bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "TYPE", /* RSExportPrimitiveType::DataTypeRSType */ 264bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "ALLOCATION", /* RSExportPrimitiveType::DataTypeRSAllocation */ 265bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "SAMPLER", /* RSExportPrimitiveType::DataTypeRSSampler */ 266bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "SCRIPT", /* RSExportPrimitiveType::DataTypeRSScript */ 267f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "MESH", /* RSExportPrimitiveType::DataTypeRSMesh */ 268bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 269bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_VERTEX", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 270bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_RASTER", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 271bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_STORE", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 272bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "FONT", /* RSExportPrimitiveType::DataTypeRSFont */ 273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*)))) 276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveBuiltinElementConstructMap[ EPT->getType() ]; 277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) { 2782dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "A_8"; 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) { 281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565) 282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_565"; 283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_888"; 285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) { 286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551) 287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_5551"; 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444) 289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_4444"; 290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_8888"; 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindIndex) { 293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned16) 294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "INDEX_16"; 295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassVector) { 297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET); 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getKind() == RSExportPrimitiveType::DataKindPosition) { 299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 2) 301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_POSITION_2"; 302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EVT->getNumElement() == 3) 303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_POSITION_3"; 304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getKind() == RSExportPrimitiveType::DataKindTexture) { 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 2) 308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_TEXTURE_2"; 309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getKind() == RSExportPrimitiveType::DataKindNormal) { 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 3) 313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_NORMAL_3"; 314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getKind() == RSExportPrimitiveType::DataKindColor) { 316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 4) 318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_COLOR_F32_4"; 319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) { 320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 4) 321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_COLOR_U8_4"; 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassPointer) { 325c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao return "USER_I32"; /* tread pointer type variable as unsigned int (TODO: this is target dependent) */ 326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataKindName(RSExportPrimitiveType::DataKind DK) { 332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* ElementDataKindNameMap[] = { 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.USER", /* RSExportPrimitiveType::DataKindUser */ 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.COLOR", /* RSExportPrimitiveType::DataKindColor */ 335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.POSITION", /* RSExportPrimitiveType::DataKindPosition */ 336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.TEXTURE", /* RSExportPrimitiveType::DataKindTexture */ 337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.NORMAL", /* RSExportPrimitiveType::DataKindNormal */ 338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.INDEX", /* RSExportPrimitiveType::DataKindIndex */ 339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.POINT_SIZE", /* RSExportPrimitiveType::DataKindPointSize */ 340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_L", /* RSExportPrimitiveType::DataKindPixelL */ 341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_A", /* RSExportPrimitiveType::DataKindPixelA */ 342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_LA", /* RSExportPrimitiveType::DataKindPixelLA */ 343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_RGB", /* RSExportPrimitiveType::DataKindPixelRGB */ 344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_RGBA", /* RSExportPrimitiveType::DataKindPixelRGBA */ 345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DK >= 0) && (DK < (sizeof(ElementDataKindNameMap) / sizeof(const char*)))) 348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ElementDataKindNameMap[ DK ]; 349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataTypeName(RSExportPrimitiveType::DataType DT) { 354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* ElementDataTypeNameMap[] = { 355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.FLOAT_32", /* RSExportPrimitiveType::DataTypeFloat32 */ 358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeFloat64 */ 359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_8", /* RSExportPrimitiveType::DataTypeSigned8 */ 360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_16", /* RSExportPrimitiveType::DataTypeSigned16 */ 361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_32", /* RSExportPrimitiveType::DataTypeSigned32 */ 362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned64 */ 363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_16", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned64 */ 367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_5_6_5", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_5_5_5_1", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_4_4_4_4", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 372dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao "Element.DataType.BOOLEAN", /* RSExportPrimitiveType::DataTypeBool */ 373dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao 374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */ 375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_TYPE", /* RSExportPrimitiveType::DataTypeRSType */ 376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_ALLOCATION", /* RSExportPrimitiveType::DataTypeRSAllocation */ 377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_SAMPLER", /* RSExportPrimitiveType::DataTypeRSSampler */ 378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_SCRIPT", /* RSExportPrimitiveType::DataTypeRSScript */ 379f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao "Element.DataType.RS_MESH", /* RSExportPrimitiveType::DataTypeRSMesh */ 380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_VERTEX", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_RASTER", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_STORE", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 384bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao "Element.DataType.RS_FONT", /* RSExportPrimitiveType::DataTypeRSFont */ 385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 386462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DT >= 0) && (DT < (sizeof(ElementDataTypeNameMap) / sizeof(const char*)))) 388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ElementDataTypeNameMap[ DT ]; 389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 393139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chioustatic void _mkdir(const std::string &path) { 394139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou char buf[256]; 395139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou char *tmp, *p = NULL; 396139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou size_t len = path.size(); 397139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou 398139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou if (len + 1 <= sizeof(buf)) 399139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou tmp = buf; 400139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou else 401139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou tmp = new char [len + 1]; 402b55d7ef3333534fc6aad80f9a9133f2bf945faf1Shih-wei Liao 403139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou strcpy(tmp, path.c_str()); 4048b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4058b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if (tmp[len - 1] == '/') 4068b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao tmp[len - 1] = 0; 4078b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4088b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao for (p = tmp + 1; *p; p++) { 4098b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if (*p == '/') { 4108b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao *p = 0; 4118b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao mkdir(tmp, S_IRWXU); 4128b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao *p = '/'; 4138b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao } 4148b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao } 4158b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao mkdir(tmp, S_IRWXU); 416139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou 417139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou if (tmp != buf) 418139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou delete[] tmp; 4198b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao} 4208b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4218b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liaobool RSReflection::openScriptFile(Context&C, const std::string& ClassName, std::string& ErrorMsg) { 4226de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao if(!C.mUseStdout) { 4236de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao C.mOF.clear(); 4248b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao std::string _path = "/" + C.getPackageName(); 4258b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao for (std::string::iterator it = _path.begin(); it != _path.end(); it++ ) { 4268b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if ( *it == '.') { 4278b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao *it = '/'; 4288b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao } 4298b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao } 4308b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 43168e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao std::string prefix = mRSContext->getReflectJavaPathName(); 43268e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao if (prefix.empty()) { 43368e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao _path.insert(0, 1, '.'); 43468e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao } else { 43568e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao _path.insert(0, mRSContext->getReflectJavaPathName()); 43668e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao } 4378b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 438139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou _mkdir(_path); 4398b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao C.mOF.open(( _path + "/" + ClassName + ".java" ).c_str()); 4406de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao if(!C.mOF.good()) { 4418b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao ErrorMsg = "failed to open file '" + _path + "/" + ClassName + ".java' for write"; 4428b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4436de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao return false; 4446de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao } 4456de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao } 4468b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao return true; 4478b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao} 4488b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao 4498b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao/****************************** Methods to generate script class ******************************/ 4508b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liaobool RSReflection::genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg) { 4518b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao /* Open the file */ 4528b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if (!openScriptFile(C, ClassName, ErrorMsg)) { 4538b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao return false; 4548b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao } 4556de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 4562dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!C.startClass(Context::AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 457462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 458462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 459462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genScriptClassConstructor(C); 460462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 461462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Reflect export variable */ 462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(); 463462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mRSContext->export_vars_end(); 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genExportVariable(C, *I); 466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 467462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Reflect export function */ 468462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_func_iterator I = mRSContext->export_funcs_begin(); 469462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mRSContext->export_funcs_end(); 470462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 471462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genExportFunction(C, *I); 472462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 473462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endClass(); 474462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 475462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 476462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 477462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 478462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genScriptClassConstructor(Context& C) { 479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "// Constructor" << endl; 4802dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 4, "RenderScript", "rs", 481462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Resources", "resources", 4822dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao "int", "id", 483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "boolean", "isRoot"); 484462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Call constructor of super class */ 4852dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.indent() << "super(rs, resources, id, isRoot);" << endl; 486324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 487324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* If an exported variable has initial value, reflect it */ 488324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 489324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(); 490324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I != mRSContext->export_vars_end(); 491324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I++) 492324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 493324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportVar* EV = *I; 494324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao if(!EV->getInit().isUninit()) 495324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit()); 496324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 497324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 498462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 500462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 501462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 50248bac230fe966771f3074975fc2426ffde519edfShih-wei Liaovoid RSReflection::genInitBoolExportVariable(Context& C, const std::string& VarName, const APValue& Val) { 50348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao assert(!Val.isUninit() && "Not a valid initializer"); 50448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 50548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 50648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao assert((Val.getKind() == APValue::Int) && "Bool type has wrong initial APValue"); 50748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 50848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao if (Val.getInt().getSExtValue() == 0) { 50948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.out() << "false"; 51048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } else { 51148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.out() << "true"; 51248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 51348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao C.out() << ";" << endl; 51448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 51548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao return; 51648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 51748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 518324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaovoid RSReflection::genInitPrimitiveExportVariable(Context& C, const std::string& VarName, const APValue& Val) { 519324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(!Val.isUninit() && "Not a valid initializer"); 520324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 521324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 522324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao switch(Val.getKind()) { 523324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Int: C.out() << Val.getInt().getSExtValue(); break; 524324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Float: C.out() << Val.getFloat().convertToDouble(); break; 525324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 526324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::ComplexInt: 527324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::ComplexFloat: 528324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::LValue: 529324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Vector: 530324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(false && "Primitive type cannot have such kind of initializer"); 531324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 532324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 533324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao default: 534324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(false && "Unknown kind of initializer"); 535324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 536324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 537324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.out() << ";" << endl; 538324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 539324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao return; 540324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 541324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 542324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaovoid RSReflection::genInitExportVariable(Context& C, const RSExportType* ET, const std::string& VarName, const APValue& Val) { 543324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(!Val.isUninit() && "Not a valid initializer"); 544324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 545324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao switch(ET->getClass()) { 54648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao case RSExportType::ExportClassPrimitive: { 54748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 54848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeBool) { 54948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao genInitBoolExportVariable(C, VarName, Val); 55048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } else { 55148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao genInitPrimitiveExportVariable(C, VarName, Val); 55248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 55348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao break; 55448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 555324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 556324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case RSExportType::ExportClassPointer: 557324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao if(!Val.isInt() || Val.getInt().getSExtValue() != 0) 558324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::cout << "Initializer which is non-NULL to pointer type variable will be ignored" << endl; 559324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 560324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 561324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case RSExportType::ExportClassVector: 562324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 563324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET); 564324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao switch(Val.getKind()) { 565324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Int: 566324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Float: 567324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(int i=0;i<EVT->getNumElement();i++) { 568324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 569324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitPrimitiveExportVariable(C, Name, Val); 570324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 571324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 572324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 573324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case APValue::Vector: 574324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 575324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " << GetVectorTypeName(EVT) << "();" << endl; 576324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 577324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao unsigned NumElements = std::min(static_cast<unsigned>(EVT->getNumElement()), Val.getVectorLength()); 578324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(unsigned i=0;i<NumElements;i++) { 579324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const APValue& ElementVal = Val.getVectorElt(i); 580324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 581324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitPrimitiveExportVariable(C, Name, ElementVal); 582324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 583324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 584324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 585324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 586324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 587324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 588324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 589324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* TODO: Resolving initializer of a record type variable is complex. It cannot obtain by just simply evaluating the initializer expression. */ 590324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao case RSExportType::ExportClassRecord: 591324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 592324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao /* 593324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao unsigned InitIndex = 0; 594324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 595324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 596324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert((Val.getKind() == APValue::Vector) && "Unexpected type of initializer for record type variable"); 597324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 598324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new "RS_TYPE_CLASS_NAME_PREFIX << ERT->getName() << "."RS_TYPE_ITEM_CLASS_NAME"();" << endl; 599324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 600324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 601324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I != ERT->fields_end(); 602324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao I++) 603324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao { 604324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao const RSExportRecordType::Field* F = *I; 605324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao std::string FieldName = VarName + "." + F->getName(); 606324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 607324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao if(InitIndex > Val.getVectorLength()) 608324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 609324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 610324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao genInitPrimitiveExportVariable(C, FieldName, Val.getVectorElt(InitIndex++)); 611324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 612324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao */ 613324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(false && "Unsupported initializer for record type variable currently"); 614324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 615324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 616324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 617324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao default: 618324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao assert(false && "Unknown class of type"); 619324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao break; 620324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 621324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao return; 622324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 623324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 624462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportVariable(Context& C, const RSExportVar* EV) { 625462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 626462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 627462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << " = " << C.getNextExportVarSlot() << ";" << endl; 628462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 629462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 630462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 631462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPrimitiveTypeExportVariable(C, EV); 632462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 633462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 634462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 635462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPointerTypeExportVariable(C, EV); 636462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 637462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 638462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 639462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genVectorTypeExportVariable(C, EV); 640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 641462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 642462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 643462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genRecordTypeExportVariable(C, EV); 644462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 645462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 646462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 647462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 648462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 649462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 650462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 652462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportFunction(Context& C, const RSExportFunc* EF) { 655462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" << endl; 656462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* invoke_*() */ 658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context::ArgTy Args; 659462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportFunc::const_param_iterator I = EF->params_begin(); 661462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != EF->params_end(); 6622dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao I++) 663462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 664462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportFunc::Parameter* P = *I; 665462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Args.push_back( make_pair(GetTypeName(P->getType()), P->getName()) ); 666462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "invoke_" + EF->getName(), Args); 669462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!EF->hasParam()) { 6712dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" << endl; 672462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else { 673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = EF->getParamPacketType(); 674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 675462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 676462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 677462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 678462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 679bdd788877b3f18980836a3ed0d46627169483653Shih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " << FieldPackerName << ");" << endl; 680462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 681462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 682462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 683462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 684462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 685462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 686462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV) { 687462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && "Variable should be type of primitive here"); 688462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 689462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(EV->getType()); 690462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* TypeName = GetPrimitiveTypeName(EPT); 691462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 692462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 693462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 694462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 695c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(!EV->isConst()) { 696c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v"); 697c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 699c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(EPT->isRSObjectType()) 700c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", (v == null) ? 0 : v.getID());" << endl; 701c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao else 702c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", v);" << endl; 703462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 704c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.endFunction(); 705c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 707462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 708462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 709462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context& C, const RSExportVar* EV) { 713462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 714462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType; 715462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string TypeName; 716462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 717462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((ET->getClass() == RSExportType::ExportClassPointer) && "Variable should be type of pointer here"); 718462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TypeName = GetTypeName(ET); 721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* bind_*() */ 723462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 724462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 725462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "bind_" + EV->getName(), 1, TypeName.c_str(), "v"); 726462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 727462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 728462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if(v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 729462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() == RSExportType::ExportClassRecord) 731462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "else bindAllocation(v.getAllocation(), "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 732462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 733462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 734462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 737462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 738462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 739462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 740462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 741462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 742462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context& C, const RSExportVar* EV) { 743462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassVector) && "Variable should be type of vector here"); 744462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 745462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(EV->getType()); 746462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* TypeName = GetVectorTypeName(EVT); 747462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* FieldPackerName = "fp"; 748462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 749462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 752c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(!EV->isConst()) { 753c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v"); 754c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 755462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 756c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(genCreateFieldPacker(C, EVT, FieldPackerName)) 757c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao genPackVarOfType(C, EVT, "v", FieldPackerName); 758c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl; 759462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 760c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.endFunction(); 761c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 762462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 763462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 764462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 765462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 766462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 767462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context& C, const RSExportVar* EV) { 768462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && "Variable should be type of struct here"); 769462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(EV->getType()); 771462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string TypeName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 772462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* FieldPackerName = "fp"; 773462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 774462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 776462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 777c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(!EV->isConst()) { 778c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName.c_str(), "v"); 779c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 780462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 781c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao if(genCreateFieldPacker(C, ERT, FieldPackerName)) 782c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao genPackVarOfType(C, ERT, "v", FieldPackerName); 783c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl; 784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 785c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao C.endFunction(); 786c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 787462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 788462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName.c_str(), EV->getName()); 789462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 790462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 791462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 792462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName) { 793462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 794462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 795462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << endl; 796462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 797462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 798462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 799462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 800462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 801462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class /end ******************************/ 802462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 803462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genCreateFieldPacker(Context& C, const RSExportType* ET, const char* FieldPackerName) { 804462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t AllocSize = RSExportType::GetTypeAllocSize(ET); 805462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(AllocSize > 0) 806462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" << AllocSize << ");" << endl; 807462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 808462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 809462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 810462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 811462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 812462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPackVarOfType(Context& C, const RSExportType* ET, const char* VarName, const char* FieldPackerName) { 813462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 814462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 815462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 816462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << "." << GetPackerAPIName(static_cast<const RSExportPrimitiveType*>(ET)) << "(" << VarName << ");" << endl; 817462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 818462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 819462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 820462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 821462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Must reflect as type Allocation in Java */ 822462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 823462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 824462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() != RSExportType::ExportClassRecord) 825c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());" << endl; 826462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 827c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName << ".getAllocation().getPtr());" << endl; 828462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 829462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 830462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 831462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 832462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 833462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 834462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao int Pos = 0; /* relative pos from now on in field packer */ 835462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 836462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 837462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != ERT->fields_end(); 838462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 839462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 840462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *I; 841462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string FieldName; 842462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 843462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 844462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 845462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 846462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(VarName != NULL) 847462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldName = VarName + ("." + F->getName()); 848462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 849462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldName = F->getName(); 850462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 851462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FieldOffset > Pos) 852462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) << ");" << endl; 853462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 854462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName); 855462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 856462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FieldAllocSize > FieldStoreSize) /* there's padding in the field type */ 857462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << (FieldAllocSize - FieldStoreSize) << ");" << endl; 858462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 859462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Pos = FieldOffset + FieldAllocSize; 860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 861462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 862462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* There maybe some padding after the struct */ 863462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos; 864462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(Padding > 0) 865462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << Padding << ");" << endl; 866462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 867462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 868462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 869462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 870462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 871462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 872462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 873462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 874462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 875462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 876462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 877462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class ******************************/ 878462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) { 879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 880462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8816de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao /* Open the file */ 8828b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao if (!openScriptFile(C, ClassName, ErrorMsg)) { 8838b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao return false; 8846de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao } 8856de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 8862dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!C.startClass(Context::AM_Public, false, ClassName, RS_TYPE_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 887462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 888462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!genTypeItemClass(C, ERT, ErrorMsg)) 890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 891462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Declare item buffer and item buffer packer */ 893462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[];" << endl; 894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" << endl; 895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClassConstructor(C, ERT); 897462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClassCopyToArray(C, ERT); 898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClasSet(C, ERT); 899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClasCopyAll(C, ERT); 900462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endClass(); 902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 903462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 904462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 906462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) { 907462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME; 908462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 909462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 910462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "public static final int sizeof = " << RSExportType::GetTypeAllocSize(ERT) << ";" << endl; 911462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 912462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Member elements */ 913462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.out() << endl; 914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 915462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 9162dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao FI++) 917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() << ";" << endl; 918462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Constructor */ 920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.out() << endl; 921462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_CLASS_NAME"()"; 922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 923462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 924462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 9262dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao FI++) 927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 928462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *FI; 929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((F->getType()->getClass() == RSExportType::ExportClassVector) || (F->getType()->getClass() == RSExportType::ExportClassRecord)) 930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << F->getName() << " = new " << GetTypeName(F->getType()) << "();" << endl; 931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 932462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end Constructor */ 934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 935462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end Item class */ 936462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 937462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 938462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 939462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 940462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 941462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassConstructor(Context& C, const RSExportRecordType* ERT) { 942462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* RenderScriptVar = "rs"; 943462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9449e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.startFunction(Context::AM_Public, true, "Element", "createElement", 1, "RenderScript", RenderScriptVar); 9459e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao genBuildElement(C, ERT, RenderScriptVar); 9469e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.endFunction(); 9479e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 2, "RenderScript", RenderScriptVar, 949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "count"); 950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 951462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << endl; 952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << endl; 9539e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.indent() << "mElement = createElement(" << RenderScriptVar << ");" << endl; 954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Call init() in super class */ 955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "init(" << RenderScriptVar << ", count);" << endl; 956462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 957462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 958462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 959462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 960462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT) { 962462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Private, false, "void", "copyToArray", 2, RS_TYPE_ITEM_CLASS_NAME, "i", 963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "index"); 964462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 965462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_PACKER_NAME" == null) "RS_TYPE_ITEM_BUFFER_PACKER_NAME" = new FieldPacker("RS_TYPE_ITEM_CLASS_NAME".sizeof * mType.getX() /* count */);" << endl; 966462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" << endl; 967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 968462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 969462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 970462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 971462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 972462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 973462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasSet(Context& C, const RSExportRecordType* ERT) { 975462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set", 3, RS_TYPE_ITEM_CLASS_NAME, "i", 976462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "index", 977462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "boolean", "copyNow"); 978462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) "RS_TYPE_ITEM_BUFFER_NAME" = new "RS_TYPE_ITEM_CLASS_NAME"[mType.getX() /* count */];" << endl; 979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << endl; 980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if (copyNow) "; 982462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 9832dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "copyToArray(i, index);" << endl; 9859e98e006c1dd889ecac1bebf353500e7a54d490eShih-wei Liao //C.indent() << "mAllocation.subData1D(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof, "RS_TYPE_ITEM_CLASS_NAME".sizeof, "RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 9869e98e006c1dd889ecac1bebf353500e7a54d490eShih-wei Liao C.indent() << "mAllocation.subData1D(index, 1, "RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 987462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end if (copyNow) */ 989462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 990462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 991462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 993462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasCopyAll(Context& C, const RSExportRecordType* ERT) { 995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "copyAll", 0); 996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-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; 998462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "mAllocation.data("RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1000462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 1001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1004462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class /end ******************************/ 1005462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1006462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type ********************/ 10079e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liaovoid RSReflection::genBuildElement(Context& C, const RSExportRecordType* ERT, const char* RenderScriptVar) { 1008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ElementBuilderName = "eb"; 1009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1010462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Create element builder */ 10119e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao // C.startBlock(true); 1012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1013462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "Element.Builder " << ElementBuilderName << " = new Element.Builder(" << RenderScriptVar << ");" << endl; 1014462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* eb.add(...) */ 1016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genAddElementToElementBuilder(C, ERT, "", ElementBuilderName, RenderScriptVar); 1017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10189e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao C.indent() << "return " << ElementBuilderName << ".create();" << endl; 1019462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10209e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao // C.endBlock(); 1021462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1022462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define EB_ADD(x, ...) \ 1025b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao C.indent() << ElementBuilderName << ".add(Element." << x ##__VA_ARGS__ ", \"" << VarName << "\");" << endl 1026b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao 1027462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context& C, const RSExportType* ET, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar) { 1028b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao const char* ElementConstruct = GetBuiltinElementConstruct(ET); 1029b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao 1030bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(ElementConstruct != NULL) { 1031bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 1032b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } else { 1033bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if((ET->getClass() == RSExportType::ExportClassPrimitive) || (ET->getClass() == RSExportType::ExportClassVector)) { 1034bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 1035bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const char* DataKindName = GetElementDataKindName(EPT->getKind()); 1036bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const char* DataTypeName = GetElementDataTypeName(EPT->getType()); 1037bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao int Size = (ET->getClass() == RSExportType::ExportClassVector) ? static_cast<const RSExportVectorType*>(ET)->getNumElement() : 1; 1038bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1039bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao switch(EPT->getKind()) { 1040bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindColor: 1041bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPosition: 1042bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindTexture: 1043bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindNormal: 1044bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPointSize: 1045bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createAttrib() */ 1046bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createAttrib(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ", " << Size << ")"); 1047bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1048bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1049bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindIndex: 1050bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createIndex() */ 1051bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createAttrib(" << RenderScriptVar << ")"); 1052bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1053bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1054bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelL: 1055bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelA: 1056bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelLA: 1057bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelRGB: 1058bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelRGBA: 1059bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createPixel() */ 1060bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ")"); 1061bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1062bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1063bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindUser: 1064bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao default: 1065bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(EPT->getClass() == RSExportType::ExportClassPrimitive) 1066bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createUser() */ 1067bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createUser(" << RenderScriptVar << ", " << DataTypeName << ")"); 1068bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao else /* (ET->getClass() == RSExportType::ExportClassVector) must hold here */ 1069bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createVector() */ 1070bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << Size << ")"); 1071bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 1072bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 1073bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassPointer) { 1074bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Pointer type variable should be resolved in GetBuiltinElementConstruct() */ 1075bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao assert(false && "??"); 1076bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassRecord) { 1077bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* 1078bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * Simalar to genPackVarOfType. 1079bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * 1080bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * TODO: Generalize these two function such that there's no duplicated codes. 1081bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao */ 1082bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 1083bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao int Pos = 0; /* relative pos from now on */ 1084bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1085bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 1086bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao I != ERT->fields_end(); 1087bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao I++) 1088bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao { 1089bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportRecordType::Field* F = *I; 1090bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao std::string FieldName; 1091bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 1092bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 1093bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 1094bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1095bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(!VarName.empty()) 1096bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao FieldName = VarName + "." + F->getName(); 1097bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao else 1098bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao FieldName = F->getName(); 1099bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1100bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* alignment */ 1101bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (FieldOffset - Pos), ElementBuilderName, RenderScriptVar); 1102bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1103bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* eb.add(...) */ 1104bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddElementToElementBuilder(C, (*I)->getType(), FieldName, ElementBuilderName, RenderScriptVar); 1105bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1106bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* there's padding within the field type */ 1107bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (FieldAllocSize - FieldStoreSize), ElementBuilderName, RenderScriptVar); 1108bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1109bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao Pos = FieldOffset + FieldAllocSize; 1110bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 1111bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 1112bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* There maybe some padding after the struct */ 1113bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (RSExportType::GetTypeAllocSize(ERT) - Pos), ElementBuilderName, RenderScriptVar); 1114bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else { 1115bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao assert(false && "Unknown class of type"); 1116bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 1117b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 1118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar) { 1121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao while(PaddingSize > 0) { 1122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const std::string& VarName = C.createPaddingField(); 1123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PaddingSize >= 4) { 1124bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U32(" << RenderScriptVar << ")"); 1125bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao PaddingSize -= 4; 1126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(PaddingSize >= 2) { 1127bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U16(" << RenderScriptVar << ")"); 1128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PaddingSize -= 2; 1129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(PaddingSize >= 1) { 1130bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U8(" << RenderScriptVar << ")"); 1131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PaddingSize -= 1; 1132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 1138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type /end ********************/ 1139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName) { 1141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context *C = NULL; 1142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ResourceId = ""; 1143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!GetFileNameWithoutExtension(OutputBCFileName, ResourceId)) 1145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ResourceId.empty()) 1148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ResourceId = "<Resource ID>"; 1149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11502dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if((OutputPackageName == NULL) || (*OutputPackageName == '\0') || strcmp(OutputPackageName, "-") == 0) 1151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C = new Context("<Package Name>", ResourceId, true); 11522dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao else 1153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C = new Context(OutputPackageName, ResourceId, false); 1154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(C != NULL) { 1156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ErrorMsg, ScriptClassName; 1157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* class ScriptC_<ScriptName> */ 1158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!GetFileNameWithoutExtension(InputFileName, ScriptClassName)) 1159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ScriptClassName.empty()) 1162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName = "<Input Script Name>"; 1163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName.at(0) = toupper(ScriptClassName.at(0)); 1165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 1166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1167d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh if (mRSContext->getLicenseNote() != NULL) 1168d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh C->setLicenseNote(*mRSContext->getLicenseNote()); 1169d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 1170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!genScriptClass(*C, ScriptClassName, ErrorMsg)) { 1171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cerr << "Failed to generate class " << ScriptClassName << " (" << ErrorMsg << ")" << endl; 1172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* class ScriptField_<TypeName> */ 1176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_type_iterator TI = mRSContext->export_types_begin(); 1177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TI != mRSContext->export_types_end(); 11782dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao TI++) 1179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 1180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = TI->getValue(); 1181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassRecord) { 1183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 1184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) { 1186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cerr << "Failed to generate type class for struct '" << ERT->getName() << "' (" << ErrorMsg << ")" << endl; 1187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 1188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 1194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSReflection::Context ******************************/ 1197d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehconst char* const RSReflection::Context::ApacheLicenseNote = 1198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 1199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Copyright (C) 2010 The Android Open Source Project\n" 1200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 1201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 1202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * you may not use this file except in compliance with the License.\n" 1203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * You may obtain a copy of the License at\n" 1204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 1205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 1206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 1207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 1208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 1209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 1210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * See the License for the specific language governing permissions and\n" 1211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * limitations under the License.\n" 1212d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh " */\n" 1213d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh "\n"; 1214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* const RSReflection::Context::Import[] = { 1216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* RenderScript java class */ 1217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.renderscript.*", 1218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Import R */ 1219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.content.res.Resources", 1220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Import for debugging */ 1221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.util.Log", 1222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 1223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* RSReflection::Context::AccessModifierStr(AccessModifier AM) { 1225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(AM) { 1226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Public: return "public"; break; 1227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Protected: return "protected"; break; 1228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Private: return "private"; break; 1229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: return ""; break; 1230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg) { 12342dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(mVerbose) 1235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cout << "Generating " << ClassName << ".java ..." << endl; 1236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* License */ 1238d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh out() << mLicenseNote; 1239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Package */ 1241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mPackageName.empty()) 1242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << "package " << mPackageName << ";" << endl; 1243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << endl; 1244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Imports */ 1246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<(sizeof(Import)/sizeof(const char*));i++) 1247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << "import " << Import[i] << ";" << endl; 1248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << endl; 1249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " << ClassName; 1251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(SuperClassName != NULL) 1252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << " extends " << SuperClassName; 1253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mClassName = ClassName; 1257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 1259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() { 1262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mUseStdout) 1264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mOF.close(); 1265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao clear(); 1266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) { 1270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ShouldIndent) 1271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "{" << endl; 1272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 1273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << " {" << endl; 1274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao incIndentLevel(); 1275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() { 1279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao decIndentLevel(); 1280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "}" << endl << endl; 1281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string& ClassName) { 1285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "public static class " << ClassName; 1286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() { 1291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...) { 1296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ArgTy Args; 1297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_list vl; 1298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_start(vl, Argc); 1299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<Argc;i++) { 1301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ArgType = va_arg(vl, const char*); 1302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ArgName = va_arg(vl, const char*); 1303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Args.push_back( make_pair(ArgType, ArgName) ); 1305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_end(vl); 1307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 1309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13132dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 13142dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao bool IsStatic, 13152dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const char* ReturnType, 13162dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const std::string& FunctionName, 13172dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const ArgTy& Args) 1318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{ 1319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 1320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool FirstArg = true; 1322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(ArgTy::const_iterator I = Args.begin(); 1323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != Args.end(); 1324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 1325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 13262dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!FirstArg) 1327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << ", "; 1328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 1329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FirstArg = false; 1330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << I->first << " " << I->second; 1332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << ")"; 1335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() { 1341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 1346