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