slang_rs_reflection.cpp revision 2e205d071c86981a8dd301a8612d17b251b3b973
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines * Copyright 2010-2012, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 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" 376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflect_utils.h" 384cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "slang_version.h" 39e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_utils.h" 406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 41192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams#include "slang_rs_reflection_base.h" 42192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams 432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_SCRIPT_CLASS_NAME_PREFIX "ScriptC_" 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC" 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_CLASS_SUPER_CLASS_NAME ".Script.FieldBase" 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ITEM_CLASS_NAME "Item" 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ITEM_BUFFER_NAME "mItemArray" 512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ITEM_BUFFER_PACKER_NAME "mIOBuffer" 522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_TYPE_ELEMENT_REF_NAME "mElementCache" 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_INDEX_PREFIX "mExportVarIdx_" 552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_PREFIX "mExportVar_" 562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_ELEM_PREFIX "mExportVarElem_" 572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_DIM_PREFIX "mExportVarDim_" 582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_CONST_PREFIX "const_" 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_ELEM_PREFIX "__" 61a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_FP_PREFIX "__rs_fp_" 631f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_RESOURCE_NAME "__rs_resource_name" 65d2936939ec10879e25746322db60071f79f28c1bStephen Hines 662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_FUNC_INDEX_PREFIX "mExportFuncIdx_" 672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_FOREACH_INDEX_PREFIX "mExportForEachIdx_" 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define RS_EXPORT_VAR_ALLOCATION_PREFIX "mAlloction_" 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_" 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 72e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 74602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet// Some utility function using internal in RSReflectionJava 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic bool GetClassNameFromFileName(const std::string &FileName, 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ClassName) { 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName.clear(); 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FileName.empty() || (FileName == "-")) 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName = 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSSlangReflectUtils::JavaClassNameFromRSFileName(FileName.c_str()); 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changstatic const char *GetMatrixTypeName(const RSExportMatrixType *EMT) { 892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static const char *MatrixTypeJavaNameMap[] = {/* 2x2 */ "Matrix2f", 902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 3x3 */ "Matrix3f", 912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 4x4 */ "Matrix4f", 9292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang }; 9392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang unsigned Dim = EMT->getDim(); 9492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if ((Dim - 2) < (sizeof(MatrixTypeJavaNameMap) / sizeof(const char *))) 962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return MatrixTypeJavaNameMap[EMT->getDim() - 2]; 9792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 986e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetMatrixTypeName : Unsupported matrix dimension"); 9992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 10092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 10192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hinesstatic const char *GetVectorAccessor(unsigned Index) { 1032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static const char *VectorAccessorMap[] = {/* 0 */ "x", 1042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 1 */ "y", 1052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 2 */ "z", 1062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* 3 */ "w", 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 108324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert((Index < (sizeof(VectorAccessorMap) / sizeof(const char *))) && 1106e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Out-of-bound index to access vector member"); 111324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return VectorAccessorMap[Index]; 113324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 114324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetPackerAPIName(const RSExportPrimitiveType *EPT) { 1166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static const char *PrimitiveTypePackerAPINameMap[] = { 1172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "", // DataTypeFloat16 1182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addF32", // DataTypeFloat32 1192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addF64", // DataTypeFloat64 1202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI8", // DataTypeSigned8 1212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI16", // DataTypeSigned16 1222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI32", // DataTypeSigned32 1232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addI64", // DataTypeSigned64 1242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU8", // DataTypeUnsigned8 1252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned16 1262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU32", // DataTypeUnsigned32 1272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU64", // DataTypeUnsigned64 1282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addBoolean", // DataTypeBoolean 1292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned565 1302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned5551 1312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addU16", // DataTypeUnsigned4444 1322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addMatrix", // DataTypeRSMatrix2x2 1332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addMatrix", // DataTypeRSMatrix3x3 1342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addMatrix", // DataTypeRSMatrix4x4 1352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSElement 1362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSType 1372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSAllocation 1382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSSampler 1392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSScript 1402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSMesh 1412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSPath 1422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramFragment 1432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramVertex 1442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramRaster 1452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSProgramStore 1462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "addObj", // DataTypeRSFont 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (TypeId < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char *))) 1512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return PrimitiveTypePackerAPINameMap[EPT->getType()]; 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1536e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetPackerAPIName : Unknown primitive data type"); 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 157d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hinesstatic std::string GetTypeName(const RSExportType *ET, bool Brackets = true) { 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 1592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 1602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return RSExportPrimitiveType::getRSReflectionType( 1612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET))->java_name; 1622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 1642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 1652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) 1682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Allocation"; 1692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 1702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return PointeeType->getElementName(); 1712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 1732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 1742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::stringstream VecName; 1752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix 1762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EVT->getNumElement(); 1772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return VecName.str(); 1782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 1802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return GetMatrixTypeName(static_cast<const RSExportMatrixType *>(ET)); 1812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 1832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *CAT = 1842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 1852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementTypeName = GetTypeName(CAT->getElementType()); 1862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (Brackets) { 1872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementTypeName.append("[]"); 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ElementTypeName; 1902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 1922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ET->getElementName() + "." RS_TYPE_ITEM_CLASS_NAME; 1932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 1942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ""; 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 200cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liaostatic const char *GetTypeNullValue(const RSExportType *ET) { 201cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao switch (ET->getClass()) { 2022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 2032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportPrimitiveType *EPT = 2042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 2052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (EPT->isRSObjectType()) 206cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "null"; 2072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else if (EPT->getType() == DataTypeBoolean) 2082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "false"; 2092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 2102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "0"; 2112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 2122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: 2142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 2152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 2162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 2172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 2182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "null"; 2192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 2202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 2212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 222cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 223cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return ""; 224cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao} 225cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao 22647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hinesstatic std::string GetBuiltinElementConstruct(const RSExportType *ET) { 2272e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ET->getClass() == RSExportType::ExportClassPrimitive) { 228a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines return std::string("Element.") + ET->getElementName(); 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassVector) { 2302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 231cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet if (EVT->getType() == DataTypeFloat32) { 2322b8fb64be3047df940a219872b331eb11de2758dStephen Hines if (EVT->getNumElement() == 2) 2332b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.F32_2"; 2342b8fb64be3047df940a219872b331eb11de2758dStephen Hines else if (EVT->getNumElement() == 3) 2352b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.F32_3"; 2362b8fb64be3047df940a219872b331eb11de2758dStephen Hines else if (EVT->getNumElement() == 4) 2372b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.F32_4"; 238cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet } else if (EVT->getType() == DataTypeUnsigned8) { 2392b8fb64be3047df940a219872b331eb11de2758dStephen Hines if (EVT->getNumElement() == 4) 2402b8fb64be3047df940a219872b331eb11de2758dStephen Hines return "Element.U8_4"; 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 24292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 24392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportMatrixType *EMT = static_cast<const RSExportMatrixType *>(ET); 24492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang switch (EMT->getDim()) { 2452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case 2: 2462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Element.MATRIX_2X2"; 2472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case 3: 2482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Element.MATRIX_3X3"; 2492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case 4: 2502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "Element.MATRIX_4X4"; 2512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 2522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unsupported dimension of matrix"); 25392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 25547aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines // RSExportType::ExportClassPointer can't be generated in a struct. 256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines return ""; 25848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 25948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 2609d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines// Replace all instances of "\" with "\\" in a single string to prevent 2619d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines// formatting errors due to unicode. 2629d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hinesstatic std::string SanitizeString(std::string s) { 2639d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines size_t p = 0; 2642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet while ((p = s.find('\\', p)) != std::string::npos) { 2659d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines s.replace(p, 1, "\\\\"); 2662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet p += 2; 2679d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines } 2689d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines return s; 2699d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines} 2709d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines 2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate script class **********************/ 2722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genScriptClass(const std::string &ClassName, 273602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 2742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!startClass(AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, 2752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg)) 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genScriptClassConstructor(); 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reflect export variable 2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 2822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = mRSContext->export_vars_end(); 2832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) 2842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genExportVariable(*I); 2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2864a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines // Reflect export for each functions (only available on ICS+) 2874cc499d6e5ec602309501873449c938af61170b2Stephen Hines if (mRSContext->getTargetAPI() >= SLANG_ICS_TARGET_API) { 2884a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines for (RSContext::const_export_foreach_iterator 2894a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines I = mRSContext->export_foreach_begin(), 2904a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines E = mRSContext->export_foreach_end(); 2914a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines I != E; I++) 2922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genExportForEach(*I); 2934a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines } 294593a894650e81be54173106ec266f0311cebebd3Stephen Hines 2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reflect export function 2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_func_iterator 2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I = mRSContext->export_funcs_begin(), 2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = mRSContext->export_funcs_end(); 2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; I++) 3002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genExportFunction(*I); 3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endClass(); 3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genScriptClassConstructor() { 3084c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines std::string className(RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 3092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet getInputFileName().c_str())); 310d2936939ec10879e25746322db60071f79f28c1bStephen Hines // Provide a simple way to reference this object. 3112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private static final String " RS_RESOURCE_NAME " = \"" 3122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << getResourceId() << "\";\n"; 313d2936939ec10879e25746322db60071f79f28c1bStephen Hines 314d2936939ec10879e25746322db60071f79f28c1bStephen Hines // Generate a simple constructor with only a single parameter (the rest 315d2936939ec10879e25746322db60071f79f28c1bStephen Hines // can be inferred from information we already have). 3162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "// Constructor\n"; 3172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, NULL, getClassName(), 1, "RenderScript", 3182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "rs"); 31944d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines 3202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (getEmbedBitcodeInJava()) { 3214c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call new single argument Java-only constructor 3222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "super(rs,\n"; 3232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " " << RS_RESOURCE_NAME ",\n"; 3242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " " << className << ".getBitCode32(),\n"; 3254c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // TODO(srhines): Replace the extra BitCode32 with Bitcode64 here! 3262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << " " << className << ".getBitCode64());\n"; 3272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " " << className << ".getBitCode32());\n"; 3284c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines } else { 3294c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call alternate constructor with required parameters. 3304c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Look up the proper raw bitcode resource id via the context. 3312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "this(rs,\n"; 3322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " rs.getApplicationContext().getResources(),\n"; 3332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " rs.getApplicationContext().getResources()." 3342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "getIdentifier(\n"; 3352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " " RS_RESOURCE_NAME ", \"raw\",\n"; 3362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " rs.getApplicationContext().getPackageName()));\n"; 3372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 3384c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines 3394c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Alternate constructor (legacy) with 3 original parameters. 3402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, NULL, getClassName(), 3, "RenderScript", 3412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "rs", "Resources", "resources", "int", "id"); 3424c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call constructor of super class 3432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "super(rs, resources, id);\n"; 34444d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 345b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 346b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // If an exported variable has initial value, reflect it 347b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 348b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 3492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = mRSContext->export_vars_end(); 3502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 351b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams const RSExportVar *EV = *I; 352d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines if (!EV->getInit().isUninit()) { 3532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitExportVariable(EV->getType(), EV->getName(), EV->getInit()); 354d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } else if (EV->getArraySize()) { 355d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines // Always create an initial zero-init array object. 3562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = new " 3572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << GetTypeName(EV->getType(), false) << "[" << EV->getArraySize() 3582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "];\n"; 359d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines size_t NumInits = EV->getNumInits(); 360d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines const RSExportConstantArrayType *ECAT = 3612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(EV->getType()); 362d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines const RSExportType *ET = ECAT->getElementType(); 363d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines for (size_t i = 0; i < NumInits; i++) { 364d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines std::stringstream Name; 365d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines Name << EV->getName() << "[" << i << "]"; 3662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitExportVariable(ET, Name.str(), EV->getInitArray(i)); 367d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } 368d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } 369a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_TARGET_API) { 3702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(EV->getType()); 371a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 3722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genFieldPackerInstance(EV->getType()); 373b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams } 374b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 37548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines for (RSContext::const_export_foreach_iterator 37648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I = mRSContext->export_foreach_begin(), 37748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines E = mRSContext->export_foreach_end(); 3782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 37948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportForEach *EF = *I; 38048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 38148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *IET = EF->getInType(); 38248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (IET) { 3832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstanceFromPointer(IET); 38448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 38548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *OET = EF->getOutType(); 38648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (OET) { 3872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstanceFromPointer(OET); 38848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 38948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 39048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 3912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 392b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 3932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (std::set<std::string>::iterator I = mTypesToCheck.begin(), 3942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet E = mTypesToCheck.end(); 3952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 3962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private Element " RS_ELEM_PREFIX << *I << ";\n"; 39748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 39848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 3992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (std::set<std::string>::iterator I = mFieldPackerTypes.begin(), 4002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet E = mFieldPackerTypes.end(); 4012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 4022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private FieldPacker " RS_FP_PREFIX << *I << ";\n"; 4031f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 4049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genInitBoolExportVariable(const std::string &VarName, 407602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const clang::APValue &Val) { 4086e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 4092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert((Val.getKind() == clang::APValue::Int) && 4102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "Bool type has wrong initial APValue"); 411462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 413462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ((Val.getInt().getSExtValue() == 0) ? "false" : "true") << ";\n"; 415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 416462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid 4182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genInitPrimitiveExportVariable(const std::string &VarName, 4192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const clang::APValue &Val) { 4205d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 4215d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines 4222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 4232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << RSReflectionBase::genInitValue(Val) << ";\n"; 42448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 42548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 4262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genInitExportVariable(const RSExportType *ET, 427602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName, 428602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const clang::APValue &Val) { 4296e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 4309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 4322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 4332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportPrimitiveType *EPT = 4342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 4352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (EPT->getType() == DataTypeBoolean) { 4362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitBoolExportVariable(VarName, Val); 4372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } else { 4382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable(VarName, Val); 439324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 4402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 4412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 4432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (!Val.isInt() || Val.getInt().getSExtValue() != 0) 4442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::cout << "Initializer which is non-NULL to pointer type variable " 4452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "will be ignored\n"; 4462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 4472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 4492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 4502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet switch (Val.getKind()) { 4512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Int: 4522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Float: { 4532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (unsigned i = 0; i < EVT->getNumElement(); i++) { 4542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Name = VarName + "." + GetVectorAccessor(i); 4552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable(Name, Val); 4562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 4592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Vector: { 4602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::stringstream VecName; 4612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix 4622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EVT->getNumElement(); 4632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " << VecName.str() 4642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "();\n"; 4652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 4662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned NumElements = std::min( 4672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<unsigned>(EVT->getNumElement()), Val.getVectorLength()); 4682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (unsigned i = 0; i < NumElements; i++) { 4692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const clang::APValue &ElementVal = Val.getVectorElt(i); 4702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Name = VarName + "." + GetVectorAccessor(i); 4712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable(Name, ElementVal); 4729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 4739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 474324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 4752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::MemberPointer: 4762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Uninitialized: 4772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::ComplexInt: 4782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::ComplexFloat: 4792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::LValue: 4802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Array: 4812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Struct: 4822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Union: 4832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::AddrLabelDiff: { 4842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unexpected type of value of initializer."); 4852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 4882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): Resolving initializer of a record (and matrix) type variable 4902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // is complex. It cannot obtain by just simply evaluating the initializer 4912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expression. 4922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 4932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 4942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 4959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#if 0 4969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned InitIndex = 0; 4976315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 4986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5006e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Vector) && 5016e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type of initializer for record type variable"); 502462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName 504a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines << " = new " << ERT->getElementName() 5052968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << "." RS_TYPE_ITEM_CLASS_NAME"();\n"; 506462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 5089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 5099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 5109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 5119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 5129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName = VarName + "." + F->getName(); 513462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (InitIndex > Val.getVectorLength()) 5159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 516462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genInitPrimitiveExportVariable( 5189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName, 5199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorElt(InitIndex++)); 5209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 5219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif 5222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unsupported initializer for record/matrix/constant " 5232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "array type variable currently"); 5242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 5279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 528462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 529462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genExportVariable(const RSExportVar *EV) { 5319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 532462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private final static int " RS_EXPORT_VAR_INDEX_PREFIX 5342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << EV->getName() << " = " << getNextExportVarSlot() << ";\n"; 535462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 5372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 5382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrimitiveTypeExportVariable(EV); 5392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 5422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPointerTypeExportVariable(EV); 5432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 5462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genVectorTypeExportVariable(EV); 5472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 5502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genMatrixTypeExportVariable(EV); 5512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 5542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genConstantArrayTypeExportVariable(EV); 5552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 5582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genRecordTypeExportVariable(EV); 5592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 5629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 563462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 564462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genExportFunction(const RSExportFunc *EF) { 5662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private final static int " RS_EXPORT_FUNC_INDEX_PREFIX 5672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << EF->getName() << " = " << getNextExportFuncSlot() << ";\n"; 5689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // invoke_*() 5702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ArgTy Args; 5719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5720da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang if (EF->hasParam()) { 5730da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang for (RSExportFunc::const_param_iterator I = EF->params_begin(), 5742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = EF->params_end(); 5752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 5762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Args.push_back( 5772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::make_pair(GetTypeName((*I)->getType()), (*I)->getName())); 5780da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang } 5799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 5809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", 5822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "invoke_" + EF->getName(/*Mangle=*/false), 5832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // We are using un-mangled name since Java 5842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // supports method overloading. 5852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet Args); 5869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EF->hasParam()) { 5882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "invoke(" RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() 5892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ");\n"; 5909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 5919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = EF->getParamPacketType(); 5929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 5939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ERT, FieldPackerName.c_str())) 5952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ERT, NULL, FieldPackerName.c_str()); 5969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "invoke(" RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " 5982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << FieldPackerName << ");\n"; 5999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 6029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 603462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genExportForEach(const RSExportForEach *EF) { 605c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines if (EF->isDummyRoot()) { 606c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines // Skip reflection for dummy root() kernels. Note that we have to 607c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines // advance the next slot number for ForEach, however. 6082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "//private final static int " RS_EXPORT_FOREACH_INDEX_PREFIX 6092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << EF->getName() << " = " << getNextExportForEachSlot() << ";\n"; 610c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines return; 611c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines } 612c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines 6132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private final static int " RS_EXPORT_FOREACH_INDEX_PREFIX 6142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << EF->getName() << " = " << getNextExportForEachSlot() << ";\n"; 615593a894650e81be54173106ec266f0311cebebd3Stephen Hines 616b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines // forEach_*() 6172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ArgTy Args; 618593a894650e81be54173106ec266f0311cebebd3Stephen Hines 6199ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines slangAssert(EF->getNumParameters() > 0 || EF->hasReturn()); 620593a894650e81be54173106ec266f0311cebebd3Stephen Hines 621b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn()) 622b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines Args.push_back(std::make_pair("Allocation", "ain")); 6239ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasOut() || EF->hasReturn()) 624593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair("Allocation", "aout")); 625b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 626b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportRecordType *ERT = EF->getParamPacketType(); 627b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 628b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines for (RSExportForEach::const_param_iterator I = EF->params_begin(), 6292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = EF->params_end(); 6302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 6312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Args.push_back( 6322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::make_pair(GetTypeName((*I)->getType()), (*I)->getName())); 633593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 634593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 635593a894650e81be54173106ec266f0311cebebd3Stephen Hines 636b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray const RSExportType *IET = EF->getInType(); 637b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray const RSExportType *OET = EF->getOutType(); 638b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 639b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 6402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int signature = 0; 6412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "Script.KernelID", 6422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "getKernelID_" + EF->getName(), 0); 643b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 6442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (IET) 6452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet signature |= 1; 6462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (OET) 6472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet signature |= 2; 648b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 6492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO: add element checking 6502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return createKernelID(" << RS_EXPORT_FOREACH_INDEX_PREFIX 6512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << EF->getName() << ", " << signature << ", null, null);\n"; 652b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 6532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 654b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 655b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 65650974740c0c5c52dd766264139a01702fbc138afStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_MR2_TARGET_API) { 6572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "forEach_" + EF->getName(), Args); 65850974740c0c5c52dd766264139a01702fbc138afStephen Hines 6592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "forEach_" << EF->getName(); 6602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << "("; 66150974740c0c5c52dd766264139a01702fbc138afStephen Hines 66250974740c0c5c52dd766264139a01702fbc138afStephen Hines if (EF->hasIn()) { 6632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << "ain, "; 66450974740c0c5c52dd766264139a01702fbc138afStephen Hines } 66550974740c0c5c52dd766264139a01702fbc138afStephen Hines 66650974740c0c5c52dd766264139a01702fbc138afStephen Hines if (EF->hasOut() || EF->hasReturn()) { 6672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << "aout, "; 66850974740c0c5c52dd766264139a01702fbc138afStephen Hines } 66950974740c0c5c52dd766264139a01702fbc138afStephen Hines 67050974740c0c5c52dd766264139a01702fbc138afStephen Hines if (EF->hasUsrData()) { 6712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << Args.back().second << ", "; 67250974740c0c5c52dd766264139a01702fbc138afStephen Hines } 67350974740c0c5c52dd766264139a01702fbc138afStephen Hines 67450974740c0c5c52dd766264139a01702fbc138afStephen Hines // No clipped bounds to pass in. 6752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << "null);\n"; 67650974740c0c5c52dd766264139a01702fbc138afStephen Hines 6772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 67850974740c0c5c52dd766264139a01702fbc138afStephen Hines 67950974740c0c5c52dd766264139a01702fbc138afStephen Hines // Add the clipped kernel parameters to the Args list. 68050974740c0c5c52dd766264139a01702fbc138afStephen Hines Args.push_back(std::make_pair("Script.LaunchOptions", "sc")); 68150974740c0c5c52dd766264139a01702fbc138afStephen Hines } 68250974740c0c5c52dd766264139a01702fbc138afStephen Hines 6832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "forEach_" + EF->getName(), Args); 684593a894650e81be54173106ec266f0311cebebd3Stephen Hines 685b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (IET) { 6862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeCheck(IET, "ain"); 687b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 688b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (OET) { 6892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeCheck(OET, "aout"); 690593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 691593a894650e81be54173106ec266f0311cebebd3Stephen Hines 6929ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasIn() && (EF->hasOut() || EF->hasReturn())) { 6932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "// Verify dimensions\n"; 6942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Type tIn = ain.getType();\n"; 6952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Type tOut = aout.getType();\n"; 6962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if ((tIn.getCount() != tOut.getCount()) ||\n"; 6972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " (tIn.getX() != tOut.getX()) ||\n"; 6982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " (tIn.getY() != tOut.getY()) ||\n"; 6992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " (tIn.getZ() != tOut.getZ()) ||\n"; 7002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " (tIn.hasFaces() != tOut.hasFaces()) ||\n"; 7012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " (tIn.hasMipmaps() != tOut.hasMipmaps())) {\n"; 7022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " throw new RSRuntimeException(\"Dimension mismatch " 7032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "between input and output parameters!\");\n"; 7042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "}\n"; 705593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 706593a894650e81be54173106ec266f0311cebebd3Stephen Hines 707b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines std::string FieldPackerName = EF->getName() + "_fp"; 708b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 7092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ERT, FieldPackerName.c_str())) { 7102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ERT, NULL, FieldPackerName.c_str()); 711b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 712b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 7132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "forEach(" RS_EXPORT_FOREACH_INDEX_PREFIX << EF->getName(); 714b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 715b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn()) 7162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", ain"; 717b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 7182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", null"; 719b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 7209ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasOut() || EF->hasReturn()) 7212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", aout"; 722b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 7232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", null"; 724b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 725b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasUsrData()) 7262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", " << FieldPackerName; 727b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 7282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", null"; 729b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 73050974740c0c5c52dd766264139a01702fbc138afStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_MR2_TARGET_API) { 7312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", sc);\n"; 73250974740c0c5c52dd766264139a01702fbc138afStephen Hines } else { 7332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ");\n"; 73450974740c0c5c52dd766264139a01702fbc138afStephen Hines } 735b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 7362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 737593a894650e81be54173106ec266f0311cebebd3Stephen Hines} 738593a894650e81be54173106ec266f0311cebebd3Stephen Hines 7392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstanceFromPointer(const RSExportType *ET) { 74048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 7419ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For pointer parameters to original forEach kernels. 74248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 7432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 7442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(EPT->getPointeeType()); 7459ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines } else { 7469ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For handling pass-by-value kernel parameters. 7472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeInstance(ET); 748a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 749a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines} 75048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 7512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstance(const RSExportType *ET) { 752a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines switch (ET->getClass()) { 7532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 7542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 7552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 7562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 7572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(TypeName)) { 7582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_ELEM_PREFIX << TypeName << " = Element." << TypeName 7592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "(rs);\n"; 760a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 7612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 76348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 7642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 7652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ClassName = ET->getElementName(); 7662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (addTypeNameForElement(ClassName)) { 7672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_ELEM_PREFIX << ClassName << " = " << ClassName 7682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ".createElement(rs);\n"; 76948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 7702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 772a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 7732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 7742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 77548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 77648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 77748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 7782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genFieldPackerInstance(const RSExportType *ET) { 7791f6c331d622ac645ab68a016aa4c577998547373Stephen Hines switch (ET->getClass()) { 7802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 7812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 7822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 7832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 7842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 7852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet addTypeNameForFieldPacker(TypeName); 7862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7881f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 7892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 7902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7911f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 7921f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 7931f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 7942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeCheck(const RSExportType *ET, 795602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName) { 7962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "// check " << VarName << "\n"; 79748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 79848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 79948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 8002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 80148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 80248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 80348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 80448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName; 80548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 80648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 8072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 8082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 8092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 8102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TypeName = ET->getElementName(); 8112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 8122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 81348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 8142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 8152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 81648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 81748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 81848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (!TypeName.empty()) { 8192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (!" << VarName 8202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ".getType().getElement().isCompatible(" RS_ELEM_PREFIX 8212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << TypeName << ")) {\n"; 8222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " throw new RSRuntimeException(\"Type mismatch with " 8232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << TypeName << "!\");\n"; 8242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "}\n"; 82548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 826b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines} 827b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 8282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrimitiveTypeExportVariable(const RSExportVar *EV) { 829602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 830602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && 831602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of primitive here"); 8329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 8342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(EV->getType()); 8350d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EPT); 8360d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 8379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, EV->getName()); 8399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8405d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines if (EV->isConst()) { 8412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "public final static " << TypeName 8422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << " " RS_EXPORT_VAR_CONST_PREFIX << VarName << " = "; 8435d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val = EV->getInit(); 8442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << RSReflectionBase::genInitValue(Val, EPT->getType() == 8452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet DataTypeBoolean) << ";\n"; 8465d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines } else { 8475d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines // set_*() 8481f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // This must remain synchronized, since multiple Dalvik threads may 8491f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // be calling setters. 8502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 8512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 852bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines if ((EPT->getSize() < 4) || EV->isUnsigned()) { 8531f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // We create/cache a per-type FieldPacker. This allows us to reuse the 8541f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // validation logic (for catching negative inputs from Dalvik, as well 8551f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // as inputs that are too large to be represented in the unsigned type). 856bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // Sub-integer types are also handled specially here, so that we don't 857bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // overwrite bytes accidentally. 8581f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string ElemName = EPT->getElementName(); 8591f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string FPName; 8601f6c331d622ac645ab68a016aa4c577998547373Stephen Hines FPName = RS_FP_PREFIX + ElemName; 8612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" << FPName << "!= null) {\n"; 8622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet incIndentLevel(); 8632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FPName << ".reset();\n"; 8642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet decIndentLevel(); 8652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "} else {\n"; 8662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet incIndentLevel(); 8672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FPName << " = new FieldPacker(" << EPT->getSize() << ");\n"; 8682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet decIndentLevel(); 8692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "}\n"; 8702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 8712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(EPT, "v", FPName.c_str()); 8722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 8732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << FPName << ");\n"; 8741f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 8752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", v);\n"; 8761f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 8779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8781f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Dalvik update comes last, since the input may be invalid (and hence 8791f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // throw an exception). 8802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 881462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 8839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 884462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 8862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 887462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 888462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPointerTypeExportVariable(const RSExportVar *EV) { 8909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 8919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8936e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 8946e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet PointeeType = static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 8970d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 8980d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 90289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 9032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "void", "bind_" + VarName, 1, 9042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 9072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (v == null) bindAllocation(null, " RS_EXPORT_VAR_INDEX_PREFIX 9082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << VarName << ");\n"; 909462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() == RSExportType::ExportClassRecord) 9112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() 9122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "else bindAllocation(v.getAllocation(), " RS_EXPORT_VAR_INDEX_PREFIX 9132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << VarName << ");\n"; 9149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 9152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "else bindAllocation(v, " RS_EXPORT_VAR_INDEX_PREFIX << VarName 9162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ");\n"; 917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 921462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genVectorTypeExportVariable(const RSExportVar *EV) { 9246e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 9256e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 9269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9270d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 9280d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 9299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 9312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genSetExportVariable(TypeName, EV); 9322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 9332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 935462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genMatrixTypeExportVariable(const RSExportVar *EV) { 9376e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 9386e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 93992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ET = EV->getType(); 9410d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 9420d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 94392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 94592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 94692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 94792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 9480d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 9492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 9502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 9512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 95292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 9542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 9552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 9562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << FieldPackerName << ");\n"; 95792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 95992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 96092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 9622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 96392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 96492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 965602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 9662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genConstantArrayTypeExportVariable(const RSExportVar *EV) { 967602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 968602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassConstantArray) && 969602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of constant array here"); 9702e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 9710d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 9720d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 9732e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 9742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 9752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genSetExportVariable(TypeName, EV); 9762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 9772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 9782e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 9792e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 9802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genRecordTypeExportVariable(const RSExportVar *EV) { 9816e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 9826e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 9839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9840d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 9850d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 9869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPrivateExportVariable(TypeName, VarName); 9882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genSetExportVariable(TypeName, EV); 9892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetExportVariable(TypeName, VarName); 9902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genGetFieldID(VarName); 9910d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 9920d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines 9932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPrivateExportVariable(const std::string &TypeName, 994602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 9952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private " << TypeName << " " RS_EXPORT_VAR_PREFIX << VarName 9962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ";\n"; 9970d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 9989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genSetExportVariable(const std::string &TypeName, 1000602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 10019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 10020d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 10030d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 10040d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const RSExportType *ET = EV->getType(); 10052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + VarName, 1, 10062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TypeName.c_str(), "v"); 10072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 10089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (genCreateFieldPacker(ET, FieldPackerName)) 10102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ET, "v", FieldPackerName); 1011a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 1012a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) { 1013a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // Legacy apps must use the old setVar() without Element/dim components. 10142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 10152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << FieldPackerName << ");\n"; 1016a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } else { 1017a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // We only have support for one-dimensional array reflection today, 1018a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // but the entry point (i.e. setVar()) takes an array of dimensions. 10192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "int []__dimArr = new int[1];\n"; 10202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "__dimArr[0] = " << ET->getSize() << ";\n"; 10212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 10222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << FieldPackerName << ", " RS_ELEM_PREFIX << ET->getElementName() 10232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ", __dimArr);\n"; 1024a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 10251ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 10262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 10279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 10289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetExportVariable(const std::string &TypeName, 1031602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 10322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 1033462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return " RS_EXPORT_VAR_PREFIX << VarName << ";\n"; 1035462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 103728d60bc2da19821af82d983902c3c78c078343c3Stephen Hines} 103828d60bc2da19821af82d983902c3c78c078343c3Stephen Hines 10392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genGetFieldID(const std::string &VarName) { 104028d60bc2da19821af82d983902c3c78c078343c3Stephen Hines // We only generate getFieldID_*() for non-Pointer (bind) types. 1041b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 10422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, "Script.FieldID", "getFieldID_" + VarName, 10432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 0); 1044b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 10452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return createFieldID(" << RS_EXPORT_VAR_INDEX_PREFIX << VarName 10462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ", null);\n"; 1047b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 10482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1049b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 10509c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10519c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 10539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genCreateFieldPacker(const RSExportType *ET, 1055602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 1056c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t AllocSize = ET->getAllocSize(); 10579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 10582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 10592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << AllocSize << ");\n"; 10609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 10619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 10629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 10639c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10649c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genPackVarOfType(const RSExportType *ET, 1066602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName, 1067602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 10689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 10692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 10702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 10712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << "." 10722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << GetPackerAPIName(static_cast<const RSExportPrimitiveType *>(ET)) 10732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "(" << VarName << ");\n"; 10742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 10752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 10762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 10772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Must reflect as type Allocation in Java 10782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 10792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 10802e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) 10822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());\n"; 10832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 10842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << ".addI32(" << VarName 10852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ".getAllocation().getPtr());\n"; 10862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 10872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 10882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 10892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << ".addMatrix(" << VarName << ");\n"; 10902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 10912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 10922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 10932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 10942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 10952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 10962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): more elegant way. Currently, we obtain the unique index 10972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // variable (this method involves recursive call which means 10982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we may have more than one level loop, therefore we can't 10992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // always use the same index variable name here) name given 11002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // in the for-loop from counting the '.' in @VarName. 11012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Level = 0; 11022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t LastDotPos = 0; 11032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 11042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet while (LastDotPos != std::string::npos) { 11062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 11072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Level++; 11082e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 11092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string IndexVarName("ct"); 11102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet IndexVarName.append(llvm::utostr_32(Level)); 1111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "for (int " << IndexVarName << " = 0; " << IndexVarName << " < " 11132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ECAT->getSize() << "; " << IndexVarName << "++)"; 11142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 1115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[" + IndexVarName + "]"); 11172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ECAT->getElementType(), ElementVarName.c_str(), 11182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldPackerName); 1119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 11212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 11242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType *ERT = static_cast<const RSExportRecordType *>(ET); 11252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Relative pos from now on in field packer 11262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Pos = 0; 11272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 11292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 11302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 11312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType::Field *F = *I; 11322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string FieldName; 11332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldOffset = F->getOffsetInParent(); 11342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *T = F->getType(); 11352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldStoreSize = T->getStoreSize(); 11362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldAllocSize = T->getAllocSize(); 11372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (VarName != NULL) 11392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = VarName + ("." + F->getName()); 11402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 11412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = F->getName(); 1142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (FieldOffset > Pos) 11442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) 11452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ");\n"; 1146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), FieldName.c_str(), FieldPackerName); 1148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There is padding in the field type 11502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (FieldAllocSize > FieldStoreSize) 11512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << ".skip(" 11522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << (FieldAllocSize - FieldStoreSize) << ");\n"; 11532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Pos = FieldOffset + FieldAllocSize; 1155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 11562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There maybe some padding after the struct 11582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ERT->getAllocSize() > Pos) 11592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << FieldPackerName << ".skip(" << ERT->getAllocSize() - Pos 11602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ");\n"; 11612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 11649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 11659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genAllocateVarOfType(const RSExportType *T, 1168602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 11692e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 11702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 11712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type like int in Java has its own storage once it's declared. 11722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // 11732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // FIXME: Should we allocate storage for RS object? 11742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 11752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 11762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 11792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Pointer type is an instance of Allocation or a TypeClass whose value is 11802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expected to be assigned by programmer later in Java program. Therefore 11812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we don't reflect things like [VarName] = new Allocation(); 11822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << VarName << " = null;\n"; 11832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 11862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 11872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(T); 11882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ElementType = ECAT->getElementType(); 11892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << VarName << " = new " << GetTypeName(ElementType) << "[" 11912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ECAT->getSize() << "];\n"; 11922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type element doesn't need allocation code. 11942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 11952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "for (int $ct = 0; $ct < " << ECAT->getSize() << "; " 11962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "$ct++)"; 11972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 11982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 11992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 12002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[$ct]"); 12012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(ElementType, ElementVarName); 12022e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 12042e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 12062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 12072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 12082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 12092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 12102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 12112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 12122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 12132e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12142e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 12152e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferIfNull(const char *Index) { 12172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME 12182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet " == null) " RS_TYPE_ITEM_BUFFER_NAME " = " 12192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "new " RS_TYPE_ITEM_CLASS_NAME 12202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "[getType().getX() /* count */];\n"; 12219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (Index != NULL) 12222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME "[" << Index 12232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "] == null) " RS_TYPE_ITEM_BUFFER_NAME "[" << Index 12242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "] = " 12252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "new " RS_TYPE_ITEM_CLASS_NAME "();\n"; 12269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferPackerIfNull() { 12292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 12302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet " == null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 12312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 12322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ".sizeof * getType().getX()/* count */" 12332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ");\n"; 1234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 12372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::genTypeClass(const RSExportRecordType *ERT, 1238602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 1239a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines std::string ClassName = ERT->getElementName(); 12402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string superClassName = getRSPackageName(); 1241f69e1e58cf65555c4be3f6c5c53f89eb044f1db5Tim Murray superClassName += RS_TYPE_CLASS_SUPER_CLASS_NAME; 12429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!startClass(AM_Public, false, ClassName, superClassName.c_str(), 12442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg)) 12459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 12469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12474cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 12484cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 12492e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeItemClass(ERT); 12509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 12522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private " RS_TYPE_ITEM_CLASS_NAME " " RS_TYPE_ITEM_BUFFER_NAME 12532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "[]" 12542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ";\n"; 12552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private FieldPacker " RS_TYPE_ITEM_BUFFER_PACKER_NAME ";\n"; 12562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "private static " 12572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "java.lang.ref.WeakReference<Element> " RS_TYPE_ELEMENT_REF_NAME 12582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet " = new java.lang.ref.WeakReference<Element>(null);\n"; 12592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 12602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassConstructor(ERT); 12612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArrayLocal(ERT); 12622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyToArray(ERT); 12632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemSetter(ERT); 12642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassItemGetter(ERT); 12652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentSetter(ERT); 12662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassComponentGetter(ERT); 12672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassCopyAll(ERT); 126882754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines if (!mRSContext->isCompatLib()) { 126982754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines // Skip the resize method if we are targeting a compatibility library. 12702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genTypeClassResize(); 127182754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines } 12729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endClass(); 12749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet resetFieldIndex(); 12762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet clearFieldIndexMap(); 127766aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 12789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 12799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeItemClass(const RSExportRecordType *ERT) { 12822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "static public class " RS_TYPE_ITEM_CLASS_NAME; 12832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 12849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "public static final int sizeof = " << ERT->getAllocSize() 12862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ";\n"; 12879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 12892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << "\n"; 12909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 12912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 12922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 12932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 12942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ";\n"; 12959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 12969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 12982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << "\n"; 12992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_CLASS_NAME "()"; 13002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 13019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 13032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 13042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 13059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 13062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAllocateVarOfType(F->getType(), F->getName()); 13079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 13089e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 13099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 13102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 1311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 13132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 1314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassConstructor(const RSExportRecordType *ERT) { 13179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 13189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Element", "createElement", 1, "RenderScript", 13202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 1321381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1322e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // TODO(all): Fix weak-refs + multi-context issue. 13232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << "Element e = " << RS_TYPE_ELEMENT_REF_NAME 13242968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << ".get();\n"; 13252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << "if (e != null) return e;\n"; 13262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genBuildElement("eb", ERT, RenderScriptVar, /* IsInline = */ true); 13272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return eb.create();\n"; 13282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << "e = eb.create();\n"; 13292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << RS_TYPE_ELEMENT_REF_NAME 13302968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << " = new java.lang.ref.WeakReference<Element>(e);\n"; 13312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // indent() << "return e;\n"; 13322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 13339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1334381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // private with element 13352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, NULL, getClassName(), 1, "RenderScript", 13362e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 13372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_NAME " = null;\n"; 13382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = null;\n"; 13392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 13402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1341381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1342381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D without usage 13432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, NULL, getClassName(), 2, "RenderScript", 13442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count"); 13459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13462e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_NAME " = null;\n"; 13472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = null;\n"; 13482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 13499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 13502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "init(" << RenderScriptVar << ", count);\n"; 13512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 13529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1353381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D with usage 13542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, false, NULL, getClassName(), 3, "RenderScript", 13552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar, "int", "count", "int", "usages"); 135691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 13572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_NAME " = null;\n"; 13582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = null;\n"; 13592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 136091fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 13612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "init(" << RenderScriptVar << ", count, usages);\n"; 13622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 136391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 1364381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D with usage 13652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 3, 13662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", 13672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 13682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << getClassName() << " obj = new " << getClassName() << "(" 13692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << RenderScriptVar << ");\n"; 13702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "obj.mAllocation = Allocation.createSized(" 13712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "rs, obj.mElement, dimX, usages);\n"; 13722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return obj;\n"; 13732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1374381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1375381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D without usage 13762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create1D", 2, 13772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX"); 13782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return create1D(" << RenderScriptVar 13792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ", dimX, Allocation.USAGE_SCRIPT);\n"; 13802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1381381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1382381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D without usage 13832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 3, 13842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY"); 13852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return create2D(" << RenderScriptVar 13862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ", dimX, dimY, Allocation.USAGE_SCRIPT);\n"; 13872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1388381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1389381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D with usage 13902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "create2D", 4, 13912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "dimX", "int", "dimY", 13922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "usages"); 13932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 13942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << getClassName() << " obj = new " << getClassName() << "(" 13952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << RenderScriptVar << ");\n"; 13962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Type.Builder b = new Type.Builder(rs, obj.mElement);\n"; 13972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "b.setX(dimX);\n"; 13982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "b.setY(dimY);\n"; 13992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Type t = b.create();\n"; 14002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 14012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return obj;\n"; 14022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1403381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1404381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createTypeBuilder 14052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, "Type.Builder", "createTypeBuilder", 1, 14062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar); 14072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Element e = createElement(" << RenderScriptVar << ");\n"; 14082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return new Type.Builder(rs, e);\n"; 14092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1410381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1411381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createCustom with usage 14122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Public, true, getClassName().c_str(), "createCustom", 3, 14132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "RenderScript", RenderScriptVar, "Type.Builder", "tb", "int", 14142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "usages"); 14152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << getClassName() << " obj = new " << getClassName() << "(" 14162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << RenderScriptVar << ");\n"; 14172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Type t = tb.create();\n"; 14182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (t.getElement() != obj.mElement) {\n"; 14192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << " throw new RSIllegalArgumentException(" 14202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "\"Type.Builder did not match expected element type.\");\n"; 14212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "}\n"; 14222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 14232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return obj;\n"; 14242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 14259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyToArray(const RSExportRecordType *ERT) { 14282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArray", 2, 14292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index"); 14309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 14322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 14332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".reset(index * " RS_TYPE_ITEM_CLASS_NAME ".sizeof);\n"; 14349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "copyToArrayLocal(i, " RS_TYPE_ITEM_BUFFER_PACKER_NAME ");\n"; 143638eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 14372e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 143838eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk} 143938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 1440602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 14412e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassCopyToArrayLocal(const RSExportRecordType *ERT) { 14422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_Private, false, "void", "copyToArrayLocal", 2, 14432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "FieldPacker", "fp"); 144438eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 14452e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(ERT, "i", "fp"); 14469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14472e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 14489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1449462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14502e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemSetter(const RSExportRecordType *ERT) { 14512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set", 3, 14522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index", "boolean", 14532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "copyNow"); 14542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferIfNull(NULL); 14552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_NAME "[index] = i;\n"; 14569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (copyNow) "; 14582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 14599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "copyToArray(i, index);\n"; 14612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "FieldPacker fp = new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 14622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ".sizeof);\n"; 14632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "copyToArrayLocal(i, fp);\n"; 14642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mAllocation.setFromFieldPacker(index, fp);\n"; 14659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 14672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 14689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 14709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1471462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemGetter(const RSExportRecordType *ERT) { 14732e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, RS_TYPE_ITEM_CLASS_NAME, "get", 1, 14742e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 14752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) return null;\n"; 14762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return " RS_TYPE_ITEM_BUFFER_NAME "[index];\n"; 14772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1478462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1480602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 14812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentSetter(const RSExportRecordType *ERT) { 14829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 1483602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 1484602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 14859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 14869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 1487c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t FieldStoreSize = F->getType()->getStoreSize(); 14882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet unsigned FieldIndex = getFieldIndex(F); 14899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "set_" + F->getName(), 14912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 3, "int", "index", GetTypeName(F->getType()).c_str(), "v", 14922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "boolean", "copyNow"); 14932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferPackerIfNull(); 14942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genNewItemBufferIfNull("index"); 14952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_NAME "[index]." << F->getName() 14962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << " = v;\n"; 1497462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (copyNow) "; 14992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 15002dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 15019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldOffset > 0) 15022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 15032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".reset(index * " RS_TYPE_ITEM_CLASS_NAME ".sizeof + " << FieldOffset 15042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ");\n"; 15059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 15062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 15072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".reset(index * " RS_TYPE_ITEM_CLASS_NAME ".sizeof);\n"; 15082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 1509462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize << ");\n"; 15112e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genPackVarOfType(F->getType(), "v", "fp"); 15122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 15132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ", fp);\n"; 1514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 15162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 1517462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 15199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 15209c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 15219c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 1522602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 15232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentGetter(const RSExportRecordType *ERT) { 15249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 1525602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 1526602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 15279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 15282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, 15292e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet GetTypeName(F->getType()).c_str(), "get_" + F->getName(), 1, 15302e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "int", "index"); 15312e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) return " 15322e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << GetTypeNullValue(F->getType()) << ";\n"; 15332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return " RS_TYPE_ITEM_BUFFER_NAME "[index]." << F->getName() 15342e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ";\n"; 15352e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 15369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 15379c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 15389b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 15392e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyAll(const RSExportRecordType *ERT) { 15402e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "copyAll", 0); 1541462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15422e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "for (int ct = 0; ct < " RS_TYPE_ITEM_BUFFER_NAME ".length; ct++)" 15432e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet " copyToArray(" RS_TYPE_ITEM_BUFFER_NAME "[ct], ct);\n"; 15442e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() 15452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "mAllocation.setFromFieldPacker(0, " RS_TYPE_ITEM_BUFFER_PACKER_NAME 15462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ");\n"; 1547462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15482e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1550462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassResize() { 15522e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startFunction(AM_PublicSynchronized, false, "void", "resize", 1, "int", 15532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "newSize"); 15542e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 15552e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (mItemArray != null) "; 15562e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet startBlock(); 15572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "int oldSize = mItemArray.length;\n"; 15582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "int copySize = Math.min(oldSize, newSize);\n"; 15592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (newSize == oldSize) return;\n"; 15602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Item ni[] = new Item[newSize];\n"; 15612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);\n"; 15622e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mItemArray = ni;\n"; 15632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endBlock(); 15642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "mAllocation.resize(newSize);\n"; 15652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 15662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 15672e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet " != null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 15682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 15692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ".sizeof * getType().getX()/* count */" 15702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ");\n"; 15712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 15722e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet endFunction(); 1573d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 1574d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 15759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 1576462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 15782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::genBuildElement(const char *ElementBuilderName, 1579602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT, 1580602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *RenderScriptVar, 1581602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet bool IsInline) { 15822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "Element.Builder " << ElementBuilderName << " = " 15832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet "new Element.Builder(" 15842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << RenderScriptVar << ");\n"; 1585462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 15872e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAddElementToElementBuilder(ERT, "", ElementBuilderName, RenderScriptVar, 15882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* ArraySize = */ 0); 1589462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 159089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (!IsInline) 15912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << "return " << ElementBuilderName << ".create();" << std::endl; 1592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1593462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define EB_ADD(x) \ 15952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet do { \ 15962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet indent() << ElementBuilderName << ".add(" << x << ", \"" << VarName \ 15972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << "\""; \ 15982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ArraySize > 0) \ 15992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ", " << ArraySize; \ 16002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << ");\n"; \ 16012e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet incFieldIndex(); \ 16022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } while (false) 16039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1604602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genAddElementToElementBuilder( 16052e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportType *ET, const std::string &VarName, 1606602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *ElementBuilderName, const char *RenderScriptVar, 1607602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet unsigned ArraySize) { 160847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines std::string ElementConstruct = GetBuiltinElementConstruct(ET); 16099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 161047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (ElementConstruct != "") { 16119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 16129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 16139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((ET->getClass() == RSExportType::ExportClassPrimitive) || 16142e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang (ET->getClass() == RSExportType::ExportClassVector)) { 16159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 16162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 161747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines const char *DataTypeName = 161847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines RSExportPrimitiveType::getRSReflectionType(EPT)->rs_type; 16192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Size = 16202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet (ET->getClass() == RSExportType::ExportClassVector) 16212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ? static_cast<const RSExportVectorType *>(ET)->getNumElement() 16222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet : 1; 16239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 162447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (EPT->getClass() == RSExportType::ExportClassPrimitive) { 162547aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines // Element.createUser() 16262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet EB_ADD("Element.createUser(" << RenderScriptVar << ", Element.DataType." 162747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines << DataTypeName << ")"); 162847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines } else { 162947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassVector) && 163047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines "Unexpected type."); 163147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines EB_ADD("Element.createVector(" << RenderScriptVar 16322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ", Element.DataType." << DataTypeName 16332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ", " << Size << ")"); 16349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 163592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#ifndef NDEBUG 16369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 16379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 16389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 16396e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 164092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 164192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 164292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 16436e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 164492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#endif 16452e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassConstantArray) { 16462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 16472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 16482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 164989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 165089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 16512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAddElementToElementBuilder(ECAT->getElementType(), VarName, 16522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementBuilderName, RenderScriptVar, 165389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ECAT->getSize()); 165489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 165589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 165689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 165789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 16582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genBuildElement(NewElementBuilderName.c_str(), 16592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ElementType), 166089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 16612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* IsInline = */ true); 166289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ArraySize = ECAT->getSize(); 166389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 166489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 16659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassRecord) { 16669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 16679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 16686315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 16696315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 16709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 16712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 16722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Pos = 0; // relative pos from now on 16739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 16752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 16762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 16779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 16789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName; 16799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 1680c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet const RSExportType *T = F->getType(); 1681c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldStoreSize = T->getStoreSize(); 1682c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldAllocSize = T->getAllocSize(); 16839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 16859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 16869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 16879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 16889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 16902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAddPaddingToElementBuilder((FieldOffset - Pos), ElementBuilderName, 16912e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 16929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 16942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet addFieldIndexMapping(F); 169589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 16962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAddElementToElementBuilder(F->getType(), FieldName, 16972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementBuilderName, RenderScriptVar, 0); 169889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 169989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 170089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 170189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 17022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genBuildElement(NewElementBuilderName.c_str(), 17032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(F->getType()), 170489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 17052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* IsInline = */ true); 170689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 17072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const std::string &VarName = FieldName; // Hack for EB_ADD macro 170889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 170989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 17109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1711a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 1712a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // There is padding within the field type. This is only necessary 1713a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // for HC-targeted APIs. 17142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAddPaddingToElementBuilder(FieldAllocSize - FieldStoreSize, 17151ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines ElementBuilderName, RenderScriptVar); 1716a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 17179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 17199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1720bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 17219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 1722c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t RecordAllocSize = ERT->getAllocSize(); 17230a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 17242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet genAddPaddingToElementBuilder(RecordAllocSize - Pos, ElementBuilderName, 17252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet RenderScriptVar); 17269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 17276e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 1728b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 17299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1731462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1732602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 17332e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc BrouilletRSReflectionJava::genAddPaddingToElementBuilder(int PaddingSize, 17341ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines const char *ElementBuilderName, 17351ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines const char *RenderScriptVar) { 1736602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet unsigned ArraySize = 0; // Hack the EB_ADD macro 17379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 17382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &VarName = createPaddingField(); 17399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 174089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U32(" << RenderScriptVar << ")"); 17419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 17429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 174389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U16(" << RenderScriptVar << ")"); 17449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 17459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 174689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U8(" << RenderScriptVar << ")"); 17479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 1748462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 17499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1752462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 17539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 1754462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1755602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::reflect(const std::string &OutputPathBase, 1756602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &OutputPackageName, 1757602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &RSPackageName, 1758602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &InputFileName, 1759602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &OutputBCFileName, 1760602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet bool EmbedBitcodeInJava) { 17619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ResourceId = ""; 1762a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines std::string PaddingPrefix = ""; 1763a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines 1764a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 1765a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines PaddingPrefix = "#padding_"; 1766a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } else { 1767a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines PaddingPrefix = "#rs_padding_"; 1768a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 1769462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(OutputBCFileName, ResourceId)) 17719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1772462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ResourceId.empty()) 17749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ResourceId = "<Resource ID>"; 1775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet slangAssert(!OutputPackageName.empty() && OutputPackageName != "-"); 1777462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mVerbose = true; 17792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mOutputPathBase = OutputPathBase; 17802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mInputFileName = InputFileName; 17812e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mPackageName = OutputPackageName; 17822e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mRSPackageName = RSPackageName; 17832e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mResourceId = ResourceId; 17842e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mPaddingPrefix = PaddingPrefix; 17852e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mLicenseNote = ApacheLicenseNote; 17862e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mEmbedBitcodeInJava = EmbedBitcodeInJava; 1787462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17882e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet clear(); 17892e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet resetFieldIndex(); 17902e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet clearFieldIndexMap(); 1791462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17922e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string ErrorMsg, ScriptClassName; 17932e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // class ScriptC_<ScriptName> 17942e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!GetClassNameFromFileName(InputFileName, ScriptClassName)) 17952e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 1796462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (ScriptClassName.empty()) 17982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ScriptClassName = "<Input Script Name>"; 1799d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 18002e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 1801462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18022e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (mRSContext->getLicenseNote() != NULL) { 18032e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet setLicenseNote(*(mRSContext->getLicenseNote())); 18042e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet } 18054cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 18062e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!genScriptClass(ScriptClassName, ErrorMsg)) { 18072e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::cerr << "Failed to generate class " << ScriptClassName << " (" 18082e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ErrorMsg << ")\n"; 18092e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 18102e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet } 18119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18122e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mGeneratedFileNames->push_back(ScriptClassName); 18139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18142e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet // class ScriptField_<TypeName> 18152e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet for (RSContext::const_export_type_iterator 18162e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI = mRSContext->export_types_begin(), 18172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TE = mRSContext->export_types_end(); 18182e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet TI != TE; TI++) { 18192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportType *ET = TI->getValue(); 18202e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 18212e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (ET->getClass() == RSExportType::ExportClassRecord) { 18222e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const RSExportRecordType *ERT = 18232e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 18242e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet 18252e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!ERT->isArtificial() && !genTypeClass(ERT, ErrorMsg)) { 18262e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::cerr << "Failed to generate type class for struct '" 18272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet << ERT->getName() << "' (" << ErrorMsg << ")\n"; 18282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 18299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1830462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 18319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1832462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1834462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1835462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet/************************** RSReflectionJava::Context 18372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet * **************************/ 18382e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletconst char *const RSReflectionJava::ApacheLicenseNote = 1839462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 18409d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines " * Copyright (C) 2011-2013 The Android Open Source Project\n" 18419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 18439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * you may not use this file except in compliance with the License.\n" 18449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * You may obtain a copy of the License at\n" 18459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 18479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 18499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 18509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or " 18519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "implied.\n" 18529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * See the License for the specific language governing permissions and\n" 18539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * limitations under the License.\n" 18549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " */\n" 18559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "\n"; 18569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::openClassFile(const std::string &ClassName, 18582e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string &ErrorMsg) { 18592e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mOF.clear(); 18602e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string Path = RSSlangReflectUtils::ComputePackagedPath( 18612e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mOutputPathBase.c_str(), mPackageName.c_str()); 18628c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18632e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!SlangUtils::CreateDirectoryWithParents(Path, &ErrorMsg)) 18642e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 18658c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18662e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string ClassFile = Path + OS_PATH_SEPARATOR_STR + ClassName + ".java"; 18678c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18682e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mOF.open(ClassFile.c_str()); 18692e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet if (!mOF.good()) { 18702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ErrorMsg = "failed to open file '" + ClassFile + "' for write"; 18712e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet return false; 18728c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 18738c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return true; 18748c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang} 18758c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18762e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletconst char *RSReflectionJava::AccessModifierStr(AccessModifier AM) { 18779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 18782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Public: 18792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public"; 18802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Protected: 18822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "protected"; 18832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Private: 18852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "private"; 18862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_PublicSynchronized: 18882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public synchronized"; 18892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 18912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ""; 18922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 18939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::startClass(AccessModifier AM, bool IsStatic, 18972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &ClassName, 18982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *SuperClassName, 18992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet std::string &ErrorMsg) { 19009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mVerbose) 19012968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet std::cout << "Generating " << ClassName << ".java ...\n"; 19029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19038c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 19048c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!openClassFile(ClassName, ErrorMsg)) 19058c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 19068c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // License 19089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << mLicenseNote; 19099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Notice of generated file 19112968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "/*\n"; 19122968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " * This file is auto-generated. DO NOT MODIFY!\n"; 19132e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet out() << " * The source Renderscript file: " << SanitizeString(mInputFileName) 19142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "\n"; 19152968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " */\n"; 19169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 19189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mPackageName.empty()) 19192968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "package " << mPackageName << ";\n"; 19202968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "\n"; 19219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 19232968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "import " << mRSPackageName << ".*;\n"; 192444d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines if (getEmbedBitcodeInJava()) { 192544d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines out() << "import " << mPackageName << "." 192644d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines << RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 19272e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mInputFileName.c_str()) << ";\n"; 192844d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } else { 19292968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "import android.content.res.Resources;\n"; 193044d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 19312968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "\n"; 19329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 19349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 19352968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "/**\n"; 19362968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " * @hide\n"; 19372968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " */\n"; 19389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 19409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ClassName; 19419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (SuperClassName != NULL) 19429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " extends " << SuperClassName; 19439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 19459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 19479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19512e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endClass() { 19529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 19532e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet mOF.close(); 19549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 1955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1956462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19572e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startBlock(bool ShouldIndent) { 19589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ShouldIndent) 19592968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet indent() << "{\n"; 19609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 19612968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " {\n"; 19629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao incIndentLevel(); 1963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1964462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19652e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endBlock() { 19669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao decIndentLevel(); 19672968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet indent() << "}\n\n"; 1968462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1969462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19702e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startTypeClass(const std::string &ClassName) { 19719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "public static class " << ClassName; 19729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 1973462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19752e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endTypeClass() { endBlock(); } 1976462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19772e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 19782e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 19792e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, int Argc, 19802e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet ...) { 19819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 19829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 19839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 1984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19856315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 19862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgType = va_arg(vl, const char *); 19872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgName = va_arg(vl, const char *); 1988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19896315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 19909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 19919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 1992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 1994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19962e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::startFunction(AccessModifier AM, bool IsStatic, 19972e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const char *ReturnType, 19982e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const std::string &FunctionName, 19992e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouillet const ArgTy &Args) { 20009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 20019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 20029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 20042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); I != E; I++) { 20059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 20069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ", "; 20079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 20089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 2009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << I->first << " " << I->second; 20119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ")"; 20149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 2015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20172e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletvoid RSReflectionJava::endFunction() { endBlock(); } 2018e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 20192e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForElement(const std::string &TypeName) { 20201f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mTypesToCheck.find(TypeName) == mTypesToCheck.end()) { 20211f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mTypesToCheck.insert(TypeName); 20221f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 20231f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 20241f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 20251f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 20261f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 20271f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 20282e205d071c86981a8dd301a8612d17b251b3b973Jean-Luc Brouilletbool RSReflectionJava::addTypeNameForFieldPacker(const std::string &TypeName) { 20291f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mFieldPackerTypes.find(TypeName) == mFieldPackerTypes.end()) { 20301f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mFieldPackerTypes.insert(TypeName); 20311f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 20321f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 20331f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 20341f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 20351f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 20361f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 20372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang 2038