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;
847682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala  int mNextExportReduceSlot;
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
86f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet  GeneratedFile mOut;
87f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet
8859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::string mLastError;
8959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  std::vector<std::string> *mGeneratedFileNames;
9059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // A mapping from a field in a record type to its index in the rsType
922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // instance. Only used when generates TypeClass (ScriptField_*).
932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  typedef std::map<const RSExportRecordType::Field *, unsigned> FieldIndexMapTy;
942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  FieldIndexMapTy mFieldIndexMap;
952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // Field index of current processing TypeClass.
962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  unsigned mFieldIndex;
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  inline void setError(const std::string &Error) { mLastError = Error; }
9959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
1002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void clear() {
1012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mClassName = "";
1022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mNextExportVarSlot = 0;
1032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mNextExportFuncSlot = 0;
1042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mNextExportForEachSlot = 0;
1057682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala    mNextExportReduceSlot = 0;
1062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  }
1072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletpublic:
1092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  typedef enum {
1102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_Public,
1112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_Protected,
1122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_Private,
1132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    AM_PublicSynchronized
1142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  } AccessModifier;
1152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // Generated RS Elements for type-checking code.
1172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::set<std::string> mTypesToCheck;
1182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  // Generated FieldPackers for unsigned setters/validation.
1202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  std::set<std::string> mFieldPackerTypes;
1212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool addTypeNameForElement(const std::string &TypeName);
1232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool addTypeNameForFieldPacker(const std::string &TypeName);
1242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  static const char *AccessModifierStr(AccessModifier AM);
1262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline bool getEmbedBitcodeInJava() const { return mEmbedBitcodeInJava; }
1288c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
1292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline int getNextExportVarSlot() { return mNextExportVarSlot++; }
1302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline int getNextExportFuncSlot() { return mNextExportFuncSlot++; }
1312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline int getNextExportForEachSlot() { return mNextExportForEachSlot++; }
1327682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala  inline int getNextExportReduceSlot() { return mNextExportReduceSlot++; }
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool startClass(AccessModifier AM, bool IsStatic,
1352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                  const std::string &ClassName, const char *SuperClassName,
1362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                  std::string &ErrorMsg);
1372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void endClass();
1382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void startFunction(AccessModifier AM, bool IsStatic, const char *ReturnType,
1402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                     const std::string &FunctionName, int Argc, ...);
1412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  typedef std::vector<std::pair<std::string, std::string>> ArgTy;
1432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void startFunction(AccessModifier AM, bool IsStatic, const char *ReturnType,
1442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                     const std::string &FunctionName, const ArgTy &Args);
1452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void endFunction();
1462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getPackageName() const { return mPackageName; }
1482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getRSPackageName() const { return mRSPackageName; }
1492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getClassName() const { return mClassName; }
1502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline const std::string &getResourceId() const { return mResourceId; }
15148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
1522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void startTypeClass(const std::string &ClassName);
1532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void endTypeClass();
1541f6c331d622ac645ab68a016aa4c577998547373Stephen Hines
1552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void incFieldIndex() { mFieldIndex++; }
1561f6c331d622ac645ab68a016aa4c577998547373Stephen Hines
1572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void resetFieldIndex() { mFieldIndex = 0; }
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void addFieldIndexMapping(const RSExportRecordType::Field *F) {
1602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    slangAssert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) &&
1612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                "Nested structure never occurs in C language.");
1622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    mFieldIndexMap.insert(std::make_pair(F, mFieldIndex));
1632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  }
1642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline unsigned getFieldIndex(const RSExportRecordType::Field *F) const {
1662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F);
1672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    slangAssert((I != mFieldIndexMap.end()) &&
1682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                "Requesting field is out of scope.");
1692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet    return I->second;
1702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  }
1712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  inline void clearFieldIndexMap() { mFieldIndexMap.clear(); }
1732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletprivate:
1758ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  static bool exportableReduce(const RSExportType *ResultType);
176277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross
1772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool genScriptClass(const std::string &ClassName, std::string &ErrorMsg);
1782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genScriptClassConstructor();
1792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet
1802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genInitBoolExportVariable(const std::string &VarName,
1812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                                 const clang::APValue &Val);
1822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genInitPrimitiveExportVariable(const std::string &VarName,
1832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                                      const clang::APValue &Val);
1842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genInitExportVariable(const RSExportType *ET, const std::string &VarName,
1852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet                             const clang::APValue &Val);
186efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet  void genInitValue(const clang::APValue &Val, bool asBool);
1872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genExportVariable(const RSExportVar *EV);
1882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPrimitiveTypeExportVariable(const RSExportVar *EV);
1892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPointerTypeExportVariable(const RSExportVar *EV);
1902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genVectorTypeExportVariable(const RSExportVar *EV);
1912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genMatrixTypeExportVariable(const RSExportVar *EV);
1922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genConstantArrayTypeExportVariable(const RSExportVar *EV);
1932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genRecordTypeExportVariable(const RSExportVar *EV);
1942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPrivateExportVariable(const std::string &TypeName,
1950d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines                                const std::string &VarName);
196657d20afa621219c1eed72178d1325fd4409f458David Gross  void genSetExportVariable(const std::string &TypeName, const RSExportVar *EV, unsigned Dimension);
1972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genGetExportVariable(const std::string &TypeName,
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const std::string &VarName);
1992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genGetFieldID(const std::string &VarName);
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genExportFunction(const RSExportFunc *EF);
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genExportForEach(const RSExportForEach *EF);
204593a894650e81be54173106ec266f0311cebebd3Stephen Hines
2057682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala  void genExportReduce(const RSExportReduce *ER);
2068ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  void genExportReduceAllocationVariant(const RSExportReduce *ER);
2078ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  void genExportReduceArrayVariant(const RSExportReduce *ER);
2088ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  void genExportReduceResultType(const RSExportType *ResultType);
209277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross
2102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeCheck(const RSExportType *ET, const char *VarName);
21148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
2122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeInstanceFromPointer(const RSExportType *ET);
213a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
2142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeInstance(const RSExportType *ET);
2151f6c331d622ac645ab68a016aa4c577998547373Stephen Hines
2162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genFieldPackerInstance(const RSExportType *ET);
217b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
2182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool genTypeClass(const RSExportRecordType *ERT, std::string &ErrorMsg);
2192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeItemClass(const RSExportRecordType *ERT);
2202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassConstructor(const RSExportRecordType *ERT);
2212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassCopyToArray(const RSExportRecordType *ERT);
2222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassCopyToArrayLocal(const RSExportRecordType *ERT);
2232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassItemSetter(const RSExportRecordType *ERT);
2242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassItemGetter(const RSExportRecordType *ERT);
2252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassComponentSetter(const RSExportRecordType *ERT);
2262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassComponentGetter(const RSExportRecordType *ERT);
2272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassCopyAll(const RSExportRecordType *ERT);
2282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genTypeClassResize();
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genBuildElement(const char *ElementBuilderName,
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const RSExportRecordType *ERT,
2322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet                       const char *RenderScriptVar, bool IsInline);
2332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genAddElementToElementBuilder(const RSExportType *ERT,
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const std::string &VarName,
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const char *ElementBuilderName,
23689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                     const char *RenderScriptVar,
23789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                     unsigned ArraySize);
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  bool genCreateFieldPacker(const RSExportType *T, const char *FieldPackerName);
2402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genPackVarOfType(const RSExportType *T, const char *VarName,
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const char *FieldPackerName);
2422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genAllocateVarOfType(const RSExportType *T, const std::string &VarName);
2432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genNewItemBufferIfNull(const char *Index);
2442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet  void genNewItemBufferPackerIfNull();
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
246c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  void genPairwiseDimCheck(std::string name0, std::string name1);
2477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala  void genVectorLengthCompatibilityCheck(const std::string &ArrayName, unsigned VecSize);
248277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross  void genNullArrayCheck(const std::string &ArrayName);
249c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes
2502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletpublic:
25159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  RSReflectionJava(const RSContext *Context,
25259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   std::vector<std::string> *GeneratedFileNames,
25359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   const std::string &OutputBaseDirectory,
25459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   const std::string &RSSourceFilename,
25559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   const std::string &BitCodeFileName,
25659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet                   bool EmbedBitcodeInJava);
25759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet
25859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet  bool reflect();
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const char *getLastError() const {
2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (mLastError.empty())
2625abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes      return nullptr;
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return mLastError.c_str();
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet}; // class RSReflectionJava
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang
2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_  NOLINT
271