slang_rs_reflection.cpp revision 277fd5e6545c8ba1272027ee6e6bc55a96316dc0
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet * Copyright 2010-2014, 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_reflection.h" 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <sys/stat.h> 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdarg> 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <cctype> 23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <algorithm> 25d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines#include <sstream> 26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <utility> 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/APFloat.h" 3089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang#include "llvm/ADT/StringExtras.h" 316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 328d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael#include "os_sep.h" 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h" 35593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_export_foreach.h" 366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h" 377682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala#include "slang_rs_export_reduce.h" 386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflect_utils.h" 394cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "slang_version.h" 406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_SCRIPT_CLASS_NAME_PREFIX "ScriptC_" 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC" 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_CLASS_SUPER_CLASS_NAME ".Script.FieldBase" 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ITEM_CLASS_NAME "Item" 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 483a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray#define RS_TYPE_ITEM_SIZEOF_LEGACY "Item.sizeof" 493a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray#define RS_TYPE_ITEM_SIZEOF_CURRENT "mElement.getBytesSize()" 503a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray 512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ITEM_BUFFER_NAME "mItemArray" 522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ITEM_BUFFER_PACKER_NAME "mIOBuffer" 532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ELEMENT_REF_NAME "mElementCache" 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_INDEX_PREFIX "mExportVarIdx_" 562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_PREFIX "mExportVar_" 572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_ELEM_PREFIX "mExportVarElem_" 582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_DIM_PREFIX "mExportVarDim_" 592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_CONST_PREFIX "const_" 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_ELEM_PREFIX "__" 62a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_FP_PREFIX "__rs_fp_" 641f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_RESOURCE_NAME "__rs_resource_name" 66d2936939ec10879e25746322db60071f79f28c1bStephen Hines 672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_FUNC_INDEX_PREFIX "mExportFuncIdx_" 682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_FOREACH_INDEX_PREFIX "mExportForEachIdx_" 697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala#define RS_EXPORT_REDUCE_INDEX_PREFIX "mExportReduceIdx_" 70277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross#define RS_EXPORT_REDUCE_NEW_INDEX_PREFIX "mExportReduceNewIdx_" 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_ALLOCATION_PREFIX "mAlloction_" 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_" 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala#define SAVED_RS_REFERENCE "mRSLocal" 767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 79c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletclass RSReflectionJavaElementBuilder { 80c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletpublic: 81c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder(const char *ElementBuilderName, 82c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const RSExportRecordType *ERT, 83c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *RenderScriptVar, 84c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet GeneratedFile *Out, const RSContext *RSContext, 85c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJava *Reflection); 86c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet void generate(); 87c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 88c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletprivate: 89c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet void genAddElement(const RSExportType *ET, const std::string &VarName, 90c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize); 91c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet void genAddStatementStart(); 92c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet void genAddStatementEnd(const std::string &VarName, unsigned ArraySize); 93c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet void genAddPadding(int PaddingSize); 94c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // TODO Will remove later due to field name information is not necessary for 95c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // C-reflect-to-Java 96c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string createPaddingField() { 97c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet return mPaddingPrefix + llvm::itostr(mPaddingFieldIndex++); 98c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 99c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 100c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *mElementBuilderName; 101c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const RSExportRecordType *mERT; 102c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *mRenderScriptVar; 103c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet GeneratedFile *mOut; 104c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string mPaddingPrefix; 105c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet int mPaddingFieldIndex; 106c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const RSContext *mRSContext; 107c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJava *mReflection; 108c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet}; 109c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 11092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changstatic const char *GetMatrixTypeName(const RSExportMatrixType *EMT) { 1112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static const char *MatrixTypeJavaNameMap[] = {/* 2x2 */ "Matrix2f", 1122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 3x3 */ "Matrix3f", 1132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 4x4 */ "Matrix4f", 11492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang }; 11592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang unsigned Dim = EMT->getDim(); 11692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if ((Dim - 2) < (sizeof(MatrixTypeJavaNameMap) / sizeof(const char *))) 1182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return MatrixTypeJavaNameMap[EMT->getDim() - 2]; 11992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1206e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetMatrixTypeName : Unsupported matrix dimension"); 1215abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes return nullptr; 12292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 12392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1246e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hinesstatic const char *GetVectorAccessor(unsigned Index) { 1252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static const char *VectorAccessorMap[] = {/* 0 */ "x", 1262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 1 */ "y", 1272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 2 */ "z", 1282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 3 */ "w", 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 130324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert((Index < (sizeof(VectorAccessorMap) / sizeof(const char *))) && 1326e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Out-of-bound index to access vector member"); 133324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return VectorAccessorMap[Index]; 135324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 136324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetPackerAPIName(const RSExportPrimitiveType *EPT) { 1386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static const char *PrimitiveTypePackerAPINameMap[] = { 139e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar "addF16", // DataTypeFloat16 1402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addF32", // DataTypeFloat32 1412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addF64", // DataTypeFloat64 1422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI8", // DataTypeSigned8 1432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI16", // DataTypeSigned16 1442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI32", // DataTypeSigned32 1452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI64", // DataTypeSigned64 1462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU8", // DataTypeUnsigned8 1472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned16 1482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU32", // DataTypeUnsigned32 1492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU64", // DataTypeUnsigned64 1502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addBoolean", // DataTypeBoolean 1512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned565 1522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned5551 1532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned4444 1542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addMatrix", // DataTypeRSMatrix2x2 1552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addMatrix", // DataTypeRSMatrix3x3 1562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addMatrix", // DataTypeRSMatrix4x4 1572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSElement 1582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSType 1592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSAllocation 1602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSSampler 1612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSScript 1622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSMesh 1632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSPath 1642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramFragment 1652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramVertex 1662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramRaster 1672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramStore 1682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSFont 1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (TypeId < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char *))) 1732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return PrimitiveTypePackerAPINameMap[EPT->getType()]; 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1756e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetPackerAPIName : Unknown primitive data type"); 1765abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes return nullptr; 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 179277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossnamespace { 180277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 181277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossenum { 182277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeNameWithConstantArrayBrackets = 0x01, 183277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeNameWithRecordElementName = 0x02, 184277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeNameC = 0x04, // else Java 185277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeNameDefault = TypeNameWithConstantArrayBrackets|TypeNameWithRecordElementName 186277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross}; 187277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 188277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string GetTypeName(const RSExportType *ET, unsigned Style = TypeNameDefault) { 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 1902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 191277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto ReflectionType = 192277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSExportPrimitiveType::getRSReflectionType(static_cast<const RSExportPrimitiveType *>(ET)); 193277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return (Style & TypeNameC ? ReflectionType->s_name : ReflectionType->java_name); 1942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 196277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!(Style & TypeNameC) && 197277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "No need to support C type names for pointer types yet"); 1982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 1992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) 2022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Allocation"; 2032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 2042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return PointeeType->getElementName(); 2052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 2072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 208277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto ReflectionType = EVT->getRSReflectionType(EVT); 2092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::stringstream VecName; 210277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross VecName << (Style & TypeNameC ? ReflectionType->s_name : ReflectionType->rs_java_vector_prefix) 2112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EVT->getNumElement(); 2122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return VecName.str(); 2132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 215277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!(Style & TypeNameC) && 216277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "No need to support C type names for matrix types yet"); 2172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return GetMatrixTypeName(static_cast<const RSExportMatrixType *>(ET)); 2182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 2202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *CAT = 2212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 222277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string ElementTypeName = GetTypeName(CAT->getElementType(), Style); 223277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (Style & TypeNameWithConstantArrayBrackets) { 224277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!(Style & TypeNameC) && 225277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "No need to support C type names for array types with brackets yet"); 2262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementTypeName.append("[]"); 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ElementTypeName; 2292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 231277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!(Style & TypeNameC) && 232277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "No need to support C type names for record types yet"); 233277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (Style & TypeNameWithRecordElementName) 234277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return ET->getElementName() + "." RS_TYPE_ITEM_CLASS_NAME; 235277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else 236277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return ET->getName(); 2372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 240462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ""; 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 244277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string GetReduceNewResultTypeName(const RSExportType *ET) { 245277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (ET->getClass()) { 246277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassConstantArray: { 247277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportConstantArrayType *const CAT = static_cast<const RSExportConstantArrayType *>(ET); 248277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return "resultArray" + std::to_string(CAT->getNumElement()) + "_" + 249277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(CAT->getElementType(), 250277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (TypeNameDefault & ~TypeNameWithRecordElementName) | TypeNameC); 251277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 252277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassRecord: 253277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return "resultStruct_" + GetTypeName(ET, 254277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (TypeNameDefault & ~TypeNameWithRecordElementName) | TypeNameC); 255277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 256277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return "result_" + GetTypeName(ET, TypeNameDefault | TypeNameC); 257277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 258277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 259277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 260277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string GetReduceNewResultTypeName(const RSExportReduceNew *ER) { 261277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return GetReduceNewResultTypeName(ER->getResultType()); 262277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 263277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 264277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} // end anonymous namespace 265277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 266cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liaostatic const char *GetTypeNullValue(const RSExportType *ET) { 267cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao switch (ET->getClass()) { 2682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 2692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportPrimitiveType *EPT = 2702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 2712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (EPT->isRSObjectType()) 272cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "null"; 2732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else if (EPT->getType() == DataTypeBoolean) 2742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "false"; 2752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 2762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "0"; 2772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 2782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: 2802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 2812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 2822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 2832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 2842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "null"; 2852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 2862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 288cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 289cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return ""; 290cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao} 291cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao 29247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hinesstatic std::string GetBuiltinElementConstruct(const RSExportType *ET) { 2932e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ET->getClass() == RSExportType::ExportClassPrimitive) { 294a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines return std::string("Element.") + ET->getElementName(); 2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassVector) { 2962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 297cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet if (EVT->getType() == DataTypeFloat32) { 298c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (EVT->getNumElement() == 2) { 2992b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.F32_2"; 300c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } else if (EVT->getNumElement() == 3) { 3012b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.F32_3"; 302c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } else if (EVT->getNumElement() == 4) { 3032b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.F32_4"; 304c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } else { 305c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet slangAssert(false && "Vectors should be size 2, 3, 4"); 306c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 307cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet } else if (EVT->getType() == DataTypeUnsigned8) { 3082b8fb64be3047df940a219872b331eb11de2758dStephen Hines if (EVT->getNumElement() == 4) 3092b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.U8_4"; 3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 31192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 31292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportMatrixType *EMT = static_cast<const RSExportMatrixType *>(ET); 31392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang switch (EMT->getDim()) { 3142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case 2: 3152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Element.MATRIX_2X2"; 3162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case 3: 3172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Element.MATRIX_3X3"; 3182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case 4: 3192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Element.MATRIX_4X4"; 3202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 3212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unsupported dimension of matrix"); 32292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 32447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines // RSExportType::ExportClassPointer can't be generated in a struct. 325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 32647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines return ""; 32748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 32848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 3297682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// If FromIntegerType == DestIntegerType, then Value is returned. 3307682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// Otherwise, return a Java expression that zero-extends the value 3317682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// Value, assumed to be of type FromIntegerType, to the integer type 3327682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// DestIntegerType. 3337682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// 3347682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// Intended operations: 3357682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// byte -> {byte,int,short,long} 3367682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// short -> {short,int,long} 3377682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// int -> {int,long} 3387682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala// long -> long 3397682b663581dd8f67b422f6f2f31692ab2f870e3Matt Walastatic std::string ZeroExtendValue(const std::string &Value, 3407682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string &FromIntegerType, 3417682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string &DestIntegerType) { 3427682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala#ifndef __DISABLE_ASSERTS 3437682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Integer types arranged in increasing order by width 3447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::vector<std::string> ValidTypes{"byte", "short", "int", "long"}; 3457682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala auto FromTypeLoc = std::find(ValidTypes.begin(), ValidTypes.end(), FromIntegerType); 3467682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala auto DestTypeLoc = std::find(ValidTypes.begin(), ValidTypes.end(), DestIntegerType); 3477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Check that both types are valid. 3487682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala slangAssert(FromTypeLoc != ValidTypes.end()); 3497682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala slangAssert(DestTypeLoc != ValidTypes.end()); 3507682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Check that DestIntegerType is at least as wide as FromIntegerType. 3517682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala slangAssert(FromTypeLoc - ValidTypes.begin() <= DestTypeLoc - ValidTypes.begin()); 3527682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala#endif 3537682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 3547682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (FromIntegerType == DestIntegerType) { 3557682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala return Value; 3567682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 3577682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 3587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala std::string Mask, MaskLiteralType; 3597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (FromIntegerType == "byte") { 3607682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Mask = "0xff"; 3617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala MaskLiteralType = "int"; 3627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else if (FromIntegerType == "short") { 3637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Mask = "0xffff"; 3647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala MaskLiteralType = "int"; 3657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else if (FromIntegerType == "int") { 3667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Mask = "0xffffffffL"; 3677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala MaskLiteralType = "long"; 3687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else { 3697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // long -> long casts should have already been handled. 3707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala slangAssert(false && "Unknown integer type"); 3717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 3727682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 3737682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Cast the mask to the appropriate type. 3747682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (MaskLiteralType != DestIntegerType) { 3757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Mask = "(" + DestIntegerType + ") " + Mask; 3767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 3777682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala return "((" + DestIntegerType + ") ((" + Value + ") & " + Mask + "))"; 3787682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 3797682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 3809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate script class **********************/ 38159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc BrouilletRSReflectionJava::RSReflectionJava(const RSContext *Context, 38259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::vector<std::string> *GeneratedFileNames, 38359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet const std::string &OutputBaseDirectory, 38459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet const std::string &RSSourceFileName, 38559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet const std::string &BitCodeFileName, 38659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet bool EmbedBitcodeInJava) 38759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet : mRSContext(Context), mPackageName(Context->getReflectJavaPackageName()), 38859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSPackageName(Context->getRSPackageName()), 38959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mOutputBaseDirectory(OutputBaseDirectory), 39059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSSourceFileName(RSSourceFileName), mBitCodeFileName(BitCodeFileName), 39159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mResourceId(RSSlangReflectUtils::JavaClassNameFromRSFileName( 39259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mBitCodeFileName.c_str())), 39359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mScriptClassName(RS_SCRIPT_CLASS_NAME_PREFIX + 39459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet RSSlangReflectUtils::JavaClassNameFromRSFileName( 39559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSSourceFileName.c_str())), 396c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mEmbedBitcodeInJava(EmbedBitcodeInJava), mNextExportVarSlot(0), 3977682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mNextExportFuncSlot(0), mNextExportForEachSlot(0), 398277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mNextExportReduceSlot(0), mNextExportReduceNewSlot(0), mLastError(""), 399c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mGeneratedFileNames(GeneratedFileNames), mFieldIndex(0) { 40059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet slangAssert(mGeneratedFileNames && "Must supply GeneratedFileNames"); 40159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet slangAssert(!mPackageName.empty() && mPackageName != "-"); 40259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet 40359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mOutputDirectory = RSSlangReflectUtils::ComputePackagedPath( 40459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet OutputBaseDirectory.c_str(), mPackageName.c_str()) + 40559f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet OS_PATH_SEPARATOR_STR; 4063a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray 4073a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray // mElement.getBytesSize only exists on JB+ 4083a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_TARGET_API) { 4093a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mItemSizeof = RS_TYPE_ITEM_SIZEOF_CURRENT; 4103a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray } else { 4113a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mItemSizeof = RS_TYPE_ITEM_SIZEOF_LEGACY; 4123a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray } 41359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet} 41459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet 4152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genScriptClass(const std::string &ClassName, 416602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 4172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!startClass(AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, 4182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg)) 4199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 4209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genScriptClassConstructor(); 4229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4237682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Reflect exported variables 4247682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_vars_begin(), 4257682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_vars_end(); 4262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) 4272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genExportVariable(*I); 4289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4297682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Reflect exported forEach functions (only available on ICS+) 4304cc499d6e5ec602309501873449c938af61170b2Stephen Hines if (mRSContext->getTargetAPI() >= SLANG_ICS_TARGET_API) { 4317682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_foreach_begin(), 4327682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_foreach_end(); 4337682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala I != E; I++) { 4342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genExportForEach(*I); 4357682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 4364a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines } 437593a894650e81be54173106ec266f0311cebebd3Stephen Hines 4387682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Reflect exported reduce functions 4397682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_reduce_begin(), 4407682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_reduce_end(); 4417682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala I != E; ++I) 4427682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genExportReduce(*I); 4437682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 444277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Reflect exported new-style reduce functions 445277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const RSExportType *ResultType : mRSContext->getReduceNewResultTypes( 446277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // FilterIn 447277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross exportableReduceNew, 448277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 449277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Compare 450277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross [](const RSExportType *A, const RSExportType *B) 451277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross { return GetReduceNewResultTypeName(A) < GetReduceNewResultTypeName(B); })) 452277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genExportReduceNewResultType(ResultType); 453277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (auto I = mRSContext->export_reduce_new_begin(), 454277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross E = mRSContext->export_reduce_new_end(); 455277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross I != E; ++I) 456277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genExportReduceNew(*I); 457277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 4587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Reflect exported functions (invokable) 4597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_funcs_begin(), 4607682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_funcs_end(); 4617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala I != E; ++I) 4622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genExportFunction(*I); 4639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endClass(); 4659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 4679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 468462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genScriptClassConstructor() { 4704c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines std::string className(RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 47159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSSourceFileName.c_str())); 472d2936939ec10879e25746322db60071f79f28c1bStephen Hines // Provide a simple way to reference this object. 473f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private static final String " RS_RESOURCE_NAME " = \"" 474f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << getResourceId() << "\";\n"; 475d2936939ec10879e25746322db60071f79f28c1bStephen Hines 476d2936939ec10879e25746322db60071f79f28c1bStephen Hines // Generate a simple constructor with only a single parameter (the rest 477d2936939ec10879e25746322db60071f79f28c1bStephen Hines // can be inferred from information we already have). 478f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "// Constructor\n"; 4795abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 1, "RenderScript", 4802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "rs"); 48144d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines 4827682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const bool haveReduceExportables = 483277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mRSContext->export_reduce_begin() != mRSContext->export_reduce_end() || 484277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mRSContext->export_reduce_new_begin() != mRSContext->export_reduce_new_end(); 4857682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 4862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (getEmbedBitcodeInJava()) { 4874c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call new single argument Java-only constructor 488f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "super(rs,\n"; 489f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " " << RS_RESOURCE_NAME ",\n"; 490f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " " << className << ".getBitCode32(),\n"; 4919ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines mOut.indent() << " " << className << ".getBitCode64());\n"; 4924c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines } else { 4934c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call alternate constructor with required parameters. 4944c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Look up the proper raw bitcode resource id via the context. 495f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "this(rs,\n"; 496f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " rs.getApplicationContext().getResources(),\n"; 497f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " rs.getApplicationContext().getResources()." 498f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "getIdentifier(\n"; 499f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " " RS_RESOURCE_NAME ", \"raw\",\n"; 500f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() 501f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " rs.getApplicationContext().getPackageName()));\n"; 5022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 5034c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines 5044c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Alternate constructor (legacy) with 3 original parameters. 5055abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 3, "RenderScript", 5062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "rs", "Resources", "resources", "int", "id"); 5074c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call constructor of super class 508f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "super(rs, resources, id);\n"; 50944d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 510b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 511b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // If an exported variable has initial value, reflect it 512b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 5137682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_vars_begin(), 5147682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_vars_end(); 5152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 516b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams const RSExportVar *EV = *I; 517d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines if (!EV->getInit().isUninit()) { 5182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitExportVariable(EV->getType(), EV->getName(), EV->getInit()); 519d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } else if (EV->getArraySize()) { 520d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines // Always create an initial zero-init array object. 521f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = new " 522277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << GetTypeName(EV->getType(), TypeNameDefault & ~TypeNameWithConstantArrayBrackets) << "[" 523f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << EV->getArraySize() << "];\n"; 524d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines size_t NumInits = EV->getNumInits(); 525d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines const RSExportConstantArrayType *ECAT = 5262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(EV->getType()); 527d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines const RSExportType *ET = ECAT->getElementType(); 528d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines for (size_t i = 0; i < NumInits; i++) { 529d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines std::stringstream Name; 530d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines Name << EV->getName() << "[" << i << "]"; 5312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitExportVariable(ET, Name.str(), EV->getInitArray(i)); 532d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } 533d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } 534a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_TARGET_API) { 5352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(EV->getType()); 536a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 5372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genFieldPackerInstance(EV->getType()); 538b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams } 539b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 5407682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (haveReduceExportables) { 5417682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << SAVED_RS_REFERENCE << " = rs;\n"; 5427682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 5437682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 5447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Reflect argument / return types in kernels 5457682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 5467682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_foreach_begin(), 5477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_foreach_end(); 5482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 54948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportForEach *EF = *I; 55048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 551c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes const RSExportForEach::InTypeVec &InTypes = EF->getInTypes(); 552c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes for (RSExportForEach::InTypeIter BI = InTypes.begin(), EI = InTypes.end(); 553c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes BI != EI; BI++) { 5545abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (*BI != nullptr) { 555c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes genTypeInstanceFromPointer(*BI); 556c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 55748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 558c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 55948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *OET = EF->getOutType(); 56048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (OET) { 5612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstanceFromPointer(OET); 56248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 56348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 56448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 5657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (auto I = mRSContext->export_reduce_begin(), 5667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala E = mRSContext->export_reduce_end(); 5677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala I != E; I++) { 5687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const RSExportReduce *ER = *I; 5697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genTypeInstance(ER->getType()); 5707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 5717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 572277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (auto I = mRSContext->export_reduce_new_begin(), 573277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross E = mRSContext->export_reduce_new_end(); 574277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross I != E; I++) { 575277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportReduceNew *ER = *I; 576277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 577277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *RT = ER->getResultType(); 578277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(RT != nullptr); 579277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!exportableReduceNew(RT)) 580277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross continue; 581277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 582277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genTypeInstance(RT); 583277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 584277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportReduceNew::InTypeVec &InTypes = ER->getAccumulatorInTypes(); 585277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (RSExportReduceNew::InTypeIter BI = InTypes.begin(), EI = InTypes.end(); 586277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross BI != EI; BI++) { 587277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(*BI != nullptr); 588277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genTypeInstance(*BI); 589277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 590277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 591277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 5922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 593b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 5942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (std::set<std::string>::iterator I = mTypesToCheck.begin(), 5952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet E = mTypesToCheck.end(); 5962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 597f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private Element " RS_ELEM_PREFIX << *I << ";\n"; 59848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 59948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 6002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (std::set<std::string>::iterator I = mFieldPackerTypes.begin(), 6012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet E = mFieldPackerTypes.end(); 6022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 603f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private FieldPacker " RS_FP_PREFIX << *I << ";\n"; 6041f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 6057682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 6067682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (haveReduceExportables) { 6077682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // We save a private copy of rs in order to create temporary 6087682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // allocations in the reduce_* entry points. 6097682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "private RenderScript " << SAVED_RS_REFERENCE << ";\n"; 6107682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 6119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 612462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genInitBoolExportVariable(const std::string &VarName, 614602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const clang::APValue &Val) { 6156e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 6162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert((Val.getKind() == clang::APValue::Int) && 6172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "Bool type has wrong initial APValue"); 618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 619f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 620462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 621f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ((Val.getInt().getSExtValue() == 0) ? "false" : "true") << ";\n"; 622462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid 6252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genInitPrimitiveExportVariable(const std::string &VarName, 6262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const clang::APValue &Val) { 6275d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 6285d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines 629f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 630efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet genInitValue(Val, false); 631f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ";\n"; 63248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 63348bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 6342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genInitExportVariable(const RSExportType *ET, 635602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName, 636602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const clang::APValue &Val) { 6376e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 6389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 6402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 6412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportPrimitiveType *EPT = 6422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 6432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (EPT->getType() == DataTypeBoolean) { 6442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitBoolExportVariable(VarName, Val); 6452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } else { 6462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable(VarName, Val); 647324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 6482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 6492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 6502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 6512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (!Val.isInt() || Val.getInt().getSExtValue() != 0) 6522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::cout << "Initializer which is non-NULL to pointer type variable " 6532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "will be ignored\n"; 6542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 6552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 6562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 6572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 6582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet switch (Val.getKind()) { 6592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Int: 6602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Float: { 6612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (unsigned i = 0; i < EVT->getNumElement(); i++) { 6622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Name = VarName + "." + GetVectorAccessor(i); 6632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable(Name, Val); 6642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 6659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Vector: { 6682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::stringstream VecName; 6692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix 6702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EVT->getNumElement(); 671f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " 672f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VecName.str() << "();\n"; 6732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 6742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned NumElements = std::min( 6752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<unsigned>(EVT->getNumElement()), Val.getVectorLength()); 6762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (unsigned i = 0; i < NumElements; i++) { 6772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const clang::APValue &ElementVal = Val.getVectorElt(i); 6782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Name = VarName + "." + GetVectorAccessor(i); 6792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable(Name, ElementVal); 6809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 682324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 6832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::MemberPointer: 6842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Uninitialized: 6852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::ComplexInt: 6862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::ComplexFloat: 6872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::LValue: 6882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Array: 6892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Struct: 6902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Union: 6912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::AddrLabelDiff: { 6922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unexpected type of value of initializer."); 6932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 6942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 6952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 6962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 6972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): Resolving initializer of a record (and matrix) type variable 6982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // is complex. It cannot obtain by just simply evaluating the initializer 6992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expression. 7002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 7012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 7022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 7039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#if 0 7049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned InitIndex = 0; 7056315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 7066315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 707462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7086e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Vector) && 7096e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type of initializer for record type variable"); 710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 711f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName 712a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines << " = new " << ERT->getElementName() 7132968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << "." RS_TYPE_ITEM_CLASS_NAME"();\n"; 714462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 7169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 7179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 7189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 7199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 7209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName = VarName + "." + F->getName(); 721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (InitIndex > Val.getVectorLength()) 7239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 724462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 725f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet genInitPrimitiveExportVariable(FieldName, 7269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorElt(InitIndex++)); 7279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif 7292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unsupported initializer for record/matrix/constant " 7302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "array type variable currently"); 7312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 7349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genExportVariable(const RSExportVar *EV) { 7389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 739462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 740f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private final static int " << RS_EXPORT_VAR_INDEX_PREFIX 741f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << EV->getName() << " = " << getNextExportVarSlot() << ";\n"; 742462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 7442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 7452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrimitiveTypeExportVariable(EV); 7462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 7492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPointerTypeExportVariable(EV); 7502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 7532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genVectorTypeExportVariable(EV); 7542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 7572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genMatrixTypeExportVariable(EV); 7582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 7612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genConstantArrayTypeExportVariable(EV); 7622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 7652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genRecordTypeExportVariable(EV); 7662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 7699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 771462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genExportFunction(const RSExportFunc *EF) { 773f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private final static int " << RS_EXPORT_FUNC_INDEX_PREFIX 774f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << EF->getName() << " = " << getNextExportFuncSlot() << ";\n"; 7759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // invoke_*() 7772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ArgTy Args; 7789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7790da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang if (EF->hasParam()) { 7800da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang for (RSExportFunc::const_param_iterator I = EF->params_begin(), 7812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = EF->params_end(); 7822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 7832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Args.push_back( 7842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::make_pair(GetTypeName((*I)->getType()), (*I)->getName())); 7850da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang } 7869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 788bd0a7ddceac6c135ea975cefbac73877a1f9dae7Stephen Hines if (mRSContext->getTargetAPI() >= SLANG_M_TARGET_API) { 789cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni startFunction(AM_Public, false, "Script.InvokeID", 790cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni "getInvokeID_" + EF->getName(), 0); 791cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni 792cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni mOut.indent() << "return createInvokeID(" << RS_EXPORT_FUNC_INDEX_PREFIX 793cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni << EF->getName() << ");\n"; 794cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni 795cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni endFunction(); 796cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni } 797cec2a1d2e38ebd644c9f63e83bf5649f15df99d5Yang Ni 7982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", 7992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "invoke_" + EF->getName(/*Mangle=*/false), 8002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // We are using un-mangled name since Java 8012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // supports method overloading. 8022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet Args); 8039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EF->hasParam()) { 805f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "invoke(" << RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() 806f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 8079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 8089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = EF->getParamPacketType(); 8099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 8109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ERT, FieldPackerName.c_str())) 8125abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes genPackVarOfType(ERT, nullptr, FieldPackerName.c_str()); 8139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 814f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "invoke(" << RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() 815f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ");\n"; 8169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 8199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 820462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 821c9454afec1649846512993d0ef65a9f868976bb4Chris Wailesvoid RSReflectionJava::genPairwiseDimCheck(std::string name0, 822c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes std::string name1) { 823c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 824c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "// Verify dimensions\n"; 825c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "t0 = " << name0 << ".getType();\n"; 826c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "t1 = " << name1 << ".getType();\n"; 827c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "if ((t0.getCount() != t1.getCount()) ||\n"; 828c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << " (t0.getX() != t1.getX()) ||\n"; 829c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << " (t0.getY() != t1.getY()) ||\n"; 830c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << " (t0.getZ() != t1.getZ()) ||\n"; 831c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << " (t0.hasFaces() != t1.hasFaces()) ||\n"; 832c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << " (t0.hasMipmaps() != t1.hasMipmaps())) {\n"; 833c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << " throw new RSRuntimeException(\"Dimension mismatch " 834c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes << "between parameters " << name0 << " and " << name1 835c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes << "!\");\n"; 836c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "}\n\n"; 837c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes} 838c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 839277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genNullArrayCheck(const std::string &ArrayName) { 8407682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "// Verify that \"" << ArrayName << "\" is non-null.\n"; 8417682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "if (" << ArrayName << " == null) {\n"; 8427682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " throw new RSIllegalArgumentException(\"Array \\\"" 8437682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ArrayName << "\\\" is null!\");\n"; 8447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "}\n"; 845277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 846277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 847277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genNullOrEmptyArrayCheck(const std::string &ArrayName) { 848277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genNullArrayCheck(ArrayName); 8497682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "// Verify that \"" << ArrayName << "\" is non-empty.\n"; 8507682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "if (" << ArrayName << ".length == 0) {\n"; 8517682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " throw new RSIllegalArgumentException(\"Array \\\"" 8527682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ArrayName << "\\\" is zero-length!\");\n"; 8537682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "}\n"; 8547682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 8557682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 8567682b663581dd8f67b422f6f2f31692ab2f870e3Matt Walavoid RSReflectionJava::genVectorLengthCompatibilityCheck(const std::string &ArrayName, 8577682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala unsigned VecSize) { 8587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "// Verify that the array length is a multiple of the vector size.\n"; 8597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "if (" << ArrayName << ".length % " << std::to_string(VecSize) 8607682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << " != 0) {\n"; 8617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " throw new RSIllegalArgumentException(\"Array \\\"" << ArrayName 8627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << "\\\" is not a multiple of " << std::to_string(VecSize) 8637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << " in length!\");\n"; 8647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "}\n"; 8657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 8667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 8677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Walavoid RSReflectionJava::gen1DCheck(const std::string &Name) { 8687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // TODO: Check that t0.getArrayCount() == 0, when / if this API is 8697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // un-hidden. 8707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "Type t0 = " << Name << ".getType();\n"; 8717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "// Verify " << Name << " is 1D\n"; 8727682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "if (t0.getY() != 0 ||\n"; 8737682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " t0.hasFaces() ||\n"; 8747682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " t0.hasMipmaps()) {\n"; 8757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " throw new RSIllegalArgumentException(\"Parameter " 8767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << Name << " is not 1D!\");\n"; 8777682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "}\n\n"; 8787682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 8797682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 8802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genExportForEach(const RSExportForEach *EF) { 881c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines if (EF->isDummyRoot()) { 882c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines // Skip reflection for dummy root() kernels. Note that we have to 883c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines // advance the next slot number for ForEach, however. 884f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "//private final static int " 885f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_FOREACH_INDEX_PREFIX << EF->getName() << " = " 886f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << getNextExportForEachSlot() << ";\n"; 887c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines return; 888c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines } 889c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines 890f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private final static int " << RS_EXPORT_FOREACH_INDEX_PREFIX 891f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << EF->getName() << " = " << getNextExportForEachSlot() 892f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 893593a894650e81be54173106ec266f0311cebebd3Stephen Hines 894b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines // forEach_*() 8952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ArgTy Args; 896fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross bool HasAllocation = false; // at least one in/out allocation? 897593a894650e81be54173106ec266f0311cebebd3Stephen Hines 898c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes const RSExportForEach::InVec &Ins = EF->getIns(); 899c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes const RSExportForEach::InTypeVec &InTypes = EF->getInTypes(); 900c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes const RSExportType *OET = EF->getOutType(); 901c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 902c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes if (Ins.size() == 1) { 903fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross HasAllocation = true; 904b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines Args.push_back(std::make_pair("Allocation", "ain")); 905c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 906c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } else if (Ins.size() > 1) { 907fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross HasAllocation = true; 908c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes for (RSExportForEach::InIter BI = Ins.begin(), EI = Ins.end(); BI != EI; 909c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes BI++) { 910c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 911c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes Args.push_back(std::make_pair("Allocation", 912c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes "ain_" + (*BI)->getName().str())); 913c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 914c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 915c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 916fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross if (EF->hasOut() || EF->hasReturn()) { 917fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross HasAllocation = true; 918593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair("Allocation", "aout")); 919fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross } 920b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 921b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportRecordType *ERT = EF->getParamPacketType(); 922b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 923b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines for (RSExportForEach::const_param_iterator I = EF->params_begin(), 9242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = EF->params_end(); 9252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 9262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Args.push_back( 9272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::make_pair(GetTypeName((*I)->getType()), (*I)->getName())); 928593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 929593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 930593a894650e81be54173106ec266f0311cebebd3Stephen Hines 931b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 9322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "Script.KernelID", 9332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "getKernelID_" + EF->getName(), 0); 934b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 9352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO: add element checking 936f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return createKernelID(" << RS_EXPORT_FOREACH_INDEX_PREFIX 937c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes << EF->getName() << ", " << EF->getSignatureMetadata() 938c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes << ", null, null);\n"; 939b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 9402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 941b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 942b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 94350974740c0c5c52dd766264139a01702fbc138afStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_MR2_TARGET_API) { 944fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross if (HasAllocation) { 945fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross startFunction(AM_Public, false, "void", "forEach_" + EF->getName(), Args); 94650974740c0c5c52dd766264139a01702fbc138afStephen Hines 947fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut.indent() << "forEach_" << EF->getName(); 948fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut << "("; 94950974740c0c5c52dd766264139a01702fbc138afStephen Hines 950fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross if (Ins.size() == 1) { 951fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut << "ain, "; 952c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 953fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross } else if (Ins.size() > 1) { 954fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross for (RSExportForEach::InIter BI = Ins.begin(), EI = Ins.end(); BI != EI; 955fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross BI++) { 956c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 957fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut << "ain_" << (*BI)->getName().str() << ", "; 958fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross } 959c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 96050974740c0c5c52dd766264139a01702fbc138afStephen Hines 961fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross if (EF->hasOut() || EF->hasReturn()) { 962fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut << "aout, "; 963fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross } 96450974740c0c5c52dd766264139a01702fbc138afStephen Hines 965fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross if (EF->hasUsrData()) { 966fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut << Args.back().second << ", "; 967fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross } 96850974740c0c5c52dd766264139a01702fbc138afStephen Hines 969fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross // No clipped bounds to pass in. 970fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross mOut << "null);\n"; 97150974740c0c5c52dd766264139a01702fbc138afStephen Hines 972fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross endFunction(); 973fb78d4c6604bd243578ce8071e31f68c023d82cfDavid Gross } 97450974740c0c5c52dd766264139a01702fbc138afStephen Hines 97550974740c0c5c52dd766264139a01702fbc138afStephen Hines // Add the clipped kernel parameters to the Args list. 97650974740c0c5c52dd766264139a01702fbc138afStephen Hines Args.push_back(std::make_pair("Script.LaunchOptions", "sc")); 97750974740c0c5c52dd766264139a01702fbc138afStephen Hines } 97850974740c0c5c52dd766264139a01702fbc138afStephen Hines 9792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "forEach_" + EF->getName(), Args); 980593a894650e81be54173106ec266f0311cebebd3Stephen Hines 981c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes if (InTypes.size() == 1) { 9825abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (InTypes.front() != nullptr) { 983c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes genTypeCheck(InTypes.front(), "ain"); 984c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 985c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 986c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } else if (InTypes.size() > 1) { 987c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes size_t Index = 0; 988c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes for (RSExportForEach::InTypeIter BI = InTypes.begin(), EI = InTypes.end(); 989c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes BI != EI; BI++, ++Index) { 990c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 9915abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (*BI != nullptr) { 992c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes genTypeCheck(*BI, ("ain_" + Ins[Index]->getName()).str().c_str()); 993c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 994c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 995b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 996c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 997b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (OET) { 9982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeCheck(OET, "aout"); 999593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 1000593a894650e81be54173106ec266f0311cebebd3Stephen Hines 1001c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes if (Ins.size() == 1 && (EF->hasOut() || EF->hasReturn())) { 1002c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "Type t0, t1;"; 1003c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes genPairwiseDimCheck("ain", "aout"); 1004c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1005c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } else if (Ins.size() > 1) { 1006c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut.indent() << "Type t0, t1;"; 1007c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1008c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes std::string In0Name = "ain_" + Ins[0]->getName().str(); 1009c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1010c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes for (size_t index = 1; index < Ins.size(); ++index) { 1011c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes genPairwiseDimCheck(In0Name, "ain_" + Ins[index]->getName().str()); 1012c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 1013c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1014c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes if (EF->hasOut() || EF->hasReturn()) { 1015c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes genPairwiseDimCheck(In0Name, "aout"); 1016c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 1017593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 1018593a894650e81be54173106ec266f0311cebebd3Stephen Hines 1019b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines std::string FieldPackerName = EF->getName() + "_fp"; 1020b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 10212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ERT, FieldPackerName.c_str())) { 10225abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes genPackVarOfType(ERT, nullptr, FieldPackerName.c_str()); 1023b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 1024b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 1025f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "forEach(" << RS_EXPORT_FOREACH_INDEX_PREFIX 1026f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << EF->getName(); 1027b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1028c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes if (Ins.size() == 1) { 1029f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", ain"; 1030c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } else if (Ins.size() > 1) { 1031c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut << ", new Allocation[]{ain_" << Ins[0]->getName().str(); 1032c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1033c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes for (size_t index = 1; index < Ins.size(); ++index) { 1034c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut << ", ain_" << Ins[index]->getName().str(); 1035c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 1036c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1037c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut << "}"; 1038c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes 1039c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } else { 1040c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes mOut << ", (Allocation) null"; 1041c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes } 1042b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 10439ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasOut() || EF->hasReturn()) 1044f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", aout"; 1045b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 1046f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", null"; 1047b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1048b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasUsrData()) 1049f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", " << FieldPackerName; 1050b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 1051f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", null"; 1052b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 105350974740c0c5c52dd766264139a01702fbc138afStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_MR2_TARGET_API) { 1054f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", sc);\n"; 105550974740c0c5c52dd766264139a01702fbc138afStephen Hines } else { 1056f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ");\n"; 105750974740c0c5c52dd766264139a01702fbc138afStephen Hines } 1058b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 10592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1060593a894650e81be54173106ec266f0311cebebd3Stephen Hines} 1061593a894650e81be54173106ec266f0311cebebd3Stephen Hines 10627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Walavoid RSReflectionJava::genExportReduce(const RSExportReduce *ER) { 10637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Generate the reflected function index. 10647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "private final static int " << RS_EXPORT_REDUCE_INDEX_PREFIX 10657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ER->getName() << " = " << getNextExportReduceSlot() 10667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ";\n"; 10677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 10687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Two variants of reduce_* entry points get generated: 10697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Array variant: 10707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // ty' reduce_foo(ty[] input) 10717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // ty' reduce_foo(ty[] input, int x1, int x2) 10727682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Allocation variant: 10737682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // void reduce_foo(Allocation ain, Allocation aout) 10747682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // void reduce_foo(Allocation ain, Allocation aout, Script.LaunchOptions sc) 10757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 10767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const RSExportType *Type = ER->getType(); 10777682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string Name = ER->getName(); 10787682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 10797682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genExportReduceArrayVariant(Type, Name); 10807682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genExportReduceAllocationVariant(Type, Name); 10817682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 10827682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 10837682b663581dd8f67b422f6f2f31692ab2f870e3Matt Walavoid RSReflectionJava::genExportReduceAllocationVariant(const RSExportType *Type, 10847682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string &KernelName) { 10857682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string FuncName = "reduce_" + KernelName; 10867682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 10877682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // void reduce_foo(Allocation ain, Allocation aout) 10887682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala startFunction(AM_Public, false, "void", FuncName, 2, 10897682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "Allocation", "ain", 10907682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "Allocation", "aout"); 10917682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << FuncName << "(ain, aout, null);\n"; 10927682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala endFunction(); 10937682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 10947682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // void reduce_foo(Allocation ain, Allocation aout, Script.LaunchOptions sc) 10957682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala startFunction(AM_Public, false, "void", FuncName, 3, 10967682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "Allocation", "ain", 10977682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "Allocation", "aout", 10987682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "Script.LaunchOptions", "sc"); 10997682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11007682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Type checking 11017682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genTypeCheck(Type, "ain"); 11027682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genTypeCheck(Type, "aout"); 11037682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11047682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Check that the input is 1D 11057682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala gen1DCheck("ain"); 11067682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11077682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Call backend 11087682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11097682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Script.reduce has the signature 11107682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // 11117682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // protected void 11127682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // reduce(int slot, Allocation ain, Allocation aout, Script.LaunchOptions sc) 11137682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "reduce(" 11147682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << RS_EXPORT_REDUCE_INDEX_PREFIX << KernelName 11157682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ", ain, aout, sc);\n"; 11167682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11177682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala endFunction(); 11187682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 11197682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11207682b663581dd8f67b422f6f2f31692ab2f870e3Matt Walavoid RSReflectionJava::genExportReduceArrayVariant(const RSExportType *Type, 11217682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string &KernelName) { 11227682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Determine if the array variant can be generated. Some type 11237682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // classes cannot be reflected in Java. 11247682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala auto Class = Type->getClass(); 11257682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (Class != RSExportType::ExportClassPrimitive && 11267682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Class != RSExportType::ExportClassVector) { 11277682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala return; 11287682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 11297682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11307682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala RSReflectionTypeData TypeData; 11317682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Type->convertToRTD(&TypeData); 11327682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11337682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Check if the type supports reading back from an Allocation and 11347682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // returning as a first class Java type. If not, the helper cannot 11357682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // be generated. 11367682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (!TypeData.type->java_name || !TypeData.type->java_array_element_name || 11377682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala (TypeData.vecSize > 1 && !TypeData.type->rs_java_vector_prefix)) { 11387682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala return; 11397682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 11407682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11417682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string FuncName = "reduce_" + KernelName; 11427682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string TypeName = GetTypeName(Type); 11437682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string ReflectedScalarType = TypeData.type->java_name; 11447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string ArrayElementType = TypeData.type->java_array_element_name; 11457682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string ArrayType = ArrayElementType + "[]"; 11467682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const std::string ElementName = Type->getElementName(); 11477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11487682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala const uint32_t VecSize = TypeData.vecSize; 11497682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11507682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala std::string InLength = "in.length"; 11517682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Adjust the length so that it corresponds to the number of 11527682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // elements in the allocation. 11537682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (VecSize > 1) { 11547682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala InLength += " / " + std::to_string(VecSize); 11557682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 11567682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11577682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // TypeName reduce_foo(ArrayElementType[] in) 11587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala startFunction(AM_Public, false, TypeName.c_str(), FuncName, 1, 11597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala ArrayType.c_str(), "in"); 11607682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genNullOrEmptyArrayCheck("in"); 11617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (VecSize > 1) { 11627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genVectorLengthCompatibilityCheck("in", VecSize); 11637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 11647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "return " << FuncName << "(in, 0, " 11657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << InLength << ");\n"; 11667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala endFunction(); 11677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // TypeName reduce_foo(ArrayElementType[] in, int x1, int x2) 11697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala startFunction(AM_Public, false, TypeName.c_str(), FuncName, 3, 11717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala ArrayType.c_str(), "in", 11727682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "int", "x1", 11737682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala "int", "x2"); 11747682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genNullOrEmptyArrayCheck("in"); 11767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (VecSize > 1) { 11777682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala genVectorLengthCompatibilityCheck("in", VecSize); 11787682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 11797682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Check that 0 <= x1 and x1 < x2 and x2 <= InLength 11807682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "// Bounds check passed x1 and x2\n"; 11817682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "if (x1 < 0 || x1 >= x2 || x2 > " << InLength << ") {\n"; 11827682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << " throw new RSRuntimeException(" 11837682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << "\"Input bounds are invalid!\");\n"; 11847682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "}\n"; 11857682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11867682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Create a temporary input allocation. 11877682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "Allocation ain = Allocation.createSized(" 11887682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << SAVED_RS_REFERENCE << ", " 11897682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << RS_ELEM_PREFIX << ElementName << ", " 11907682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << "x2 - x1);\n"; 11917682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "ain.setAutoPadding(true);\n"; 11927682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "ain.copy1DRangeFrom(x1, x2 - x1, in);\n"; 11937682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 11947682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Create a temporary output allocation. 11957682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "Allocation aout = Allocation.createSized(" 11967682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << SAVED_RS_REFERENCE << ", " 11977682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << RS_ELEM_PREFIX << ElementName << ", " 11987682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << "1);\n"; 11997682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "aout.setAutoPadding(true);\n"; 12007682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12017682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << FuncName << "(ain, aout, null);\n"; 12027682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12037682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (VecSize > 1) { 12047682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // An allocation with vector elements is represented as an array 12057682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // of primitives, so we have to extract the output from the 12067682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // element array and rebuild the vector. 12077682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // 12087682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // E.g. for int2 12097682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // 12107682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Allocation outArray = new int[2]; 12117682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // aout.copyTo(outArray); 12127682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // int elem0 = outArray[0]; 12137682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // int elem1 = outArray[1]; 12147682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // return new Int2(elem0, elem1); 12157682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12167682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << ArrayType << " outArray = new " 12177682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ArrayElementType << "[" << VecSize << "];\n"; 12187682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12197682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "aout.copy1DRangeTo(0, 1, outArray);\n"; 12207682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12217682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (unsigned Elem = 0; Elem < VecSize; ++Elem) { 12227682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << ReflectedScalarType << " elem" << Elem << " = "; 12237682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala std::string Index = "outArray[" + std::to_string(Elem) + "]"; 12247682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12257682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (ReflectedScalarType == ArrayElementType) { 12267682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut << Index << ";\n"; 12277682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else { 12287682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut << ZeroExtendValue(Index, ArrayElementType, ReflectedScalarType) << ";\n"; 12297682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 12307682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 12317682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12327682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "return new " << TypeName << "("; 12337682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala for (unsigned Elem = 0; Elem < VecSize; ++Elem) { 12347682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (Elem > 0) mOut << ", "; 12357682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut << "elem" << Elem; 12367682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 12377682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut << ");\n"; 12387682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else { 12397682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Scalar handling. 12407682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // 12417682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // E.g. for int 12427682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // Allocation outArray = new int[1]; 12437682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // aout.copyTo(outArray); 12447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala // return outArray[0]; 12457682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << ArrayType << " outArray = new " << ArrayElementType 12467682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << "[1];\n"; 12477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "aout.copyTo(outArray);\n"; 12487682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12497682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala if (ReflectedScalarType == "boolean") { 12507682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "return outArray[0] != 0;\n"; 12517682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else if (ReflectedScalarType == ArrayElementType) { 12527682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "return outArray[0];\n"; 12537682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } else { 12547682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mOut.indent() << "return " 12557682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ZeroExtendValue("outArray[0]", 12567682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala ArrayElementType, 12577682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala ReflectedScalarType) 12587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala << ";\n"; 12597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 12607682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala } 12617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 12627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala endFunction(); 12637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala} 12647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 1265277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross////////////////////////////////////////////////////////////////////////////////////////////////////// 1266277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1267277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Reductions with certain legal result types can only be reflected for NDK, not for Java. 1268277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossbool RSReflectionJava::exportableReduceNew(const RSExportType *ResultType) { 1269277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *CheckType = ResultType; 1270277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (ResultType->getClass() == RSExportType::ExportClassConstantArray) 1271277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross CheckType = static_cast<const RSExportConstantArrayType *>(ResultType)->getElementType(); 1272277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (CheckType->getClass() == RSExportType::ExportClassRecord) { 1273277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // No Java reflection for struct until http://b/22236498 is resolved. 1274277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return false; 1275277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1276277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1277277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return true; 1278277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1279277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1280277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossnamespace { 1281277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossenum MappingComment { MappingCommentWithoutType, MappingCommentWithCType }; 1282277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1283277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// OUTPUTS 1284277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InputParamName = name to use for input parameter 1285277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InputMappingComment = text showing the mapping from InputParamName to the corresponding 1286277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// accumulator function parameter name (and possibly type) 1287277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// INPUTS 1288277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// NamePrefix = beginning of parameter name (e.g., "in") 1289277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MappingComment = whether or not InputMappingComment should contain type 1290277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ER = description of the reduction 1291277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InIdx = which input (numbered from zero) 1292277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid getReduceNewInputStrings(std::string &InputParamName, std::string &InputMappingComment, 1293277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &NamePrefix, MappingComment Mapping, 1294277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportReduceNew *ER, size_t InIdx) { 1295277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputParamName = NamePrefix + std::to_string(InIdx+1); 1296277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string TypeString; 1297277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (Mapping == MappingCommentWithCType) { 1298277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *InType = ER->getAccumulatorInTypes()[InIdx]; 1299277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InType->getClass() == RSExportType::ExportClassRecord) { 1300277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // convertToRTD doesn't understand this type 1301277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeString = "/* struct <> */ "; 1302277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1303277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData InTypeData; 1304277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ER->getAccumulatorInTypes()[InIdx]->convertToRTD(&InTypeData); 1305277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(InTypeData.type->s_name != nullptr); 1306277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InTypeData.vecSize > 1) { 1307277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeString = InTypeData.type->s_name + std::to_string(InTypeData.vecSize) + " "; 1308277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1309277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeString = InTypeData.type->s_name + std::string(" "); 1310277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1311277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1312277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1313277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputMappingComment = InputParamName + " = \"" + TypeString + std::string(ER->getAccumulatorIns()[InIdx]->getName()) + "\""; 1314277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1315277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1316277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} // end anonymous namespace 1317277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1318277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNew(const RSExportReduceNew *ER) { 1319277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!exportableReduceNew(ER->getResultType())) 1320277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1321277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1322277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Generate the reflected function index. 1323277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "private final static int " << RS_EXPORT_REDUCE_NEW_INDEX_PREFIX 1324277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ER->getNameReduce() << " = " << getNextExportReduceNewSlot() 1325277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1326277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1327277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross /****** remember resultSvType generation **********************************************************/ 1328277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1329277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Two variants of reduce_* entry points get generated. 1330277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Array variant: 1331277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(<devecSiIn1Type>[] in1, ..., <devecSiInNType>[] inN) 1332277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(<devecSiIn1Type>[] in1, ..., <devecSiInNType>[] inN, int x1, int x2) 1333277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Allocation variant: 1334277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN) 1335277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN, Script.LaunchOptions sc) 1336277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1337277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genExportReduceNewArrayVariant(ER); 1338277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genExportReduceNewAllocationVariant(ER); 1339277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1340277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1341277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewArrayVariant(const RSExportReduceNew *ER) { 1342277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Analysis of result type. Returns early if result type is not 1343277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // suitable for array method reflection. 1344277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *const ResultType = ER->getResultType(); 1345277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross auto ResultTypeClass = ResultType->getClass(); 1346277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (ResultTypeClass) { 1347277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassConstantArray: 1348277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassMatrix: 1349277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPrimitive: 1350277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassVector: 1351277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Ok 1352277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross break; 1353277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1354277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPointer: 1355277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Should not get here with pointer type"); 1356277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1357277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1358277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassRecord: 1359277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: convertToRTD() cannot handle this. Why not? 1360277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1361277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1362277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1363277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown export class"); 1364277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1365277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1366277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData ResultTypeData; 1367277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->convertToRTD(&ResultTypeData); 1368277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!ResultTypeData.type->java_name || !ResultTypeData.type->java_array_element_name || 1369277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (ResultTypeData.vecSize > 1 && !ResultTypeData.type->rs_java_vector_prefix)) { 1370277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1371277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1372277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ResultTypeName = GetReduceNewResultTypeName(ER); 1373277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1374277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Analysis of inputs. Returns early if some input type is not 1375277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // suitable for array method reflection. 1376277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<RSReflectionTypeData, 1> InsTypeData; 1377277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArgTy Args; 1378277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &Ins = ER->getAccumulatorIns(); 1379277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &InTypes = ER->getAccumulatorInTypes(); 1380277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InTypes.size()); 1381277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InsTypeData.resize(Ins.size()); 1382277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<std::string, 1> InComments; 1383277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1384277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *const InType = InTypes[InIdx]; 1385277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (InType->getClass()) { 1386277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassMatrix: 1387277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPrimitive: 1388277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassVector: 1389277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Ok 1390277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross break; 1391277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1392277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassConstantArray: 1393277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // No 1394277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1395277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1396277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPointer: 1397277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Should not get here with pointer type"); 1398277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1399277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1400277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassRecord: 1401277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: convertToRTD() cannot handle this. Why not? 1402277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1403277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1404277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1405277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown export class"); 1406277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1407277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1408277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1409277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData &InTypeData = InsTypeData[InIdx]; 1410277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InType->convertToRTD(&InTypeData); 1411277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!InTypeData.type->java_name || !InTypeData.type->java_array_element_name || 1412277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (InTypeData.vecSize > 1 && !InTypeData.type->rs_java_vector_prefix)) { 1413277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1414277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1415277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1416277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputParamName, InputComment; 1417277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross getReduceNewInputStrings(InputParamName, InputComment, "in", MappingCommentWithoutType, ER, InIdx); 1418277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InTypeData.vecSize > 1) 1419277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputComment += (", flattened " + std::to_string(InTypeData.vecSize) + "-vectors"); 1420277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InComments.push_back(InputComment); 1421277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1422277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string InputTypeName = std::string(InTypeData.type->java_array_element_name) + "[]"; 1423277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair(InputTypeName, InputParamName)); 1424277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1425277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1426277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string MethodName = "reduce_" + ER->getNameReduce(); 1427277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1428277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(<devecSiIn1Type>[] in1, ..., <devecSiInNType>[] inN) 1429277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1430277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1431277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1432277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1433277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InTypes.size()); 1434277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InsTypeData.size()); 1435277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == Args.size()); 1436277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string PassAsX2; // reduce_<name>(in1, ..., inN, int x1, int x2) 1437277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1438277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArgName = Args[InIdx].second; 1439277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genNullArrayCheck(ArgName); 1440277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InLength = ArgName + ".length"; 1441277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const uint32_t VecSize = InsTypeData[InIdx].vecSize; 1442277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (VecSize > 1) { 1443277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InLength += " / " + std::to_string(VecSize); 1444277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genVectorLengthCompatibilityCheck(ArgName, VecSize); 1445277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1446277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx == 0) { 1447277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross PassAsX2 = InLength; 1448277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1449277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// Verify that input array lengths are the same.\n"; 1450277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "if (" << PassAsX2 << " != " << InLength << ") {\n"; 1451277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << " throw new RSRuntimeException(\"Array length mismatch " 1452277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "between parameters \\\"" << Args[0].second << "\\\" and \\\"" << ArgName 1453277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "\\\"!\");\n"; 1454277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "}\n"; 1455277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1456277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1457277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "\n"; 1458277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << MethodName << "("; 1459277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross bool EmittedFirstArg = false; 1460277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const auto &Arg : Args) { 1461277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!EmittedFirstArg) { 1462277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross EmittedFirstArg = true; 1463277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1464277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", "; 1465277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1466277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << Arg.second; 1467277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1468277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", 0, " << PassAsX2 << ");\n"; 1469277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1470277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1471277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(<devecSiIn1Type>[] in1, ..., <devecSiInNType>[] inN, int x1, int x2) 1472277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1473277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross static const char FormalX1Name[] = "x1"; 1474277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross static const char FormalX2Name[] = "x2"; 1475277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("int", FormalX1Name)); 1476277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("int", FormalX2Name)); 1477277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// reduction only across cells at " << FormalX1Name << " <= coord < " << FormalX2Name << "\n"; 1478277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InVectorComment : InComments) 1479277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InVectorComment << "\n"; 1480277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1481277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Verify that !(x1 < 0 || x1 >= x2) 1482277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// Bounds-check " << FormalX1Name << " and " << FormalX2Name << "\n"; 1483277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "if (" << FormalX1Name << " < 0 || " 1484277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << FormalX1Name << " >= " << FormalX2Name << ") {\n"; 1485277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << " throw new RSRuntimeException(\"Input bounds are invalid!\");\n"; 1486277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "}\n"; 1487277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputAllocationOutgoingArgumentList; 1488277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1489277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArgName = Args[InIdx].second; 1490277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genNullArrayCheck(ArgName); 1491277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InLength = ArgName + ".length"; 1492277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const uint32_t VecSize = InsTypeData[InIdx].vecSize; 1493277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (VecSize > 1) { 1494277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InLength += " / " + std::to_string(VecSize); 1495277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genVectorLengthCompatibilityCheck(ArgName, VecSize); 1496277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1497277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Verify that !(x2 > InLength) 1498277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// Bounds-check \"" << ArgName << "\" against " << FormalX2Name << "\n"; 1499277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "if (" << FormalX2Name << " > " << InLength << ") {\n"; 1500277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << " throw new RSRuntimeException(\"Input bound is invalid " 1501277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "for parameter \\\"" << ArgName << "\\\"!\");\n"; 1502277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "}\n"; 1503277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Create a temporary input allocation 1504277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string TempName = "a" + ArgName; 1505277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Allocation " << TempName << " = Allocation.createSized(" 1506277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << SAVED_RS_REFERENCE << ", " 1507277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << RS_ELEM_PREFIX << InTypes[InIdx]->getElementName() << ", " 1508277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << FormalX2Name << " - " << FormalX1Name << ");\n"; 1509277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << TempName << ".setAutoPadding(true);\n"; 1510277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << TempName << ".copy1DRangeFrom(" << FormalX1Name << ", " 1511277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << FormalX2Name << " - " << FormalX1Name << ", " 1512277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ArgName << ");\n"; 1513277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // ... and put that input allocation on the outgoing argument list 1514277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!InputAllocationOutgoingArgumentList.empty()) 1515277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputAllocationOutgoingArgumentList += ", "; 1516277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputAllocationOutgoingArgumentList += TempName; 1517277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1518277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "\n"; 1519277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << MethodName << "(" << InputAllocationOutgoingArgumentList << ", null);\n"; 1520277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1521277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1522277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1523277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewAllocationVariant(const RSExportReduceNew *ER) { 1524277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &Ins = ER->getAccumulatorIns(); 1525277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &InTypes = ER->getAccumulatorInTypes(); 1526277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *ResultType = ER->getResultType(); 1527277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1528277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<std::string, 1> InComments; 1529277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArgTy Args; 1530277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1531277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputParamName, InputComment; 1532277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross getReduceNewInputStrings(InputParamName, InputComment, "ain", MappingCommentWithCType, ER, InIdx); 1533277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InComments.push_back(InputComment); 1534277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("Allocation", InputParamName)); 1535277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1536277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1537277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string MethodName = "reduce_" + ER->getNameReduce(); 1538277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ResultTypeName = GetReduceNewResultTypeName(ER); 1539277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1540277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN) 1541277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1542277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1543277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1544277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1545277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << MethodName << "("; 1546277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross bool EmittedFirstArg = false; 1547277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const auto &Arg : Args) { 1548277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!EmittedFirstArg) { 1549277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross EmittedFirstArg = true; 1550277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1551277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", "; 1552277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1553277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << Arg.second; 1554277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1555277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", null);\n"; 1556277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1557277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1558277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN, Script.LaunchOptions sc) 1559277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1560277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross static const char FormalOptionsName[] = "sc"; 1561277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("Script.LaunchOptions", FormalOptionsName)); 1562277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1563277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1564277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1565277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &In0Name = Args[0].second; 1566277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Sanity-check inputs 1567277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (Ins.size() > 1) 1568277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Type t0, t1;\n"; 1569277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1570277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &InName = Args[InIdx].second; 1571277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genTypeCheck(InTypes[InIdx], InName.c_str()); 1572277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx > 0) 1573277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genPairwiseDimCheck(In0Name.c_str(), InName.c_str()); 1574277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1575277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Create a temporary output allocation 1576277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char OutputAllocName[] = "aout"; 1577277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const size_t OutputAllocLength = 1578277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->getClass() == RSExportType::ExportClassConstantArray 1579277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ? static_cast<const RSExportConstantArrayType *>(ResultType)->getNumElement() 1580277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross : 1; 1581277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Allocation " << OutputAllocName << " = Allocation.createSized(" 1582277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << SAVED_RS_REFERENCE << ", " 1583277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << RS_ELEM_PREFIX << ResultType->getElementName() << ", " 1584277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << OutputAllocLength << ");\n"; 1585277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << OutputAllocName << ".setAutoPadding(true);\n"; 1586277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Call the underlying reduce entry point 1587277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "reduce(" << RS_EXPORT_REDUCE_NEW_INDEX_PREFIX << ER->getNameReduce() 1588277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ", new Allocation[]{" << In0Name; 1589277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 1, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) 1590277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", " << Args[InIdx].second; 1591277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "}, " << OutputAllocName << ", " << FormalOptionsName << ");\n"; 1592277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return new " << ResultTypeName << "(" << OutputAllocName << ");\n"; 1593277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1594277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1595277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1596277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossnamespace { 1597277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1598277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// When we've copied the Allocation to a Java array, how do we 1599277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// further process the elements of that array? 1600277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossenum MapFromAllocation { 1601277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationTrivial, // no further processing 1602277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationPositive, // need to ensure elements are positive (range check) 1603277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationBoolean, // need to convert elements from byte to boolean 1604277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationPromote // need to zero extend elements 1605277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross}; 1606277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1607277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Return Java expression that maps from an Allocation element to a Java non-vector result. 1608277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1609277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MFA = mapping kind 1610277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ArrayElementTypeName = type of InVal (having been copied out of Allocation to Java array) 1611277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ReflectedScalarTypeName = type of mapped value 1612277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InVal = input value that must be mapped 1613277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1614277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string genReduceNewResultMapping(MapFromAllocation MFA, 1615277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArrayElementTypeName, 1616277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ReflectedScalarTypeName, 1617277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char *InVal) { 1618277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (MFA) { 1619277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1620277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown MapFromAllocation"); 1621277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // and fall through 1622277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationPositive: // range checking must be done separately 1623277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationTrivial: 1624277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return InVal; 1625277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationBoolean: 1626277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return std::string(InVal) + std::string(" != 0"); 1627277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationPromote: 1628277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return ZeroExtendValue(InVal, 1629277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, 1630277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ReflectedScalarTypeName); 1631277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1632277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1633277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1634277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Return Java expression that maps from an Allocation element to a Java vector result. 1635277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1636277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MFA = mapping kind 1637277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ArrayElementTypeName = type of InVal (having been copied out of Allocation to Java array) 1638277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ReflectedScalarTypeName = type of mapped value 1639277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// VectorTypeName = type of vector 1640277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// VectorElementCount = number of elements in the vector 1641277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InArray = input array containing vector elements 1642277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InIdx = index of first vector element within InArray (or nullptr, if 0) 1643277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1644277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string genReduceNewResultVectorMapping(MapFromAllocation MFA, 1645277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArrayElementTypeName, 1646277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ReflectedScalarTypeName, 1647277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &VectorTypeName, 1648277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross unsigned VectorElementCount, 1649277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char *InArray, const char *InIdx = nullptr) { 1650277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string result = "new " + VectorTypeName + "("; 1651277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (unsigned VectorElementIdx = 0; VectorElementIdx < VectorElementCount; ++VectorElementIdx) { 1652277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (VectorElementIdx) 1653277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += ", "; 1654277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1655277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string ArrayElementName = std::string(InArray) + "["; 1656277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx) 1657277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName += std::string(InIdx) + "+"; 1658277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName += std::to_string(VectorElementIdx) + "]"; 1659277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1660277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1661277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName.c_str()); 1662277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1663277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += ")"; 1664277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return result; 1665277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1666277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1667277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid genReduceNewResultRangeCheck(GeneratedFile &Out, const char *InVal) { 1668277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Out.indent() << "if (" << InVal << " < 0)\n"; 1669277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Out.indent() << " throw new RSRuntimeException(\"Result is not representible in Java\");\n"; 1670277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1671277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1672277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} // end anonymous namespace 1673277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1674277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewResultType(const RSExportType *ResultType) { 1675277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!exportableReduceNew(ResultType)) 1676277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1677277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1678277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ClassName = GetReduceNewResultTypeName(ResultType); 1679277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// To obtain the result, invoke get(), which blocks\n"; 1680277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// until the asynchronously-launched operation has completed.\n"; 1681277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "public static class " << ClassName; 1682277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1683277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, GetTypeName(ResultType).c_str(), "get", 0); 1684277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1685277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData TypeData; 1686277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->convertToRTD(&TypeData); 1687277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1688277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string UnbracketedResultTypeName = 1689277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(ResultType, TypeNameDefault & ~TypeNameWithConstantArrayBrackets); 1690277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ReflectedScalarTypeName = TypeData.type->java_name; 1691277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Note: MATRIX* and F16 types do not have a java_array_element_name 1692277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ArrayElementTypeName = 1693277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeData.type->java_array_element_name 1694277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ? std::string(TypeData.type->java_array_element_name) 1695277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross : ReflectedScalarTypeName; 1696277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1697277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocation MFA = MapFromAllocationTrivial; 1698277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (std::string(TypeData.type->rs_type) == "UNSIGNED_64") 1699277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationPositive; 1700277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else if (ReflectedScalarTypeName == "boolean") 1701277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationBoolean; 1702277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else if (ReflectedScalarTypeName != ArrayElementTypeName) 1703277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationPromote; 1704277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1705277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.vecSize == 1) { // result type is non-vector 1706277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ArrayElementType>[] outArray = new <ArrayElementType>[1]; 1707277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // mOut.copyTo(outArray); 1708277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << ArrayElementTypeName << "[] outArray = new " << ArrayElementTypeName 1709277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << std::max(TypeData.arraySize, 1U) << "];\n"; 1710277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut.copyTo(outArray);\n"; 1711277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.arraySize == 0) { // result type is non-array non-vector 1712277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return outArray[0]; // but there are several special cases 1713277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) 1714277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[0]"); 1715277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " 1716277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1717277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray[0]") 1718277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1719277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is array of non-vector 1720277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationTrivial) { 1721277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return outArray; 1722277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return outArray;\n"; 1723277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1724277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ResultType> result = new <UnbracketedResultType>[<ArrayElementCount>]; 1725277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // for (unsigned Idx = 0; Idx < <ArrayElementCount>; ++Idx) 1726277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result[Idx] = <Transform>(outArray[Idx]); 1727277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return result; // but there are several special cases 1728277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA != MapFromAllocationPositive) { 1729277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << GetTypeName(ResultType) << " result = new " 1730277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << UnbracketedResultTypeName 1731277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << TypeData.arraySize << "];\n"; 1732277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1733277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << TypeData.arraySize << "; ++Idx)"; 1734277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1735277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) { 1736277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[Idx]"); 1737277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1738277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "result[Idx] = " 1739277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1740277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray[Idx]") 1741277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1742277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1743277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1744277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << (MFA == MapFromAllocationPositive ? "outArray" : "result") << ";\n"; 1745277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1746277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1747277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is vector or array of vector 1748277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ArrayElementType>[] outArray = new <ArrayElementType>[<VectorElementCount> * <ArrayElementCount>]; 1749277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // mOut.copyTo(outArray); 1750277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const unsigned VectorElementCount = TypeData.vecSize; 1751277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const unsigned OutArrayElementCount = VectorElementCount * std::max(TypeData.arraySize, 1U); 1752277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << ArrayElementTypeName << "[] outArray = new " << ArrayElementTypeName 1753277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << OutArrayElementCount << "];\n"; 1754277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut.copyTo(outArray);\n"; 1755277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) { 1756277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << OutArrayElementCount << "; ++Idx)"; 1757277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1758277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[Idx]"); 1759277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1760277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1761277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.arraySize == 0) { // result type is vector 1762277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return new <ResultType>(outArray[0], outArray[1] ...); // but there are several special cases 1763277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " 1764277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultVectorMapping(MFA, 1765277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, ReflectedScalarTypeName, 1766277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(ResultType), VectorElementCount, 1767277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray") 1768277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1769277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is array of vector 1770277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ResultType> result = new <UnbracketedResultType>[<ArrayElementCount>]; 1771277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // for (unsigned Idx = 0; Idx < <ArrayElementCount>; ++Idx) 1772277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result[Idx] = new <UnbracketedResultType>(outArray[<ArrayElementCount>*Idx+0], 1773277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // outArray[<ArrayElementCount>*Idx+1]...); 1774277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return result; // but there are several special cases 1775277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << GetTypeName(ResultType) << " result = new " 1776277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << UnbracketedResultTypeName 1777277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << TypeData.arraySize << "];\n"; 1778277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << TypeData.arraySize << "; ++Idx)"; 1779277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1780277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "result[Idx] = " 1781277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultVectorMapping(MFA, 1782277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, ReflectedScalarTypeName, 1783277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross UnbracketedResultTypeName, VectorElementCount, 1784277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray", (std::to_string(VectorElementCount) + "*Idx").c_str()) 1785277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1786277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1787277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return result;\n"; 1788277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1789277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1790277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1791277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1792277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Private, false, nullptr, ClassName, 1, "Allocation", "out"); 1793277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: Generate allocation type check and size check? Or move 1794277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // responsibility for instantiating the Allocation here, instead of 1795277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // the reduce_* method? 1796277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut = out;\n"; 1797277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1798277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "private Allocation mOut;\n"; 1799277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1800277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1801277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1802277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross////////////////////////////////////////////////////////////////////////////////////////////////////// 1803277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 18042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstanceFromPointer(const RSExportType *ET) { 180548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 18069ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For pointer parameters to original forEach kernels. 180748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 18082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 18092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(EPT->getPointeeType()); 18109ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines } else { 18119ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For handling pass-by-value kernel parameters. 18122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(ET); 1813a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 1814a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines} 181548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstance(const RSExportType *ET) { 1817a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines switch (ET->getClass()) { 18182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 18212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 18222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(TypeName)) { 1823f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_ELEM_PREFIX << TypeName << " = Element." << TypeName 1824f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "(rs);\n"; 1825a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 18262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 182848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ClassName = ET->getElementName(); 18312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(ClassName)) { 1832f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_ELEM_PREFIX << ClassName << " = " << ClassName 1833f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".createElement(rs);\n"; 183448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 18352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1837a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 18382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 184048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 184148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 184248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genFieldPackerInstance(const RSExportType *ET) { 18441f6c331d622ac645ab68a016aa4c577998547373Stephen Hines switch (ET->getClass()) { 18452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 18482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 18502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet addTypeNameForFieldPacker(TypeName); 18512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 18531f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 18542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18561f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 18571f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 18581f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 18592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeCheck(const RSExportType *ET, 1860602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName) { 1861f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "// check " << VarName << "\n"; 186248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 186348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 186448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 18652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 186648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 186748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 186848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 186948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName; 187048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 187148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 18722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TypeName = ET->getElementName(); 18762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 187848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 188148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 188248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 188348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (!TypeName.empty()) { 1884f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (!" << VarName 1885f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getType().getElement().isCompatible(" RS_ELEM_PREFIX 1886f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << TypeName << ")) {\n"; 1887f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " throw new RSRuntimeException(\"Type mismatch with " 1888f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << TypeName << "!\");\n"; 1889f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 189048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 1891b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines} 1892b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 18932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrimitiveTypeExportVariable(const RSExportVar *EV) { 1894602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 1895602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && 1896602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of primitive here"); 18979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 18992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(EV->getType()); 19000d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EPT); 19010d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 19029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, EV->getName()); 19049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19055d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines if (EV->isConst()) { 1906f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "public final static " << TypeName 1907f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " " RS_EXPORT_VAR_CONST_PREFIX << VarName << " = "; 19085d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val = EV->getInit(); 1909efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet genInitValue(Val, EPT->getType() == DataTypeBoolean); 1910f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ";\n"; 19115d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines } else { 19125d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines // set_*() 19131f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // This must remain synchronized, since multiple Dalvik threads may 19141f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // be calling setters. 19152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 19162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 1917657d20afa621219c1eed72178d1325fd4409f458David Gross if ((EPT->getElementSizeInBytes() < 4) || EV->isUnsigned()) { 19181f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // We create/cache a per-type FieldPacker. This allows us to reuse the 19191f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // validation logic (for catching negative inputs from Dalvik, as well 19201f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // as inputs that are too large to be represented in the unsigned type). 1921bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // Sub-integer types are also handled specially here, so that we don't 1922bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // overwrite bytes accidentally. 19231f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string ElemName = EPT->getElementName(); 19241f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string FPName; 19251f6c331d622ac645ab68a016aa4c577998547373Stephen Hines FPName = RS_FP_PREFIX + ElemName; 1926f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << FPName << "!= null) {\n"; 1927f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.increaseIndent(); 1928f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FPName << ".reset();\n"; 1929f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.decreaseIndent(); 1930f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "} else {\n"; 1931f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.increaseIndent(); 1932657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << FPName << " = new FieldPacker(" << EPT->getElementSizeInBytes() 1933f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 1934f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.decreaseIndent(); 1935f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 19362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 19372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(EPT, "v", FPName.c_str()); 1938f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 1939f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FPName << ");\n"; 19401f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 1941f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 1942f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", v);\n"; 19431f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 19449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19451f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Dalvik update comes last, since the input may be invalid (and hence 19461f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // throw an exception). 1947f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 1948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 19509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1951462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 19532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 1954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1956efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouilletvoid RSReflectionJava::genInitValue(const clang::APValue &Val, bool asBool) { 1957efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet switch (Val.getKind()) { 1958efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Int: { 1959efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::APInt api = Val.getInt(); 1960efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (asBool) { 1961f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ((api.getSExtValue() == 0) ? "false" : "true"); 1962efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } else { 1963efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // TODO: Handle unsigned correctly 1964f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << api.getSExtValue(); 1965efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (api.getBitWidth() > 32) { 1966f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "L"; 1967efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1968efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1969efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1970efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1971efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1972efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Float: { 1973efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::APFloat apf = Val.getFloat(); 1974efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::SmallString<30> s; 1975efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet apf.toString(s); 1976f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << s.c_str(); 1977efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { 1978efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (s.count('.') == 0) { 1979f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ".f"; 1980efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } else { 1981f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "f"; 1982efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1983efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1984efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1985efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1986efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1987efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::ComplexInt: 1988efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::ComplexFloat: 1989efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::LValue: 1990efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Vector: { 1991efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet slangAssert(false && "Primitive type cannot have such kind of initializer"); 1992efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1993efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1994efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1995efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet default: { slangAssert(false && "Unknown kind of initializer"); } 1996efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1997efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet} 1998efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 19992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPointerTypeExportVariable(const RSExportVar *EV) { 20009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 20019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 2002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20036e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 20046e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 2005462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet PointeeType = static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 20070d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 20080d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 2009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2011462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 201289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 20132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "bind_" + VarName, 1, 20142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2016f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 2017f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (v == null) bindAllocation(null, " 2018f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_VAR_INDEX_PREFIX << VarName << ");\n"; 2019462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2020f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (PointeeType->getClass() == RSExportType::ExportClassRecord) { 2021f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "else bindAllocation(v.getAllocation(), " 2022f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_VAR_INDEX_PREFIX << VarName << ");\n"; 2023f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2024f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "else bindAllocation(v, " << RS_EXPORT_VAR_INDEX_PREFIX 2025f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ");\n"; 2026f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2027462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 2031462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2032462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genVectorTypeExportVariable(const RSExportVar *EV) { 20346e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 20356e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 20369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20370d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20380d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2041657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, 1); 20422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 2044462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genMatrixTypeExportVariable(const RSExportVar *EV) { 20476e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 20486e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 204992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ET = EV->getType(); 20510d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 20520d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 205392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 205592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 205692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 205792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 20580d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 20592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 20602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2061f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 206292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 20642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 2065f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 2066f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << FieldPackerName << ");\n"; 206792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 206992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 207092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 207392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 207492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 2075602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 20762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genConstantArrayTypeExportVariable(const RSExportVar *EV) { 2077657d20afa621219c1eed72178d1325fd4409f458David Gross const RSExportType *const ET = EV->getType(); 2078602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 2079657d20afa621219c1eed72178d1325fd4409f458David Gross (ET->getClass() == RSExportType::ExportClassConstantArray) && 2080602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of constant array here"); 20812e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20820d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20830d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20842e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2086657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, static_cast<const RSExportConstantArrayType *>(ET)->getNumElement()); 20872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 20892e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 20902e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genRecordTypeExportVariable(const RSExportVar *EV) { 20926e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 20936e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 20949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20950d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20960d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2099657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, 1); 21002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 21012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 21020d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 21030d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines 21042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrivateExportVariable(const std::string &TypeName, 2105602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 2106f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private " << TypeName << " " << RS_EXPORT_VAR_PREFIX 2107f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ";\n"; 21080d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 21099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2110657d20afa621219c1eed72178d1325fd4409f458David Gross// Dimension = array element count; otherwise, 1. 21112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genSetExportVariable(const std::string &TypeName, 2112657d20afa621219c1eed72178d1325fd4409f458David Gross const RSExportVar *EV, 2113657d20afa621219c1eed72178d1325fd4409f458David Gross unsigned Dimension) { 21149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 21150d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 21160d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 21170d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const RSExportType *ET = EV->getType(); 21182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 21192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2120f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 21219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 21232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 2124a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 2125a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) { 2126a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // Legacy apps must use the old setVar() without Element/dim components. 2127f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 2128f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ");\n"; 2129a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } else { 2130a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // We only have support for one-dimensional array reflection today, 2131a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // but the entry point (i.e. setVar()) takes an array of dimensions. 2132f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int []__dimArr = new int[1];\n"; 2133657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << "__dimArr[0] = " << Dimension << ";\n"; 2134f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 2135f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ", " << RS_ELEM_PREFIX 2136f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ET->getElementName() << ", __dimArr);\n"; 2137a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 21381ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 21392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 21409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 21419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetExportVariable(const std::string &TypeName, 2144602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 21452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 2146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2147f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " << RS_EXPORT_VAR_PREFIX << VarName << ";\n"; 2148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 215028d60bc2da19821af82d983902c3c78c078343c3Stephen Hines} 215128d60bc2da19821af82d983902c3c78c078343c3Stephen Hines 21522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetFieldID(const std::string &VarName) { 215328d60bc2da19821af82d983902c3c78c078343c3Stephen Hines // We only generate getFieldID_*() for non-Pointer (bind) types. 2154b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 21552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "Script.FieldID", "getFieldID_" + VarName, 21562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 0); 2157b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 2158f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return createFieldID(" << RS_EXPORT_VAR_INDEX_PREFIX 2159f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ", null);\n"; 2160b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 21612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2162b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 21639c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 21649c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 21659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 21669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genCreateFieldPacker(const RSExportType *ET, 2168602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 2169c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t AllocSize = ET->getAllocSize(); 21709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 2171f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 2172f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << AllocSize << ");\n"; 21739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 21749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 21759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 21769c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 21779c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 21782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPackVarOfType(const RSExportType *ET, 2179602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName, 2180602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 21819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 21822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 21832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 2184f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << "." 2185f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << GetPackerAPIName( 2186f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET)) << "(" 2187f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ");\n"; 21882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 21892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 21902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 21912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Must reflect as type Allocation in Java 21922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 21932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 21942e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 2195f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) { 2196f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addI32(" << VarName 2197f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getPtr());\n"; 2198f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2199f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addI32(" << VarName 2200f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getAllocation().getPtr());\n"; 2201f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 2205f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addMatrix(" << VarName << ");\n"; 22062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 22092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 22102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 22112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): more elegant way. Currently, we obtain the unique index 22132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // variable (this method involves recursive call which means 22142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we may have more than one level loop, therefore we can't 22152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // always use the same index variable name here) name given 22162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // in the for-loop from counting the '.' in @VarName. 22172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Level = 0; 22182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t LastDotPos = 0; 22192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 22202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet while (LastDotPos != std::string::npos) { 22222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 22232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Level++; 22242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 22252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string IndexVarName("ct"); 22262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet IndexVarName.append(llvm::utostr_32(Level)); 2227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2228f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "for (int " << IndexVarName << " = 0; " << IndexVarName 2229657d20afa621219c1eed72178d1325fd4409f458David Gross << " < " << ECAT->getNumElement() << "; " << IndexVarName << "++)"; 2230f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[" + IndexVarName + "]"); 22332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ECAT->getElementType(), ElementVarName.c_str(), 22342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldPackerName); 2235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2236f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 22372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 22402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType *ERT = static_cast<const RSExportRecordType *>(ET); 22412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Relative pos from now on in field packer 22422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Pos = 0; 22432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 22452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 22462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 22472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType::Field *F = *I; 22482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string FieldName; 22492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldOffset = F->getOffsetInParent(); 22502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *T = F->getType(); 22512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldStoreSize = T->getStoreSize(); 22522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldAllocSize = T->getAllocSize(); 22532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22545abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (VarName != nullptr) 22552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = VarName + ("." + F->getName()); 22562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 22572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = F->getName(); 2258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2259f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldOffset > Pos) { 2260f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) 2261f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2262f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), FieldName.c_str(), FieldPackerName); 2265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There is padding in the field type 2267f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldAllocSize > FieldStoreSize) { 2268f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" 2269f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << (FieldAllocSize - FieldStoreSize) << ");\n"; 2270f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Pos = FieldOffset + FieldAllocSize; 2273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 22742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There maybe some padding after the struct 2276f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (ERT->getAllocSize() > Pos) { 2277f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" << ERT->getAllocSize() - Pos 2278f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2279f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 22839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 22849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genAllocateVarOfType(const RSExportType *T, 2287602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 22882e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 22892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 22902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type like int in Java has its own storage once it's declared. 22912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // 22922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // FIXME: Should we allocate storage for RS object? 22932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 2294f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 22952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 22982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Pointer type is an instance of Allocation or a TypeClass whose value is 22992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expected to be assigned by programmer later in Java program. Therefore 23002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we don't reflect things like [VarName] = new Allocation(); 2301f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = null;\n"; 23022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 23032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 23042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 23052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 23062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(T); 23072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ElementType = ECAT->getElementType(); 23082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 2309f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = new " << GetTypeName(ElementType) << "[" 2310657d20afa621219c1eed72178d1325fd4409f458David Gross << ECAT->getNumElement() << "];\n"; 23112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 23122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type element doesn't need allocation code. 23132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 2314657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << "for (int $ct = 0; $ct < " << ECAT->getNumElement() 2315f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "; $ct++)"; 2316f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 23172e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 23182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 23192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[$ct]"); 23202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(ElementType, ElementVarName); 23212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 2322f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 23232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 23242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 23252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 23262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 23272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 23282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 2329f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 23302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 23312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 23322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 23332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 23342e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 23352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferIfNull(const char *Index) { 2336f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME " == null) "; 2337f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_NAME << " = new " << RS_TYPE_ITEM_CLASS_NAME 2338f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "[getType().getX() /* count */];\n"; 23395abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (Index != nullptr) { 2340f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME << "[" << Index 2341f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "] == null) "; 2342f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_NAME << "[" << Index << "] = new " 2343f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_CLASS_NAME << "();\n"; 2344f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 23459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferPackerIfNull() { 2348f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " == null) "; 2349f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = new FieldPacker(" 23503a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << " * getType().getX()/* count */);\n"; 2351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 23542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genTypeClass(const RSExportRecordType *ERT, 2355602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 2356a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines std::string ClassName = ERT->getElementName(); 23572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string superClassName = getRSPackageName(); 2358f69e1e58cf65555c4be3f6c5c53f89eb044f1db5Tim Murray superClassName += RS_TYPE_CLASS_SUPER_CLASS_NAME; 23599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!startClass(AM_Public, false, ClassName, superClassName.c_str(), 23612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg)) 23629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 23639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23644cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 23654cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 23662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeItemClass(ERT); 23679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 2369f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private " << RS_TYPE_ITEM_CLASS_NAME << " " 2370f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_BUFFER_NAME << "[];\n"; 2371f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private FieldPacker " << RS_TYPE_ITEM_BUFFER_PACKER_NAME 2372f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 2373f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private static java.lang.ref.WeakReference<Element> " 2374f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ELEMENT_REF_NAME 2375f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " = new java.lang.ref.WeakReference<Element>(null);\n"; 23762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 23772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassConstructor(ERT); 23782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArrayLocal(ERT); 23792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArray(ERT); 23802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemSetter(ERT); 23812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemGetter(ERT); 23822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentSetter(ERT); 23832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentGetter(ERT); 23842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyAll(ERT); 238582754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines if (!mRSContext->isCompatLib()) { 238682754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines // Skip the resize method if we are targeting a compatibility library. 23872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassResize(); 238882754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines } 23899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endClass(); 23919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet resetFieldIndex(); 23932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet clearFieldIndexMap(); 239466aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 23959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 23969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2397462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeItemClass(const RSExportRecordType *ERT) { 2399f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "static public class " RS_TYPE_ITEM_CLASS_NAME; 2400f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 24019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24023a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray // Sizeof should not be exposed for 64-bit; it is not accurate 24033a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray if (mRSContext->getTargetAPI() < 21) { 24043a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mOut.indent() << "public static final int sizeof = " << ERT->getAllocSize() 24053a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << ";\n"; 24063a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray } 24079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 2409f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 24109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 24112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 24122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 2413f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 2414f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 24159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 24169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 2418f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 2419f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_CLASS_NAME << "()"; 2420f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 24219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 24232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 24242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 24259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 24262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(F->getType(), F->getName()); 24279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 24289e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 24299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 2430f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 2433f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2434462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassConstructor(const RSExportRecordType *ERT) { 24379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 24389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Element", "createElement", 1, "RenderScript", 24402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 2441381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2442e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // TODO(all): Fix weak-refs + multi-context issue. 2443f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "Element e = " << RS_TYPE_ELEMENT_REF_NAME 24442968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << ".get();\n"; 2445f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "if (e != null) return e;\n"; 2446c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder("eb", ERT, RenderScriptVar, &mOut, 2447c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRSContext, this); 2448c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 2449c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2450f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return eb.create();\n"; 2451f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "e = eb.create();\n"; 2452f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << RS_TYPE_ELEMENT_REF_NAME 24532968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << " = new java.lang.ref.WeakReference<Element>(e);\n"; 2454f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "return e;\n"; 24552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 24569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2457381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // private with element 24585abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Private, false, nullptr, getClassName(), 1, "RenderScript", 24592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 2460f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2461f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2462f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 24632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2464381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2465381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D without usage 24665abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 2, "RenderScript", 24672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count"); 24689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2469f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2470f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2471f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 24729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 2473f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "init(" << RenderScriptVar << ", count);\n"; 24742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 24759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2476381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D with usage 24775abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 3, "RenderScript", 24782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count", "int", "usages"); 247991fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 2480f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2481f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2482f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 248391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 2484f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "init(" << RenderScriptVar << ", count, usages);\n"; 24852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 248691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 2487381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D with usage 24882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 3, 24892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", 24902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 2491f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2492f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2493f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createSized(" 2494f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "rs, obj.mElement, dimX, usages);\n"; 2495f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 24962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2497381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2498381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D without usage 24992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 2, 25002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX"); 2501f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return create1D(" << RenderScriptVar 2502f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", dimX, Allocation.USAGE_SCRIPT);\n"; 25032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2504381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2505381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D without usage 25062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 3, 25072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY"); 2508f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return create2D(" << RenderScriptVar 2509f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", dimX, dimY, Allocation.USAGE_SCRIPT);\n"; 25102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2511381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2512381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D with usage 25132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 4, 25142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY", 25152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "usages"); 25162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 2517f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2518f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2519f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type.Builder b = new Type.Builder(rs, obj.mElement);\n"; 2520f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "b.setX(dimX);\n"; 2521f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "b.setY(dimY);\n"; 2522f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type t = b.create();\n"; 2523f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 2524f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 25252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2526381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2527381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createTypeBuilder 25282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Type.Builder", "createTypeBuilder", 1, 25292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar); 2530f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Element e = createElement(" << RenderScriptVar << ");\n"; 2531f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return new Type.Builder(rs, e);\n"; 25322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2533381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2534381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createCustom with usage 25352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "createCustom", 3, 25362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "Type.Builder", "tb", "int", 25372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 2538f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2539f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2540f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type t = tb.create();\n"; 2541f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (t.getElement() != obj.mElement) {\n"; 2542f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " throw new RSIllegalArgumentException(" 2543f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "\"Type.Builder did not match expected element type.\");\n"; 2544f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 2545f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 2546f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 25472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyToArray(const RSExportRecordType *ERT) { 25512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArray", 2, 25522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index"); 25539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 2555f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 25563a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << ");\n"; 25579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2558f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArrayLocal(i, " RS_TYPE_ITEM_BUFFER_PACKER_NAME 2559f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet ");\n"; 256038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 25612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 256238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk} 256338eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 2564602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 25652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassCopyToArrayLocal(const RSExportRecordType *ERT) { 25662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArrayLocal", 2, 25672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "FieldPacker", "fp"); 256838eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 25692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ERT, "i", "fp"); 25709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2573462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemSetter(const RSExportRecordType *ERT) { 25752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set", 3, 25762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index", "boolean", 25772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "copyNow"); 25785abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes genNewItemBufferIfNull(nullptr); 2579f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << "[index] = i;\n"; 25809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2581f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (copyNow) "; 2582f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 25839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2584f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArray(i, index);\n"; 25853a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mOut.indent() << "FieldPacker fp = new FieldPacker(" << mItemSizeof << ");\n"; 2586f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArrayLocal(i, fp);\n"; 2587f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(index, fp);\n"; 25889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 2590f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 25919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2594462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemGetter(const RSExportRecordType *ERT) { 25962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, RS_TYPE_ITEM_CLASS_NAME, "get", 1, 25972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 2598f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME 2599f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " == null) return null;\n"; 2600f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " << RS_TYPE_ITEM_BUFFER_NAME << "[index];\n"; 26012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2602462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2603462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2604602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 26052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentSetter(const RSExportRecordType *ERT) { 26069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 2607602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 2608602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 26099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 26109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 2611c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t FieldStoreSize = F->getType()->getStoreSize(); 26122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet unsigned FieldIndex = getFieldIndex(F); 26139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 26142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + F->getName(), 26152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 3, "int", "index", GetTypeName(F->getType()).c_str(), "v", 26162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "boolean", "copyNow"); 26172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 26182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferIfNull("index"); 2619f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << "[index]." << F->getName() 2620f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " = v;\n"; 2621462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2622f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (copyNow) "; 2623f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 26242dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 2625f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldOffset > 0) { 2626f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 26273a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << " + " << FieldOffset 2628f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2629f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2630f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 26313a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << ");\n"; 2632f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 26332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 2634462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2635f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize 2636f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 26372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", "fp"); 2638f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 2639f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", fp);\n"; 2640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 2642f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2643462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 26459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 26469c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 26479c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 2648602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 26492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentGetter(const RSExportRecordType *ERT) { 26509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 2651602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 2652602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 26539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 26542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, 26552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet GetTypeName(F->getType()).c_str(), "get_" + F->getName(), 1, 26562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 2657f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME << " == null) return " 2658f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << GetTypeNullValue(F->getType()) << ";\n"; 2659f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " RS_TYPE_ITEM_BUFFER_NAME << "[index]." 2660f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << F->getName() << ";\n"; 26612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 26629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 26639c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 26649b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 26652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyAll(const RSExportRecordType *ERT) { 26662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "copyAll", 0); 2667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2668f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "for (int ct = 0; ct < " << RS_TYPE_ITEM_BUFFER_NAME 2669f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".length; ct++)" 2670f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " copyToArray(" << RS_TYPE_ITEM_BUFFER_NAME 2671f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "[ct], ct);\n"; 2672f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(0, " 2673f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_BUFFER_PACKER_NAME ");\n"; 2674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2676462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2677462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassResize() { 26792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "resize", 1, "int", 26802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "newSize"); 26812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 2682f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (mItemArray != null) "; 2683f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2684f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int oldSize = mItemArray.length;\n"; 2685f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int copySize = Math.min(oldSize, newSize);\n"; 2686f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (newSize == oldSize) return;\n"; 2687f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Item ni[] = new Item[newSize];\n"; 2688f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);\n"; 2689f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mItemArray = ni;\n"; 2690f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2691f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.resize(newSize);\n"; 2692f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet 2693f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 2694f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet " != null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 26953a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray "new FieldPacker(" << mItemSizeof << " * getType().getX()/* count */);\n"; 26962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 26972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2698d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 2699d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 27009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 2701462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 27029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 2703c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2704c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc BrouilletRSReflectionJavaElementBuilder::RSReflectionJavaElementBuilder( 2705c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *ElementBuilderName, const RSExportRecordType *ERT, 2706c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *RenderScriptVar, GeneratedFile *Out, const RSContext *RSContext, 2707c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJava *Reflection) 2708c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet : mElementBuilderName(ElementBuilderName), mERT(ERT), 2709c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar(RenderScriptVar), mOut(Out), mPaddingFieldIndex(1), 2710c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRSContext(RSContext), mReflection(Reflection) { 2711c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 2712c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mPaddingPrefix = "#padding_"; 2713c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } else { 2714c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mPaddingPrefix = "#rs_padding_"; 2715c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2716c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2717c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2718c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::generate() { 2719c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mOut->indent() << "Element.Builder " << mElementBuilderName 2720c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << " = new Element.Builder(" << mRenderScriptVar << ");\n"; 2721c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddElement(mERT, "", /* ArraySize = */ 0); 2722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2723462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2724c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddElement(const RSExportType *ET, 2725c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const std::string &VarName, 2726c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize) { 272747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines std::string ElementConstruct = GetBuiltinElementConstruct(ET); 27289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 272947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (ElementConstruct != "") { 2730c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2731c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ElementConstruct << "(" << mRenderScriptVar << ")"; 2732c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 27339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2734c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2735c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet switch (ET->getClass()) { 2736c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 27379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 27382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 273947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines const char *DataTypeName = 274047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines RSExportPrimitiveType::getRSReflectionType(EPT)->rs_type; 2741c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2742c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.createUser(" << mRenderScriptVar 2743c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << ", Element.DataType." << DataTypeName << ")"; 2744c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 2745c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2746c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2747c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassVector: { 2748c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const RSExportVectorType *EVT = 2749c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportVectorType *>(ET); 2750c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *DataTypeName = 2751c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSExportPrimitiveType::getRSReflectionType(EVT)->rs_type; 2752c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2753c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.createVector(" << mRenderScriptVar 2754c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << ", Element.DataType." << DataTypeName << ", " 2755c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << EVT->getNumElement() << ")"; 2756c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 2757c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2758c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2759c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassPointer: 27609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 27619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 27626e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 2763c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2764c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassMatrix: 276592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 276692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 27676e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 2768c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2769c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 27702e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 27712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 27722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 277389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 277489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 2775657d20afa621219c1eed72178d1325fd4409f458David Gross genAddElement(ECAT->getElementType(), VarName, ECAT->getNumElement()); 277689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 2777c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string NewElementBuilderName(mElementBuilderName); 277889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 277989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2780c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder( 2781c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet NewElementBuilderName.c_str(), 2782c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportRecordType *>(ElementType), 2783c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar, mOut, mRSContext, mReflection); 2784c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 2785c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2786657d20afa621219c1eed72178d1325fd4409f458David Gross ArraySize = ECAT->getNumElement(); 2787c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2788c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << NewElementBuilderName << ".create()"; 2789c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 279089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 2791c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2792c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2793c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassRecord: { 27949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 27959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 27966315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 27976315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 27989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 27992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 28002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Pos = 0; // relative pos from now on 28019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 28032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 28042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 28059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 28069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 2807c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet const RSExportType *T = F->getType(); 2808c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldStoreSize = T->getStoreSize(); 2809c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldAllocSize = T->getAllocSize(); 28109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2811c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string FieldName; 28129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 28139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 28149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 28159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 28169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 2818c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(FieldOffset - Pos); 28199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 2821c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mReflection->addFieldIndexMapping(F); 282289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 2823c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddElement(F->getType(), FieldName, 0); 282489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 2825c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string NewElementBuilderName(mElementBuilderName); 282689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 282789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2828c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder( 2829c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet NewElementBuilderName.c_str(), 2830c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportRecordType *>(F->getType()), 2831c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar, mOut, mRSContext, mReflection); 2832c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 283389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2834c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2835c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << NewElementBuilderName << ".create()"; 2836c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(FieldName, ArraySize); 283789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 28389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2839a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 2840a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // There is padding within the field type. This is only necessary 2841a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // for HC-targeted APIs. 2842c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(FieldAllocSize - FieldStoreSize); 2843a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 28449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 28469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2847bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 28489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 2849c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t RecordAllocSize = ERT->getAllocSize(); 28500a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 2851c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(RecordAllocSize - Pos); 2852c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2853c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2854c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet default: 28556e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 2856c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2857b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 28589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2859462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2861c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddPadding(int PaddingSize) { 28629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 28632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &VarName = createPaddingField(); 2864c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 28659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 2866c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U32(" << mRenderScriptVar << ")"; 28679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 28689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 2869c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U16(" << mRenderScriptVar << ")"; 28709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 28719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 2872c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U8(" << mRenderScriptVar << ")"; 28739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 2874462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 2875c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, 0); 28769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2877462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2878462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2879c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddStatementStart() { 2880c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mOut->indent() << mElementBuilderName << ".add("; 2881c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2882c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2883c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid 2884c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc BrouilletRSReflectionJavaElementBuilder::genAddStatementEnd(const std::string &VarName, 2885c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize) { 2886c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ", \"" << VarName << "\""; 2887c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (ArraySize > 0) { 2888c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ", " << ArraySize; 2889c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2890c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ");\n"; 2891c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // TODO Review incFieldIndex. It's probably better to assign the numbers at 2892c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // the start rather 2893c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // than as we're generating the code. 2894c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mReflection->incFieldIndex(); 2895c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2896c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 28979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 2898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 289959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouilletbool RSReflectionJava::reflect() { 290059f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::string ErrorMsg; 290159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!genScriptClass(mScriptClassName, ErrorMsg)) { 290259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::cerr << "Failed to generate class " << mScriptClassName << " (" 29032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ErrorMsg << ")\n"; 29042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 29052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet } 29069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 290759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mGeneratedFileNames->push_back(mScriptClassName); 29089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // class ScriptField_<TypeName> 29102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (RSContext::const_export_type_iterator 29112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI = mRSContext->export_types_begin(), 29122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TE = mRSContext->export_types_end(); 29132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI != TE; TI++) { 29142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportType *ET = TI->getValue(); 29152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 29162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (ET->getClass() == RSExportType::ExportClassRecord) { 29172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportRecordType *ERT = 29182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 29192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 29202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!ERT->isArtificial() && !genTypeClass(ERT, ErrorMsg)) { 29212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::cerr << "Failed to generate type class for struct '" 29222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ERT->getName() << "' (" << ErrorMsg << ")\n"; 29232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 29249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 29269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletconst char *RSReflectionJava::AccessModifierStr(AccessModifier AM) { 29329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 29332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Public: 29342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public"; 29352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Protected: 29372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "protected"; 29382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Private: 29402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "private"; 29412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_PublicSynchronized: 29432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public synchronized"; 29442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 29462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ""; 29472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::startClass(AccessModifier AM, bool IsStatic, 29522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &ClassName, 29532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *SuperClassName, 29542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string &ErrorMsg) { 29558c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 2956f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet std::string FileName = ClassName + ".java"; 295759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!mOut.startFile(mOutputDirectory, FileName, mRSSourceFileName, 2958fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mRSContext->getLicenseNote(), true, 2959fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mRSContext->getVerbose())) { 29608c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 2961f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 29629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 2964f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (!mPackageName.empty()) { 2965f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "package " << mPackageName << ";\n"; 2966f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2967f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 29689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 2970f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import " << mRSPackageName << ".*;\n"; 297144d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines if (getEmbedBitcodeInJava()) { 2972f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import " << mPackageName << "." 297344d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines << RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 297459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSSourceFileName.c_str()) << ";\n"; 297544d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } else { 2976f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import android.content.res.Resources;\n"; 297744d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 2978f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 29799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 29819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 2982f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "/**\n"; 2983f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " * @hide\n"; 2984f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " */\n"; 29859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2986f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 2987f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ClassName; 29885abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (SuperClassName != nullptr) 2989f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " extends " << SuperClassName; 29909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2991f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 29929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 29949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endClass() { 2999f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 3000f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.closeFile(); 30019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 3002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startTypeClass(const std::string &ClassName) { 3005f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "public static class " << ClassName; 3006f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 3007462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3009f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouilletvoid RSReflectionJava::endTypeClass() { mOut.endBlock(); } 3010462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 30122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 30132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, int Argc, 30142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ...) { 30159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 30169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 30179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 3018462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 30202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgType = va_arg(vl, const char *); 30212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgName = va_arg(vl, const char *); 3022462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 30249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 30259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 3026462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 3028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 30312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 30322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, 30332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const ArgTy &Args) { 3034f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 3035f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ((ReturnType) ? ReturnType : "") << " " << FunctionName 3036f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "("; 30379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 30389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 30392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); I != E; I++) { 30409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 3041f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", "; 30429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 30439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 3044462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3045f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << I->first << " " << I->second; 30469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3047462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3048f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ")"; 3049f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 3050462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3052f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouilletvoid RSReflectionJava::endFunction() { mOut.endBlock(); } 3053e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 30542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForElement(const std::string &TypeName) { 30551f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mTypesToCheck.find(TypeName) == mTypesToCheck.end()) { 30561f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mTypesToCheck.insert(TypeName); 30571f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 30581f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 30591f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 30601f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 30611f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 30621f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 30632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForFieldPacker(const std::string &TypeName) { 30641f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mFieldPackerTypes.find(TypeName) == mFieldPackerTypes.end()) { 30651f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mFieldPackerTypes.insert(TypeName); 30661f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 30671f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 30681f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 30691f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 30701f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 30711f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 30722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang 3073