1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
20a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines * Copyright 2010-2012, 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
172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_ // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <fstream>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <iostream>
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <map>
2348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines#include <set>
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string>
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector>
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringExtras.h"
286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
296e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h"
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h"
31f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet#include "slang_rs_reflect_utils.h"
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletclass RSContext;
362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletclass RSExportVar;
372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletclass RSExportFunc;
382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletclass RSExportForEach;
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
40602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletclass RSReflectionJava {
412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletprivate:
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSContext *mRSContext;
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The name of the Java package name we're creating this file for,
4559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. com.example.android.rs.flashlight
462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::string mPackageName;
4759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The name of the Java Renderscript package we'll be using,
4859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. android.renderscript
4959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. android.support.v8.renderscript
502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::string mRSPackageName;
5159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
5259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The directory under which we'll create the Java files, in appropriate subdirectories,
5359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. /tmp/myout
5459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mOutputBaseDirectory;
5559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The output directory for the specfied package (mPackageName),
5659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. /tmp/myout/com/example/android/rs/flashlight/
5759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // TODO This includes the terminating separator.  Needed?
5859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mOutputDirectory;
5959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
6059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The full path of the .rs file that we are reflecting.
6159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mRSSourceFileName;
6259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The full path where the generated bit code can be read.
6359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mBitCodeFileName;
6459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
6559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The name of the resource we pass to the RenderScript constructor
6659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. flashlight
672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::string mResourceId;
6859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // The name of the Java class we are generating for this script.
6959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // e.g. ScriptC_flashlight
7059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mScriptClassName;
7159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  // This is set by startClass() and will change for the multiple classes generated.
742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::string mClassName;
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
763a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray  // This is the token used for determining the size of a given ScriptField.Item.
773a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray  std::string mItemSizeof;
783a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray
792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool mEmbedBitcodeInJava;
8044d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines
812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  int mNextExportVarSlot;
822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  int mNextExportFuncSlot;
832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  int mNextExportForEachSlot;
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
85f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet  GeneratedFile mOut;
86f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet
8759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mLastError;
8859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::vector<std::string> *mGeneratedFileNames;
8959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // A mapping from a field in a record type to its index in the rsType
912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // instance. Only used when generates TypeClass (ScriptField_*).
922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  typedef std::map<const RSExportRecordType::Field *, unsigned> FieldIndexMapTy;
932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  FieldIndexMapTy mFieldIndexMap;
942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // Field index of current processing TypeClass.
952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  unsigned mFieldIndex;
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  inline void setError(const std::string &Error) { mLastError = Error; }
9859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void clear() {
1002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mClassName = "";
1012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mNextExportVarSlot = 0;
1022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mNextExportFuncSlot = 0;
1032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mNextExportForEachSlot = 0;
1042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  }
1052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletpublic:
1072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  typedef enum {
1082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_Public,
1092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_Protected,
1102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_Private,
1112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_PublicSynchronized
1122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  } AccessModifier;
1132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // Generated RS Elements for type-checking code.
1152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::set<std::string> mTypesToCheck;
1162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // Generated FieldPackers for unsigned setters/validation.
1182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::set<std::string> mFieldPackerTypes;
1192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool addTypeNameForElement(const std::string &TypeName);
1212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool addTypeNameForFieldPacker(const std::string &TypeName);
1222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  static const char *AccessModifierStr(AccessModifier AM);
1242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline bool getEmbedBitcodeInJava() const { return mEmbedBitcodeInJava; }
1268c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
1272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline int getNextExportVarSlot() { return mNextExportVarSlot++; }
1282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline int getNextExportFuncSlot() { return mNextExportFuncSlot++; }
1292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline int getNextExportForEachSlot() { return mNextExportForEachSlot++; }
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool startClass(AccessModifier AM, bool IsStatic,
1322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                  const std::string &ClassName, const char *SuperClassName,
1332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                  std::string &ErrorMsg);
1342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void endClass();
1352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void startFunction(AccessModifier AM, bool IsStatic, const char *ReturnType,
1372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                     const std::string &FunctionName, int Argc, ...);
1382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  typedef std::vector<std::pair<std::string, std::string>> ArgTy;
1402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void startFunction(AccessModifier AM, bool IsStatic, const char *ReturnType,
1412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                     const std::string &FunctionName, const ArgTy &Args);
1422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void endFunction();
1432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getPackageName() const { return mPackageName; }
1452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getRSPackageName() const { return mRSPackageName; }
1462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getClassName() const { return mClassName; }
1472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getResourceId() const { return mResourceId; }
14848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
1492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void startTypeClass(const std::string &ClassName);
1502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void endTypeClass();
1511f6c331d622ac645ab68a016aa4c577998547373Stephen Hines
1522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void incFieldIndex() { mFieldIndex++; }
1531f6c331d622ac645ab68a016aa4c577998547373Stephen Hines
1542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void resetFieldIndex() { mFieldIndex = 0; }
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void addFieldIndexMapping(const RSExportRecordType::Field *F) {
1572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    slangAssert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) &&
1582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                "Nested structure never occurs in C language.");
1592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mFieldIndexMap.insert(std::make_pair(F, mFieldIndex));
1602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  }
1612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline unsigned getFieldIndex(const RSExportRecordType::Field *F) const {
1632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F);
1642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    slangAssert((I != mFieldIndexMap.end()) &&
1652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                "Requesting field is out of scope.");
1662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    return I->second;
1672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  }
1682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void clearFieldIndexMap() { mFieldIndexMap.clear(); }
1702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletprivate:
1722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool genScriptClass(const std::string &ClassName, std::string &ErrorMsg);
1732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genScriptClassConstructor();
1742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genInitBoolExportVariable(const std::string &VarName,
1762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                                 const clang::APValue &Val);
1772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genInitPrimitiveExportVariable(const std::string &VarName,
1782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                                      const clang::APValue &Val);
1792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genInitExportVariable(const RSExportType *ET, const std::string &VarName,
1802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                             const clang::APValue &Val);
181efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet  void genInitValue(const clang::APValue &Val, bool asBool);
1822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genExportVariable(const RSExportVar *EV);
1832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPrimitiveTypeExportVariable(const RSExportVar *EV);
1842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPointerTypeExportVariable(const RSExportVar *EV);
1852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genVectorTypeExportVariable(const RSExportVar *EV);
1862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genMatrixTypeExportVariable(const RSExportVar *EV);
1872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genConstantArrayTypeExportVariable(const RSExportVar *EV);
1882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genRecordTypeExportVariable(const RSExportVar *EV);
1892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPrivateExportVariable(const std::string &TypeName,
1900d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines                                const std::string &VarName);
1912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genSetExportVariable(const std::string &TypeName, const RSExportVar *EV);
1922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genGetExportVariable(const std::string &TypeName,
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const std::string &VarName);
1942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genGetFieldID(const std::string &VarName);
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genExportFunction(const RSExportFunc *EF);
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genExportForEach(const RSExportForEach *EF);
199593a894650e81be54173106ec266f0311cebebd3Stephen Hines
2002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeCheck(const RSExportType *ET, const char *VarName);
20148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
2022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeInstanceFromPointer(const RSExportType *ET);
203a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
2042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeInstance(const RSExportType *ET);
2051f6c331d622ac645ab68a016aa4c577998547373Stephen Hines
2062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genFieldPackerInstance(const RSExportType *ET);
207b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
2082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool genTypeClass(const RSExportRecordType *ERT, std::string &ErrorMsg);
2092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeItemClass(const RSExportRecordType *ERT);
2102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassConstructor(const RSExportRecordType *ERT);
2112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassCopyToArray(const RSExportRecordType *ERT);
2122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassCopyToArrayLocal(const RSExportRecordType *ERT);
2132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassItemSetter(const RSExportRecordType *ERT);
2142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassItemGetter(const RSExportRecordType *ERT);
2152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassComponentSetter(const RSExportRecordType *ERT);
2162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassComponentGetter(const RSExportRecordType *ERT);
2172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassCopyAll(const RSExportRecordType *ERT);
2182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassResize();
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genBuildElement(const char *ElementBuilderName,
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const RSExportRecordType *ERT,
2222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet                       const char *RenderScriptVar, bool IsInline);
2232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genAddElementToElementBuilder(const RSExportType *ERT,
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const std::string &VarName,
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const char *ElementBuilderName,
22689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                     const char *RenderScriptVar,
22789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                     unsigned ArraySize);
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool genCreateFieldPacker(const RSExportType *T, const char *FieldPackerName);
2302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPackVarOfType(const RSExportType *T, const char *VarName,
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const char *FieldPackerName);
2322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genAllocateVarOfType(const RSExportType *T, const std::string &VarName);
2332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genNewItemBufferIfNull(const char *Index);
2342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genNewItemBufferPackerIfNull();
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
236c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  void genPairwiseDimCheck(std::string name0, std::string name1);
237c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes
2382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletpublic:
23959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  RSReflectionJava(const RSContext *Context,
24059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   std::vector<std::string> *GeneratedFileNames,
24159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   const std::string &OutputBaseDirectory,
24259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   const std::string &RSSourceFilename,
24359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   const std::string &BitCodeFileName,
24459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   bool EmbedBitcodeInJava);
24559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
24659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  bool reflect();
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const char *getLastError() const {
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (mLastError.empty())
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return NULL;
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return mLastError.c_str();
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet}; // class RSReflectionJava
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_  NOLINT
259