slang_rs_reflection.h revision 9c631ff2e65a8fa766981c9683c3b255ce0a2388
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef _SLANG_COMPILER_RS_REFLECTION_HPP
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#   define _SLANG_COMPILER_RS_REFLECTION_HPP
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <map>
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <vector>
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cassert>
8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <fstream>
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <iostream>
10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type.hpp"
12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/StringExtras.h"  /* for function llvm::utostr_32() and llvm::itostr() */
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext;
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportVar;
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc;
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSReflection {
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoprivate:
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const RSContext* mRSContext;
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string mLastError;
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    inline void setError(const std::string& Error) { mLastError = Error; }
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    class Context {
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    private:
30d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        static const char* const ApacheLicenseNote;
31d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        std::string mLicenseNote;
32d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        static const char* const Import[];
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        bool mVerbose;
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
374e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang        std::string mInputRSFile;
384e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string mPackageName;
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string mResourceId;
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string mClassName;
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        std::string mIndent;
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        int mPaddingFieldIndex;
47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        int mNextExportVarSlot;
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        int mNextExportFuncSlot;
50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
519c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        /*
529c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao         * A mapping from a field in a record type to its index in the rsType instance.
539c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao         * Only used when generates TypeClass (ScriptField_*).
549c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao         */
559c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        typedef std::map<const RSExportRecordType::Field*, unsigned> FieldIndexMapTy;
569c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        FieldIndexMapTy mFieldIndexMap;
579c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        /* Field index of current processing TypeClass. */
589c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        unsigned mFieldIndex;
599c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline void clear() {
61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mClassName = "";
62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mIndent = "";
63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mPaddingFieldIndex = 1;
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mNextExportVarSlot = 0;
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mNextExportFuncSlot = 0;
66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return;
67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    public:
70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        typedef enum {
71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            AM_Public,
72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            AM_Protected,
73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            AM_Private
74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        } AccessModifier;
75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
766de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        bool mUseStdout;
776de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        mutable std::ofstream mOF;
786de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        static const char* AccessModifierStr(AccessModifier AM);
80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
814e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang        Context(const std::string& InputRSFile, const std::string& PackageName, const std::string& ResourceId, bool UseStdout) :
82d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh            mLicenseNote(ApacheLicenseNote),
834e348449fedc9e33e3a5a6796d480c0a74202b9bYing Wang            mInputRSFile(InputRSFile),
84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mPackageName(PackageName),
85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mResourceId(ResourceId),
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mUseStdout(UseStdout),
87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            mVerbose(true)
889e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao        {
89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            clear();
909e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            return;
91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline std::ostream& out() const { if(mUseStdout) return std::cout; else return mOF; }
949e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao        inline std::ostream& indent() const {
959e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            out() << mIndent;
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return out();
97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
999e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao        inline void incIndentLevel() {
1009e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            mIndent.append(4, ' ');
1019e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            return;
102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1049e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao        inline void decIndentLevel() {
1059e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            assert(getIndentLevel() > 0 && "No indent");
1069e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            mIndent.erase(0, 4);
1079e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao            return;
108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline int getIndentLevel() {
111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return (mIndent.length() >> 2);
112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline int getNextExportVarSlot() {
115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return mNextExportVarSlot++;
116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline int getNextExportFuncSlot() {
119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return mNextExportFuncSlot++;
120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
122462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* Will remove later due to field name information is not necessary for C-reflect-to-Java */
123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline std::string createPaddingField() {
124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return "#padding_" + llvm::itostr(mPaddingFieldIndex++);
125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
127d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        inline void setLicenseNote(const std::string& LicenseNote) {
128d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh            mLicenseNote = LicenseNote;
129d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        }
130d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        bool startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg);
132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void endClass();
133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...);
1359e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao
136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        typedef std::vector<std::pair<std::string, std::string> > ArgTy;
137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, const ArgTy& Args);
138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void endFunction();
139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void startBlock(bool ShouldIndent = false);
141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void endBlock();
142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline const std::string& getPackageName() const { return mPackageName; }
144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline const std::string& getClassName() const { return mClassName; }
145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        inline const std::string& getResourceId() const { return mResourceId; }
146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void startTypeClass(const std::string& ClassName);
148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        void endTypeClass();
1499c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
1509c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        inline void incFieldIndex() {
1519c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            mFieldIndex++;
1529c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        }
1539c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
1549c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        inline void resetFieldIndex() {
1559c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            mFieldIndex = 0;
1569c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        }
1579c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
1589c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        inline void addFieldIndexMapping(const RSExportRecordType::Field* F) {
1599c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            assert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) && "Nested structure never occurs in C language.");
1609c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            mFieldIndexMap.insert(std::make_pair(F, mFieldIndex));
1619c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        }
1629c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
1639c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        inline unsigned getFieldIndex(const RSExportRecordType::Field* F) const {
1649c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F);
1659c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            assert((I != mFieldIndexMap.end()) && "Requesting field is out of scope.");
1669c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            return I->second;
1679c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        }
1689c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
1699c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        inline void clearFieldIndexMap() {
1709c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao            mFieldIndexMap.clear();
1719c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao        }
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    };
173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1748b1d0dd74715221138d2458858178b4e0e014f09Shih-wei Liao    bool openScriptFile(Context& C, const std::string& ClassName, std::string& ErrorMsg);
175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg);
176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genScriptClassConstructor(Context& C);
177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao    void genInitBoolExportVariable(Context& C, const std::string& VarName, const APValue& Val);
179324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    void genInitPrimitiveExportVariable(Context& C, const std::string& VarName, const APValue& Val);
180324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    void genInitExportVariable(Context& C, const RSExportType* ET, const std::string& VarName, const APValue& Val);
181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genExportVariable(Context& C, const RSExportVar* EV);
182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV);
183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genPointerTypeExportVariable(Context& C, const RSExportVar* EV);
184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genVectorTypeExportVariable(Context& C, const RSExportVar* EV);
185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genRecordTypeExportVariable(Context& C, const RSExportVar* EV);
186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName);
187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genExportFunction(Context& C, const RSExportFunc* EF);
189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg);
191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg);
192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genTypeClassConstructor(Context& C, const RSExportRecordType* ERT);
193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT);
1949c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genTypeClassItemSetter(Context& C, const RSExportRecordType* ERT);
1959c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genTypeClassItemGetter(Context& C, const RSExportRecordType* ERT);
1969c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genTypeClassComponentSetter(Context& C, const RSExportRecordType* ERT);
1979c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genTypeClassComponentGetter(Context& C, const RSExportRecordType* ERT);
1989c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genTypeClassCopyAll(Context& C, const RSExportRecordType* ERT);
199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2009e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao    void genBuildElement(Context& C, const RSExportRecordType* ERT, const char* RenderScriptVar);
201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genAddElementToElementBuilder(Context& C, const RSExportType* ERT, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar);
202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar);
203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool genCreateFieldPacker(Context& C, const RSExportType* T, const char* FieldPackerName);
205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void genPackVarOfType(Context& C, const RSExportType* T, const char* VarName, const char* FieldPackerName);
2069c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genNewItemBufferIfNull(Context& C, const char* Index);
2079c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao    void genNewItemBufferPackerIfNull(Context& C);
208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaopublic:
210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSReflection(const RSContext* Context) :
211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mRSContext(Context),
212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mLastError("")
213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return;
215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName);
218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    inline const char* getLastError() const {
220462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(mLastError.empty())
221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return NULL;
222462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        else
223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            return mLastError.c_str();
224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};  /* class RSReflection */
226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}   /* namespace slang */
228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif  /* _SLANG_COMPILER_RS_REFLECTION_HPP */
230