slang_rs_reflection.cpp revision 1381ae7c081ab151e78184501f757f517fe6c2a9
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 // Allocation variant: 1333277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN) 1334277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN, Script.LaunchOptions sc) 1335277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1336277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genExportReduceNewArrayVariant(ER); 1337277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genExportReduceNewAllocationVariant(ER); 1338277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1339277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1340277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewArrayVariant(const RSExportReduceNew *ER) { 1341277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Analysis of result type. Returns early if result type is not 1342277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // suitable for array method reflection. 1343277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *const ResultType = ER->getResultType(); 1344277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross auto ResultTypeClass = ResultType->getClass(); 1345277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (ResultTypeClass) { 1346277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassConstantArray: 1347277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassMatrix: 1348277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPrimitive: 1349277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassVector: 1350277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Ok 1351277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross break; 1352277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1353277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPointer: 1354277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Should not get here with pointer type"); 1355277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1356277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1357277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassRecord: 1358277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: convertToRTD() cannot handle this. Why not? 1359277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1360277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1361277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1362277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown export class"); 1363277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1364277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1365277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData ResultTypeData; 1366277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->convertToRTD(&ResultTypeData); 1367277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!ResultTypeData.type->java_name || !ResultTypeData.type->java_array_element_name || 1368277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (ResultTypeData.vecSize > 1 && !ResultTypeData.type->rs_java_vector_prefix)) { 1369277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1370277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1371277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ResultTypeName = GetReduceNewResultTypeName(ER); 1372277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1373277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Analysis of inputs. Returns early if some input type is not 1374277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // suitable for array method reflection. 1375277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<RSReflectionTypeData, 1> InsTypeData; 1376277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArgTy Args; 1377277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &Ins = ER->getAccumulatorIns(); 1378277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &InTypes = ER->getAccumulatorInTypes(); 1379277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InTypes.size()); 1380277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InsTypeData.resize(Ins.size()); 1381277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<std::string, 1> InComments; 1382277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1383277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *const InType = InTypes[InIdx]; 1384277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (InType->getClass()) { 1385277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassMatrix: 1386277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPrimitive: 1387277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassVector: 1388277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Ok 1389277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross break; 1390277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1391277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassConstantArray: 1392277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // No 1393277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1394277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1395277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPointer: 1396277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Should not get here with pointer type"); 1397277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1398277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1399277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassRecord: 1400277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: convertToRTD() cannot handle this. Why not? 1401277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1402277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1403277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1404277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown export class"); 1405277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1406277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1407277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1408277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData &InTypeData = InsTypeData[InIdx]; 1409277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InType->convertToRTD(&InTypeData); 1410277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!InTypeData.type->java_name || !InTypeData.type->java_array_element_name || 1411277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (InTypeData.vecSize > 1 && !InTypeData.type->rs_java_vector_prefix)) { 1412277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1413277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1414277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1415277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputParamName, InputComment; 1416277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross getReduceNewInputStrings(InputParamName, InputComment, "in", MappingCommentWithoutType, ER, InIdx); 1417277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InTypeData.vecSize > 1) 1418277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputComment += (", flattened " + std::to_string(InTypeData.vecSize) + "-vectors"); 1419277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InComments.push_back(InputComment); 1420277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1421277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string InputTypeName = std::string(InTypeData.type->java_array_element_name) + "[]"; 1422277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair(InputTypeName, InputParamName)); 1423277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1424277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1425277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string MethodName = "reduce_" + ER->getNameReduce(); 1426277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1427277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(<devecSiIn1Type>[] in1, ..., <devecSiInNType>[] inN) 1428277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1429277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1430277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1431277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1432277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InTypes.size()); 1433277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InsTypeData.size()); 1434277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == Args.size()); 14351381ae7c081ab151e78184501f757f517fe6c2a9David Gross std::string In1Length; 14361381ae7c081ab151e78184501f757f517fe6c2a9David Gross std::string InputAllocationOutgoingArgumentList; 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) { 14471381ae7c081ab151e78184501f757f517fe6c2a9David Gross In1Length = InLength; 1448277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1449277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// Verify that input array lengths are the same.\n"; 14501381ae7c081ab151e78184501f757f517fe6c2a9David Gross mOut.indent() << "if (" << In1Length << " != " << 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 // Create a temporary input allocation 1457277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string TempName = "a" + ArgName; 1458277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Allocation " << TempName << " = Allocation.createSized(" 1459277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << SAVED_RS_REFERENCE << ", " 1460277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << RS_ELEM_PREFIX << InTypes[InIdx]->getElementName() << ", " 14611381ae7c081ab151e78184501f757f517fe6c2a9David Gross << InLength << ");\n"; 1462277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << TempName << ".setAutoPadding(true);\n"; 14631381ae7c081ab151e78184501f757f517fe6c2a9David Gross mOut.indent() << TempName << ".copyFrom(" << ArgName << ");\n"; 1464277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // ... and put that input allocation on the outgoing argument list 1465277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!InputAllocationOutgoingArgumentList.empty()) 1466277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputAllocationOutgoingArgumentList += ", "; 1467277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputAllocationOutgoingArgumentList += TempName; 1468277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 14691381ae7c081ab151e78184501f757f517fe6c2a9David Gross 1470277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "\n"; 1471277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << MethodName << "(" << InputAllocationOutgoingArgumentList << ", null);\n"; 1472277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1473277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1474277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1475277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewAllocationVariant(const RSExportReduceNew *ER) { 1476277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &Ins = ER->getAccumulatorIns(); 1477277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &InTypes = ER->getAccumulatorInTypes(); 1478277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *ResultType = ER->getResultType(); 1479277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1480277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<std::string, 1> InComments; 1481277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArgTy Args; 1482277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1483277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputParamName, InputComment; 1484277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross getReduceNewInputStrings(InputParamName, InputComment, "ain", MappingCommentWithCType, ER, InIdx); 1485277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InComments.push_back(InputComment); 1486277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("Allocation", InputParamName)); 1487277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1488277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1489277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string MethodName = "reduce_" + ER->getNameReduce(); 1490277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ResultTypeName = GetReduceNewResultTypeName(ER); 1491277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1492277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN) 1493277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1494277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1495277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1496277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1497277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << MethodName << "("; 1498277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross bool EmittedFirstArg = false; 1499277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const auto &Arg : Args) { 1500277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!EmittedFirstArg) { 1501277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross EmittedFirstArg = true; 1502277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1503277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", "; 1504277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1505277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << Arg.second; 1506277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1507277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", null);\n"; 1508277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1509277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1510277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN, Script.LaunchOptions sc) 1511277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1512277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross static const char FormalOptionsName[] = "sc"; 1513277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("Script.LaunchOptions", FormalOptionsName)); 1514277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1515277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1516277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1517277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &In0Name = Args[0].second; 1518277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Sanity-check inputs 1519277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (Ins.size() > 1) 1520277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Type t0, t1;\n"; 1521277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1522277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &InName = Args[InIdx].second; 1523277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genTypeCheck(InTypes[InIdx], InName.c_str()); 1524277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx > 0) 1525277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genPairwiseDimCheck(In0Name.c_str(), InName.c_str()); 1526277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1527277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Create a temporary output allocation 1528277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char OutputAllocName[] = "aout"; 1529277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const size_t OutputAllocLength = 1530277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->getClass() == RSExportType::ExportClassConstantArray 1531277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ? static_cast<const RSExportConstantArrayType *>(ResultType)->getNumElement() 1532277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross : 1; 1533277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Allocation " << OutputAllocName << " = Allocation.createSized(" 1534277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << SAVED_RS_REFERENCE << ", " 1535277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << RS_ELEM_PREFIX << ResultType->getElementName() << ", " 1536277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << OutputAllocLength << ");\n"; 1537277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << OutputAllocName << ".setAutoPadding(true);\n"; 1538277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Call the underlying reduce entry point 1539277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "reduce(" << RS_EXPORT_REDUCE_NEW_INDEX_PREFIX << ER->getNameReduce() 1540277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ", new Allocation[]{" << In0Name; 1541277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 1, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) 1542277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", " << Args[InIdx].second; 1543277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "}, " << OutputAllocName << ", " << FormalOptionsName << ");\n"; 1544277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return new " << ResultTypeName << "(" << OutputAllocName << ");\n"; 1545277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1546277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1547277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1548277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossnamespace { 1549277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1550277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// When we've copied the Allocation to a Java array, how do we 1551277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// further process the elements of that array? 1552277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossenum MapFromAllocation { 1553277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationTrivial, // no further processing 1554277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationPositive, // need to ensure elements are positive (range check) 1555277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationBoolean, // need to convert elements from byte to boolean 1556277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationPromote // need to zero extend elements 1557277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross}; 1558277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1559277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Return Java expression that maps from an Allocation element to a Java non-vector result. 1560277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1561277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MFA = mapping kind 1562277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ArrayElementTypeName = type of InVal (having been copied out of Allocation to Java array) 1563277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ReflectedScalarTypeName = type of mapped value 1564277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InVal = input value that must be mapped 1565277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1566277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string genReduceNewResultMapping(MapFromAllocation MFA, 1567277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArrayElementTypeName, 1568277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ReflectedScalarTypeName, 1569277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char *InVal) { 1570277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (MFA) { 1571277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1572277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown MapFromAllocation"); 1573277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // and fall through 1574277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationPositive: // range checking must be done separately 1575277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationTrivial: 1576277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return InVal; 1577277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationBoolean: 1578277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return std::string(InVal) + std::string(" != 0"); 1579277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationPromote: 1580277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return ZeroExtendValue(InVal, 1581277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, 1582277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ReflectedScalarTypeName); 1583277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1584277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1585277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1586277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Return Java expression that maps from an Allocation element to a Java vector result. 1587277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1588277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MFA = mapping kind 1589277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ArrayElementTypeName = type of InVal (having been copied out of Allocation to Java array) 1590277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ReflectedScalarTypeName = type of mapped value 1591277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// VectorTypeName = type of vector 1592277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// VectorElementCount = number of elements in the vector 1593277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InArray = input array containing vector elements 1594277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InIdx = index of first vector element within InArray (or nullptr, if 0) 1595277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1596277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string genReduceNewResultVectorMapping(MapFromAllocation MFA, 1597277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArrayElementTypeName, 1598277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ReflectedScalarTypeName, 1599277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &VectorTypeName, 1600277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross unsigned VectorElementCount, 1601277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char *InArray, const char *InIdx = nullptr) { 1602277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string result = "new " + VectorTypeName + "("; 1603277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (unsigned VectorElementIdx = 0; VectorElementIdx < VectorElementCount; ++VectorElementIdx) { 1604277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (VectorElementIdx) 1605277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += ", "; 1606277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1607277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string ArrayElementName = std::string(InArray) + "["; 1608277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx) 1609277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName += std::string(InIdx) + "+"; 1610277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName += std::to_string(VectorElementIdx) + "]"; 1611277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1612277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1613277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName.c_str()); 1614277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1615277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += ")"; 1616277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return result; 1617277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1618277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1619277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid genReduceNewResultRangeCheck(GeneratedFile &Out, const char *InVal) { 1620277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Out.indent() << "if (" << InVal << " < 0)\n"; 1621277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Out.indent() << " throw new RSRuntimeException(\"Result is not representible in Java\");\n"; 1622277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1623277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1624277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} // end anonymous namespace 1625277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1626277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewResultType(const RSExportType *ResultType) { 1627277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!exportableReduceNew(ResultType)) 1628277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1629277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1630277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ClassName = GetReduceNewResultTypeName(ResultType); 1631277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// To obtain the result, invoke get(), which blocks\n"; 1632277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// until the asynchronously-launched operation has completed.\n"; 1633277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "public static class " << ClassName; 1634277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1635277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, GetTypeName(ResultType).c_str(), "get", 0); 1636277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1637277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData TypeData; 1638277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->convertToRTD(&TypeData); 1639277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1640277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string UnbracketedResultTypeName = 1641277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(ResultType, TypeNameDefault & ~TypeNameWithConstantArrayBrackets); 1642277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ReflectedScalarTypeName = TypeData.type->java_name; 1643277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Note: MATRIX* and F16 types do not have a java_array_element_name 1644277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ArrayElementTypeName = 1645277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeData.type->java_array_element_name 1646277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ? std::string(TypeData.type->java_array_element_name) 1647277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross : ReflectedScalarTypeName; 1648277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1649277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocation MFA = MapFromAllocationTrivial; 1650277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (std::string(TypeData.type->rs_type) == "UNSIGNED_64") 1651277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationPositive; 1652277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else if (ReflectedScalarTypeName == "boolean") 1653277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationBoolean; 1654277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else if (ReflectedScalarTypeName != ArrayElementTypeName) 1655277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationPromote; 1656277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1657277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.vecSize == 1) { // result type is non-vector 1658277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ArrayElementType>[] outArray = new <ArrayElementType>[1]; 1659277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // mOut.copyTo(outArray); 1660277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << ArrayElementTypeName << "[] outArray = new " << ArrayElementTypeName 1661277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << std::max(TypeData.arraySize, 1U) << "];\n"; 1662277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut.copyTo(outArray);\n"; 1663277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.arraySize == 0) { // result type is non-array non-vector 1664277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return outArray[0]; // but there are several special cases 1665277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) 1666277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[0]"); 1667277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " 1668277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1669277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray[0]") 1670277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1671277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is array of non-vector 1672277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationTrivial) { 1673277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return outArray; 1674277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return outArray;\n"; 1675277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1676277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ResultType> result = new <UnbracketedResultType>[<ArrayElementCount>]; 1677277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // for (unsigned Idx = 0; Idx < <ArrayElementCount>; ++Idx) 1678277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result[Idx] = <Transform>(outArray[Idx]); 1679277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return result; // but there are several special cases 1680277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA != MapFromAllocationPositive) { 1681277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << GetTypeName(ResultType) << " result = new " 1682277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << UnbracketedResultTypeName 1683277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << TypeData.arraySize << "];\n"; 1684277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1685277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << TypeData.arraySize << "; ++Idx)"; 1686277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1687277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) { 1688277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[Idx]"); 1689277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1690277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "result[Idx] = " 1691277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1692277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray[Idx]") 1693277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1694277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1695277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1696277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << (MFA == MapFromAllocationPositive ? "outArray" : "result") << ";\n"; 1697277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1698277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1699277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is vector or array of vector 1700277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ArrayElementType>[] outArray = new <ArrayElementType>[<VectorElementCount> * <ArrayElementCount>]; 1701277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // mOut.copyTo(outArray); 1702277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const unsigned VectorElementCount = TypeData.vecSize; 1703277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const unsigned OutArrayElementCount = VectorElementCount * std::max(TypeData.arraySize, 1U); 1704277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << ArrayElementTypeName << "[] outArray = new " << ArrayElementTypeName 1705277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << OutArrayElementCount << "];\n"; 1706277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut.copyTo(outArray);\n"; 1707277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) { 1708277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << OutArrayElementCount << "; ++Idx)"; 1709277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1710277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[Idx]"); 1711277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1712277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1713277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.arraySize == 0) { // result type is vector 1714277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return new <ResultType>(outArray[0], outArray[1] ...); // but there are several special cases 1715277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " 1716277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultVectorMapping(MFA, 1717277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, ReflectedScalarTypeName, 1718277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(ResultType), VectorElementCount, 1719277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray") 1720277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1721277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is array of vector 1722277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ResultType> result = new <UnbracketedResultType>[<ArrayElementCount>]; 1723277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // for (unsigned Idx = 0; Idx < <ArrayElementCount>; ++Idx) 1724277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result[Idx] = new <UnbracketedResultType>(outArray[<ArrayElementCount>*Idx+0], 1725277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // outArray[<ArrayElementCount>*Idx+1]...); 1726277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // return result; // but there are several special cases 1727277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << GetTypeName(ResultType) << " result = new " 1728277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << UnbracketedResultTypeName 1729277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << TypeData.arraySize << "];\n"; 1730277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << TypeData.arraySize << "; ++Idx)"; 1731277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1732277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "result[Idx] = " 1733277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultVectorMapping(MFA, 1734277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, ReflectedScalarTypeName, 1735277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross UnbracketedResultTypeName, VectorElementCount, 1736277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray", (std::to_string(VectorElementCount) + "*Idx").c_str()) 1737277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1738277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1739277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return result;\n"; 1740277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1741277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1742277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1743277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1744277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Private, false, nullptr, ClassName, 1, "Allocation", "out"); 1745277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: Generate allocation type check and size check? Or move 1746277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // responsibility for instantiating the Allocation here, instead of 1747277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // the reduce_* method? 1748277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut = out;\n"; 1749277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1750277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "private Allocation mOut;\n"; 1751277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1752277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1753277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1754277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross////////////////////////////////////////////////////////////////////////////////////////////////////// 1755277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 17562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstanceFromPointer(const RSExportType *ET) { 175748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 17589ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For pointer parameters to original forEach kernels. 175948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 17602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 17612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(EPT->getPointeeType()); 17629ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines } else { 17639ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For handling pass-by-value kernel parameters. 17642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(ET); 1765a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 1766a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines} 176748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 17682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstance(const RSExportType *ET) { 1769a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines switch (ET->getClass()) { 17702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 17712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 17722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 17732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 17742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(TypeName)) { 1775f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_ELEM_PREFIX << TypeName << " = Element." << TypeName 1776f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "(rs);\n"; 1777a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 17782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 17792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 178048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 17812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 17822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ClassName = ET->getElementName(); 17832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(ClassName)) { 1784f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_ELEM_PREFIX << ClassName << " = " << ClassName 1785f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".createElement(rs);\n"; 178648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 17872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 17882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1789a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 17902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 17912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 179248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 179348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 179448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 17952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genFieldPackerInstance(const RSExportType *ET) { 17961f6c331d622ac645ab68a016aa4c577998547373Stephen Hines switch (ET->getClass()) { 17972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 17982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 17992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 18002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 18022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet addTypeNameForFieldPacker(TypeName); 18032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 18051f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 18062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18081f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 18091f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 18101f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 18112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeCheck(const RSExportType *ET, 1812602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName) { 1813f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "// check " << VarName << "\n"; 181448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 181548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 181648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 18172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 181848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 181948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 182048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 182148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName; 182248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 182348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 18242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TypeName = ET->getElementName(); 18282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 183048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 183348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 183448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 183548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (!TypeName.empty()) { 1836f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (!" << VarName 1837f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getType().getElement().isCompatible(" RS_ELEM_PREFIX 1838f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << TypeName << ")) {\n"; 1839f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " throw new RSRuntimeException(\"Type mismatch with " 1840f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << TypeName << "!\");\n"; 1841f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 184248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 1843b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines} 1844b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 18452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrimitiveTypeExportVariable(const RSExportVar *EV) { 1846602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 1847602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && 1848602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of primitive here"); 18499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 18512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(EV->getType()); 18520d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EPT); 18530d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 18549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, EV->getName()); 18569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18575d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines if (EV->isConst()) { 1858f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "public final static " << TypeName 1859f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " " RS_EXPORT_VAR_CONST_PREFIX << VarName << " = "; 18605d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val = EV->getInit(); 1861efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet genInitValue(Val, EPT->getType() == DataTypeBoolean); 1862f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ";\n"; 18635d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines } else { 18645d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines // set_*() 18651f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // This must remain synchronized, since multiple Dalvik threads may 18661f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // be calling setters. 18672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 18682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 1869657d20afa621219c1eed72178d1325fd4409f458David Gross if ((EPT->getElementSizeInBytes() < 4) || EV->isUnsigned()) { 18701f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // We create/cache a per-type FieldPacker. This allows us to reuse the 18711f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // validation logic (for catching negative inputs from Dalvik, as well 18721f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // as inputs that are too large to be represented in the unsigned type). 1873bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // Sub-integer types are also handled specially here, so that we don't 1874bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // overwrite bytes accidentally. 18751f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string ElemName = EPT->getElementName(); 18761f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string FPName; 18771f6c331d622ac645ab68a016aa4c577998547373Stephen Hines FPName = RS_FP_PREFIX + ElemName; 1878f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << FPName << "!= null) {\n"; 1879f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.increaseIndent(); 1880f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FPName << ".reset();\n"; 1881f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.decreaseIndent(); 1882f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "} else {\n"; 1883f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.increaseIndent(); 1884657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << FPName << " = new FieldPacker(" << EPT->getElementSizeInBytes() 1885f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 1886f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.decreaseIndent(); 1887f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 18882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 18892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(EPT, "v", FPName.c_str()); 1890f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 1891f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FPName << ");\n"; 18921f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 1893f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 1894f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", v);\n"; 18951f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 18969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18971f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Dalvik update comes last, since the input may be invalid (and hence 18981f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // throw an exception). 1899f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 1900462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 19029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1903462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 19052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 1906462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1907462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1908efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouilletvoid RSReflectionJava::genInitValue(const clang::APValue &Val, bool asBool) { 1909efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet switch (Val.getKind()) { 1910efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Int: { 1911efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::APInt api = Val.getInt(); 1912efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (asBool) { 1913f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ((api.getSExtValue() == 0) ? "false" : "true"); 1914efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } else { 1915efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // TODO: Handle unsigned correctly 1916f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << api.getSExtValue(); 1917efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (api.getBitWidth() > 32) { 1918f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "L"; 1919efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1920efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1921efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1922efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1923efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1924efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Float: { 1925efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::APFloat apf = Val.getFloat(); 1926efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::SmallString<30> s; 1927efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet apf.toString(s); 1928f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << s.c_str(); 1929efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { 1930efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (s.count('.') == 0) { 1931f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ".f"; 1932efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } else { 1933f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "f"; 1934efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1935efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1936efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1937efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1938efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1939efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::ComplexInt: 1940efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::ComplexFloat: 1941efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::LValue: 1942efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Vector: { 1943efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet slangAssert(false && "Primitive type cannot have such kind of initializer"); 1944efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1945efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1946efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1947efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet default: { slangAssert(false && "Unknown kind of initializer"); } 1948efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1949efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet} 1950efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 19512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPointerTypeExportVariable(const RSExportVar *EV) { 19529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 19539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 1954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19556e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 19566e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 1957462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet PointeeType = static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 19590d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 19600d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 1961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 1963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 196489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 19652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "bind_" + VarName, 1, 19662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 1967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1968f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 1969f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (v == null) bindAllocation(null, " 1970f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_VAR_INDEX_PREFIX << VarName << ");\n"; 1971462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1972f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (PointeeType->getClass() == RSExportType::ExportClassRecord) { 1973f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "else bindAllocation(v.getAllocation(), " 1974f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_VAR_INDEX_PREFIX << VarName << ");\n"; 1975f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 1976f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "else bindAllocation(v, " << RS_EXPORT_VAR_INDEX_PREFIX 1977f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ");\n"; 1978f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 1979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 1983462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genVectorTypeExportVariable(const RSExportVar *EV) { 19866e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 19876e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 19889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19890d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 19900d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 19919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 1993657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, 1); 19942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 19952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 1996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genMatrixTypeExportVariable(const RSExportVar *EV) { 19996e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 20006e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 200192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ET = EV->getType(); 20030d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 20040d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 200592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 200792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 200892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 200992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 20100d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 20112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 20122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2013f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 201492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 20162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 2017f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 2018f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << FieldPackerName << ");\n"; 201992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 202192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 202292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 202592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 202692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 2027602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 20282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genConstantArrayTypeExportVariable(const RSExportVar *EV) { 2029657d20afa621219c1eed72178d1325fd4409f458David Gross const RSExportType *const ET = EV->getType(); 2030602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 2031657d20afa621219c1eed72178d1325fd4409f458David Gross (ET->getClass() == RSExportType::ExportClassConstantArray) && 2032602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of constant array here"); 20332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20340d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20350d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2038657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, static_cast<const RSExportConstantArrayType *>(ET)->getNumElement()); 20392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 20412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 20422e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genRecordTypeExportVariable(const RSExportVar *EV) { 20446e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 20456e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 20469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20470d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20480d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2051657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, 1); 20522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 20540d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 20550d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines 20562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrivateExportVariable(const std::string &TypeName, 2057602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 2058f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private " << TypeName << " " << RS_EXPORT_VAR_PREFIX 2059f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ";\n"; 20600d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 20619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2062657d20afa621219c1eed72178d1325fd4409f458David Gross// Dimension = array element count; otherwise, 1. 20632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genSetExportVariable(const std::string &TypeName, 2064657d20afa621219c1eed72178d1325fd4409f458David Gross const RSExportVar *EV, 2065657d20afa621219c1eed72178d1325fd4409f458David Gross unsigned Dimension) { 20669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 20670d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 20680d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20690d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const RSExportType *ET = EV->getType(); 20702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 20712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2072f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 20739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 20752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 2076a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 2077a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) { 2078a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // Legacy apps must use the old setVar() without Element/dim components. 2079f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 2080f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ");\n"; 2081a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } else { 2082a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // We only have support for one-dimensional array reflection today, 2083a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // but the entry point (i.e. setVar()) takes an array of dimensions. 2084f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int []__dimArr = new int[1];\n"; 2085657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << "__dimArr[0] = " << Dimension << ";\n"; 2086f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 2087f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ", " << RS_ELEM_PREFIX 2088f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ET->getElementName() << ", __dimArr);\n"; 2089a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 20901ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 20912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 20929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 20939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2094462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetExportVariable(const std::string &TypeName, 2096602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 20972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 2098462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2099f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " << RS_EXPORT_VAR_PREFIX << VarName << ";\n"; 2100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 210228d60bc2da19821af82d983902c3c78c078343c3Stephen Hines} 210328d60bc2da19821af82d983902c3c78c078343c3Stephen Hines 21042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetFieldID(const std::string &VarName) { 210528d60bc2da19821af82d983902c3c78c078343c3Stephen Hines // We only generate getFieldID_*() for non-Pointer (bind) types. 2106b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 21072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "Script.FieldID", "getFieldID_" + VarName, 21082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 0); 2109b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 2110f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return createFieldID(" << RS_EXPORT_VAR_INDEX_PREFIX 2111f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ", null);\n"; 2112b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 21132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2114b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 21159c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 21169c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 21179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 21189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genCreateFieldPacker(const RSExportType *ET, 2120602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 2121c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t AllocSize = ET->getAllocSize(); 21229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 2123f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 2124f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << AllocSize << ");\n"; 21259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 21269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 21279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 21289c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 21299c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 21302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPackVarOfType(const RSExportType *ET, 2131602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName, 2132602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 21339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 21342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 21352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 2136f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << "." 2137f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << GetPackerAPIName( 2138f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET)) << "(" 2139f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ");\n"; 21402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 21412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 21422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 21432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Must reflect as type Allocation in Java 21442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 21452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 21462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 2147f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) { 2148f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addI32(" << VarName 2149f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getPtr());\n"; 2150f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2151f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addI32(" << VarName 2152f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getAllocation().getPtr());\n"; 2153f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 21542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 21552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 21562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 2157f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addMatrix(" << VarName << ");\n"; 21582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 21592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 21602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 21612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 21622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 21632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 21642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): more elegant way. Currently, we obtain the unique index 21652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // variable (this method involves recursive call which means 21662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we may have more than one level loop, therefore we can't 21672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // always use the same index variable name here) name given 21682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // in the for-loop from counting the '.' in @VarName. 21692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Level = 0; 21702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t LastDotPos = 0; 21712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 21722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 21732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet while (LastDotPos != std::string::npos) { 21742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 21752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Level++; 21762e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 21772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string IndexVarName("ct"); 21782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet IndexVarName.append(llvm::utostr_32(Level)); 2179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2180f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "for (int " << IndexVarName << " = 0; " << IndexVarName 2181657d20afa621219c1eed72178d1325fd4409f458David Gross << " < " << ECAT->getNumElement() << "; " << IndexVarName << "++)"; 2182f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[" + IndexVarName + "]"); 21852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ECAT->getElementType(), ElementVarName.c_str(), 21862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldPackerName); 2187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2188f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 21892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 21902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 21912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 21922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType *ERT = static_cast<const RSExportRecordType *>(ET); 21932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Relative pos from now on in field packer 21942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Pos = 0; 21952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 21962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 21972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 21982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 21992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType::Field *F = *I; 22002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string FieldName; 22012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldOffset = F->getOffsetInParent(); 22022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *T = F->getType(); 22032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldStoreSize = T->getStoreSize(); 22042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldAllocSize = T->getAllocSize(); 22052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22065abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (VarName != nullptr) 22072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = VarName + ("." + F->getName()); 22082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 22092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = F->getName(); 2210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2211f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldOffset > Pos) { 2212f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) 2213f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2214f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), FieldName.c_str(), FieldPackerName); 2217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There is padding in the field type 2219f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldAllocSize > FieldStoreSize) { 2220f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" 2221f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << (FieldAllocSize - FieldStoreSize) << ");\n"; 2222f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Pos = FieldOffset + FieldAllocSize; 2225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 22262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There maybe some padding after the struct 2228f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (ERT->getAllocSize() > Pos) { 2229f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" << ERT->getAllocSize() - Pos 2230f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2231f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 22359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 22369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2237462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genAllocateVarOfType(const RSExportType *T, 2239602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 22402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 22412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 22422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type like int in Java has its own storage once it's declared. 22432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // 22442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // FIXME: Should we allocate storage for RS object? 22452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 2246f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 22472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 22502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Pointer type is an instance of Allocation or a TypeClass whose value is 22512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expected to be assigned by programmer later in Java program. Therefore 22522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we don't reflect things like [VarName] = new Allocation(); 2253f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = null;\n"; 22542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 22572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 22582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(T); 22592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ElementType = ECAT->getElementType(); 22602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 2261f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = new " << GetTypeName(ElementType) << "[" 2262657d20afa621219c1eed72178d1325fd4409f458David Gross << ECAT->getNumElement() << "];\n"; 22632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type element doesn't need allocation code. 22652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 2266657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << "for (int $ct = 0; $ct < " << ECAT->getNumElement() 2267f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "; $ct++)"; 2268f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 22692e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 22702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 22712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[$ct]"); 22722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(ElementType, ElementVarName); 22732e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 2274f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 22752e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 22762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 22792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 22802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 2281f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 22822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22842e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 22852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 22862e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 22872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferIfNull(const char *Index) { 2288f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME " == null) "; 2289f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_NAME << " = new " << RS_TYPE_ITEM_CLASS_NAME 2290f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "[getType().getX() /* count */];\n"; 22915abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (Index != nullptr) { 2292f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME << "[" << Index 2293f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "] == null) "; 2294f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_NAME << "[" << Index << "] = new " 2295f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_CLASS_NAME << "();\n"; 2296f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferPackerIfNull() { 2300f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " == null) "; 2301f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = new FieldPacker(" 23023a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << " * getType().getX()/* count */);\n"; 2303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 23062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genTypeClass(const RSExportRecordType *ERT, 2307602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 2308a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines std::string ClassName = ERT->getElementName(); 23092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string superClassName = getRSPackageName(); 2310f69e1e58cf65555c4be3f6c5c53f89eb044f1db5Tim Murray superClassName += RS_TYPE_CLASS_SUPER_CLASS_NAME; 23119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!startClass(AM_Public, false, ClassName, superClassName.c_str(), 23132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg)) 23149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 23159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23164cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 23174cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 23182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeItemClass(ERT); 23199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 2321f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private " << RS_TYPE_ITEM_CLASS_NAME << " " 2322f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_BUFFER_NAME << "[];\n"; 2323f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private FieldPacker " << RS_TYPE_ITEM_BUFFER_PACKER_NAME 2324f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 2325f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private static java.lang.ref.WeakReference<Element> " 2326f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ELEMENT_REF_NAME 2327f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " = new java.lang.ref.WeakReference<Element>(null);\n"; 23282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 23292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassConstructor(ERT); 23302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArrayLocal(ERT); 23312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArray(ERT); 23322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemSetter(ERT); 23332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemGetter(ERT); 23342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentSetter(ERT); 23352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentGetter(ERT); 23362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyAll(ERT); 233782754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines if (!mRSContext->isCompatLib()) { 233882754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines // Skip the resize method if we are targeting a compatibility library. 23392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassResize(); 234082754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines } 23419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endClass(); 23439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet resetFieldIndex(); 23452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet clearFieldIndexMap(); 234666aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 23479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 23489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeItemClass(const RSExportRecordType *ERT) { 2351f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "static public class " RS_TYPE_ITEM_CLASS_NAME; 2352f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 23539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23543a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray // Sizeof should not be exposed for 64-bit; it is not accurate 23553a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray if (mRSContext->getTargetAPI() < 21) { 23563a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mOut.indent() << "public static final int sizeof = " << ERT->getAllocSize() 23573a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << ";\n"; 23583a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray } 23599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 2361f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 23629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 23632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 23642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 2365f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 2366f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 23679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 23689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 2370f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 2371f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_CLASS_NAME << "()"; 2372f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 23739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 23752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 23762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 23779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 23782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(F->getType(), F->getName()); 23799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 23809e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 23819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 2382f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 2385f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2386462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassConstructor(const RSExportRecordType *ERT) { 23899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 23909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Element", "createElement", 1, "RenderScript", 23922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 2393381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2394e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // TODO(all): Fix weak-refs + multi-context issue. 2395f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "Element e = " << RS_TYPE_ELEMENT_REF_NAME 23962968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << ".get();\n"; 2397f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "if (e != null) return e;\n"; 2398c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder("eb", ERT, RenderScriptVar, &mOut, 2399c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRSContext, this); 2400c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 2401c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2402f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return eb.create();\n"; 2403f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "e = eb.create();\n"; 2404f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << RS_TYPE_ELEMENT_REF_NAME 24052968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << " = new java.lang.ref.WeakReference<Element>(e);\n"; 2406f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "return e;\n"; 24072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 24089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2409381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // private with element 24105abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Private, false, nullptr, getClassName(), 1, "RenderScript", 24112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 2412f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2413f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2414f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 24152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2416381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2417381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D without usage 24185abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 2, "RenderScript", 24192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count"); 24209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2421f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2422f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2423f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 24249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 2425f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "init(" << RenderScriptVar << ", count);\n"; 24262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 24279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2428381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D with usage 24295abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 3, "RenderScript", 24302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count", "int", "usages"); 243191fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 2432f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2433f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2434f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 243591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 2436f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "init(" << RenderScriptVar << ", count, usages);\n"; 24372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 243891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 2439381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D with usage 24402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 3, 24412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", 24422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 2443f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2444f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2445f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createSized(" 2446f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "rs, obj.mElement, dimX, usages);\n"; 2447f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 24482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2449381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2450381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D without usage 24512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 2, 24522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX"); 2453f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return create1D(" << RenderScriptVar 2454f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", dimX, Allocation.USAGE_SCRIPT);\n"; 24552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2456381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2457381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D without usage 24582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 3, 24592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY"); 2460f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return create2D(" << RenderScriptVar 2461f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", dimX, dimY, Allocation.USAGE_SCRIPT);\n"; 24622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2463381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2464381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D with usage 24652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 4, 24662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY", 24672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "usages"); 24682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 2469f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2470f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2471f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type.Builder b = new Type.Builder(rs, obj.mElement);\n"; 2472f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "b.setX(dimX);\n"; 2473f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "b.setY(dimY);\n"; 2474f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type t = b.create();\n"; 2475f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 2476f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 24772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2478381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2479381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createTypeBuilder 24802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Type.Builder", "createTypeBuilder", 1, 24812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar); 2482f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Element e = createElement(" << RenderScriptVar << ");\n"; 2483f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return new Type.Builder(rs, e);\n"; 24842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2485381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2486381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createCustom with usage 24872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "createCustom", 3, 24882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "Type.Builder", "tb", "int", 24892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 2490f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2491f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2492f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type t = tb.create();\n"; 2493f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (t.getElement() != obj.mElement) {\n"; 2494f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " throw new RSIllegalArgumentException(" 2495f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "\"Type.Builder did not match expected element type.\");\n"; 2496f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 2497f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 2498f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 24992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2501462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyToArray(const RSExportRecordType *ERT) { 25032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArray", 2, 25042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index"); 25059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 2507f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 25083a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << ");\n"; 25099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2510f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArrayLocal(i, " RS_TYPE_ITEM_BUFFER_PACKER_NAME 2511f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet ");\n"; 251238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 25132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 251438eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk} 251538eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 2516602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 25172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassCopyToArrayLocal(const RSExportRecordType *ERT) { 25182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArrayLocal", 2, 25192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "FieldPacker", "fp"); 252038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 25212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ERT, "i", "fp"); 25229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2525462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemSetter(const RSExportRecordType *ERT) { 25272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set", 3, 25282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index", "boolean", 25292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "copyNow"); 25305abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes genNewItemBufferIfNull(nullptr); 2531f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << "[index] = i;\n"; 25329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2533f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (copyNow) "; 2534f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 25359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2536f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArray(i, index);\n"; 25373a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mOut.indent() << "FieldPacker fp = new FieldPacker(" << mItemSizeof << ");\n"; 2538f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArrayLocal(i, fp);\n"; 2539f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(index, fp);\n"; 25409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 2542f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 25439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2546462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemGetter(const RSExportRecordType *ERT) { 25482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, RS_TYPE_ITEM_CLASS_NAME, "get", 1, 25492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 2550f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME 2551f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " == null) return null;\n"; 2552f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " << RS_TYPE_ITEM_BUFFER_NAME << "[index];\n"; 25532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2554462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2555462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2556602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 25572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentSetter(const RSExportRecordType *ERT) { 25589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 2559602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 2560602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 25619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 25629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 2563c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t FieldStoreSize = F->getType()->getStoreSize(); 25642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet unsigned FieldIndex = getFieldIndex(F); 25659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + F->getName(), 25672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 3, "int", "index", GetTypeName(F->getType()).c_str(), "v", 25682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "boolean", "copyNow"); 25692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 25702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferIfNull("index"); 2571f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << "[index]." << F->getName() 2572f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " = v;\n"; 2573462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2574f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (copyNow) "; 2575f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 25762dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 2577f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldOffset > 0) { 2578f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 25793a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << " + " << FieldOffset 2580f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2581f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2582f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 25833a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << ");\n"; 2584f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 25852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 2586462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2587f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize 2588f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 25892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", "fp"); 2590f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 2591f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", fp);\n"; 2592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 2594f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2595462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 25989c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 25999c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 2600602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 26012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentGetter(const RSExportRecordType *ERT) { 26029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 2603602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 2604602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 26059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 26062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, 26072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet GetTypeName(F->getType()).c_str(), "get_" + F->getName(), 1, 26082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 2609f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME << " == null) return " 2610f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << GetTypeNullValue(F->getType()) << ";\n"; 2611f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " RS_TYPE_ITEM_BUFFER_NAME << "[index]." 2612f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << F->getName() << ";\n"; 26132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 26149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 26159c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 26169b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 26172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyAll(const RSExportRecordType *ERT) { 26182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "copyAll", 0); 2619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2620f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "for (int ct = 0; ct < " << RS_TYPE_ITEM_BUFFER_NAME 2621f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".length; ct++)" 2622f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " copyToArray(" << RS_TYPE_ITEM_BUFFER_NAME 2623f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "[ct], ct);\n"; 2624f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(0, " 2625f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_BUFFER_PACKER_NAME ");\n"; 2626462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2628462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2629462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassResize() { 26312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "resize", 1, "int", 26322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "newSize"); 26332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 2634f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (mItemArray != null) "; 2635f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2636f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int oldSize = mItemArray.length;\n"; 2637f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int copySize = Math.min(oldSize, newSize);\n"; 2638f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (newSize == oldSize) return;\n"; 2639f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Item ni[] = new Item[newSize];\n"; 2640f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);\n"; 2641f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mItemArray = ni;\n"; 2642f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2643f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.resize(newSize);\n"; 2644f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet 2645f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 2646f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet " != null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 26473a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray "new FieldPacker(" << mItemSizeof << " * getType().getX()/* count */);\n"; 26482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 26492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2650d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 2651d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 26529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 2653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 2655c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2656c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc BrouilletRSReflectionJavaElementBuilder::RSReflectionJavaElementBuilder( 2657c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *ElementBuilderName, const RSExportRecordType *ERT, 2658c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *RenderScriptVar, GeneratedFile *Out, const RSContext *RSContext, 2659c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJava *Reflection) 2660c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet : mElementBuilderName(ElementBuilderName), mERT(ERT), 2661c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar(RenderScriptVar), mOut(Out), mPaddingFieldIndex(1), 2662c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRSContext(RSContext), mReflection(Reflection) { 2663c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 2664c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mPaddingPrefix = "#padding_"; 2665c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } else { 2666c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mPaddingPrefix = "#rs_padding_"; 2667c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2668c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2669c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2670c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::generate() { 2671c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mOut->indent() << "Element.Builder " << mElementBuilderName 2672c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << " = new Element.Builder(" << mRenderScriptVar << ");\n"; 2673c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddElement(mERT, "", /* ArraySize = */ 0); 2674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2675462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2676c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddElement(const RSExportType *ET, 2677c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const std::string &VarName, 2678c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize) { 267947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines std::string ElementConstruct = GetBuiltinElementConstruct(ET); 26809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 268147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (ElementConstruct != "") { 2682c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2683c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ElementConstruct << "(" << mRenderScriptVar << ")"; 2684c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 26859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2686c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2687c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet switch (ET->getClass()) { 2688c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 26899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 26902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 269147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines const char *DataTypeName = 269247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines RSExportPrimitiveType::getRSReflectionType(EPT)->rs_type; 2693c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2694c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.createUser(" << mRenderScriptVar 2695c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << ", Element.DataType." << DataTypeName << ")"; 2696c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 2697c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2698c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2699c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassVector: { 2700c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const RSExportVectorType *EVT = 2701c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportVectorType *>(ET); 2702c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *DataTypeName = 2703c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSExportPrimitiveType::getRSReflectionType(EVT)->rs_type; 2704c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2705c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.createVector(" << mRenderScriptVar 2706c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << ", Element.DataType." << DataTypeName << ", " 2707c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << EVT->getNumElement() << ")"; 2708c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 2709c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2710c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2711c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassPointer: 27129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 27139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 27146e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 2715c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2716c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassMatrix: 271792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 271892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 27196e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 2720c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2721c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 27222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 27232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 27242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 272589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 272689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 2727657d20afa621219c1eed72178d1325fd4409f458David Gross genAddElement(ECAT->getElementType(), VarName, ECAT->getNumElement()); 272889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 2729c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string NewElementBuilderName(mElementBuilderName); 273089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 273189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2732c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder( 2733c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet NewElementBuilderName.c_str(), 2734c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportRecordType *>(ElementType), 2735c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar, mOut, mRSContext, mReflection); 2736c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 2737c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2738657d20afa621219c1eed72178d1325fd4409f458David Gross ArraySize = ECAT->getNumElement(); 2739c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2740c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << NewElementBuilderName << ".create()"; 2741c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 274289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 2743c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2744c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2745c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassRecord: { 27469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 27479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 27486315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 27496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 27509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 27512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 27522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Pos = 0; // relative pos from now on 27539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 27549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 27552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 27562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 27579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 27589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 2759c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet const RSExportType *T = F->getType(); 2760c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldStoreSize = T->getStoreSize(); 2761c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldAllocSize = T->getAllocSize(); 27629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2763c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string FieldName; 27649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 27659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 27669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 27679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 27689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 27699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 2770c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(FieldOffset - Pos); 27719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 27729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 2773c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mReflection->addFieldIndexMapping(F); 277489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 2775c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddElement(F->getType(), FieldName, 0); 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 *>(F->getType()), 2783c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar, mOut, mRSContext, mReflection); 2784c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 278589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2786c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2787c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << NewElementBuilderName << ".create()"; 2788c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(FieldName, ArraySize); 278989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 27909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2791a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 2792a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // There is padding within the field type. This is only necessary 2793a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // for HC-targeted APIs. 2794c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(FieldAllocSize - FieldStoreSize); 2795a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 27969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 27979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 27989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2799bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 28009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 2801c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t RecordAllocSize = ERT->getAllocSize(); 28020a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 2803c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(RecordAllocSize - Pos); 2804c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2805c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2806c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet default: 28076e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 2808c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2809b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 28109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2811462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2812462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2813c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddPadding(int PaddingSize) { 28149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 28152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &VarName = createPaddingField(); 2816c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 28179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 2818c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U32(" << mRenderScriptVar << ")"; 28199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 28209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 2821c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U16(" << mRenderScriptVar << ")"; 28229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 28239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 2824c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U8(" << mRenderScriptVar << ")"; 28259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 2826462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 2827c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, 0); 28289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2829462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2830462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2831c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddStatementStart() { 2832c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mOut->indent() << mElementBuilderName << ".add("; 2833c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2834c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2835c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid 2836c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc BrouilletRSReflectionJavaElementBuilder::genAddStatementEnd(const std::string &VarName, 2837c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize) { 2838c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ", \"" << VarName << "\""; 2839c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (ArraySize > 0) { 2840c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ", " << ArraySize; 2841c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2842c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ");\n"; 2843c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // TODO Review incFieldIndex. It's probably better to assign the numbers at 2844c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // the start rather 2845c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // than as we're generating the code. 2846c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mReflection->incFieldIndex(); 2847c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2848c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 28499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 2850462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 285159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouilletbool RSReflectionJava::reflect() { 285259f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::string ErrorMsg; 285359f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!genScriptClass(mScriptClassName, ErrorMsg)) { 285459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::cerr << "Failed to generate class " << mScriptClassName << " (" 28552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ErrorMsg << ")\n"; 28562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 28572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet } 28589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 285959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mGeneratedFileNames->push_back(mScriptClassName); 28609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // class ScriptField_<TypeName> 28622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (RSContext::const_export_type_iterator 28632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI = mRSContext->export_types_begin(), 28642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TE = mRSContext->export_types_end(); 28652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI != TE; TI++) { 28662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportType *ET = TI->getValue(); 28672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 28682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (ET->getClass() == RSExportType::ExportClassRecord) { 28692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportRecordType *ERT = 28702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 28712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 28722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!ERT->isArtificial() && !genTypeClass(ERT, ErrorMsg)) { 28732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::cerr << "Failed to generate type class for struct '" 28742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ERT->getName() << "' (" << ErrorMsg << ")\n"; 28752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 28769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2877462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 28789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 28809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2881462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2882462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 28832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletconst char *RSReflectionJava::AccessModifierStr(AccessModifier AM) { 28849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 28852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Public: 28862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public"; 28872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 28882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Protected: 28892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "protected"; 28902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 28912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Private: 28922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "private"; 28932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 28942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_PublicSynchronized: 28952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public synchronized"; 28962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 28972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 28982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ""; 28992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::startClass(AccessModifier AM, bool IsStatic, 29042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &ClassName, 29052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *SuperClassName, 29062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string &ErrorMsg) { 29078c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 2908f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet std::string FileName = ClassName + ".java"; 290959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!mOut.startFile(mOutputDirectory, FileName, mRSSourceFileName, 2910fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mRSContext->getLicenseNote(), true, 2911fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mRSContext->getVerbose())) { 29128c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 2913f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 29149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 2916f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (!mPackageName.empty()) { 2917f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "package " << mPackageName << ";\n"; 2918f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2919f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 29209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 2922f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import " << mRSPackageName << ".*;\n"; 292344d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines if (getEmbedBitcodeInJava()) { 2924f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import " << mPackageName << "." 292544d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines << RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 292659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSSourceFileName.c_str()) << ";\n"; 292744d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } else { 2928f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import android.content.res.Resources;\n"; 292944d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 2930f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 29319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 29339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 2934f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "/**\n"; 2935f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " * @hide\n"; 2936f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " */\n"; 29379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2938f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 2939f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ClassName; 29405abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (SuperClassName != nullptr) 2941f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " extends " << SuperClassName; 29429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2943f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 29449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 29469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endClass() { 2951f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2952f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.closeFile(); 29539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 2954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startTypeClass(const std::string &ClassName) { 2957f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "public static class " << ClassName; 2958f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2959462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2960462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2961f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouilletvoid RSReflectionJava::endTypeClass() { mOut.endBlock(); } 2962462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 29642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 29652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, int Argc, 29662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ...) { 29679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 29689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 29699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 2970462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29716315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 29722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgType = va_arg(vl, const char *); 29732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgName = va_arg(vl, const char *); 2974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29756315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 29769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 29779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 2978462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 2980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 29832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 29842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, 29852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const ArgTy &Args) { 2986f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 2987f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ((ReturnType) ? ReturnType : "") << " " << FunctionName 2988f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "("; 29899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 29912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); I != E; I++) { 29929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 2993f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", "; 29949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 29959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 2996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2997f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << I->first << " " << I->second; 29989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3000f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ")"; 3001f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 3002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3004f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouilletvoid RSReflectionJava::endFunction() { mOut.endBlock(); } 3005e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 30062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForElement(const std::string &TypeName) { 30071f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mTypesToCheck.find(TypeName) == mTypesToCheck.end()) { 30081f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mTypesToCheck.insert(TypeName); 30091f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 30101f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 30111f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 30121f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 30131f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 30141f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 30152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForFieldPacker(const std::string &TypeName) { 30161f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mFieldPackerTypes.find(TypeName) == mFieldPackerTypes.end()) { 30171f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mFieldPackerTypes.insert(TypeName); 30181f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 30191f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 30201f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 30211f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 30221f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 30231f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 30242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang 3025