slang_rs_context.cpp revision 3fd0a94a5cf1656569b1aea07043cc63939dcb46
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 2041ebf534161bb67f6207a070c1f6a895dc853408Zonr Chang 21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTContext.h" 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Decl.h" 239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/DeclBase.h" 24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/Type.h" 25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/Linkage.h" 27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/TargetInfo.h" 2841ebf534161bb67f6207a070c1f6a895dc853408Zonr Chang 299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Index/ASTLocation.h" 309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 31e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LLVMContext.h" 32e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 33e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Target/TargetData.h" 34e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h" 366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h" 376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h" 38e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_export_var.h" 39e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_exportable.h" 406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_pragma_handler.h" 41e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_reflection.h" 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 43e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 459e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen HinesRSContext::RSContext(clang::Preprocessor &PP, 469e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines clang::ASTContext &Ctx, 473fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines const clang::TargetInfo &Target, 483fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines PragmaList *Pragmas) 496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr : mPP(PP), 506315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mCtx(Ctx), 516315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mTarget(Target), 523fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines mPragmas(Pragmas), 536315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mTargetData(NULL), 546315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr mLLVMContext(llvm::getGlobalContext()), 5596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines mLicenseNote(NULL), 5696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines version(0) { 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs export_type 589e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines PP.AddPragmaHandler( 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaExportTypeHandler(this)); 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs java_package_name 629e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines PP.AddPragmaHandler( 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaJavaPackageNameHandler(this)); 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // For #pragma rs set_reflect_license 669e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines PP.AddPragmaHandler( 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "rs", RSPragmaHandler::CreatePragmaReflectLicenseHandler(this)); 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines // For #pragma version 7096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines PP.AddPragmaHandler(RSPragmaHandler::CreatePragmaVersionHandler(this)); 7196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Prepare target data 739e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines mTargetData = new llvm::TargetData(Target.getTargetDescription()); 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportVar(const clang::VarDecl *VD) { 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(!VD->getName().empty() && "Variable name should not be empty"); 80537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 816315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): some check on variable 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = RSExportType::CreateFromDecl(this, VD); 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!ET) 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportVar *EV = new RSExportVar(this, VD, ET); 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EV == NULL) 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportVars.push_back(EV); 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 963fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hinesstatic bool isSpecialRSFunc(const llvm::StringRef& Name) { 973fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines static llvm::StringRef FuncInit("init"); 983fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines static llvm::StringRef FuncRoot("root"); 993fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines return Name.equals(FuncInit) || Name.equals(FuncRoot); 1003fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines} 1013fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines 1026315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrbool RSContext::processExportFunc(const clang::FunctionDecl *FD) { 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(!FD->getName().empty() && "Function name should not be empty"); 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1053fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines if (!FD->isThisDeclarationADefinition()) { 1063fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines return true; 1073fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines } 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FD->getStorageClass() != clang::SC_None) { 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExportFunc : cannot export extern or " 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "static function '%s'\n", FD->getName().str().c_str()); 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1153fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines // Do not reflect specialized RS functions like init/root. 1163fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines if (isSpecialRSFunc(FD->getName())) { 1173fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines return true; 1183fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines } 1193fbe68a4ec20fec25f8a40191437bbc02d00f591Stephen Hines 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportFunc *EF = RSExportFunc::Create(this, FD); 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EF == NULL) 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mExportFuncs.push_back(EF); 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSContext::processExportType(const llvm::StringRef &Name) { 1319e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines clang::TranslationUnitDecl *TUDecl = mCtx.getTranslationUnitDecl(); 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao assert(TUDecl != NULL && "Translation unit declaration (top-level " 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "declaration) is null object"); 135f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1369e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines const clang::IdentifierInfo *II = mPP.getIdentifierInfo(Name); 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (II == NULL) 1386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): alert identifier @Name mark as an exportable type cannot be 1396315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // found 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 141f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::DeclContext::lookup_const_result R = TUDecl->lookup(II); 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSExportType *ET = NULL; 144f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liao 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::DeclContext::lookup_const_iterator I = R.first, E = R.second; 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::NamedDecl *const ND = *I; 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::Type *T = NULL; 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ND->getKind()) { 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Decl::Typedef: { 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = static_cast<const clang::TypedefDecl*>( 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ND)->getCanonicalDecl()->getUnderlyingType().getTypePtr(); 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::Decl::Record: { 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao T = static_cast<const clang::RecordDecl*>(ND)->getTypeForDecl(); 1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // unsupported, skip 1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 164ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao } 165ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao } 166537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (T != NULL) 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ET = RSExportType::Create(this, T); 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return (ET != NULL); 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 174c808a99831115928b4648f4c8b86dc682594217aStephen Hinesbool RSContext::processExport() { 1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Export variable 1769e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines clang::TranslationUnitDecl *TUDecl = mCtx.getTranslationUnitDecl(); 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (clang::DeclContext::decl_iterator DI = TUDecl->decls_begin(), 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DE = TUDecl->decls_end(); 179c97a333bc84ce8c28c96d07734cbded75c914639Stephen Hines DI != DE; 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao DI++) { 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (DI->getKind() == clang::Decl::Var) { 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::VarDecl *VD = (clang::VarDecl*) (*DI); 1832d2512c5703bb238b7935ab5228beff6563f2f94Stephen Hines if (VD->getLinkage() == clang::ExternalLinkage) { 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportVar(VD)) { 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export var " 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", VD->getNameAsString().c_str()); 187c808a99831115928b4648f4c8b86dc682594217aStephen Hines return false; 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (DI->getKind() == clang::Decl::Function) { 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Export functions 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::FunctionDecl *FD = (clang::FunctionDecl*) (*DI); 1932d2512c5703bb238b7935ab5228beff6563f2f94Stephen Hines if (FD->getLinkage() == clang::ExternalLinkage) { 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportFunc(FD)) { 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export func " 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", FD->getNameAsString().c_str()); 197c808a99831115928b4648f4c8b86dc682594217aStephen Hines return false; 1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2003f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Finally, export type forcely set to be exported by user 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (NeedExportTypeSet::const_iterator EI = mNeedExportTypes.begin(), 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EE = mNeedExportTypes.end(); 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EI != EE; 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EI++) { 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!processExportType(EI->getKey())) { 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::processExport : failed to export type " 2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "'%s'\n", EI->getKey().str().c_str()); 211c808a99831115928b4648f4c8b86dc682594217aStephen Hines return false; 2123f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang } 2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 215c808a99831115928b4648f4c8b86dc682594217aStephen Hines return true; 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 234b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaobool RSContext::reflectToJava(const std::string &OutputPathBase, 235b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &OutputPackageName, 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName, 238b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string *RealPackageName) { 239b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (RealPackageName != NULL) 240b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RealPackageName->clear(); 241b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 242b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &PackageName = 243b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ((OutputPackageName.empty()) ? mReflectJavaPackageName : 244b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputPackageName); 24535f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines if (PackageName.empty()) { 24635f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines std::cerr << "Error: Missing \"#pragma rs " 24735f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines << "java_package_name(com.foo.bar)\" in " 24835f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines << InputFileName << std::endl; 24935f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines return false; 25035f5b39f0490953f1fe13ef803b43e3ced9a01d9Stephen Hines } 2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Copy back the really applied package name 253b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RealPackageName->assign(PackageName); 2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSReflection *R = new RSReflection(this); 256b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao bool ret = R->reflect(OutputPathBase, PackageName, 257b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao InputFileName, OutputBCFileName); 2586315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr if (!ret) 2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao fprintf(stderr, "RSContext::reflectToJava : failed to do reflection " 2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "(%s)\n", R->getLastError()); 2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete R; 2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ret; 2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2646de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao 265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSContext::~RSContext() { 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete mLicenseNote; 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao delete mTargetData; 268a41ce1d98094da84643995d40d71c529905123fcZonr Chang for (ExportableList::iterator I = mExportables.begin(), 269a41ce1d98094da84643995d40d71c529905123fcZonr Chang E = mExportables.end(); 270a41ce1d98094da84643995d40d71c529905123fcZonr Chang I != E; 271a41ce1d98094da84643995d40d71c529905123fcZonr Chang I++) { 272641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (!(*I)->isKeep()) 273641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang delete *I; 274a41ce1d98094da84643995d40d71c529905123fcZonr Chang } 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 276e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 277e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 278