slang_rs_reflection.h revision 9ef2f785e0cc490af678dfd685995dec787321ff
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef _SLANG_COMPILER_RS_REFLECTION_HPP 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao# define _SLANG_COMPILER_RS_REFLECTION_HPP 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 49ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "slang_rs_export_type.hpp" 59ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringExtras.h" 79ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <map> 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <vector> 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string> 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cassert> 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <fstream> 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <iostream> 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 { 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSContext *mRSContext; 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mLastError; 269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setError(const std::string &Error) { mLastError = Error; } 279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao class Context { 299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *const ApacheLicenseNote; 319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *const Import[]; 339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mVerbose; 359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mInputRSFile; 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mPackageName; 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mResourceId; 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mClassName; 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mLicenseNote; 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mIndent; 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int mPaddingFieldIndex; 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int mNextExportVarSlot; 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int mNextExportFuncSlot; 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // A mapping from a field in a record type to its index in the rsType 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // instance. Only used when generates TypeClass (ScriptField_*). 549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::map<const RSExportRecordType::Field*, unsigned> FieldIndexMapTy; 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldIndexMapTy mFieldIndexMap; 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Field index of current processing TypeClass. 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned mFieldIndex; 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void clear() { 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ""; 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mIndent = ""; 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPaddingFieldIndex = 1; 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNextExportVarSlot = 0; 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNextExportFuncSlot = 0; 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef enum { 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao AM_Public, 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao AM_Protected, 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao AM_Private 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } AccessModifier; 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mUseStdout; 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mutable std::ofstream mOF; 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *AccessModifierStr(AccessModifier AM); 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context(const std::string &InputRSFile, 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &PackageName, 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ResourceId, 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool UseStdout) 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : mVerbose(true), 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mInputRSFile(InputRSFile), 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPackageName(PackageName), 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mResourceId(ResourceId), 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLicenseNote(ApacheLicenseNote), 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mUseStdout(UseStdout) { 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::ostream &out() const { 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mUseStdout) return std::cout; else return mOF; 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::ostream &indent() const { 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << mIndent; 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return out(); 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void incIndentLevel() { 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mIndent.append(4, ' '); 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void decIndentLevel() { 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(getIndentLevel() > 0 && "No indent"); 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mIndent.erase(0, 4); 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline int getIndentLevel() { 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return (mIndent.length() >> 2); 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline int getNextExportVarSlot() { 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mNextExportVarSlot++; 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline int getNextExportFuncSlot() { 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mNextExportFuncSlot++; 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Will remove later due to field name information is not necessary for 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // C-reflect-to-Java 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::string createPaddingField() { 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return "#padding_" + llvm::itostr(mPaddingFieldIndex++); 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 130cecd11d2af5d45d8ba322bed61fb48a99c305528Shih-wei Liao 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setLicenseNote(const std::string &LicenseNote) { 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLicenseNote = LicenseNote; 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool startClass(AccessModifier AM, 1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *SuperClassName, 1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endClass(); 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startFunction(AccessModifier AM, 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Argc, ...); 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::vector<std::pair<std::string, std::string> > ArgTy; 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startFunction(AccessModifier AM, 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const ArgTy &Args); 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endFunction(); 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startBlock(bool ShouldIndent = false); 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endBlock(); 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string &getPackageName() const { return mPackageName; } 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string &getClassName() const { return mClassName; } 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string &getResourceId() const { return mResourceId; } 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startTypeClass(const std::string &ClassName); 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endTypeClass(); 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void incFieldIndex() { 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mFieldIndex++; 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void resetFieldIndex() { 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mFieldIndex = 0; 1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1739c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addFieldIndexMapping(const RSExportRecordType::Field *F) { 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) && 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Nested structure never occurs in C language."); 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mFieldIndexMap.insert(std::make_pair(F, mFieldIndex)); 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline unsigned getFieldIndex(const RSExportRecordType::Field *F) const { 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F); 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert((I != mFieldIndexMap.end()) && 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Requesting field is out of scope."); 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return I->second; 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void clearFieldIndexMap() { 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mFieldIndexMap.clear(); 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool openScriptFile(Context &C, 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genScriptClass(Context &C, 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genScriptClassConstructor(Context &C); 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genInitBoolExportVariable(Context &C, 2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val); 2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genInitPrimitiveExportVariable(Context &C, 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string& VarName, 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val); 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genInitExportVariable(Context &C, 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val); 2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genExportVariable(Context &C, const RSExportVar *EV); 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genPrimitiveTypeExportVariable(Context &C, const RSExportVar *EV); 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genPointerTypeExportVariable(Context &C, const RSExportVar *EV); 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genVectorTypeExportVariable(Context &C, const RSExportVar *EV); 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genRecordTypeExportVariable(Context &C, const RSExportVar *EV); 2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genGetExportVariable(Context &C, 2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &TypeName, 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName); 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genExportFunction(Context &C, 2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportFunc *EF); 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genTypeClass(Context &C, 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genTypeItemClass(Context &C, 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassConstructor(Context &C, 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT); 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassCopyToArray(Context &C, 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT); 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassItemSetter(Context &C, 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT); 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassItemGetter(Context &C, const RSExportRecordType *ERT); 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassComponentSetter(Context &C, const RSExportRecordType *ERT); 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassComponentGetter(Context &C, const RSExportRecordType *ERT); 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassCopyAll(Context &C, const RSExportRecordType *ERT); 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genBuildElement(Context &C, 2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar); 2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genAddElementToElementBuilder(Context &C, 2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ERT, 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar); 2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genAddPaddingToElementBuiler(Context &C, 2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int PaddingSize, 2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar); 2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genCreateFieldPacker(Context &C, 2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *T, 2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName); 2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genPackVarOfType(Context &C, 2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *T, 2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *VarName, 2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName); 2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genNewItemBufferIfNull(Context &C, const char *Index); 2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genNewItemBufferPackerIfNull(Context &C); 2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflection(const RSContext *Context) 2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : mRSContext(Context), 2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLastError("") { 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool reflect(const char *OutputPackageName, 2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName); 2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const char *getLastError() const { 2749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mLastError.empty()) 2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mLastError.c_str(); 2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}; // class RSReflection 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif // _SLANG_COMPILER_RS_REFLECTION_HPP 284