slang_rs_reflection.cpp revision 2b377908d8bd15fabc370547f2cc55ffc58bafd4
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[] = { 1392a7ec01e812624ff7685d7de5528e8fc1a4acc9ePirama Arumuga Nainar "addI16", // 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)) { 1369991096ff0ab7d2dc124994c0a40290212de349bdDavid Gross slangAssert(false); 1370277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1371277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1372277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ResultTypeName = GetReduceNewResultTypeName(ER); 1373277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1374277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Analysis of inputs. Returns early if some input type is not 1375277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // suitable for array method reflection. 1376277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<RSReflectionTypeData, 1> InsTypeData; 1377277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArgTy Args; 1378277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &Ins = ER->getAccumulatorIns(); 1379277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &InTypes = ER->getAccumulatorInTypes(); 1380277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InTypes.size()); 1381277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InsTypeData.resize(Ins.size()); 1382277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<std::string, 1> InComments; 1383277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1384277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *const InType = InTypes[InIdx]; 1385277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (InType->getClass()) { 1386277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassMatrix: 1387277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPrimitive: 1388277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassVector: 1389277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Ok 1390277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross break; 1391277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1392277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassConstantArray: 1393277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // No 1394277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1395277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1396277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassPointer: 1397277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Should not get here with pointer type"); 1398277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1399277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1400277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case RSExportType::ExportClassRecord: 1401277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: convertToRTD() cannot handle this. Why not? 1402277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1403277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1404277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1405277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown export class"); 1406277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1407277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1408277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1409277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData &InTypeData = InsTypeData[InIdx]; 1410277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InType->convertToRTD(&InTypeData); 1411277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!InTypeData.type->java_name || !InTypeData.type->java_array_element_name || 1412277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross (InTypeData.vecSize > 1 && !InTypeData.type->rs_java_vector_prefix)) { 1413277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1414277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1415277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1416277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputParamName, InputComment; 1417277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross getReduceNewInputStrings(InputParamName, InputComment, "in", MappingCommentWithoutType, ER, InIdx); 1418277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InTypeData.vecSize > 1) 1419277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputComment += (", flattened " + std::to_string(InTypeData.vecSize) + "-vectors"); 1420277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InComments.push_back(InputComment); 1421277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1422277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string InputTypeName = std::string(InTypeData.type->java_array_element_name) + "[]"; 1423277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair(InputTypeName, InputParamName)); 1424277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1425277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1426277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string MethodName = "reduce_" + ER->getNameReduce(); 1427277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1428277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(<devecSiIn1Type>[] in1, ..., <devecSiInNType>[] inN) 1429277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1430277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1431277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1432277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1433277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InTypes.size()); 1434277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == InsTypeData.size()); 1435277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(Ins.size() == Args.size()); 14361381ae7c081ab151e78184501f757f517fe6c2a9David Gross std::string In1Length; 14371381ae7c081ab151e78184501f757f517fe6c2a9David Gross std::string InputAllocationOutgoingArgumentList; 14382b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross std::vector<std::string> InputAllocationNames; 1439277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1440277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArgName = Args[InIdx].second; 1441277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genNullArrayCheck(ArgName); 1442277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InLength = ArgName + ".length"; 1443277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const uint32_t VecSize = InsTypeData[InIdx].vecSize; 1444277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (VecSize > 1) { 1445277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InLength += " / " + std::to_string(VecSize); 1446277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genVectorLengthCompatibilityCheck(ArgName, VecSize); 1447277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1448277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx == 0) { 14491381ae7c081ab151e78184501f757f517fe6c2a9David Gross In1Length = InLength; 1450277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1451277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// Verify that input array lengths are the same.\n"; 14521381ae7c081ab151e78184501f757f517fe6c2a9David Gross mOut.indent() << "if (" << In1Length << " != " << InLength << ") {\n"; 1453277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << " throw new RSRuntimeException(\"Array length mismatch " 1454277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "between parameters \\\"" << Args[0].second << "\\\" and \\\"" << ArgName 1455277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "\\\"!\");\n"; 1456277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "}\n"; 1457277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1458277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Create a temporary input allocation 1459277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string TempName = "a" + ArgName; 1460277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Allocation " << TempName << " = Allocation.createSized(" 1461277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << SAVED_RS_REFERENCE << ", " 1462277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << RS_ELEM_PREFIX << InTypes[InIdx]->getElementName() << ", " 14631381ae7c081ab151e78184501f757f517fe6c2a9David Gross << InLength << ");\n"; 1464277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << TempName << ".setAutoPadding(true);\n"; 14651381ae7c081ab151e78184501f757f517fe6c2a9David Gross mOut.indent() << TempName << ".copyFrom(" << ArgName << ");\n"; 1466277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // ... and put that input allocation on the outgoing argument list 1467277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!InputAllocationOutgoingArgumentList.empty()) 1468277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputAllocationOutgoingArgumentList += ", "; 1469277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InputAllocationOutgoingArgumentList += TempName; 14702b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // ... and keep track of it for setting result.mTempIns 14712b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross InputAllocationNames.push_back(TempName); 1472277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 14731381ae7c081ab151e78184501f757f517fe6c2a9David Gross 1474277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "\n"; 14752b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << ResultTypeName << " result = " << MethodName << "(" << InputAllocationOutgoingArgumentList << ", null);\n"; 14762b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross if (!InputAllocationNames.empty()) { 14772b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "result.mTempIns = new Allocation[]{"; 14782b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross bool EmittedFirst = false; 14792b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross for (const std::string &InputAllocationName : InputAllocationNames) { 14802b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross if (!EmittedFirst) { 14812b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross EmittedFirst = true; 14822b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross } else { 14832b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut << ", "; 14842b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross } 14852b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut << InputAllocationName; 14862b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross } 14872b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut << "};\n"; 14882b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross } 14892b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "return result;\n"; 1490277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1491277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1492277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1493277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewAllocationVariant(const RSExportReduceNew *ER) { 1494277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &Ins = ER->getAccumulatorIns(); 1495277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const auto &InTypes = ER->getAccumulatorInTypes(); 1496277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const RSExportType *ResultType = ER->getResultType(); 1497277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1498277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross llvm::SmallVector<std::string, 1> InComments; 1499277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArgTy Args; 1500277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1501277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string InputParamName, InputComment; 1502277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross getReduceNewInputStrings(InputParamName, InputComment, "ain", MappingCommentWithCType, ER, InIdx); 1503277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross InComments.push_back(InputComment); 1504277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("Allocation", InputParamName)); 1505277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1506277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1507277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string MethodName = "reduce_" + ER->getNameReduce(); 1508277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ResultTypeName = GetReduceNewResultTypeName(ER); 1509277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1510277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN) 1511277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1512277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1513277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1514277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1515277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return " << MethodName << "("; 1516277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross bool EmittedFirstArg = false; 1517277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const auto &Arg : Args) { 1518277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!EmittedFirstArg) { 1519277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross EmittedFirstArg = true; 1520277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1521277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", "; 1522277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1523277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << Arg.second; 1524277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1525277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", null);\n"; 1526277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1527277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1528277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result_<resultSvType> reduce_<name>(Allocation in1, ..., Allocation inN, Script.LaunchOptions sc) 1529277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1530277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross static const char FormalOptionsName[] = "sc"; 1531277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Args.push_back(std::make_pair("Script.LaunchOptions", FormalOptionsName)); 1532277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (const std::string &InComment : InComments) 1533277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// " << InComment << "\n"; 1534277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Public, false, ResultTypeName.c_str(), MethodName, Args); 1535277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &In0Name = Args[0].second; 1536277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Sanity-check inputs 1537277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (Ins.size() > 1) 1538277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Type t0, t1;\n"; 1539277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 0, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) { 1540277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &InName = Args[InIdx].second; 1541277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genTypeCheck(InTypes[InIdx], InName.c_str()); 1542277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx > 0) 1543277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genPairwiseDimCheck(In0Name.c_str(), InName.c_str()); 1544277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1545277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Create a temporary output allocation 1546277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char OutputAllocName[] = "aout"; 1547277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const size_t OutputAllocLength = 1548277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->getClass() == RSExportType::ExportClassConstantArray 1549277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ? static_cast<const RSExportConstantArrayType *>(ResultType)->getNumElement() 1550277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross : 1; 1551277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "Allocation " << OutputAllocName << " = Allocation.createSized(" 1552277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << SAVED_RS_REFERENCE << ", " 1553277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << RS_ELEM_PREFIX << ResultType->getElementName() << ", " 1554277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << OutputAllocLength << ");\n"; 1555277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << OutputAllocName << ".setAutoPadding(true);\n"; 1556277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // Call the underlying reduce entry point 1557277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "reduce(" << RS_EXPORT_REDUCE_NEW_INDEX_PREFIX << ER->getNameReduce() 1558277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ", new Allocation[]{" << In0Name; 1559277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (size_t InIdx = 1, InEnd = Ins.size(); InIdx < InEnd; ++InIdx) 1560277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << ", " << Args[InIdx].second; 1561277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut << "}, " << OutputAllocName << ", " << FormalOptionsName << ");\n"; 1562277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "return new " << ResultTypeName << "(" << OutputAllocName << ");\n"; 1563277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 1564277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1565277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1566277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossnamespace { 1567277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1568277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// When we've copied the Allocation to a Java array, how do we 1569277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// further process the elements of that array? 1570277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossenum MapFromAllocation { 1571277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationTrivial, // no further processing 1572277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationPositive, // need to ensure elements are positive (range check) 1573277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationBoolean, // need to convert elements from byte to boolean 1574277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocationPromote // need to zero extend elements 1575277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross}; 1576277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1577277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Return Java expression that maps from an Allocation element to a Java non-vector result. 1578277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1579277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MFA = mapping kind 1580277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ArrayElementTypeName = type of InVal (having been copied out of Allocation to Java array) 1581277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ReflectedScalarTypeName = type of mapped value 1582277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InVal = input value that must be mapped 1583277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1584277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string genReduceNewResultMapping(MapFromAllocation MFA, 1585277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArrayElementTypeName, 1586277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ReflectedScalarTypeName, 1587277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char *InVal) { 1588277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross switch (MFA) { 1589277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross default: 1590277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross slangAssert(!"Unknown MapFromAllocation"); 1591277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // and fall through 1592277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationPositive: // range checking must be done separately 1593277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationTrivial: 1594277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return InVal; 1595277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationBoolean: 1596277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return std::string(InVal) + std::string(" != 0"); 1597277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross case MapFromAllocationPromote: 1598277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return ZeroExtendValue(InVal, 1599277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, 1600277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ReflectedScalarTypeName); 1601277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1602277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1603277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1604277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// Return Java expression that maps from an Allocation element to a Java vector result. 1605277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1606277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// MFA = mapping kind 1607277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ArrayElementTypeName = type of InVal (having been copied out of Allocation to Java array) 1608277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// ReflectedScalarTypeName = type of mapped value 1609277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// VectorTypeName = type of vector 1610277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// VectorElementCount = number of elements in the vector 1611277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InArray = input array containing vector elements 1612277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// InIdx = index of first vector element within InArray (or nullptr, if 0) 1613277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross// 1614277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossstd::string genReduceNewResultVectorMapping(MapFromAllocation MFA, 1615277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ArrayElementTypeName, 1616277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &ReflectedScalarTypeName, 1617277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string &VectorTypeName, 1618277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross unsigned VectorElementCount, 1619277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const char *InArray, const char *InIdx = nullptr) { 1620277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string result = "new " + VectorTypeName + "("; 1621277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross for (unsigned VectorElementIdx = 0; VectorElementIdx < VectorElementCount; ++VectorElementIdx) { 1622277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (VectorElementIdx) 1623277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += ", "; 1624277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1625277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross std::string ArrayElementName = std::string(InArray) + "["; 1626277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (InIdx) 1627277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName += std::string(InIdx) + "+"; 1628277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName += std::to_string(VectorElementIdx) + "]"; 1629277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1630277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1631277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementName.c_str()); 1632277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1633277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross result += ")"; 1634277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return result; 1635277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1636277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1637277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid genReduceNewResultRangeCheck(GeneratedFile &Out, const char *InVal) { 1638277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Out.indent() << "if (" << InVal << " < 0)\n"; 1639277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross Out.indent() << " throw new RSRuntimeException(\"Result is not representible in Java\");\n"; 1640277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1641277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1642277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} // end anonymous namespace 1643277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1644277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Grossvoid RSReflectionJava::genExportReduceNewResultType(const RSExportType *ResultType) { 1645277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (!exportableReduceNew(ResultType)) 1646277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross return; 1647277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1648277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ClassName = GetReduceNewResultTypeName(ResultType); 16492b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross const std::string GetMethodReturnTypeName = GetTypeName(ResultType); 1650277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// To obtain the result, invoke get(), which blocks\n"; 1651277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "// until the asynchronously-launched operation has completed.\n"; 1652277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "public static class " << ClassName; 1653277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 16542b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross startFunction(AM_Public, false, GetMethodReturnTypeName.c_str(), "get", 0); 1655277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1656277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross RSReflectionTypeData TypeData; 1657277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ResultType->convertToRTD(&TypeData); 1658277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1659277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string UnbracketedResultTypeName = 1660277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(ResultType, TypeNameDefault & ~TypeNameWithConstantArrayBrackets); 1661277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ReflectedScalarTypeName = TypeData.type->java_name; 1662991096ff0ab7d2dc124994c0a40290212de349bdDavid Gross // Note: MATRIX* types do not have a java_array_element_name 1663277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const std::string ArrayElementTypeName = 1664277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross TypeData.type->java_array_element_name 1665277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ? std::string(TypeData.type->java_array_element_name) 1666277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross : ReflectedScalarTypeName; 1667277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1668277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MapFromAllocation MFA = MapFromAllocationTrivial; 1669277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (std::string(TypeData.type->rs_type) == "UNSIGNED_64") 1670277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationPositive; 1671277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else if (ReflectedScalarTypeName == "boolean") 1672277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationBoolean; 1673277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross else if (ReflectedScalarTypeName != ArrayElementTypeName) 1674277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross MFA = MapFromAllocationPromote; 1675277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 16762b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "if (!mGotResult)"; 16772b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.startBlock(); 16782b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross 1679277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.vecSize == 1) { // result type is non-vector 1680277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ArrayElementType>[] outArray = new <ArrayElementType>[1]; 1681277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // mOut.copyTo(outArray); 1682277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << ArrayElementTypeName << "[] outArray = new " << ArrayElementTypeName 1683277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << std::max(TypeData.arraySize, 1U) << "];\n"; 1684277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut.copyTo(outArray);\n"; 1685277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.arraySize == 0) { // result type is non-array non-vector 16862b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // mResult = outArray[0]; // but there are several special cases 1687277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) 1688277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[0]"); 16892b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mResult = " 1690277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1691277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray[0]") 1692277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1693277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is array of non-vector 1694277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationTrivial) { 16952b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // mResult = outArray; 16962b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mResult = outArray;\n"; 1697277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1698277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ResultType> result = new <UnbracketedResultType>[<ArrayElementCount>]; 1699277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // for (unsigned Idx = 0; Idx < <ArrayElementCount>; ++Idx) 1700277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result[Idx] = <Transform>(outArray[Idx]); 17012b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // mResult = result; // but there are several special cases 1702277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA != MapFromAllocationPositive) { 1703277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << GetTypeName(ResultType) << " result = new " 1704277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << UnbracketedResultTypeName 1705277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << TypeData.arraySize << "];\n"; 1706277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1707277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << TypeData.arraySize << "; ++Idx)"; 1708277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1709277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) { 1710277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[Idx]"); 1711277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { 1712277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "result[Idx] = " 1713277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultMapping(MFA, ArrayElementTypeName, ReflectedScalarTypeName, 1714277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray[Idx]") 1715277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1716277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1717277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 17182b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mResult = " << (MFA == MapFromAllocationPositive ? "outArray" : "result") << ";\n"; 1719277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1720277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1721277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is vector or array of vector 1722277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ArrayElementType>[] outArray = new <ArrayElementType>[<VectorElementCount> * <ArrayElementCount>]; 1723277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // mOut.copyTo(outArray); 1724277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const unsigned VectorElementCount = TypeData.vecSize; 1725277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross const unsigned OutArrayElementCount = VectorElementCount * std::max(TypeData.arraySize, 1U); 1726277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << ArrayElementTypeName << "[] outArray = new " << ArrayElementTypeName 1727277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << OutArrayElementCount << "];\n"; 1728277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut.copyTo(outArray);\n"; 1729277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (MFA == MapFromAllocationPositive) { 1730277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << OutArrayElementCount << "; ++Idx)"; 1731277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1732277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross genReduceNewResultRangeCheck(mOut, "outArray[Idx]"); 1733277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1734277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1735277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross if (TypeData.arraySize == 0) { // result type is vector 17362b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // mResult = new <ResultType>(outArray[0], outArray[1] ...); // but there are several special cases 17372b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mResult = " 1738277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultVectorMapping(MFA, 1739277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, ReflectedScalarTypeName, 1740277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross GetTypeName(ResultType), VectorElementCount, 1741277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray") 1742277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1743277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } else { // result type is array of vector 1744277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // <ResultType> result = new <UnbracketedResultType>[<ArrayElementCount>]; 1745277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // for (unsigned Idx = 0; Idx < <ArrayElementCount>; ++Idx) 1746277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // result[Idx] = new <UnbracketedResultType>(outArray[<ArrayElementCount>*Idx+0], 1747277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // outArray[<ArrayElementCount>*Idx+1]...); 17482b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // mResult = result; // but there are several special cases 1749277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << GetTypeName(ResultType) << " result = new " 1750277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << UnbracketedResultTypeName 1751277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << "[" << TypeData.arraySize << "];\n"; 1752277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "for (int Idx = 0; Idx < " << TypeData.arraySize << "; ++Idx)"; 1753277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.startBlock(); 1754277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "result[Idx] = " 1755277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << genReduceNewResultVectorMapping(MFA, 1756277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross ArrayElementTypeName, ReflectedScalarTypeName, 1757277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross UnbracketedResultTypeName, VectorElementCount, 1758277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross "outArray", (std::to_string(VectorElementCount) + "*Idx").c_str()) 1759277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross << ";\n"; 1760277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 17612b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mResult = result;\n"; 1762277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1763277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross } 1764277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 17652b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mOut.destroy();\n"; 17662b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mOut = null; // make Java object eligible for garbage collection\n"; 17672b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "if (mTempIns != null)"; 17682b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.startBlock(); 17692b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "for (Allocation tempIn : mTempIns)"; 17702b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.startBlock(); 17712b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "tempIn.destroy();\n"; 17722b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.endBlock(); 17732b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mTempIns = null; // make Java objects eligible for garbage collection\n"; 17742b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.endBlock(); 17752b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mGotResult = true;\n"; 17762b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.endBlock(); 17772b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross 17782b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "return mResult;\n"; 1779277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 17802b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross 1781277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross startFunction(AM_Private, false, nullptr, ClassName, 1, "Allocation", "out"); 1782277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // TODO: Generate allocation type check and size check? Or move 1783277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // responsibility for instantiating the Allocation here, instead of 1784277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross // the reduce_* method? 17852b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mTempIns = null;\n"; 1786277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "mOut = out;\n"; 17872b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "mGotResult = false;\n"; 1788277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross endFunction(); 17892b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "private Allocation[] mTempIns;\n"; 1790277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.indent() << "private Allocation mOut;\n"; 17912b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // TODO: If result is reference type rather than primitive type, we 17922b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // could omit mGotResult and use mResult==null to indicate that we 17932b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross // haven't obtained the result yet. 17942b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "private boolean mGotResult;\n"; 17952b377908d8bd15fabc370547f2cc55ffc58bafd4David Gross mOut.indent() << "private " << GetMethodReturnTypeName << " mResult;\n"; 1796277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross mOut.endBlock(); 1797277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross} 1798277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 1799277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross////////////////////////////////////////////////////////////////////////////////////////////////////// 1800277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross 18012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstanceFromPointer(const RSExportType *ET) { 180248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 18039ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For pointer parameters to original forEach kernels. 180448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 18052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 18062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(EPT->getPointeeType()); 18079ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines } else { 18089ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For handling pass-by-value kernel parameters. 18092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(ET); 1810a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 1811a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines} 181248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstance(const RSExportType *ET) { 1814a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines switch (ET->getClass()) { 18152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 18182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 18192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(TypeName)) { 1820f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_ELEM_PREFIX << TypeName << " = Element." << TypeName 1821f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "(rs);\n"; 1822a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 18232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 182548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ClassName = ET->getElementName(); 18282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(ClassName)) { 1829f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_ELEM_PREFIX << ClassName << " = " << ClassName 1830f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".createElement(rs);\n"; 183148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 18322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1834a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 18352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 183748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 183848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 183948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genFieldPackerInstance(const RSExportType *ET) { 18411f6c331d622ac645ab68a016aa4c577998547373Stephen Hines switch (ET->getClass()) { 18422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 18452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 18472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet addTypeNameForFieldPacker(TypeName); 18482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 18501f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 18512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18531f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 18541f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 18551f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 18562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeCheck(const RSExportType *ET, 1857602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName) { 1858f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "// check " << VarName << "\n"; 185948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 186048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 186148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 18622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 186348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 186448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 186548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 186648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName; 186748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 186848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 18692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 18702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 18712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 18722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TypeName = ET->getElementName(); 18732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 187548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 187848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 187948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 188048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (!TypeName.empty()) { 1881f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (!" << VarName 1882f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getType().getElement().isCompatible(" RS_ELEM_PREFIX 1883f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << TypeName << ")) {\n"; 1884f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " throw new RSRuntimeException(\"Type mismatch with " 1885f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << TypeName << "!\");\n"; 1886f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 188748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 1888b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines} 1889b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 18902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrimitiveTypeExportVariable(const RSExportVar *EV) { 1891602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 1892602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && 1893602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of primitive here"); 18949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 18962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(EV->getType()); 18970d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EPT); 18980d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 18999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, EV->getName()); 19019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19025d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines if (EV->isConst()) { 1903f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "public final static " << TypeName 1904f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " " RS_EXPORT_VAR_CONST_PREFIX << VarName << " = "; 19055d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val = EV->getInit(); 1906efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet genInitValue(Val, EPT->getType() == DataTypeBoolean); 1907f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ";\n"; 19085d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines } else { 19095d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines // set_*() 19101f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // This must remain synchronized, since multiple Dalvik threads may 19111f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // be calling setters. 19122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 19132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 1914657d20afa621219c1eed72178d1325fd4409f458David Gross if ((EPT->getElementSizeInBytes() < 4) || EV->isUnsigned()) { 19151f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // We create/cache a per-type FieldPacker. This allows us to reuse the 19161f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // validation logic (for catching negative inputs from Dalvik, as well 19171f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // as inputs that are too large to be represented in the unsigned type). 1918bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // Sub-integer types are also handled specially here, so that we don't 1919bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // overwrite bytes accidentally. 19201f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string ElemName = EPT->getElementName(); 19211f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string FPName; 19221f6c331d622ac645ab68a016aa4c577998547373Stephen Hines FPName = RS_FP_PREFIX + ElemName; 1923f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << FPName << "!= null) {\n"; 1924f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.increaseIndent(); 1925f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FPName << ".reset();\n"; 1926f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.decreaseIndent(); 1927f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "} else {\n"; 1928f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.increaseIndent(); 1929657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << FPName << " = new FieldPacker(" << EPT->getElementSizeInBytes() 1930f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 1931f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.decreaseIndent(); 1932f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 19332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 19342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(EPT, "v", FPName.c_str()); 1935f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 1936f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FPName << ");\n"; 19371f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 1938f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 1939f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", v);\n"; 19401f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 19419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19421f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Dalvik update comes last, since the input may be invalid (and hence 19431f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // throw an exception). 1944f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 1945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 19479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 19502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 1951462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1953efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouilletvoid RSReflectionJava::genInitValue(const clang::APValue &Val, bool asBool) { 1954efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet switch (Val.getKind()) { 1955efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Int: { 1956efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::APInt api = Val.getInt(); 1957efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (asBool) { 1958f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ((api.getSExtValue() == 0) ? "false" : "true"); 1959efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } else { 1960efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet // TODO: Handle unsigned correctly 1961f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << api.getSExtValue(); 1962efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (api.getBitWidth() > 32) { 1963f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "L"; 1964efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1965efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1966efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1967efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1968efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1969efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Float: { 1970efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::APFloat apf = Val.getFloat(); 1971efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet llvm::SmallString<30> s; 1972efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet apf.toString(s); 1973f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << s.c_str(); 1974efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { 1975efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet if (s.count('.') == 0) { 1976f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ".f"; 1977efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } else { 1978f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "f"; 1979efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1980efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1981efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1982efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1983efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1984efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::ComplexInt: 1985efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::ComplexFloat: 1986efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::LValue: 1987efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet case clang::APValue::Vector: { 1988efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet slangAssert(false && "Primitive type cannot have such kind of initializer"); 1989efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet break; 1990efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1991efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 1992efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet default: { slangAssert(false && "Unknown kind of initializer"); } 1993efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet } 1994efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet} 1995efcff1017f5f1e120a8ffb67125e412343479f94Jean-Luc Brouillet 19962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPointerTypeExportVariable(const RSExportVar *EV) { 19979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 19989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 1999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20006e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 20016e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 2002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet PointeeType = static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 20040d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 20050d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 2006462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 200989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 20102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "bind_" + VarName, 1, 20112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2013f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 2014f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (v == null) bindAllocation(null, " 2015f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_VAR_INDEX_PREFIX << VarName << ");\n"; 2016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2017f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (PointeeType->getClass() == RSExportType::ExportClassRecord) { 2018f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "else bindAllocation(v.getAllocation(), " 2019f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_EXPORT_VAR_INDEX_PREFIX << VarName << ");\n"; 2020f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2021f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "else bindAllocation(v, " << RS_EXPORT_VAR_INDEX_PREFIX 2022f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ");\n"; 2023f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2026462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 2028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genVectorTypeExportVariable(const RSExportVar *EV) { 20316e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 20326e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 20339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20340d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20350d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2038657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, 1); 20392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 2041462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2042462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genMatrixTypeExportVariable(const RSExportVar *EV) { 20446e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 20456e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 204692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ET = EV->getType(); 20480d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 20490d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 205092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 205292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 205392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 205492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 20550d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 20562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 20572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2058f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 205992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 20612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 2062f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 2063f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << FieldPackerName << ");\n"; 206492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 206692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 206792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 20682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 207092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 207192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 2072602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 20732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genConstantArrayTypeExportVariable(const RSExportVar *EV) { 2074657d20afa621219c1eed72178d1325fd4409f458David Gross const RSExportType *const ET = EV->getType(); 2075602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 2076657d20afa621219c1eed72178d1325fd4409f458David Gross (ET->getClass() == RSExportType::ExportClassConstantArray) && 2077602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of constant array here"); 20782e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20790d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20800d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20812e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2083657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, static_cast<const RSExportConstantArrayType *>(ET)->getNumElement()); 20842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 20862e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 20872e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 20882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genRecordTypeExportVariable(const RSExportVar *EV) { 20896e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 20906e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 20919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20920d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 20930d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 20949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 2096657d20afa621219c1eed72178d1325fd4409f458David Gross genSetExportVariable(TypeName, EV, 1); 20972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 20982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 20990d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 21000d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines 21012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrivateExportVariable(const std::string &TypeName, 2102602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 2103f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private " << TypeName << " " << RS_EXPORT_VAR_PREFIX 2104f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ";\n"; 21050d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 21069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2107657d20afa621219c1eed72178d1325fd4409f458David Gross// Dimension = array element count; otherwise, 1. 21082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genSetExportVariable(const std::string &TypeName, 2109657d20afa621219c1eed72178d1325fd4409f458David Gross const RSExportVar *EV, 2110657d20afa621219c1eed72178d1325fd4409f458David Gross unsigned Dimension) { 21119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 21120d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 21130d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 21140d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const RSExportType *ET = EV->getType(); 21152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 21162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 2117f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 21189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 21202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 2121a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 2122a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) { 2123a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // Legacy apps must use the old setVar() without Element/dim components. 2124f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 2125f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ");\n"; 2126a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } else { 2127a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // We only have support for one-dimensional array reflection today, 2128a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // but the entry point (i.e. setVar()) takes an array of dimensions. 2129f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int []__dimArr = new int[1];\n"; 2130657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << "__dimArr[0] = " << Dimension << ";\n"; 2131f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "setVar(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 2132f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", " << FieldPackerName << ", " << RS_ELEM_PREFIX 2133f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ET->getElementName() << ", __dimArr);\n"; 2134a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 21351ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 21362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 21379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 21389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetExportVariable(const std::string &TypeName, 2141602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 21422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 2143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2144f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " << RS_EXPORT_VAR_PREFIX << VarName << ";\n"; 2145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 214728d60bc2da19821af82d983902c3c78c078343c3Stephen Hines} 214828d60bc2da19821af82d983902c3c78c078343c3Stephen Hines 21492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetFieldID(const std::string &VarName) { 215028d60bc2da19821af82d983902c3c78c078343c3Stephen Hines // We only generate getFieldID_*() for non-Pointer (bind) types. 2151b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 21522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "Script.FieldID", "getFieldID_" + VarName, 21532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 0); 2154b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 2155f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return createFieldID(" << RS_EXPORT_VAR_INDEX_PREFIX 2156f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ", null);\n"; 2157b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 21582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2159b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 21609c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 21619c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 21629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 21639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genCreateFieldPacker(const RSExportType *ET, 2165602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 2166c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t AllocSize = ET->getAllocSize(); 21679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 2168f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 2169f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << AllocSize << ");\n"; 21709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 21719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 21729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 21739c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 21749c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 21752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPackVarOfType(const RSExportType *ET, 2176602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName, 2177602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 21789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 21792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 21802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 2181f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << "." 2182f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << GetPackerAPIName( 2183f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET)) << "(" 2184f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << VarName << ");\n"; 21852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 21862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 21872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 21882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Must reflect as type Allocation in Java 21892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 21902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 21912e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 2192f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) { 2193f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addI32(" << VarName 2194f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getPtr());\n"; 2195f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2196f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addI32(" << VarName 2197f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".getAllocation().getPtr());\n"; 2198f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 21992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 2202f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".addMatrix(" << VarName << ");\n"; 22032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 22062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 22072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 22082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): more elegant way. Currently, we obtain the unique index 22102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // variable (this method involves recursive call which means 22112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we may have more than one level loop, therefore we can't 22122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // always use the same index variable name here) name given 22132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // in the for-loop from counting the '.' in @VarName. 22142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Level = 0; 22152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t LastDotPos = 0; 22162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 22172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet while (LastDotPos != std::string::npos) { 22192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 22202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Level++; 22212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 22222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string IndexVarName("ct"); 22232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet IndexVarName.append(llvm::utostr_32(Level)); 2224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2225f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "for (int " << IndexVarName << " = 0; " << IndexVarName 2226657d20afa621219c1eed72178d1325fd4409f458David Gross << " < " << ECAT->getNumElement() << "; " << IndexVarName << "++)"; 2227f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[" + IndexVarName + "]"); 22302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ECAT->getElementType(), ElementVarName.c_str(), 22312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldPackerName); 2232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2233f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 22342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 22372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType *ERT = static_cast<const RSExportRecordType *>(ET); 22382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Relative pos from now on in field packer 22392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Pos = 0; 22402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 22422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 22432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 22442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType::Field *F = *I; 22452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string FieldName; 22462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldOffset = F->getOffsetInParent(); 22472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *T = F->getType(); 22482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldStoreSize = T->getStoreSize(); 22492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldAllocSize = T->getAllocSize(); 22502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22515abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (VarName != nullptr) 22522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = VarName + ("." + F->getName()); 22532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 22542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = F->getName(); 2255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2256f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldOffset > Pos) { 2257f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) 2258f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2259f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), FieldName.c_str(), FieldPackerName); 2262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There is padding in the field type 2264f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldAllocSize > FieldStoreSize) { 2265f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" 2266f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << (FieldAllocSize - FieldStoreSize) << ");\n"; 2267f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Pos = FieldOffset + FieldAllocSize; 2270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 22712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 22722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There maybe some padding after the struct 2273f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (ERT->getAllocSize() > Pos) { 2274f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << FieldPackerName << ".skip(" << ERT->getAllocSize() - Pos 2275f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2276f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 22772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 22809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 22819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genAllocateVarOfType(const RSExportType *T, 2284602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 22852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 22862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 22872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type like int in Java has its own storage once it's declared. 22882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // 22892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // FIXME: Should we allocate storage for RS object? 22902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 2291f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 22922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 22932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 22942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 22952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Pointer type is an instance of Allocation or a TypeClass whose value is 22962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expected to be assigned by programmer later in Java program. Therefore 22972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we don't reflect things like [VarName] = new Allocation(); 2298f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = null;\n"; 22992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 23002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 23012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 23022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 23032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(T); 23042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ElementType = ECAT->getElementType(); 23052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 2306f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = new " << GetTypeName(ElementType) << "[" 2307657d20afa621219c1eed72178d1325fd4409f458David Gross << ECAT->getNumElement() << "];\n"; 23082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 23092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type element doesn't need allocation code. 23102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 2311657d20afa621219c1eed72178d1325fd4409f458David Gross mOut.indent() << "for (int $ct = 0; $ct < " << ECAT->getNumElement() 2312f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "; $ct++)"; 2313f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 23142e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 23152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 23162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[$ct]"); 23172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(ElementType, ElementVarName); 23182e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 2319f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 23202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 23212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 23222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 23232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 23242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 23252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 2326f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 23272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 23282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 23292e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 23302e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 23312e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 23322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferIfNull(const char *Index) { 2333f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME " == null) "; 2334f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_NAME << " = new " << RS_TYPE_ITEM_CLASS_NAME 2335f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "[getType().getX() /* count */];\n"; 23365abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (Index != nullptr) { 2337f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME << "[" << Index 2338f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "] == null) "; 2339f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_NAME << "[" << Index << "] = new " 2340f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_CLASS_NAME << "();\n"; 2341f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 23429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferPackerIfNull() { 2345f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " == null) "; 2346f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = new FieldPacker(" 23473a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << " * getType().getX()/* count */);\n"; 2348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 23512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genTypeClass(const RSExportRecordType *ERT, 2352602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 2353a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines std::string ClassName = ERT->getElementName(); 23542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string superClassName = getRSPackageName(); 2355f69e1e58cf65555c4be3f6c5c53f89eb044f1db5Tim Murray superClassName += RS_TYPE_CLASS_SUPER_CLASS_NAME; 23569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!startClass(AM_Public, false, ClassName, superClassName.c_str(), 23582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg)) 23599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 23609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23614cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 23624cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 23632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeItemClass(ERT); 23649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 2366f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private " << RS_TYPE_ITEM_CLASS_NAME << " " 2367f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_BUFFER_NAME << "[];\n"; 2368f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private FieldPacker " << RS_TYPE_ITEM_BUFFER_PACKER_NAME 2369f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 2370f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "private static java.lang.ref.WeakReference<Element> " 2371f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ELEMENT_REF_NAME 2372f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " = new java.lang.ref.WeakReference<Element>(null);\n"; 23732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 23742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassConstructor(ERT); 23752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArrayLocal(ERT); 23762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArray(ERT); 23772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemSetter(ERT); 23782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemGetter(ERT); 23792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentSetter(ERT); 23802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentGetter(ERT); 23812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyAll(ERT); 238282754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines if (!mRSContext->isCompatLib()) { 238382754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines // Skip the resize method if we are targeting a compatibility library. 23842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassResize(); 238582754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines } 23869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endClass(); 23889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet resetFieldIndex(); 23902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet clearFieldIndexMap(); 239166aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 23929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 23939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeItemClass(const RSExportRecordType *ERT) { 2396f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "static public class " RS_TYPE_ITEM_CLASS_NAME; 2397f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 23989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23993a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray // Sizeof should not be exposed for 64-bit; it is not accurate 24003a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray if (mRSContext->getTargetAPI() < 21) { 24013a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mOut.indent() << "public static final int sizeof = " << ERT->getAllocSize() 24023a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << ";\n"; 24033a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray } 24049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 2406f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 24079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 24082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 24092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 2410f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 2411f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ";\n"; 24129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 24139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 2415f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 2416f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_CLASS_NAME << "()"; 2417f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 24189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 24202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 24212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 24229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 24232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(F->getType(), F->getName()); 24249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 24259e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 24269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 2427f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2428462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 2430f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2432462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassConstructor(const RSExportRecordType *ERT) { 24349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 24359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 24362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Element", "createElement", 1, "RenderScript", 24372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 2438381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2439e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // TODO(all): Fix weak-refs + multi-context issue. 2440f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "Element e = " << RS_TYPE_ELEMENT_REF_NAME 24412968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << ".get();\n"; 2442f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "if (e != null) return e;\n"; 2443c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder("eb", ERT, RenderScriptVar, &mOut, 2444c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRSContext, this); 2445c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 2446c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2447f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return eb.create();\n"; 2448f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "e = eb.create();\n"; 2449f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << RS_TYPE_ELEMENT_REF_NAME 24502968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << " = new java.lang.ref.WeakReference<Element>(e);\n"; 2451f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet // mOut.indent() << "return e;\n"; 24522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 24539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2454381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // private with element 24555abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Private, false, nullptr, getClassName(), 1, "RenderScript", 24562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 2457f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2458f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2459f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 24602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2461381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2462381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D without usage 24635abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 2, "RenderScript", 24642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count"); 24659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2466f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2467f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2468f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 24699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 2470f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "init(" << RenderScriptVar << ", count);\n"; 24712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 24729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2473381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D with usage 24745abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes startFunction(AM_Public, false, nullptr, getClassName(), 3, "RenderScript", 24752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count", "int", "usages"); 247691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 2477f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << " = null;\n"; 2478f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << " = null;\n"; 2479f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 248091fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 2481f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "init(" << RenderScriptVar << ", count, usages);\n"; 24822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 248391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 2484381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D with usage 24852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 3, 24862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", 24872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 2488f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2489f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2490f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createSized(" 2491f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "rs, obj.mElement, dimX, usages);\n"; 2492f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 24932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2494381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2495381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D without usage 24962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 2, 24972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX"); 2498f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return create1D(" << RenderScriptVar 2499f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", dimX, Allocation.USAGE_SCRIPT);\n"; 25002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2501381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2502381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D without usage 25032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 3, 25042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY"); 2505f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return create2D(" << RenderScriptVar 2506f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", dimX, dimY, Allocation.USAGE_SCRIPT);\n"; 25072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2508381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2509381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D with usage 25102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 4, 25112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY", 25122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "usages"); 25132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 2514f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2515f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2516f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type.Builder b = new Type.Builder(rs, obj.mElement);\n"; 2517f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "b.setX(dimX);\n"; 2518f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "b.setY(dimY);\n"; 2519f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type t = b.create();\n"; 2520f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 2521f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 25222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2523381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2524381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createTypeBuilder 25252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Type.Builder", "createTypeBuilder", 1, 25262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar); 2527f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Element e = createElement(" << RenderScriptVar << ");\n"; 2528f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return new Type.Builder(rs, e);\n"; 25292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2530381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 2531381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createCustom with usage 25322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "createCustom", 3, 25332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "Type.Builder", "tb", "int", 25342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 2535f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << getClassName() << " obj = new " << getClassName() << "(" 2536f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RenderScriptVar << ");\n"; 2537f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Type t = tb.create();\n"; 2538f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (t.getElement() != obj.mElement) {\n"; 2539f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << " throw new RSIllegalArgumentException(" 2540f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet "\"Type.Builder did not match expected element type.\");\n"; 2541f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "}\n"; 2542f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 2543f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return obj;\n"; 25442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2546462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyToArray(const RSExportRecordType *ERT) { 25482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArray", 2, 25492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index"); 25509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 2552f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 25533a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << ");\n"; 25549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2555f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArrayLocal(i, " RS_TYPE_ITEM_BUFFER_PACKER_NAME 2556f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet ");\n"; 255738eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 25582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 255938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk} 256038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 2561602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 25622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassCopyToArrayLocal(const RSExportRecordType *ERT) { 25632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArrayLocal", 2, 25642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "FieldPacker", "fp"); 256538eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 25662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ERT, "i", "fp"); 25679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2570462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemSetter(const RSExportRecordType *ERT) { 25722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set", 3, 25732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index", "boolean", 25742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "copyNow"); 25755abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes genNewItemBufferIfNull(nullptr); 2576f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << "[index] = i;\n"; 25779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2578f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (copyNow) "; 2579f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 25809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2581f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArray(i, index);\n"; 25823a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray mOut.indent() << "FieldPacker fp = new FieldPacker(" << mItemSizeof << ");\n"; 2583f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "copyToArrayLocal(i, fp);\n"; 2584f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(index, fp);\n"; 25859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 2587f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 25889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 25892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 25909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 2591462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemGetter(const RSExportRecordType *ERT) { 25932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, RS_TYPE_ITEM_CLASS_NAME, "get", 1, 25942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 2595f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" << RS_TYPE_ITEM_BUFFER_NAME 2596f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " == null) return null;\n"; 2597f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " << RS_TYPE_ITEM_BUFFER_NAME << "[index];\n"; 25982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2599462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2600462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2601602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 26022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentSetter(const RSExportRecordType *ERT) { 26039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 2604602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 2605602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 26069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 26079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 2608c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t FieldStoreSize = F->getType()->getStoreSize(); 26092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet unsigned FieldIndex = getFieldIndex(F); 26109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 26112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + F->getName(), 26122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 3, "int", "index", GetTypeName(F->getType()).c_str(), "v", 26132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "boolean", "copyNow"); 26142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 26152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferIfNull("index"); 2616f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_NAME << "[index]." << F->getName() 2617f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " = v;\n"; 2618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2619f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (copyNow) "; 2620f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 26212dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 2622f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (FieldOffset > 0) { 2623f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 26243a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << " + " << FieldOffset 2625f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 2626f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } else { 2627f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME << ".reset(index * " 26283a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray << mItemSizeof << ");\n"; 2629f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 26302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 2631462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2632f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize 2633f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ");\n"; 26342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", "fp"); 2635f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 2636f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ", fp);\n"; 2637462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 2639f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 26429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 26439c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 26449c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 2645602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 26462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentGetter(const RSExportRecordType *ERT) { 26479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 2648602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 2649602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 26509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 26512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, 26522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet GetTypeName(F->getType()).c_str(), "get_" + F->getName(), 1, 26532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 2654f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME << " == null) return " 2655f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << GetTypeNullValue(F->getType()) << ";\n"; 2656f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "return " RS_TYPE_ITEM_BUFFER_NAME << "[index]." 2657f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << F->getName() << ";\n"; 26582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 26599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 26609c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 26619b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 26622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyAll(const RSExportRecordType *ERT) { 26632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "copyAll", 0); 2664462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2665f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "for (int ct = 0; ct < " << RS_TYPE_ITEM_BUFFER_NAME 2666f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ".length; ct++)" 2667f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << " copyToArray(" << RS_TYPE_ITEM_BUFFER_NAME 2668f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "[ct], ct);\n"; 2669f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.setFromFieldPacker(0, " 2670f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << RS_TYPE_ITEM_BUFFER_PACKER_NAME ");\n"; 2671462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassResize() { 26762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "resize", 1, "int", 26772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "newSize"); 26782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 2679f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (mItemArray != null) "; 2680f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 2681f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int oldSize = mItemArray.length;\n"; 2682f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "int copySize = Math.min(oldSize, newSize);\n"; 2683f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (newSize == oldSize) return;\n"; 2684f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "Item ni[] = new Item[newSize];\n"; 2685f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);\n"; 2686f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mItemArray = ni;\n"; 2687f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2688f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "mAllocation.resize(newSize);\n"; 2689f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet 2690f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 2691f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet " != null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 26923a38b7489d016b07e5b95a1e04ccfe9064b3438fTim Murray "new FieldPacker(" << mItemSizeof << " * getType().getX()/* count */);\n"; 26932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 26942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 2695d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 2696d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 26979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 2698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 2700c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2701c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc BrouilletRSReflectionJavaElementBuilder::RSReflectionJavaElementBuilder( 2702c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *ElementBuilderName, const RSExportRecordType *ERT, 2703c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *RenderScriptVar, GeneratedFile *Out, const RSContext *RSContext, 2704c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJava *Reflection) 2705c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet : mElementBuilderName(ElementBuilderName), mERT(ERT), 2706c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar(RenderScriptVar), mOut(Out), mPaddingFieldIndex(1), 2707c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRSContext(RSContext), mReflection(Reflection) { 2708c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 2709c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mPaddingPrefix = "#padding_"; 2710c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } else { 2711c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mPaddingPrefix = "#rs_padding_"; 2712c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2713c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2714c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2715c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::generate() { 2716c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mOut->indent() << "Element.Builder " << mElementBuilderName 2717c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << " = new Element.Builder(" << mRenderScriptVar << ");\n"; 2718c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddElement(mERT, "", /* ArraySize = */ 0); 2719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2721c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddElement(const RSExportType *ET, 2722c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const std::string &VarName, 2723c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize) { 272447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines std::string ElementConstruct = GetBuiltinElementConstruct(ET); 27259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 272647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (ElementConstruct != "") { 2727c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2728c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ElementConstruct << "(" << mRenderScriptVar << ")"; 2729c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 27309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 2731c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2732c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet switch (ET->getClass()) { 2733c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 27349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 27352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 273647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines const char *DataTypeName = 273747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines RSExportPrimitiveType::getRSReflectionType(EPT)->rs_type; 2738c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2739c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.createUser(" << mRenderScriptVar 2740c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << ", Element.DataType." << DataTypeName << ")"; 2741c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 2742c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2743c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2744c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassVector: { 2745c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const RSExportVectorType *EVT = 2746c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportVectorType *>(ET); 2747c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet const char *DataTypeName = 2748c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSExportPrimitiveType::getRSReflectionType(EVT)->rs_type; 2749c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2750c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.createVector(" << mRenderScriptVar 2751c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << ", Element.DataType." << DataTypeName << ", " 2752c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet << EVT->getNumElement() << ")"; 2753c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 2754c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2755c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2756c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassPointer: 27579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 27589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 27596e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 2760c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2761c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassMatrix: 276292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 276392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 27646e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 2765c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2766c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 27672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 27682e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 27692e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 277089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 277189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 2772657d20afa621219c1eed72178d1325fd4409f458David Gross genAddElement(ECAT->getElementType(), VarName, ECAT->getNumElement()); 277389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 2774c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string NewElementBuilderName(mElementBuilderName); 277589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 277689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2777c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder( 2778c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet NewElementBuilderName.c_str(), 2779c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportRecordType *>(ElementType), 2780c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar, mOut, mRSContext, mReflection); 2781c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 2782c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2783657d20afa621219c1eed72178d1325fd4409f458David Gross ArraySize = ECAT->getNumElement(); 2784c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2785c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << NewElementBuilderName << ".create()"; 2786c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, ArraySize); 278789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 2788c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2789c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2790c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet case RSExportType::ExportClassRecord: { 27919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 27929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 27936315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 27946315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 27959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 27962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 27972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Pos = 0; // relative pos from now on 27989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 27999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 28002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 28012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 28029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 28039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 2804c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet const RSExportType *T = F->getType(); 2805c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldStoreSize = T->getStoreSize(); 2806c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldAllocSize = T->getAllocSize(); 28079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2808c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string FieldName; 28099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 28109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 28119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 28129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 28139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 2815c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(FieldOffset - Pos); 28169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 2818c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mReflection->addFieldIndexMapping(F); 281989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 2820c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddElement(F->getType(), FieldName, 0); 282189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 2822c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet std::string NewElementBuilderName(mElementBuilderName); 282389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 282489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2825c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet RSReflectionJavaElementBuilder builder( 2826c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet NewElementBuilderName.c_str(), 2827c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet static_cast<const RSExportRecordType *>(F->getType()), 2828c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mRenderScriptVar, mOut, mRSContext, mReflection); 2829c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet builder.generate(); 283089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 2831c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 2832c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << NewElementBuilderName << ".create()"; 2833c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(FieldName, ArraySize); 283489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 28359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2836a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 2837a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // There is padding within the field type. This is only necessary 2838a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // for HC-targeted APIs. 2839c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(FieldAllocSize - FieldStoreSize); 2840a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 28419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 28429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 28439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2844bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 28459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 2846c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t RecordAllocSize = ERT->getAllocSize(); 28470a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 2848c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddPadding(RecordAllocSize - Pos); 2849c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2850c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2851c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet default: 28526e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 2853c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet break; 2854b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 28559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2856462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2857462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2858c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddPadding(int PaddingSize) { 28599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 28602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &VarName = createPaddingField(); 2861c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementStart(); 28629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 2863c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U32(" << mRenderScriptVar << ")"; 28649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 28659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 2866c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U16(" << mRenderScriptVar << ")"; 28679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 28689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 2869c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << "Element.U8(" << mRenderScriptVar << ")"; 28709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 2871462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 2872c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet genAddStatementEnd(VarName, 0); 28739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2874462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2875462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2876c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid RSReflectionJavaElementBuilder::genAddStatementStart() { 2877c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mOut->indent() << mElementBuilderName << ".add("; 2878c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2879c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 2880c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouilletvoid 2881c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc BrouilletRSReflectionJavaElementBuilder::genAddStatementEnd(const std::string &VarName, 2882c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet unsigned ArraySize) { 2883c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ", \"" << VarName << "\""; 2884c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet if (ArraySize > 0) { 2885c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ", " << ArraySize; 2886c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet } 2887c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet *mOut << ");\n"; 2888c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // TODO Review incFieldIndex. It's probably better to assign the numbers at 2889c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // the start rather 2890c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet // than as we're generating the code. 2891c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet mReflection->incFieldIndex(); 2892c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet} 2893c643ceb752ed999def0fd028990eafa802cd13fbJean-Luc Brouillet 28949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 2895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 289659f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouilletbool RSReflectionJava::reflect() { 289759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::string ErrorMsg; 289859f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!genScriptClass(mScriptClassName, ErrorMsg)) { 289959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet std::cerr << "Failed to generate class " << mScriptClassName << " (" 29002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ErrorMsg << ")\n"; 29012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 29022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet } 29039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 290459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mGeneratedFileNames->push_back(mScriptClassName); 29059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // class ScriptField_<TypeName> 29072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (RSContext::const_export_type_iterator 29082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI = mRSContext->export_types_begin(), 29092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TE = mRSContext->export_types_end(); 29102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI != TE; TI++) { 29112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportType *ET = TI->getValue(); 29122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 29132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (ET->getClass() == RSExportType::ExportClassRecord) { 29142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportRecordType *ERT = 29152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 29162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 29172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!ERT->isArtificial() && !genTypeClass(ERT, ErrorMsg)) { 29182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::cerr << "Failed to generate type class for struct '" 29192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ERT->getName() << "' (" << ErrorMsg << ")\n"; 29202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 29219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 29239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2924462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletconst char *RSReflectionJava::AccessModifierStr(AccessModifier AM) { 29299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 29302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Public: 29312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public"; 29322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Protected: 29342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "protected"; 29352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Private: 29372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "private"; 29382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_PublicSynchronized: 29402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public synchronized"; 29412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 29432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ""; 29442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 29459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2946462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2947462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::startClass(AccessModifier AM, bool IsStatic, 29492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &ClassName, 29502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *SuperClassName, 29512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string &ErrorMsg) { 29528c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 2953f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet std::string FileName = ClassName + ".java"; 295459f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!mOut.startFile(mOutputDirectory, FileName, mRSSourceFileName, 2955fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mRSContext->getLicenseNote(), true, 2956fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mRSContext->getVerbose())) { 29578c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 2958f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 29599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 2961f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet if (!mPackageName.empty()) { 2962f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "package " << mPackageName << ";\n"; 2963f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet } 2964f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 29659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 2967f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import " << mRSPackageName << ".*;\n"; 296844d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines if (getEmbedBitcodeInJava()) { 2969f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import " << mPackageName << "." 297044d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines << RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 297159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet mRSSourceFileName.c_str()) << ";\n"; 297244d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } else { 2973f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "import android.content.res.Resources;\n"; 297444d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 2975f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "\n"; 29769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 29789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 2979f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << "/**\n"; 2980f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " * @hide\n"; 2981f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " */\n"; 29829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2983f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 2984f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ClassName; 29855abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes if (SuperClassName != nullptr) 2986f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << " extends " << SuperClassName; 29879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2988f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 29899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 29919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 29929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2993462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endClass() { 2996f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.endBlock(); 2997f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.closeFile(); 29989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 2999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3000462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startTypeClass(const std::string &ClassName) { 3002f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << "public static class " << ClassName; 3003f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 3004462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3005462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3006f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouilletvoid RSReflectionJava::endTypeClass() { mOut.endBlock(); } 3007462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 30092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 30102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, int Argc, 30112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ...) { 30129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 30139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 30149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 3015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 30172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgType = va_arg(vl, const char *); 30182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgName = va_arg(vl, const char *); 3019462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 30219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 30229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 3023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 3025462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3026462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 30282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 30292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, 30302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const ArgTy &Args) { 3031f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 3032f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << ((ReturnType) ? ReturnType : "") << " " << FunctionName 3033f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet << "("; 30349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 30359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 30362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); I != E; I++) { 30379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 3038f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ", "; 30399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 30409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 3041462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3042f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << I->first << " " << I->second; 30439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3044462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3045f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut << ")"; 3046f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouillet mOut.startBlock(); 3047462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 3048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3049f33e1561dc390cf2be7a81e9f818b269d458ec7eJean-Luc Brouilletvoid RSReflectionJava::endFunction() { mOut.endBlock(); } 3050e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 30512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForElement(const std::string &TypeName) { 30521f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mTypesToCheck.find(TypeName) == mTypesToCheck.end()) { 30531f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mTypesToCheck.insert(TypeName); 30541f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 30551f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 30561f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 30571f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 30581f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 30591f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 30602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForFieldPacker(const std::string &TypeName) { 30611f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mFieldPackerTypes.find(TypeName) == mFieldPackerTypes.end()) { 30621f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mFieldPackerTypes.insert(TypeName); 30631f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 30641f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 30651f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 30661f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 30671f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 30681f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 30692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang 3070