slang_rs_context.cpp revision a41ce1d98094da84643995d40d71c529905123fc
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 26315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 36315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/LLVMContext.h" 46315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/Target/TargetData.h" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/TargetInfo.h" 79ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/Linkage.h" 89ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Type.h" 99ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Decl.h" 109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/DeclBase.h" 119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/ASTContext.h" 129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Index/ASTLocation.h" 139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h" 156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflection.h" 16a41ce1d98094da84643995d40d71c529905123fcZonr Chang#include "slang_rs_exportable.h" 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h" 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h" 196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h" 206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_pragma_handler.h" 219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaousing namespace slang; 239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSContext::RSContext(clang::Preprocessor *PP, 259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::ASTContext *Ctx, 266315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const clang::TargetInfo *Target) 276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : mPP(PP), 286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mCtx(Ctx), 296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mTarget(Target), 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mTargetData(NULL), 316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mLLVMContext(llvm::getGlobalContext()), 326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mExportAllNonStaticVars(false), 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mExportAllNonStaticFuncs(false), 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mLicenseNote(NULL) { 359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_var 369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportVarHandler(this)); 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_var_all 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportVarAllHandler(this)); 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_func 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportFuncHandler(this)); 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_func_all 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportFuncAllHandler(this)); 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_type 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportTypeHandler(this)); 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs java_package_name 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaJavaPackageNameHandler(this)); 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs set_reflect_license 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PP->AddPragmaHandler( 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaReflectLicenseHandler(this)); 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Prepare target data 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mTargetData = new llvm::TargetData(Slang::TargetDescription); 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportVar(const clang::VarDecl *VD) { 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(!VD->getName().empty() && "Variable name should not be empty"); 71537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 726315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): some check on variable 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = RSExportType::CreateFromDecl(this, VD); 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!ET) 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportVar *EV = new RSExportVar(this, VD, ET); 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EV == NULL) 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportVars.push_back(EV); 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 876315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrbool RSContext::processExportFunc(const clang::FunctionDecl *FD) { 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(!FD->getName().empty() && "Function name should not be empty"); 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FD->isThisDeclarationADefinition()) 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FD->getStorageClass() != clang::SC_None) { 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExportFunc : cannot export extern or " 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "static function '%s'\n", FD->getName().str().c_str()); 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportFunc *EF = RSExportFunc::Create(this, FD); 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EF == NULL) 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportFuncs.push_back(EF); 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportType(const llvm::StringRef &Name) { 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl(); 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(TUDecl != NULL && "Translation unit declaration (top-level " 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "declaration) is null object"); 114f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::IdentifierInfo *II = mPP->getIdentifierInfo(Name); 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (II == NULL) 1176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): alert identifier @Name mark as an exportable type cannot be 1186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // found 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 120f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::DeclContext::lookup_const_result R = TUDecl->lookup(II); 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = NULL; 123f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPointerType::IntegerType = mCtx->IntTy.getTypePtr(); 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::DeclContext::lookup_const_iterator I = R.first, E = R.second; 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::NamedDecl *const ND = *I; 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *T = NULL; 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ND->getKind()) { 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Decl::Typedef: { 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = static_cast<const clang::TypedefDecl*>( 1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ND)->getCanonicalDecl()->getUnderlyingType().getTypePtr(); 1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Decl::Record: { 1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = static_cast<const clang::RecordDecl*>(ND)->getTypeForDecl(); 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // unsupported, skip 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 145ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao } 146ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao } 147537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (T != NULL) 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportType::Create(this, T); 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportPointerType::IntegerType = NULL; 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return (ET != NULL); 155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSContext::processExport() { 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mNeedExportVars.empty() && 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportFuncs.empty() && 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao !mExportAllNonStaticVars && !mExportAllNonStaticFuncs) { 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "note: No reflection because there are no #pragma " 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs export_var(...), #pragma rs export_func(...), " 1636315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "#pragma rs export_var_all, or #pragma rs " 1646315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "export_func_all\n"); 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Export variable 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::TranslationUnitDecl *TUDecl = mCtx->getTranslationUnitDecl(); 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::DeclContext::decl_iterator DI = TUDecl->decls_begin(), 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DE = TUDecl->decls_end(); 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DI != TUDecl->decls_end(); 1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DI++) { 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (DI->getKind() == clang::Decl::Var) { 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::VarDecl *VD = (clang::VarDecl*) (*DI); 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mExportAllNonStaticVars && 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (VD->getLinkage() == clang::ExternalLinkage)) { 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportVar(VD)) { 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export var " 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", VD->getNameAsString().c_str()); 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportVarSet::iterator EI = mNeedExportVars.find(VD->getName()); 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EI != mNeedExportVars.end() && processExportVar(VD)) { 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportVars.erase(EI); 1853f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (DI->getKind() == clang::Decl::Function) { 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Export functions 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::FunctionDecl *FD = (clang::FunctionDecl*) (*DI); 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mExportAllNonStaticFuncs && 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (FD->getLinkage() == clang::ExternalLinkage)) { 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportFunc(FD)) { 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export func " 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", FD->getNameAsString().c_str()); 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NeedExportFuncSet::iterator EI = mNeedExportFuncs.find(FD->getName()); 1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EI != mNeedExportFuncs.end() && processExportFunc(FD)) 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNeedExportFuncs.erase(EI); 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2013f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Finally, export type forcely set to be exported by user 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (NeedExportTypeSet::const_iterator EI = mNeedExportTypes.begin(), 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EE = mNeedExportTypes.end(); 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EI != EE; 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EI++) { 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportType(EI->getKey())) { 2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export type " 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", EI->getKey().str().c_str()); 2123f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 217537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::insertExportType(const llvm::StringRef &TypeName, 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET) { 2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportTypeMap::value_type *NewItem = 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ExportTypeMap::value_type::Create(TypeName.begin(), 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName.end(), 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportTypes.getAllocator(), 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET); 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mExportTypes.insert(NewItem)) { 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao free(NewItem); 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::reflectToJava(const char *OutputPackageName, 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName, 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao char realPackageName[], 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int bSize) { 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (realPackageName != NULL) { 2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao *realPackageName = 0; 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (OutputPackageName == NULL) { 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mReflectJavaPackageName.empty()) { 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao OutputPackageName = mReflectJavaPackageName.c_str(); 2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // no package name, just return 2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Copy back the really applied package name 2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (realPackageName != NULL) { 2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao strncpy(realPackageName, OutputPackageName, bSize - 1); 2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflection *R = new RSReflection(this); 2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool ret = R->reflect(OutputPackageName, InputFileName, OutputBCFileName); 2596315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr if (!ret) 2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::reflectToJava : failed to do reflection " 2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "(%s)\n", R->getLastError()); 2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete R; 2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ret; 2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2656de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::reflectToJavaPath(const char *OutputPathName) { 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (OutputPathName == NULL) 2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // no path name, just return 2696de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao return true; 2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao setReflectJavaPathName(std::string(OutputPathName)); 2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2736de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao} 2746de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSContext::~RSContext() { 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete mLicenseNote; 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete mTargetData; 278a41ce1d98094da84643995d40d71c529905123fcZonr Chang for (ExportableList::iterator I = mExportables.begin(), 279a41ce1d98094da84643995d40d71c529905123fcZonr Chang E = mExportables.end(); 280a41ce1d98094da84643995d40d71c529905123fcZonr Chang I != E; 281a41ce1d98094da84643995d40d71c529905123fcZonr Chang I++) { 282a41ce1d98094da84643995d40d71c529905123fcZonr Chang delete *I; 283a41ce1d98094da84643995d40d71c529905123fcZonr Chang } 284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 285