slang_rs_reflection.cpp revision f8149d9e5a3795e9952717ee6346789a134c55c7
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>
122239ecece40c177e071f56326cd5ef423806394dShih-wei Liao#include "llvm/ADT/APFloat.h"
138b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::make_pair;
15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::endl;
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX         "ScriptC_"
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME    "ScriptC"
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_NAME_PREFIX           "ScriptField_"
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME      "android.renderscript.Script.FieldBase"
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME             "Item"
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME            "mItemArray"
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME     "mIOBuffer"
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX          "mExportVarIdx_"
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_PREFIX                "mExportVar_"
31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX         "mExportFuncIdx_"
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX     "mAlloction_"
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX   "mData_"
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/* Some utility function using internal in RSReflection */
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic bool GetFileNameWithoutExtension(const std::string& FileName, std::string& OutFileName) {
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    OutFileName.clear();
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(FileName.empty() || (FileName == "-"))
44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return true;
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* find last component in given path */
47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    size_t SlashPos = FileName.find_last_of("/\\");
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((SlashPos != std::string::npos) && ((SlashPos + 1) < FileName.length()))
50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        OutFileName = FileName.substr(SlashPos + 1);
51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        OutFileName = FileName;
53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    size_t DotPos = OutFileName.find_first_of('.');
552dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(DotPos != std::string::npos)
562dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        OutFileName.erase(DotPos);
57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPrimitiveTypeName(const RSExportPrimitiveType* EPT) {
62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* PrimitiveTypeJavaNameMap[] = {
63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "float",    /* RSExportPrimitiveType::DataTypeFloat32 */
66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "double",   /* RSExportPrimitiveType::DataTypeFloat64 */
67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "byte",     /* RSExportPrimitiveType::DataTypeSigned8 */
68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "short",    /* RSExportPrimitiveType::DataTypeSigned16 */
69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeSigned32 */
70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "long",     /* RSExportPrimitiveType::DataTypeSigned64 */
71c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "short",    /* RSExportPrimitiveType::DataTypeUnsigned8 */
72c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned16 */
73c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "long",     /* RSExportPrimitiveType::DataTypeUnsigned32 */
74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "long",     /* RSExportPrimitiveType::DataTypeUnsigned64 */
75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
76c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned565 */
77c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned5551 */
78c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        "int",      /* RSExportPrimitiveType::DataTypeUnsigned4444 */
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
801f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao        "boolean",  /* RSExportPrimitiveType::DataTypeBool */
81dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element",  /* RSExportPrimitiveType::DataTypeRSElement */
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Type",     /* RSExportPrimitiveType::DataTypeRSType */
84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Allocation",   /* RSExportPrimitiveType::DataTypeRSAllocation */
85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Sampler",  /* RSExportPrimitiveType::DataTypeRSSampler */
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Script",   /* RSExportPrimitiveType::DataTypeRSScript */
87f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao        "Mesh",       /* RSExportPrimitiveType::DataTypeRSMesh */
88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramFragment",  /* RSExportPrimitiveType::DataTypeRSProgramFragment */
89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramVertex",    /* RSExportPrimitiveType::DataTypeRSProgramVertex */
90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramRaster",    /* RSExportPrimitiveType::DataTypeRSProgramRaster */
91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "ProgramStore",     /* RSExportPrimitiveType::DataTypeRSProgramStore */
92bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao        "Font",     /* RSExportPrimitiveType::DataTypeRSFont */
93ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao        "Matrix2f",     /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */
94ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao        "Matrix3f",     /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */
95ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao        "Matrix4f",     /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
981f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao    if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypeJavaNameMap) / sizeof(const char*)))) {
991f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao        // printf("Type %d\n", EPT->getType());
100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return PrimitiveTypeJavaNameMap[ EPT->getType() ];
1011f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao    }
102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(false && "GetPrimitiveTypeName : Unknown primitive data type");
104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return NULL;
105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetVectorTypeName(const RSExportVectorType* EVT) {
108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* VectorTypeJavaNameMap[][3] = {
109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* 0 */ { "Byte2",  "Byte3",    "Byte4" },
110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* 1 */ { "Short2", "Short3",   "Short4" },
111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* 2 */ { "Int2",   "Int3",     "Int4" },
112c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        /* 3 */ { "Long2",  "Long3",    "Long4" },
113c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        /* 4 */ { "Float2", "Float3",   "Float4" },
114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char** BaseElement;
117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(EVT->getType()) {
119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportPrimitiveType::DataTypeSigned8:
120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[0];
121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportPrimitiveType::DataTypeSigned16:
124c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        case RSExportPrimitiveType::DataTypeUnsigned8:
125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[1];
126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportPrimitiveType::DataTypeSigned32:
129c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        case RSExportPrimitiveType::DataTypeUnsigned16:
130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[2];
131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
133c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        case RSExportPrimitiveType::DataTypeUnsigned32:
134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            BaseElement = VectorTypeJavaNameMap[3];
135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1372dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        case RSExportPrimitiveType::DataTypeFloat32:
138c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao            BaseElement = VectorTypeJavaNameMap[4];
139c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        break;
140c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao
1411f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao        case RSExportPrimitiveType::DataTypeBool:
1421f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao            BaseElement = VectorTypeJavaNameMap[0];
1431f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao        break;
1441f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao
145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "RSReflection::genElementTypeName : Unsupported vector element data type");
147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EVT->getNumElement() > 1) && (EVT->getNumElement() <= 4) && "Number of element in vector type is invalid");
151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return BaseElement[EVT->getNumElement() - 2];
153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
155324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaostatic const char* GetVectorAccessor(int Index) {
156324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    static const char* VectorAccessorMap[] = {
157324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        /* 0 */ "x",
158324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        /* 1 */ "y",
159324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        /* 2 */ "z",
160324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        /* 3 */ "w",
161324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    };
162324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
163324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    assert((Index >= 0) && (Index < (sizeof(VectorAccessorMap) / sizeof(const char*))) && "Out-of-bound index to access vector member");
164324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
165324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    return VectorAccessorMap[Index];
166324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao}
167324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPackerAPIName(const RSExportPrimitiveType* EPT) {
169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* PrimitiveTypePackerAPINameMap[] = {
170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "",
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addF32",   /* RSExportPrimitiveType::DataTypeFloat32 */
173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addF64",   /* RSExportPrimitiveType::DataTypeFloat64 */
174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI8",    /* RSExportPrimitiveType::DataTypeSigned8 */
175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI16",   /* RSExportPrimitiveType::DataTypeSigned16 */
176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI32",   /* RSExportPrimitiveType::DataTypeSigned32 */
177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addI64",   /* RSExportPrimitiveType::DataTypeSigned64 */
178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU8",    /* RSExportPrimitiveType::DataTypeUnsigned8 */
179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned16 */
180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU32",   /* RSExportPrimitiveType::DataTypeUnsigned32 */
181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU64",   /* RSExportPrimitiveType::DataTypeUnsigned64 */
182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned565 */
184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned5551 */
185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addU16",   /* RSExportPrimitiveType::DataTypeUnsigned4444 */
186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
187dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao        "addBoolean",  /* RSExportPrimitiveType::DataTypeBool */
188dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao
189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSElement */
190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSType */
191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSAllocation */
192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSSampler */
193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSScript */
194f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSMesh */
195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramFragment */
196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramVertex */
197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramRaster */
198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSProgramStore */
199bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSFont */
200ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */
201ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */
202ca3be0350773a63b7792eedc216a7808e42e77eaShih-wei Liao        "addObj",   /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */
203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*))))
206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return PrimitiveTypePackerAPINameMap[ EPT->getType() ];
207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(false && "GetPackerAPIName : Unknown primitive data type");
209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return NULL;
210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic std::string GetTypeName(const RSExportType* ET) {
213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(ET->getClass()) {
214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPrimitive:
215f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        case RSExportType::ExportClassConstantArray:
216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return GetPrimitiveTypeName(static_cast<const RSExportPrimitiveType*>(ET));
217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPointer:
220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(PointeeType->getClass() != RSExportType::ExportClassRecord)
224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "Allocation";
225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else
226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName();
227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassVector:
231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET));
232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassRecord:
235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + "."RS_TYPE_ITEM_CLASS_NAME;
236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "Unknown class of type");
240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return "";
244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetBuiltinElementConstruct(const RSExportType* ET) {
247f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao    if (ET->getClass() == RSExportType::ExportClassPrimitive || ET->getClass() == RSExportType::ExportClassConstantArray) {
248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET);
249f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        if (EPT->getKind() == RSExportPrimitiveType::DataKindUser) {
250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            static const char* PrimitiveBuiltinElementConstructMap[] = {
251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,
252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,
253bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "F32", /* RSExportPrimitiveType::DataTypeFloat32 */
254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeFloat64 */
255bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "I8",  /* RSExportPrimitiveType::DataTypeSigned8 */
256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeSigned16 */
257bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "I32", /* RSExportPrimitiveType::DataTypeSigned32 */
258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeSigned64 */
259bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "U8",  /* RSExportPrimitiveType::DataTypeUnsigned8 */
260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeUnsigned16 */
261bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "U32", /* RSExportPrimitiveType::DataTypeUnsigned32 */
262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,       /* RSExportPrimitiveType::DataTypeUnsigned64 */
263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,   /* RSExportPrimitiveType::DataTypeUnsigned565 */
265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,   /* RSExportPrimitiveType::DataTypeUnsigned5551 */
266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                NULL,   /* RSExportPrimitiveType::DataTypeUnsigned4444 */
267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
268dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao                "BOOLEAN",  /* RSExportPrimitiveType::DataTypeBool */
269dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao
270bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */
271bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "TYPE",    /* RSExportPrimitiveType::DataTypeRSType */
272bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "ALLOCATION",  /* RSExportPrimitiveType::DataTypeRSAllocation */
273bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "SAMPLER",     /* RSExportPrimitiveType::DataTypeRSSampler */
274bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "SCRIPT",      /* RSExportPrimitiveType::DataTypeRSScript */
275f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao                "MESH",        /* RSExportPrimitiveType::DataTypeRSMesh */
276bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_FRAGMENT",    /* RSExportPrimitiveType::DataTypeRSProgramFragment */
277bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_VERTEX",      /* RSExportPrimitiveType::DataTypeRSProgramVertex */
278bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_RASTER",      /* RSExportPrimitiveType::DataTypeRSProgramRaster */
279bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao                "PROGRAM_STORE",       /* RSExportPrimitiveType::DataTypeRSProgramStore */
280bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao                "FONT",       /* RSExportPrimitiveType::DataTypeRSFont */
281fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao                "MATRIX_2X2",       /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */
282fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao                "MATRIX_3X3",       /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */
283fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao                "MATRIX_4X4",       /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */
284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            };
285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
286f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if ((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*))))
287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return PrimitiveBuiltinElementConstructMap[ EPT->getType() ];
288f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) {
289f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8)
290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "A_8";
291f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) {
292f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565)
293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_565";
294f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8)
295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_888";
296f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) {
297f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551)
298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_5551";
299f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444)
300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_4444";
301f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8)
302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "RGB_8888";
303f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EPT->getKind() == RSExportPrimitiveType::DataKindIndex) {
304f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned16)
305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                return "INDEX_16";
306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
307f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao    } else if (ET->getClass() == RSExportType::ExportClassVector) {
308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET);
309f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        if (EVT->getKind() == RSExportPrimitiveType::DataKindPosition) {
310f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
311f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao                if (EVT->getNumElement() == 2)
312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_POSITION_2";
313f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao                else if (EVT->getNumElement() == 3)
314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_POSITION_3";
315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
316f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EVT->getKind() == RSExportPrimitiveType::DataKindTexture) {
317f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
318f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao                if (EVT->getNumElement() == 2)
319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_TEXTURE_2";
320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
321f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EVT->getKind() == RSExportPrimitiveType::DataKindNormal) {
322f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
323f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao                if (EVT->getNumElement() == 3)
324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_NORMAL_3";
325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
326f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        } else if (EVT->getKind() == RSExportPrimitiveType::DataKindColor) {
327f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
328f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao                if (EVT->getNumElement() == 4)
329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_COLOR_F32_4";
330f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            } else if (EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) {
331f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao                if (EVT->getNumElement() == 4)
332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return "ATTRIB_COLOR_U8_4";
333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
335f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao    } else if (ET->getClass() == RSExportType::ExportClassPointer) {
336c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao        return "USER_I32";  /* tread pointer type variable as unsigned int (TODO: this is target dependent) */
337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return NULL;
340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataKindName(RSExportPrimitiveType::DataKind DK) {
343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* ElementDataKindNameMap[] = {
344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.USER",        /* RSExportPrimitiveType::DataKindUser */
345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.COLOR",       /* RSExportPrimitiveType::DataKindColor */
346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.POSITION",    /* RSExportPrimitiveType::DataKindPosition */
347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.TEXTURE",     /* RSExportPrimitiveType::DataKindTexture */
348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.NORMAL",      /* RSExportPrimitiveType::DataKindNormal */
349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.INDEX",       /* RSExportPrimitiveType::DataKindIndex */
350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.POINT_SIZE",  /* RSExportPrimitiveType::DataKindPointSize */
351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_L",     /* RSExportPrimitiveType::DataKindPixelL */
352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_A",     /* RSExportPrimitiveType::DataKindPixelA */
353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_LA",    /* RSExportPrimitiveType::DataKindPixelLA */
354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_RGB",   /* RSExportPrimitiveType::DataKindPixelRGB */
355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataKind.PIXEL_RGBA",  /* RSExportPrimitiveType::DataKindPixelRGBA */
356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((DK >= 0) && (DK < (sizeof(ElementDataKindNameMap) / sizeof(const char*))))
359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return ElementDataKindNameMap[ DK ];
360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return NULL;
362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataTypeName(RSExportPrimitiveType::DataType DT) {
365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    static const char* ElementDataTypeNameMap[] = {
366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,
367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,
368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.FLOAT_32",    /* RSExportPrimitiveType::DataTypeFloat32 */
369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,                           /* RSExportPrimitiveType::DataTypeFloat64 */
370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.SIGNED_8",    /* RSExportPrimitiveType::DataTypeSigned8 */
371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.SIGNED_16",   /* RSExportPrimitiveType::DataTypeSigned16 */
372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.SIGNED_32",   /* RSExportPrimitiveType::DataTypeSigned32 */
373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,                           /* RSExportPrimitiveType::DataTypeSigned64 */
374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_8",  /* RSExportPrimitiveType::DataTypeUnsigned8 */
375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_16", /* RSExportPrimitiveType::DataTypeUnsigned16 */
376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_32", /* RSExportPrimitiveType::DataTypeUnsigned32 */
377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NULL,                           /* RSExportPrimitiveType::DataTypeUnsigned64 */
378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_5_6_5",   /* RSExportPrimitiveType::DataTypeUnsigned565 */
380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_5_5_5_1", /* RSExportPrimitiveType::DataTypeUnsigned5551 */
381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.UNSIGNED_4_4_4_4", /* RSExportPrimitiveType::DataTypeUnsigned4444 */
382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
383dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao        "Element.DataType.BOOLEAN",     /* RSExportPrimitiveType::DataTypeBool */
384dd35e490cc067a761f0f55ecde5c76a76cc87ad2Shih-wei Liao
385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_ELEMENT",  /* RSExportPrimitiveType::DataTypeRSElement */
386462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_TYPE",     /* RSExportPrimitiveType::DataTypeRSType */
387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_ALLOCATION",   /* RSExportPrimitiveType::DataTypeRSAllocation */
388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_SAMPLER",      /* RSExportPrimitiveType::DataTypeRSSampler */
389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_SCRIPT",       /* RSExportPrimitiveType::DataTypeRSScript */
390f1bd510334a62034dcf3b4787f2d6634d05ec80bShih-wei Liao        "Element.DataType.RS_MESH",         /* RSExportPrimitiveType::DataTypeRSMesh */
391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */
392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_VERTEX",   /* RSExportPrimitiveType::DataTypeRSProgramVertex */
393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_RASTER",   /* RSExportPrimitiveType::DataTypeRSProgramRaster */
394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        "Element.DataType.RS_PROGRAM_STORE",    /* RSExportPrimitiveType::DataTypeRSProgramStore */
395bb1f9f01421ffbbafb4f02ea7c27dabd605edc35Shih-wei Liao        "Element.DataType.RS_FONT",    /* RSExportPrimitiveType::DataTypeRSFont */
396fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao        "Element.DataType.RS_MATRIX_2X2",    /* RSExportPrimitiveType::DataTypeRSMatrix2x2 */
397fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao        "Element.DataType.RS_MATRIX_3X3",    /* RSExportPrimitiveType::DataTypeRSMatrix3x3 */
398fcdd3355ba5b1e32e31941be6ec4da1469de3101Shih-wei Liao        "Element.DataType.RS_MATRIX_4X4",    /* RSExportPrimitiveType::DataTypeRSMatrix4x4 */
399462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
401462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if((DT >= 0) && (DT < (sizeof(ElementDataTypeNameMap) / sizeof(const char*))))
402462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return ElementDataTypeNameMap[ DT ];
403462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
404462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return NULL;
405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
407139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chioustatic void _mkdir(const std::string &path) {
408139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    char buf[256];
409139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    char *tmp, *p = NULL;
410139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    size_t len = path.size();
411139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou
412139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    if (len + 1 <= sizeof(buf))
413139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou        tmp = buf;
414139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    else
415139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou        tmp = new char [len + 1];
416b55d7ef3333534fc6aad80f9a9133f2bf945faf1Shih-wei Liao
417139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    strcpy(tmp, path.c_str());
4188b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
4198b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    if (tmp[len - 1] == '/')
4208b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        tmp[len - 1] = 0;
4218b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
4228b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    for (p = tmp + 1; *p; p++) {
4238b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        if (*p == '/') {
4248b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao            *p = 0;
4258b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao            mkdir(tmp, S_IRWXU);
4268b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao            *p = '/';
4278b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        }
4288b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    }
4298b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    mkdir(tmp, S_IRWXU);
430139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou
431139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou    if (tmp != buf)
432139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou        delete[] tmp;
4338b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao}
4348b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
4358b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liaobool RSReflection::openScriptFile(Context&C, const std::string& ClassName, std::string& ErrorMsg) {
4366de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    if(!C.mUseStdout) {
4376de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        C.mOF.clear();
4388b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        std::string _path = "/" + C.getPackageName();
4398b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        for (std::string::iterator it = _path.begin(); it != _path.end(); it++ ) {
4408b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao            if ( *it == '.') {
4418b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao                *it = '/';
4428b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao            }
4438b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        }
4448b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
44568e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao        std::string prefix = mRSContext->getReflectJavaPathName();
44668e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao        if (prefix.empty()) {
44768e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao            _path.insert(0, 1, '.');
44868e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao        } else {
44968e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao            _path.insert(0, mRSContext->getReflectJavaPathName());
45068e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao        }
4518b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
452139949bc10689a1a91980840fa743a3b07668e69Che-Liang Chiou        _mkdir(_path);
4538b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        C.mOF.open(( _path + "/" + ClassName + ".java" ).c_str());
4546de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        if(!C.mOF.good()) {
4558b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao            ErrorMsg = "failed to open file '" + _path + "/" + ClassName + ".java' for write";
4568b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
4576de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao            return false;
4586de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        }
4596de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    }
4608b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    return true;
4618b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao}
4628b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao
4638b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao/****************************** Methods to generate script class ******************************/
4648b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liaobool RSReflection::genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg) {
4658b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    /* Open the file */
4668b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    if (!openScriptFile(C, ClassName, ErrorMsg)) {
4678b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        return false;
4688b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    }
4696de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
4702dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(!C.startClass(Context::AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, ErrorMsg))
471462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
472462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
473462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genScriptClassConstructor(C);
474462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
475462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Reflect export variable */
476462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin();
477462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != mRSContext->export_vars_end();
478462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I++)
479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        genExportVariable(C, *I);
480462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
481462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Reflect export function */
482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSContext::const_export_func_iterator I = mRSContext->export_funcs_begin();
483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != mRSContext->export_funcs_end();
484462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I++)
485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        genExportFunction(C, *I);
486462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
487462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endClass();
488462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
489462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
490462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
491462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
492462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genScriptClassConstructor(Context& C) {
493462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "// Constructor" << endl;
4942dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 4, "RenderScript", "rs",
495462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "Resources", "resources",
4962dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                                                          "int", "id",
497462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "boolean", "isRoot");
498462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Call constructor of super class */
4992dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    C.indent() << "super(rs, resources, id, isRoot);" << endl;
500324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
501324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    /* If an exported variable has initial value, reflect it */
502324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
503324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin();
504324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        I != mRSContext->export_vars_end();
505324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        I++)
506324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    {
507324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        const RSExportVar* EV = *I;
508324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        if(!EV->getInit().isUninit())
509324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit());
510324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    }
511324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
512462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
513462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
515462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
51648bac230fe966771f3074975fc2426ffde519edfShih-wei Liaovoid RSReflection::genInitBoolExportVariable(Context& C, const std::string& VarName, const APValue& Val) {
51748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    assert(!Val.isUninit() && "Not a valid initializer");
51848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
51948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = ";
52048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    assert((Val.getKind() == APValue::Int) && "Bool type has wrong initial APValue");
52148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
52248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    if (Val.getInt().getSExtValue() == 0) {
52348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao        C.out() << "false";
52448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    } else {
52548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao        C.out() << "true";
52648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    }
52748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    C.out() << ";" << endl;
52848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
52948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    return;
53048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao}
53148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
532324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaovoid RSReflection::genInitPrimitiveExportVariable(Context& C, const std::string& VarName, const APValue& Val) {
533324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    assert(!Val.isUninit() && "Not a valid initializer");
534324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
535324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = ";
536324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    switch(Val.getKind()) {
5372239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      case APValue::Int: C.out() << Val.getInt().getSExtValue(); break;
5382239ecece40c177e071f56326cd5ef423806394dShih-wei Liao
5392239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      case APValue::Float: {
5402239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        llvm::APFloat apf = Val.getFloat();
5412239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        if (apf.semanticsPrecision(apf.getSemantics()) == 24 /*llvm::APFloat::IEEEsingle*/) {
5422239ecece40c177e071f56326cd5ef423806394dShih-wei Liao          C.out() << apf.convertToFloat();
5432239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        } else {
5442239ecece40c177e071f56326cd5ef423806394dShih-wei Liao          C.out() << apf.convertToDouble();
5452239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        }
546324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
5472239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      }
548324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
5492239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      case APValue::ComplexInt:
5502239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      case APValue::ComplexFloat:
5512239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      case APValue::LValue:
5522239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      case APValue::Vector:
5532239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        assert(false && "Primitive type cannot have such kind of initializer");
5542239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        break;
5552239ecece40c177e071f56326cd5ef423806394dShih-wei Liao
5562239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      default:
5572239ecece40c177e071f56326cd5ef423806394dShih-wei Liao        assert(false && "Unknown kind of initializer");
558324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
559324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    }
560324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    C.out() << ";" << endl;
561324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
562324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    return;
563324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao}
564324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
565324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liaovoid RSReflection::genInitExportVariable(Context& C, const RSExportType* ET, const std::string& VarName, const APValue& Val) {
566324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    assert(!Val.isUninit() && "Not a valid initializer");
567324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
568324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    switch(ET->getClass()) {
569f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        case RSExportType::ExportClassPrimitive:
570f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        case RSExportType::ExportClassConstantArray:
571f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        {
57248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET);
57348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            if (EPT->getType() == RSExportPrimitiveType::DataTypeBool) {
57448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao                genInitBoolExportVariable(C, VarName, Val);
57548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            } else {
57648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao                genInitPrimitiveExportVariable(C, VarName, Val);
57748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            }
57848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao            break;
57948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao        }
580324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
581324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        case RSExportType::ExportClassPointer:
582324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            if(!Val.isInt() || Val.getInt().getSExtValue() != 0)
583324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                std::cout << "Initializer which is non-NULL to pointer type variable will be ignored" << endl;
584324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
585324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
586324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        case RSExportType::ExportClassVector:
587324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        {
588324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET);
589324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            switch(Val.getKind()) {
590324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                case APValue::Int:
591324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                case APValue::Float:
592324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    for(int i=0;i<EVT->getNumElement();i++) {
593324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                        std::string Name =  VarName + "." + GetVectorAccessor(i);
594324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                        genInitPrimitiveExportVariable(C, Name, Val);
595324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    }
596324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                break;
597324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
598324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                case APValue::Vector:
599324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                {
600324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " << GetVectorTypeName(EVT) << "();" << endl;
601324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
602324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    unsigned NumElements = std::min(static_cast<unsigned>(EVT->getNumElement()), Val.getVectorLength());
603324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    for(unsigned i=0;i<NumElements;i++) {
604324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                        const APValue& ElementVal = Val.getVectorElt(i);
605324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                        std::string Name =  VarName + "." + GetVectorAccessor(i);
606324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                        genInitPrimitiveExportVariable(C, Name, ElementVal);
607324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    }
608324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                }
609324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                break;
610324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            }
611324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        }
612324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
613324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
614324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        /* TODO: Resolving initializer of a record type variable is complex. It cannot obtain by just simply evaluating the initializer expression. */
615324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        case RSExportType::ExportClassRecord:
616324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        {
617324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            /*
618324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            unsigned InitIndex = 0;
619324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
620324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
621324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            assert((Val.getKind() == APValue::Vector) && "Unexpected type of initializer for record type variable");
622324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
623324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new "RS_TYPE_CLASS_NAME_PREFIX << ERT->getName() <<  "."RS_TYPE_ITEM_CLASS_NAME"();" << endl;
624324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
625324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            for(RSExportRecordType::const_field_iterator I = ERT->fields_begin();
626324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                I != ERT->fields_end();
627324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                I++)
628324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            {
629324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                const RSExportRecordType::Field* F = *I;
630324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                std::string FieldName = VarName + "." + F->getName();
631324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
632324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                if(InitIndex > Val.getVectorLength())
633324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                    break;
634324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
635324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao                genInitPrimitiveExportVariable(C, FieldName, Val.getVectorElt(InitIndex++));
636324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            }
637324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            */
638324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            assert(false && "Unsupported initializer for record type variable currently");
639324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        }
640324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
641324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
642324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        default:
643324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao            assert(false && "Unknown class of type");
644324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
645324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    }
646324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    return;
647324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao}
648324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
649462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportVariable(Context& C, const RSExportVar* EV) {
650462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportType* ET = EV->getType();
651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
652462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << " = " << C.getNextExportVarSlot() << ";" << endl;
653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(ET->getClass()) {
655462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPrimitive:
656f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        case RSExportType::ExportClassConstantArray:
657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genPrimitiveTypeExportVariable(C, EV);
658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
659462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPointer:
661462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genPointerTypeExportVariable(C, EV);
662462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
663462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
664462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassVector:
665462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genVectorTypeExportVariable(C, EV);
666462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassRecord:
669462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genRecordTypeExportVariable(C, EV);
670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
671462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
672462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "Unknown class of type");
674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
675462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
676462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
677462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
678462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
679462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
680462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportFunction(Context& C, const RSExportFunc* EF) {
681462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" << endl;
682462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
683462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* invoke_*() */
684462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    Context::ArgTy Args;
685462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
686462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSExportFunc::const_param_iterator I = EF->params_begin();
687462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != EF->params_end();
6882dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        I++)
689462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
690462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportFunc::Parameter* P = *I;
691462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Args.push_back( make_pair(GetTypeName(P->getType()), P->getName()) );
692462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
693462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
694462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "invoke_" + EF->getName(), Args);
695462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
696462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!EF->hasParam()) {
6972dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" << endl;
698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    } else {
699462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportRecordType* ERT = EF->getParamPacketType();
700462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string FieldPackerName = EF->getName() + "_fp";
701462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(genCreateFieldPacker(C, ERT, FieldPackerName.c_str()))
703462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str());
704462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
705bdd788877b3f18980836a3ed0d46627169483653Shih-wei Liao        C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " << FieldPackerName << ");" << endl;
706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
707462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
708462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
709462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV) {
713f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao    assert((  EV->getType()->getClass() == RSExportType::ExportClassPrimitive ||
714f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao              EV->getType()->getClass() == RSExportType::ExportClassConstantArray
715f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao           ) && "Variable should be type of primitive here");
716462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
717462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(EV->getType());
718462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* TypeName = GetPrimitiveTypeName(EPT);
719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* set_*() */
723c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    if(!EV->isConst()) {
724c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v");
725c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
726462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
727c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        if(EPT->isRSObjectType())
728c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao            C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", (v == null) ? 0 : v.getID());" << endl;
729c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        else
730c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao            C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", v);" << endl;
731462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
732c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.endFunction();
733c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    }
734462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName, EV->getName());
736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
737462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
738462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
739462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
740462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context& C, const RSExportVar* EV) {
741462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportType* ET = EV->getType();
742462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportType* PointeeType;
743462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string TypeName;
744462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
745462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((ET->getClass() == RSExportType::ExportClassPointer) && "Variable should be type of pointer here");
746462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
747462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
748462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    TypeName = GetTypeName(ET);
749462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* bind_*() */
751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
752462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
753462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "bind_" + EV->getName(), 1, TypeName.c_str(), "v");
754462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
755462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
756462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if(v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl;
757462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
758462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(PointeeType->getClass() == RSExportType::ExportClassRecord)
759462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "else bindAllocation(v.getAllocation(), "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl;
760462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
761462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl;
762462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
763462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
764462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
765462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName, EV->getName());
766462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
767462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
768462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
769462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context& C, const RSExportVar* EV) {
771462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EV->getType()->getClass() == RSExportType::ExportClassVector) && "Variable should be type of vector here");
772462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
773462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(EV->getType());
774462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* TypeName = GetVectorTypeName(EVT);
775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* FieldPackerName = "fp";
776462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
777462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
778462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
779462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* set_*() */
780c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    if(!EV->isConst()) {
781c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v");
782c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
783462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
784c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        if(genCreateFieldPacker(C, EVT, FieldPackerName))
785c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao            genPackVarOfType(C, EVT, "v", FieldPackerName);
786c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl;
787462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
788c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.endFunction();
789c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    }
790462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
791462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName, EV->getName());
792462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
793462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
794462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
795462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context& C, const RSExportVar* EV) {
796462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && "Variable should be type of struct here");
797462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
798462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(EV->getType());
799462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string TypeName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME;
800462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* FieldPackerName = "fp";
801462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
802462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl;
803462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
804462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* set_*() */
805c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    if(!EV->isConst()) {
806c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName.c_str(), "v");
807c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl;
808462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
809c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        if(genCreateFieldPacker(C, ERT, FieldPackerName))
810c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao            genPackVarOfType(C, ERT, "v", FieldPackerName);
811c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl;
812462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
813c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao        C.endFunction();
814c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    }
815462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
816462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genGetExportVariable(C, TypeName.c_str(), EV->getName());
817462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
818462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
819462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
820462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName) {
821462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, TypeName.c_str(), "get_" + VarName, 0);
822462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
823462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << endl;
824462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
825462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
826462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
827462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
828462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
829462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class /end ******************************/
830462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
831462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genCreateFieldPacker(Context& C, const RSExportType* ET, const char* FieldPackerName) {
832462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    size_t AllocSize = RSExportType::GetTypeAllocSize(ET);
833462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(AllocSize > 0)
834462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" << AllocSize << ");" << endl;
835462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
836462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
837462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
838462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
839462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
840462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPackVarOfType(Context& C, const RSExportType* ET, const char* VarName, const char* FieldPackerName) {
841462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(ET->getClass()) {
842462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPrimitive:
843f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        case RSExportType::ExportClassConstantArray:
844462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassVector:
845462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            C.indent() << FieldPackerName << "." << GetPackerAPIName(static_cast<const RSExportPrimitiveType*>(ET)) << "(" << VarName << ");" << endl;
846462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
847462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
848462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassPointer:
849462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
850462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* Must reflect as type Allocation in Java */
851462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
852462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
853462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(PointeeType->getClass() != RSExportType::ExportClassRecord)
854c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao                C.indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());" << endl;
855462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            else
856c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao                C.indent() << FieldPackerName << ".addI32(" << VarName << ".getAllocation().getPtr());" << endl;
857462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
858462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
859462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case RSExportType::ExportClassRecord:
861462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
862462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
863462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            int Pos = 0;    /* relative pos from now on in field packer */
864462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
865462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            for(RSExportRecordType::const_field_iterator I = ERT->fields_begin();
866462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                I != ERT->fields_end();
867462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                I++)
868462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            {
869462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                const RSExportRecordType::Field* F = *I;
870462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                std::string FieldName;
871462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                size_t FieldOffset = F->getOffsetInParent();
872462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
873462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType());
874462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
875462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(VarName != NULL)
876462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    FieldName = VarName + ("." + F->getName());
877462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                else
878462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    FieldName = F->getName();
879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
880462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(FieldOffset > Pos)
881462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    C.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) << ");" << endl;
882462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName);
884462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
885462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(FieldAllocSize > FieldStoreSize)  /* there's padding in the field type */
886462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    C.indent() << FieldPackerName << ".skip(" << (FieldAllocSize - FieldStoreSize) << ");" << endl;
887462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
888462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                Pos = FieldOffset + FieldAllocSize;
889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
891462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            /* There maybe some padding after the struct */
892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos;
893462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(Padding > 0)
894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                C.indent() << FieldPackerName << ".skip(" << Padding << ");" << endl;
895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
897462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default:
899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            assert(false && "Unknown class of type");
900462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        break;
901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
903462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
904462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
906462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class  ******************************/
907462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) {
908462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName();
909462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
9106de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    /* Open the file */
9118b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    if (!openScriptFile(C, ClassName, ErrorMsg)) {
9128b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao        return false;
9136de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    }
9146de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
9152dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(!C.startClass(Context::AM_Public, false, ClassName, RS_TYPE_CLASS_SUPER_CLASS_NAME, ErrorMsg))
916462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
918462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!genTypeItemClass(C, ERT, ErrorMsg))
919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
921462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Declare item buffer and item buffer packer */
922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[];" << endl;
923462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" << endl;
924462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClassConstructor(C, ERT);
926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClassCopyToArray(C, ERT);
927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClasSet(C, ERT);
9289b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    genTypeClasGet(C, ERT);
929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genTypeClasCopyAll(C, ERT);
930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endClass();
932462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
935462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
936462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) {
937462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME;
938462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
939462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
940462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "public static final int sizeof = " << RSExportType::GetTypeAllocSize(ERT) << ";" << endl;
941462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
942462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Member elements */
943462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.out() << endl;
944462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin();
945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        FI != ERT->fields_end();
946f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        FI++) {
947462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() << ";" << endl;
948f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao    }
949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Constructor */
951462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.out() << endl;
952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_CLASS_NAME"()";
953462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin();
956462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        FI != ERT->fields_end();
9572dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        FI++)
958462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
959462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const RSExportRecordType::Field* F = *FI;
960f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        if( (F->getType()->getClass() == RSExportType::ExportClassVector) ||
961f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            (F->getType()->getClass() == RSExportType::ExportClassRecord) ||
962f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            (F->getType()->getClass() == RSExportType::ExportClassConstantArray)
963f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            ) {
964f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao          C.indent() << F->getName() << " = new " << GetTypeName(F->getType()) << "();" << endl;
965f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao        }
966462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
968462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();   /* end Constructor */
969462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
970462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();   /* end Item class */
971462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
972462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
973462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
975462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
976462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassConstructor(Context& C, const RSExportRecordType* ERT) {
977462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* RenderScriptVar = "rs";
978462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
9799e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    C.startFunction(Context::AM_Public, true, "Element", "createElement", 1, "RenderScript", RenderScriptVar);
9809e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    genBuildElement(C, ERT, RenderScriptVar);
9819e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    C.endFunction();
9829e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao
983462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 2, "RenderScript", RenderScriptVar,
984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "int", "count");
985462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
986462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << endl;
987462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << endl;
9889e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    C.indent() << "mElement = createElement(" << RenderScriptVar << ");" << endl;
989462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Call init() in super class */
990462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "init(" << RenderScriptVar << ", count);" << endl;
991462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
993462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT) {
997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Private, false, "void", "copyToArray", 2, RS_TYPE_ITEM_CLASS_NAME, "i",
998462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                          "int", "index");
999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1000462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-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;
1001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" << endl;
1002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME);
1004462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1005462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
1006462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1007462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasSet(Context& C, const RSExportRecordType* ERT) {
1010462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "set", 3, RS_TYPE_ITEM_CLASS_NAME, "i",
1011462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                 "int", "index",
1012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                                                                 "boolean", "copyNow");
1013462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-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;
1014462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << endl;
1015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if (copyNow) ";
1017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
10182dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao
1019462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "copyToArray(i, index);" << endl;
10209e98e006c1dd889ecac1bebf353500e7a54d490eShih-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;
10219e98e006c1dd889ecac1bebf353500e7a54d490eShih-wei Liao    C.indent() << "mAllocation.subData1D(index, 1, "RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl;
1022462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endBlock();   /* end if (copyNow) */
1024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1025462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
1026462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1027462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10299b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liaovoid RSReflection::genTypeClasGet(Context& C, const RSExportRecordType* ERT) {
10309b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    C.startFunction(Context::AM_Public, false, RS_TYPE_ITEM_CLASS_NAME, "get", 1, "int", "index");
10319b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return null;" << endl;
10329b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index];" << endl;
10339b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    C.endFunction();
10349b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    return;
10359b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao}
10369b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao
1037462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasCopyAll(Context& C, const RSExportRecordType* ERT) {
1038462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startFunction(Context::AM_Public, false, "void", "copyAll", 0);
1039462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1040462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-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;
1041462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "mAllocation.data("RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl;
1042462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1043462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
1044462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1046462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1047462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class /end ******************************/
1048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1049462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type ********************/
10509e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liaovoid RSReflection::genBuildElement(Context& C, const RSExportRecordType* ERT, const char* RenderScriptVar) {
1051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const char* ElementBuilderName = "eb";
1052462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1053462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Create element builder */
10549e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    //    C.startBlock(true);
1055462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1056462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "Element.Builder " << ElementBuilderName << " = new Element.Builder(" << RenderScriptVar << ");" << endl;
1057462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1058462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* eb.add(...) */
1059462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    genAddElementToElementBuilder(C, ERT, "", ElementBuilderName, RenderScriptVar);
1060462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10619e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    C.indent() << "return " << ElementBuilderName << ".create();" << endl;
1062462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10639e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    //   C.endBlock();
1064462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1065462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1066462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1067462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define EB_ADD(x, ...)  \
1068b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    C.indent() << ElementBuilderName << ".add(Element." << x ##__VA_ARGS__ ", \"" << VarName << "\");" << endl
1069b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao
1070462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context& C, const RSExportType* ET, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar) {
1071b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    const char* ElementConstruct = GetBuiltinElementConstruct(ET);
1072b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao
1073bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao    if(ElementConstruct != NULL) {
1074bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")");
1075b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    } else {
1076f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao      if ((ET->getClass() == RSExportType::ExportClassPrimitive) ||
1077f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao          (ET->getClass() == RSExportType::ExportClassVector)    ||
1078f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao          (ET->getClass() == RSExportType::ExportClassConstantArray)
1079f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao          ) {
1080bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET);
1081bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const char* DataKindName = GetElementDataKindName(EPT->getKind());
1082bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const char* DataTypeName = GetElementDataTypeName(EPT->getType());
1083bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        int Size = (ET->getClass() == RSExportType::ExportClassVector) ? static_cast<const RSExportVectorType*>(ET)->getNumElement() : 1;
1084bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1085bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        switch(EPT->getKind()) {
1086bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindColor:
1087bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPosition:
1088bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindTexture:
1089bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindNormal:
1090bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPointSize:
1091bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            /* Element.createAttrib() */
1092bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("createAttrib(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ", " << Size << ")");
1093bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
1094bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1095bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindIndex:
1096bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            /* Element.createIndex() */
1097bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("createAttrib(" << RenderScriptVar << ")");
1098bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
1099bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1100bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelL:
1101bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelA:
1102bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelLA:
1103bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelRGB:
1104bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindPixelRGBA:
1105bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            /* Element.createPixel() */
1106bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ")");
1107bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
1108bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1109bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          case RSExportPrimitiveType::DataKindUser:
1110bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          default:
1111f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            if (EPT->getClass() == RSExportType::ExportClassPrimitive || EPT->getClass() == RSExportType::ExportClassConstantArray) {
1112bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              /* Element.createUser() */
1113bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              EB_ADD("createUser(" << RenderScriptVar << ", " << DataTypeName << ")");
1114f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            } else {   /* (ET->getClass() == RSExportType::ExportClassVector) must hold here */
1115bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              /* Element.createVector() */
1116bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao              EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << Size << ")");
1117f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao            }
1118bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            break;
1119bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        }
1120bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      } else if(ET->getClass() == RSExportType::ExportClassPointer) {
1121bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        /* Pointer type variable should be resolved in GetBuiltinElementConstruct()  */
1122bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        assert(false && "??");
1123bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      } else if(ET->getClass() == RSExportType::ExportClassRecord) {
1124bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        /*
1125bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         * Simalar to genPackVarOfType.
1126bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         *
1127bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         * TODO: Generalize these two function such that there's no duplicated codes.
1128bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao         */
1129bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
1130bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        int Pos = 0;    /* relative pos from now on */
1131bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1132bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        for(RSExportRecordType::const_field_iterator I = ERT->fields_begin();
1133bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            I != ERT->fields_end();
1134bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            I++)
1135bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        {
1136bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          const RSExportRecordType::Field* F = *I;
1137bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          std::string FieldName;
1138bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          size_t FieldOffset = F->getOffsetInParent();
1139bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
1140bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType());
1141bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1142bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          if(!VarName.empty())
1143bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            FieldName = VarName + "." + F->getName();
1144bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          else
1145bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            FieldName = F->getName();
1146bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1147bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          /* alignment */
1148bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          genAddPaddingToElementBuiler(C, (FieldOffset - Pos), ElementBuilderName, RenderScriptVar);
1149bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1150bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          /* eb.add(...) */
1151bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          genAddElementToElementBuilder(C, (*I)->getType(), FieldName, ElementBuilderName, RenderScriptVar);
1152bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
11530a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao          /* There is padding within the field type */
1154bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          genAddPaddingToElementBuiler(C, (FieldAllocSize - FieldStoreSize), ElementBuilderName, RenderScriptVar);
1155bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1156bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          Pos = FieldOffset + FieldAllocSize;
1157bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        }
1158bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
1159bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        /* There maybe some padding after the struct */
11600a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao        //unsigned char align = RSExportType::GetTypeAlignment(ERT);
11610a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao        //size_t siz = RSExportType::GetTypeAllocSize(ERT);
11620a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao        size_t siz1 = RSExportType::GetTypeStoreSize(ERT);
11630a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao
11640a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao        genAddPaddingToElementBuiler(C, siz1 - Pos, ElementBuilderName, RenderScriptVar);
1165bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      } else {
1166bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao        assert(false && "Unknown class of type");
1167bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao      }
1168b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    }
1169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar) {
1172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    while(PaddingSize > 0) {
1173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const std::string& VarName = C.createPaddingField();
1174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(PaddingSize >= 4) {
1175bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          EB_ADD("U32(" << RenderScriptVar << ")");
1176bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao          PaddingSize -= 4;
1177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(PaddingSize >= 2) {
1178bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("U16(" << RenderScriptVar << ")");
1179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            PaddingSize -= 2;
1180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } else if(PaddingSize >= 1) {
1181bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao            EB_ADD("U8(" << RenderScriptVar << ")");
1182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            PaddingSize -= 1;
1183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
1184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD
1189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type /end ********************/
1190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName) {
1192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    Context *C = NULL;
1193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string ResourceId = "";
1194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!GetFileNameWithoutExtension(OutputBCFileName, ResourceId))
1196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
1197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(ResourceId.empty())
1199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ResourceId = "<Resource ID>";
1200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12012dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if((OutputPackageName == NULL) || (*OutputPackageName == '\0') || strcmp(OutputPackageName, "-") == 0)
12024e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang        C = new Context(InputFileName, "<Package Name>", ResourceId, true);
12032dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    else
12044e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang        C = new Context(InputFileName, OutputPackageName, ResourceId, false);
1205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(C != NULL) {
1207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string ErrorMsg, ScriptClassName;
1208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* class ScriptC_<ScriptName> */
1209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(!GetFileNameWithoutExtension(InputFileName, ScriptClassName))
1210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return false;
1211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(ScriptClassName.empty())
1213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            ScriptClassName = "<Input Script Name>";
1214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ScriptClassName.at(0) = toupper(ScriptClassName.at(0));
1216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX);
1217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12184c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao        if (mRSContext->getLicenseNote() != NULL) {
12194c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao          C->setLicenseNote(*(mRSContext->getLicenseNote()));
12204c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao        }
1221d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
1222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(!genScriptClass(*C, ScriptClassName, ErrorMsg)) {
1223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            std::cerr << "Failed to generate class " << ScriptClassName << " (" << ErrorMsg << ")" << endl;
1224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return false;
1225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
1226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* class ScriptField_<TypeName> */
1228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        for(RSContext::const_export_type_iterator TI = mRSContext->export_types_begin();
1229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            TI != mRSContext->export_types_end();
12302dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao            TI++)
1231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        {
1232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const RSExportType* ET = TI->getValue();
1233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(ET->getClass() == RSExportType::ExportClassRecord) {
1235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET);
1236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                if(!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) {
1238462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    std::cerr << "Failed to generate type class for struct '" << ERT->getName() << "' (" << ErrorMsg << ")" << endl;
1239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    return false;
1240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                }
1241462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
1242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
1243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
1246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1248462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSReflection::Context ******************************/
1249d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsiehconst char* const RSReflection::Context::ApacheLicenseNote =
1250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "/*\n"
1251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * Copyright (C) 2010 The Android Open Source Project\n"
1252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *\n"
1253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
1254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * you may not use this file except in compliance with the License.\n"
1255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * You may obtain a copy of the License at\n"
1256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *\n"
1257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *      http://www.apache.org/licenses/LICENSE-2.0\n"
1258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" *\n"
1259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * Unless required by applicable law or agreed to in writing, software\n"
1260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
1261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
1262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * See the License for the specific language governing permissions and\n"
1263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao	" * limitations under the License.\n"
1264d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh	" */\n"
1265d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh	"\n";
1266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* const RSReflection::Context::Import[] = {
1268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* RenderScript java class */
1269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "android.renderscript.*",
1270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Import R */
1271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "android.content.res.Resources",
1272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Import for debugging */
1273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "android.util.Log",
1274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
1275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* RSReflection::Context::AccessModifierStr(AccessModifier AM) {
1277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    switch(AM) {
1278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case AM_Public: return "public"; break;
1279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case AM_Protected: return "protected"; break;
1280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        case AM_Private: return "private"; break;
1281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        default: return ""; break;
1282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg) {
12862dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao    if(mVerbose)
1287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::cout << "Generating " << ClassName << ".java ..." << endl;
1288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* License */
1290d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    out() << mLicenseNote;
1291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12924e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    /* Notice of generated file */
12934e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << "/*" << endl;
12944e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << " * This file is auto-generated. DO NOT MODIFY!" << endl;
12954e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << " * The source RenderScript file: " << mInputRSFile << endl;
12964e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << " */" << endl;
12974e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang
1298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Package */
1299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!mPackageName.empty())
1300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << "package " << mPackageName << ";" << endl;
1301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << endl;
1302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Imports */
1304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(int i=0;i<(sizeof(Import)/sizeof(const char*));i++)
1305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << "import " << Import[i] << ";" << endl;
1306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << endl;
1307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13084e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    /* All reflected classes should be annotated as hidden, so that they won't be exposed in SDK. */
13094e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << "/**" << endl;
13104e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << " * @hide" << endl;
13114e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang    out() << " */" << endl;
13124e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang
1313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " << ClassName;
1314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(SuperClassName != NULL)
1315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << " extends " << SuperClassName;
1316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startBlock();
1318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mClassName = ClassName;
1320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
1322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() {
1325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    endBlock();
1326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!mUseStdout)
1327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mOF.close();
1328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    clear();
1329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) {
1333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(ShouldIndent)
1334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        indent() << "{" << endl;
1335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
1336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << " {" << endl;
1337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    incIndentLevel();
1338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() {
1342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    decIndentLevel();
1343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    indent() << "}" << endl << endl;
1344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string& ClassName) {
1348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    indent() << "public static class " << ClassName;
1349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startBlock();
1350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() {
1354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    endBlock();
1355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...) {
1359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    ArgTy Args;
1360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    va_list vl;
1361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    va_start(vl, Argc);
1362462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(int i=0;i<Argc;i++) {
1364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const char* ArgType = va_arg(vl, const char*);
1365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        const char* ArgName = va_arg(vl, const char*);
1366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        Args.push_back( make_pair(ArgType, ArgName) );
1368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    va_end(vl);
1370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startFunction(AM, IsStatic, ReturnType, FunctionName, Args);
1372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13762dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM,
13772dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          bool IsStatic,
13782dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          const char* ReturnType,
13792dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          const std::string& FunctionName,
13802dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          const ArgTy& Args)
1381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{
1382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "(";
1383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1384462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool FirstArg = true;
1385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(ArgTy::const_iterator I = Args.begin();
1386462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != Args.end();
1387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I++)
1388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
13892dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao        if(!FirstArg)
1390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            out() << ", ";
1391462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        else
1392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            FirstArg = false;
1393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        out() << I->first << " " << I->second;
1395462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1396462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1397462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    out() << ")";
1398462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    startBlock();
1399462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1401462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1402462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1403462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() {
1404462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    endBlock();
1405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
1406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1408462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}   /* namespace slang */
1409