slang_rs_reflection.cpp revision 1ce012a517e37bdc63493c7fb2aaee19b6361f92
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 **********************/ 272602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::genScriptClass(Context &C, const std::string &ClassName, 273602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 274602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet if (!C.startClass(Context::AM_Public, false, ClassName, 275602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet RS_SCRIPT_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genScriptClassConstructor(C); 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++) 2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genExportVariable(C, *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++) 2924a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines genExportForEach(C, *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++) 3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genExportFunction(C, *I); 3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endClass(); 3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 307602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genScriptClassConstructor(Context &C) { 3084c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines std::string className(RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 3094c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines C.getInputRSFile().c_str())); 310d2936939ec10879e25746322db60071f79f28c1bStephen Hines // Provide a simple way to reference this object. 311d2936939ec10879e25746322db60071f79f28c1bStephen Hines C.indent() << "private static final String " RS_RESOURCE_NAME " = \"" 3122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << C.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). 3162968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "// Constructor\n"; 3172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 1, 318d2936939ec10879e25746322db60071f79f28c1bStephen Hines "RenderScript", "rs"); 31944d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines 32044d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines if (C.getEmbedBitcodeInJava()) { 3214c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call new single argument Java-only constructor 3222968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "super(rs,\n"; 3232968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " " << RS_RESOURCE_NAME ",\n"; 3242968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " " << className << ".getBitCode32(),\n"; 3254c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // TODO(srhines): Replace the extra BitCode32 with Bitcode64 here! 3262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // C.indent() << " " << className << ".getBitCode64());\n"; 3272968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.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. 3312968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "this(rs,\n"; 3322968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " rs.getApplicationContext().getResources(),\n"; 3334c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines C.indent() << " rs.getApplicationContext().getResources()." 3342968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet "getIdentifier(\n"; 3352968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " " RS_RESOURCE_NAME ", \"raw\",\n"; 3362968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " rs.getApplicationContext().getPackageName()));\n"; 3374c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines C.endFunction(); 3384c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines 3394c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Alternate constructor (legacy) with 3 original parameters. 3402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 3, 3412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "RenderScript", "rs", "Resources", "resources", "int", 3422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "id"); 3434c8b659edc8dca50ffb9c172258412fc1e02b80dStephen Hines // Call constructor of super class 3442968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "super(rs, resources, id);\n"; 34544d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 346b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 347b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // If an exported variable has initial value, reflect it 348b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 349b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 3502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = mRSContext->export_vars_end(); 3512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 352b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams const RSExportVar *EV = *I; 353d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines if (!EV->getInit().isUninit()) { 354b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit()); 355d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } else if (EV->getArraySize()) { 356d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines // Always create an initial zero-init array object. 357d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = new " 358d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines << GetTypeName(EV->getType(), false) << "[" 3592968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << EV->getArraySize() << "];\n"; 360d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines size_t NumInits = EV->getNumInits(); 361d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines const RSExportConstantArrayType *ECAT = 3622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(EV->getType()); 363d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines const RSExportType *ET = ECAT->getElementType(); 364d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines for (size_t i = 0; i < NumInits; i++) { 365d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines std::stringstream Name; 366d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines Name << EV->getName() << "[" << i << "]"; 367d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines genInitExportVariable(C, ET, Name.str(), EV->getInitArray(i)); 368d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } 369d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines } 370a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_TARGET_API) { 371a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines genTypeInstance(C, EV->getType()); 372a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 3731f6c331d622ac645ab68a016aa4c577998547373Stephen Hines genFieldPackerInstance(C, EV->getType()); 374b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams } 375b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 37648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines for (RSContext::const_export_foreach_iterator 37748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I = mRSContext->export_foreach_begin(), 37848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines E = mRSContext->export_foreach_end(); 3792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 38048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportForEach *EF = *I; 38148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 38248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *IET = EF->getInType(); 38348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (IET) { 384a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines genTypeInstanceFromPointer(C, IET); 38548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 38648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *OET = EF->getOutType(); 38748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (OET) { 388a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines genTypeInstanceFromPointer(C, OET); 38948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 39048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 39148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 392b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams C.endFunction(); 393b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 39448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines for (std::set<std::string>::iterator I = C.mTypesToCheck.begin(), 39548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines E = C.mTypesToCheck.end(); 3962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 3972968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "private Element " RS_ELEM_PREFIX << *I << ";\n"; 39848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 39948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 4001f6c331d622ac645ab68a016aa4c577998547373Stephen Hines for (std::set<std::string>::iterator I = C.mFieldPackerTypes.begin(), 4011f6c331d622ac645ab68a016aa4c577998547373Stephen Hines E = C.mFieldPackerTypes.end(); 4022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 4032968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "private FieldPacker " RS_FP_PREFIX << *I << ";\n"; 4041f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 4059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 407602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genInitBoolExportVariable(Context &C, 408602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName, 409602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const clang::APValue &Val) { 4106e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 4112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert((Val.getKind() == clang::APValue::Int) && 4122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "Bool type has wrong initial APValue"); 413462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4162968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << ((Val.getInt().getSExtValue() == 0) ? "false" : "true") << ";\n"; 417462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 419602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genInitPrimitiveExportVariable( 420602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet Context &C, const std::string &VarName, const clang::APValue &Val) { 4215d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 4225d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines 4235d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 4242968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << RSReflectionBase::genInitValue(Val) << ";\n"; 42548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 42648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 427602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genInitExportVariable(Context &C, const RSExportType *ET, 428602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName, 429602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const clang::APValue &Val) { 4306e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 4319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 4332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 4342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportPrimitiveType *EPT = 4352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 4362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (EPT->getType() == DataTypeBoolean) { 4372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genInitBoolExportVariable(C, VarName, Val); 4382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } else { 4392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genInitPrimitiveExportVariable(C, VarName, Val); 440324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 4412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 4422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 4442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (!Val.isInt() || Val.getInt().getSExtValue() != 0) 4452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::cout << "Initializer which is non-NULL to pointer type variable " 4462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "will be ignored\n"; 4472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 4482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 4502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportVectorType *EVT = static_cast<const RSExportVectorType *>(ET); 4512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet switch (Val.getKind()) { 4522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Int: 4532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Float: { 4542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (unsigned i = 0; i < EVT->getNumElement(); i++) { 4552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Name = VarName + "." + GetVectorAccessor(i); 4562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genInitPrimitiveExportVariable(C, Name, Val); 4572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 4599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 4602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Vector: { 4612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::stringstream VecName; 4622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix 4632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EVT->getNumElement(); 4642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " 4652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << VecName.str() << "();\n"; 4662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 4672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned NumElements = std::min( 4682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<unsigned>(EVT->getNumElement()), Val.getVectorLength()); 4692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (unsigned i = 0; i < NumElements; i++) { 4702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const clang::APValue &ElementVal = Val.getVectorElt(i); 4712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Name = VarName + "." + GetVectorAccessor(i); 4722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genInitPrimitiveExportVariable(C, Name, ElementVal); 4739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 4749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 475324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 4762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::MemberPointer: 4772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Uninitialized: 4782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::ComplexInt: 4792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::ComplexFloat: 4802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::LValue: 4812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Array: 4822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Struct: 4832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::Union: 4842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case clang::APValue::AddrLabelDiff: { 4852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unexpected type of value of initializer."); 4862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 4892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 4902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): Resolving initializer of a record (and matrix) type variable 4912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // is complex. It cannot obtain by just simply evaluating the initializer 4922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expression. 4932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 4942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 4952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 4969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#if 0 4979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned InitIndex = 0; 4986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 4996315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 500462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5016e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Vector) && 5026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type of initializer for record type variable"); 503462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName 505a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines << " = new " << ERT->getElementName() 5062968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << "." RS_TYPE_ITEM_CLASS_NAME"();\n"; 507462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 5099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 5109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 5119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 5129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 5139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName = VarName + "." + F->getName(); 514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (InitIndex > Val.getVectorLength()) 5169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 517462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, 5199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName, 5209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorElt(InitIndex++)); 5219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 5229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif 5232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet slangAssert(false && "Unsupported initializer for record/matrix/constant " 5242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "array type variable currently"); 5252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 5289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 529462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 530462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 531602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genExportVariable(Context &C, const RSExportVar *EV) { 5329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 533462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 534ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "private final static int " RS_EXPORT_VAR_INDEX_PREFIX 5352968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << EV->getName() << " = " << C.getNextExportVarSlot() << ";\n"; 536462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 5382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 5392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genPrimitiveTypeExportVariable(C, EV); 5402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 5432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genPointerTypeExportVariable(C, EV); 5442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 5472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genVectorTypeExportVariable(C, EV); 5482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 5512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genMatrixTypeExportVariable(C, EV); 5522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 5552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genConstantArrayTypeExportVariable(C, EV); 5562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 5592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genRecordTypeExportVariable(C, EV); 5602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 5612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 5622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 5639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 564462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 565462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 566602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genExportFunction(Context &C, const RSExportFunc *EF) { 567ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "private final static int " RS_EXPORT_FUNC_INDEX_PREFIX 5682968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << EF->getName() << " = " << C.getNextExportFuncSlot() << ";\n"; 5699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // invoke_*() 5719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context::ArgTy Args; 5729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5730da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang if (EF->hasParam()) { 5740da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang for (RSExportFunc::const_param_iterator I = EF->params_begin(), 5752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = EF->params_end(); 5762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 5772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Args.push_back( 5782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::make_pair(GetTypeName((*I)->getType()), (*I)->getName())); 5790da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang } 5809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 5819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5822ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, "void", 5832ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "invoke_" + EF->getName(/*Mangle=*/false), 5842ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // We are using un-mangled name since Java 5852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // supports method overloading. 5869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Args); 5879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EF->hasParam()) { 5892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "invoke(" RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() 5902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ");\n"; 5919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 5929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = EF->getParamPacketType(); 5939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 5949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 5969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 5979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 598ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "invoke(" RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " 5992968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << FieldPackerName << ");\n"; 6009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 6039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 604462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 605602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genExportForEach(Context &C, const RSExportForEach *EF) { 606c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines if (EF->isDummyRoot()) { 607c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines // Skip reflection for dummy root() kernels. Note that we have to 608c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines // advance the next slot number for ForEach, however. 609ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "//private final static int " RS_EXPORT_FOREACH_INDEX_PREFIX 6102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EF->getName() << " = " << C.getNextExportForEachSlot() 6112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ";\n"; 612c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines return; 613c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines } 614c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines 615ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "private final static int " RS_EXPORT_FOREACH_INDEX_PREFIX 6162968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << EF->getName() << " = " << C.getNextExportForEachSlot() << ";\n"; 617593a894650e81be54173106ec266f0311cebebd3Stephen Hines 618b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines // forEach_*() 619593a894650e81be54173106ec266f0311cebebd3Stephen Hines Context::ArgTy Args; 620593a894650e81be54173106ec266f0311cebebd3Stephen Hines 6219ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines slangAssert(EF->getNumParameters() > 0 || EF->hasReturn()); 622593a894650e81be54173106ec266f0311cebebd3Stephen Hines 623b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn()) 624b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines Args.push_back(std::make_pair("Allocation", "ain")); 6259ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasOut() || EF->hasReturn()) 626593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair("Allocation", "aout")); 627b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 628b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportRecordType *ERT = EF->getParamPacketType(); 629b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 630b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines for (RSExportForEach::const_param_iterator I = EF->params_begin(), 6312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = EF->params_end(); 6322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 6332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Args.push_back( 6342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::make_pair(GetTypeName((*I)->getType()), (*I)->getName())); 635593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 636593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 637593a894650e81be54173106ec266f0311cebebd3Stephen Hines 638b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray const RSExportType *IET = EF->getInType(); 639b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray const RSExportType *OET = EF->getOutType(); 640b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 641b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 6422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int signature = 0; 6432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, "Script.KernelID", 6442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "getKernelID_" + EF->getName(), 0); 645b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 6462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (IET) 6472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet signature |= 1; 6482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (OET) 6492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet signature |= 2; 650b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 6512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO: add element checking 6522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "return createKernelID(" << RS_EXPORT_FOREACH_INDEX_PREFIX 6532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << EF->getName() << ", " << signature << ", null, null);\n"; 654b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 6552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.endFunction(); 656b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 657b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 65850974740c0c5c52dd766264139a01702fbc138afStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_MR2_TARGET_API) { 6592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, "void", 6602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "forEach_" + EF->getName(), Args); 66150974740c0c5c52dd766264139a01702fbc138afStephen Hines 66250974740c0c5c52dd766264139a01702fbc138afStephen Hines C.indent() << "forEach_" << EF->getName(); 66350974740c0c5c52dd766264139a01702fbc138afStephen Hines C.out() << "("; 66450974740c0c5c52dd766264139a01702fbc138afStephen Hines 66550974740c0c5c52dd766264139a01702fbc138afStephen Hines if (EF->hasIn()) { 66650974740c0c5c52dd766264139a01702fbc138afStephen Hines C.out() << "ain, "; 66750974740c0c5c52dd766264139a01702fbc138afStephen Hines } 66850974740c0c5c52dd766264139a01702fbc138afStephen Hines 66950974740c0c5c52dd766264139a01702fbc138afStephen Hines if (EF->hasOut() || EF->hasReturn()) { 67050974740c0c5c52dd766264139a01702fbc138afStephen Hines C.out() << "aout, "; 67150974740c0c5c52dd766264139a01702fbc138afStephen Hines } 67250974740c0c5c52dd766264139a01702fbc138afStephen Hines 67350974740c0c5c52dd766264139a01702fbc138afStephen Hines if (EF->hasUsrData()) { 67450974740c0c5c52dd766264139a01702fbc138afStephen Hines C.out() << Args.back().second << ", "; 67550974740c0c5c52dd766264139a01702fbc138afStephen Hines } 67650974740c0c5c52dd766264139a01702fbc138afStephen Hines 67750974740c0c5c52dd766264139a01702fbc138afStephen Hines // No clipped bounds to pass in. 6782968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << "null);\n"; 67950974740c0c5c52dd766264139a01702fbc138afStephen Hines 68050974740c0c5c52dd766264139a01702fbc138afStephen Hines C.endFunction(); 68150974740c0c5c52dd766264139a01702fbc138afStephen Hines 68250974740c0c5c52dd766264139a01702fbc138afStephen Hines // Add the clipped kernel parameters to the Args list. 68350974740c0c5c52dd766264139a01702fbc138afStephen Hines Args.push_back(std::make_pair("Script.LaunchOptions", "sc")); 68450974740c0c5c52dd766264139a01702fbc138afStephen Hines } 68550974740c0c5c52dd766264139a01702fbc138afStephen Hines 6862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, "void", "forEach_" + EF->getName(), 687593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args); 688593a894650e81be54173106ec266f0311cebebd3Stephen Hines 689b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (IET) { 690b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines genTypeCheck(C, IET, "ain"); 691b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 692b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (OET) { 693b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines genTypeCheck(C, OET, "aout"); 694593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 695593a894650e81be54173106ec266f0311cebebd3Stephen Hines 6969ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasIn() && (EF->hasOut() || EF->hasReturn())) { 6972968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "// Verify dimensions\n"; 6982968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Type tIn = ain.getType();\n"; 6992968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Type tOut = aout.getType();\n"; 7002968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "if ((tIn.getCount() != tOut.getCount()) ||\n"; 7012968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " (tIn.getX() != tOut.getX()) ||\n"; 7022968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " (tIn.getY() != tOut.getY()) ||\n"; 7032968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " (tIn.getZ() != tOut.getZ()) ||\n"; 7042968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " (tIn.hasFaces() != tOut.hasFaces()) ||\n"; 7052968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << " (tIn.hasMipmaps() != tOut.hasMipmaps())) {\n"; 70648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << " throw new RSRuntimeException(\"Dimension mismatch " 7072968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << "between input and output parameters!\");\n"; 7082968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "}\n"; 709593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 710593a894650e81be54173106ec266f0311cebebd3Stephen Hines 711b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines std::string FieldPackerName = EF->getName() + "_fp"; 712b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 713b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) { 714b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 715b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 716b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 717ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "forEach(" RS_EXPORT_FOREACH_INDEX_PREFIX << EF->getName(); 718b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 719b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn()) 720b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", ain"; 721b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 722b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", null"; 723b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 7249ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines if (EF->hasOut() || EF->hasReturn()) 725b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", aout"; 726b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 727b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", null"; 728b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 729b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasUsrData()) 730b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", " << FieldPackerName; 731b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 732b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", null"; 733b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 73450974740c0c5c52dd766264139a01702fbc138afStephen Hines if (mRSContext->getTargetAPI() >= SLANG_JB_MR2_TARGET_API) { 7352968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << ", sc);\n"; 73650974740c0c5c52dd766264139a01702fbc138afStephen Hines } else { 7372968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << ");\n"; 73850974740c0c5c52dd766264139a01702fbc138afStephen Hines } 739b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 740593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.endFunction(); 741593a894650e81be54173106ec266f0311cebebd3Stephen Hines} 742593a894650e81be54173106ec266f0311cebebd3Stephen Hines 743602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstanceFromPointer(Context &C, 744602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportType *ET) { 74548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 7469ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For pointer parameters to original forEach kernels. 74748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 7482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 749a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines genTypeInstance(C, EPT->getPointeeType()); 7509ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines } else { 7519ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines // For handling pass-by-value kernel parameters. 7529ca96e70657cf5437a294213f56ba4768dc08ad2Stephen Hines genTypeInstance(C, ET); 753a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 754a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines} 75548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 756602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeInstance(Context &C, const RSExportType *ET) { 757a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines switch (ET->getClass()) { 7582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 7592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 7602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 7612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 7622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (C.addTypeNameForElement(TypeName)) { 7632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << RS_ELEM_PREFIX << TypeName << " = Element." << TypeName 7642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "(rs);\n"; 765a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 7662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 76848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 7692ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 7702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ClassName = ET->getElementName(); 7712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (C.addTypeNameForElement(ClassName)) { 7722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << RS_ELEM_PREFIX << ClassName << " = " << ClassName 7732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ".createElement(rs);\n"; 77448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 7752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 777a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 7782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 7792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 78048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 78148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 78248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 783602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genFieldPackerInstance(Context &C, 784602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportType *ET) { 7851f6c331d622ac645ab68a016aa4c577998547373Stephen Hines switch (ET->getClass()) { 7862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 7872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 7882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: 7892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 7902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string TypeName = ET->getElementName(); 7912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.addTypeNameForFieldPacker(TypeName); 7922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 7941f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 7952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 7962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 7971f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 7981f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 7991f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 800602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeCheck(Context &C, const RSExportType *ET, 801602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName) { 8022968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "// check " << VarName << "\n"; 80348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 80448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 80548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 8062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET); 80748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 80848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 80948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 81048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName; 81148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 81248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 8132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 8142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 8152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 8162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TypeName = ET->getElementName(); 8172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 8182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 81948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 8202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 8212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 82248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 82348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 82448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (!TypeName.empty()) { 82548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "if (!" << VarName 826a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines << ".getType().getElement().isCompatible(" RS_ELEM_PREFIX 8272968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << TypeName << ")) {\n"; 82848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << " throw new RSRuntimeException(\"Type mismatch with " 8292968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << TypeName << "!\");\n"; 8302968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "}\n"; 83148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 832b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines} 833b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 834602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genPrimitiveTypeExportVariable(Context &C, 835602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 836602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 837602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && 838602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of primitive here"); 8399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 8412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(EV->getType()); 8420d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EPT); 8430d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 8449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8450d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPrivateExportVariable(C, TypeName, EV->getName()); 8469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8475d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines if (EV->isConst()) { 8485d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines C.indent() << "public final static " << TypeName 8490d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines << " " RS_EXPORT_VAR_CONST_PREFIX << VarName << " = "; 8505d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val = EV->getInit(); 8512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.out() << RSReflectionBase::genInitValue( 8522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Val, EPT->getType() == DataTypeBoolean) << ";\n"; 8535d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines } else { 8545d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines // set_*() 8551f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // This must remain synchronized, since multiple Dalvik threads may 8561f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // be calling setters. 8572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, "void", 8582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "set_" + VarName, 1, TypeName.c_str(), "v"); 859bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines if ((EPT->getSize() < 4) || EV->isUnsigned()) { 8601f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // We create/cache a per-type FieldPacker. This allows us to reuse the 8611f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // validation logic (for catching negative inputs from Dalvik, as well 8621f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // as inputs that are too large to be represented in the unsigned type). 863bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // Sub-integer types are also handled specially here, so that we don't 864bcae1fe692a8c5d9225a9699a932380b5659a735Stephen Hines // overwrite bytes accidentally. 8651f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string ElemName = EPT->getElementName(); 8661f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::string FPName; 8671f6c331d622ac645ab68a016aa4c577998547373Stephen Hines FPName = RS_FP_PREFIX + ElemName; 8682968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "if (" << FPName << "!= null) {\n"; 8691f6c331d622ac645ab68a016aa4c577998547373Stephen Hines C.incIndentLevel(); 8702968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << FPName << ".reset();\n"; 8711f6c331d622ac645ab68a016aa4c577998547373Stephen Hines C.decIndentLevel(); 8722968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "} else {\n"; 8731f6c331d622ac645ab68a016aa4c577998547373Stephen Hines C.incIndentLevel(); 8742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FPName << " = new FieldPacker(" << EPT->getSize() << ");\n"; 8751f6c331d622ac645ab68a016aa4c577998547373Stephen Hines C.decIndentLevel(); 8762968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "}\n"; 8771f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 8781f6c331d622ac645ab68a016aa4c577998547373Stephen Hines genPackVarOfType(C, EPT, "v", FPName.c_str()); 8792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 8802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << FPName << ");\n"; 8811f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 882ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName 8832968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ", v);\n"; 8841f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 8859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8861f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Dalvik update comes last, since the input may be invalid (and hence 8871f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // throw an exception). 8882968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 8919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8930d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genGetExportVariable(C, TypeName, VarName); 89428d60bc2da19821af82d983902c3c78c078343c3Stephen Hines genGetFieldID(C, VarName); 895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 897602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genPointerTypeExportVariable(Context &C, 898602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 8999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 9009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 9036e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 904462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet PointeeType = static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 9060d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 9070d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 908462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9090d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPrivateExportVariable(C, TypeName, VarName); 910462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 91189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 9122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, "void", "bind_" + VarName, 1, 913d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName.c_str(), "v"); 914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9152968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 9162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() 9172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "if (v == null) bindAllocation(null, " RS_EXPORT_VAR_INDEX_PREFIX 9182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << VarName << ");\n"; 919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() == RSExportType::ExportClassRecord) 9212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() 9222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "else bindAllocation(v.getAllocation(), " RS_EXPORT_VAR_INDEX_PREFIX 9232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << VarName << ");\n"; 9249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 925ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "else bindAllocation(v, " RS_EXPORT_VAR_INDEX_PREFIX 9262968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << VarName << ");\n"; 927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9300d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genGetExportVariable(C, TypeName, VarName); 931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 932462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 933602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genVectorTypeExportVariable(Context &C, 934602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 9356e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 9366e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 9379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9380d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 9390d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 9409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9410d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPrivateExportVariable(C, TypeName, VarName); 9420d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genSetExportVariable(C, TypeName, EV); 9430d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genGetExportVariable(C, TypeName, VarName); 94428d60bc2da19821af82d983902c3c78c078343c3Stephen Hines genGetFieldID(C, VarName); 945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 946462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 947602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genMatrixTypeExportVariable(Context &C, 948602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 9496e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 9506e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 95192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ET = EV->getType(); 9530d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(ET); 9540d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 95592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9560d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPrivateExportVariable(C, TypeName, VarName); 95792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 95892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 95992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 9600d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 9612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, "void", 9622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "set_" + VarName, 1, TypeName.c_str(), "v"); 9632968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 96492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9650d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines if (genCreateFieldPacker(C, ET, FieldPackerName)) 9660d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPackVarOfType(C, ET, "v", FieldPackerName); 967ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 9682968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << FieldPackerName << ");\n"; 96992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 97092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.endFunction(); 97192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 97292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 9730d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genGetExportVariable(C, TypeName, VarName); 97428d60bc2da19821af82d983902c3c78c078343c3Stephen Hines genGetFieldID(C, VarName); 97592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 97692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 977602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 978602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc BrouilletRSReflectionJava::genConstantArrayTypeExportVariable(Context &C, 979602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 980602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet slangAssert( 981602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet (EV->getType()->getClass() == RSExportType::ExportClassConstantArray) && 982602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "Variable should be type of constant array here"); 9832e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 9840d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 9850d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 9862e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 9870d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPrivateExportVariable(C, TypeName, VarName); 9880d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genSetExportVariable(C, TypeName, EV); 9890d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genGetExportVariable(C, TypeName, VarName); 99028d60bc2da19821af82d983902c3c78c078343c3Stephen Hines genGetFieldID(C, VarName); 9912e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 9922e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 993602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genRecordTypeExportVariable(Context &C, 994602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 9956e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 9966e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 9979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9980d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string TypeName = GetTypeName(EV->getType()); 9990d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 10009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10010d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPrivateExportVariable(C, TypeName, VarName); 10020d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genSetExportVariable(C, TypeName, EV); 10030d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genGetExportVariable(C, TypeName, VarName); 100428d60bc2da19821af82d983902c3c78c078343c3Stephen Hines genGetFieldID(C, VarName); 10050d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 10060d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines 1007602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genPrivateExportVariable(Context &C, 1008602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &TypeName, 1009602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 1010602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.indent() << "private " << TypeName << " " RS_EXPORT_VAR_PREFIX << VarName 1011602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet << ";\n"; 10120d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines} 10139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1014602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genSetExportVariable(Context &C, 1015602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &TypeName, 1016602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportVar *EV) { 10179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 10180d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const char *FieldPackerName = "fp"; 10190d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines std::string VarName = EV->getName(); 10200d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const RSExportType *ET = EV->getType(); 10212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, "void", 10222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "set_" + VarName, 1, TypeName.c_str(), "v"); 10232968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = v;\n"; 10249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10250d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines if (genCreateFieldPacker(C, ET, FieldPackerName)) 10260d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines genPackVarOfType(C, ET, "v", FieldPackerName); 1027a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 1028a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) { 1029a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // Legacy apps must use the old setVar() without Element/dim components. 10302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 10312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << FieldPackerName << ");\n"; 1032a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } else { 1033a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // We only have support for one-dimensional array reflection today, 1034a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines // but the entry point (i.e. setVar()) takes an array of dimensions. 10352968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "int []__dimArr = new int[1];\n"; 10362968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "__dimArr[0] = " << ET->getSize() << ";\n"; 1037ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "setVar(" RS_EXPORT_VAR_INDEX_PREFIX << VarName << ", " 1038a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines << FieldPackerName << ", " RS_ELEM_PREFIX 10392968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ET->getElementName() << ", __dimArr);\n"; 1040a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines } 10411ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 10429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 10439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 10449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1046602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genGetExportVariable(Context &C, 1047602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &TypeName, 1048602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 1049602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, TypeName.c_str(), "get_" + VarName, 10509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 0); 1051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10522968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return " RS_EXPORT_VAR_PREFIX << VarName << ";\n"; 1053462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 105528d60bc2da19821af82d983902c3c78c078343c3Stephen Hines} 105628d60bc2da19821af82d983902c3c78c078343c3Stephen Hines 1057602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genGetFieldID(Context &C, const std::string &VarName) { 105828d60bc2da19821af82d983902c3c78c078343c3Stephen Hines // We only generate getFieldID_*() for non-Pointer (bind) types. 1059b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray if (mRSContext->getTargetAPI() >= SLANG_JB_MR1_TARGET_API) { 10602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, "Script.FieldID", 10612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "getFieldID_" + VarName, 0); 1062b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 106328d60bc2da19821af82d983902c3c78c078343c3Stephen Hines C.indent() << "return createFieldID(" << RS_EXPORT_VAR_INDEX_PREFIX 10642968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << VarName << ", null);\n"; 1065b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray 106628d60bc2da19821af82d983902c3c78c078343c3Stephen Hines C.endFunction(); 1067b81a993cc0fed2dabfb1abc8b23ab9bd1586f201Tim Murray } 10689c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10699c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 10719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1072602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::genCreateFieldPacker(Context &C, const RSExportType *ET, 1073602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 1074c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t AllocSize = ET->getAllocSize(); 10759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 10769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 10772968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << AllocSize << ");\n"; 10789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 10799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 10809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 10819c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10829c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 1083602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genPackVarOfType(Context &C, const RSExportType *ET, 1084602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *VarName, 1085602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *FieldPackerName) { 10869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 10872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: 10882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: { 10892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FieldPackerName << "." 10902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << GetPackerAPIName(static_cast<const RSExportPrimitiveType *>( 10912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ET)) << "(" << VarName << ");\n"; 10922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 10932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 10942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 10952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Must reflect as type Allocation in Java 10962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *PointeeType = 10972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPointerType *>(ET)->getPointeeType(); 10982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (PointeeType->getClass() != RSExportType::ExportClassRecord) 11002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());\n"; 11012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 11022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FieldPackerName << ".addI32(" << VarName 11032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ".getAllocation().getPtr());\n"; 11042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: { 11072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FieldPackerName << ".addMatrix(" << VarName << ");\n"; 11082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 11112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 11122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(ET); 11132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // TODO(zonr): more elegant way. Currently, we obtain the unique index 11152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // variable (this method involves recursive call which means 11162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we may have more than one level loop, therefore we can't 11172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // always use the same index variable name here) name given 11182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // in the for-loop from counting the '.' in @VarName. 11192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Level = 0; 11202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t LastDotPos = 0; 11212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 11222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet while (LastDotPos != std::string::npos) { 11242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 11252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Level++; 11262e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 11272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string IndexVarName("ct"); 11282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet IndexVarName.append(llvm::utostr_32(Level)); 1129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "for (int " << IndexVarName << " = 0; " << IndexVarName 11312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << " < " << ECAT->getSize() << "; " << IndexVarName << "++)"; 11322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startBlock(); 1133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[" + IndexVarName + "]"); 11352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genPackVarOfType(C, ECAT->getElementType(), ElementVarName.c_str(), 11362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldPackerName); 1137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11382ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.endBlock(); 11392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 11422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType *ERT = static_cast<const RSExportRecordType *>(ET); 11432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Relative pos from now on in field packer 11442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet unsigned Pos = 0; 11452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 11472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 11482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 11492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportRecordType::Field *F = *I; 11502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string FieldName; 11512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldOffset = F->getOffsetInParent(); 11522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *T = F->getType(); 11532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldStoreSize = T->getStoreSize(); 11542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet size_t FieldAllocSize = T->getAllocSize(); 11552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (VarName != NULL) 11572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = VarName + ("." + F->getName()); 11582ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet else 11592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FieldName = F->getName(); 1160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (FieldOffset > Pos) 11622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) 11632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ");\n"; 1164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11652ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName); 1166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There is padding in the field type 11682ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (FieldAllocSize > FieldStoreSize) 11696b201eb3306b9609a991728a52ce948974bd4aedStephen Hines C.indent() << FieldPackerName << ".skip(" 11702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << (FieldAllocSize - FieldStoreSize) << ");\n"; 11712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet Pos = FieldOffset + FieldAllocSize; 1173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 11742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 11752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // There maybe some padding after the struct 11762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ERT->getAllocSize() > Pos) 11772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << FieldPackerName << ".skip(" << ERT->getAllocSize() - Pos 11782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ");\n"; 11792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11802ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11812ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: { slangAssert(false && "Unknown class of type"); } 11829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 11839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1185602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genAllocateVarOfType(Context &C, const RSExportType *T, 1186602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &VarName) { 11872e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 11882ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPrimitive: { 11892ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type like int in Java has its own storage once it's declared. 11902ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // 11912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // FIXME: Should we allocate storage for RS object? 11922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 11932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // C.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 11942ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 11952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 11962ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassPointer: { 11972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Pointer type is an instance of Allocation or a TypeClass whose value is 11982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // expected to be assigned by programmer later in Java program. Therefore 11992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // we don't reflect things like [VarName] = new Allocation(); 12002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << VarName << " = null;\n"; 12012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 12022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 12032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassConstantArray: { 12042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportConstantArrayType *ECAT = 12052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportConstantArrayType *>(T); 12062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const RSExportType *ElementType = ECAT->getElementType(); 12072ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 12082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << VarName << " = new " << GetTypeName(ElementType) << "[" 12092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ECAT->getSize() << "];\n"; 12102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 12112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet // Primitive type element doesn't need allocation code. 12122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 12132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "for (int $ct = 0; $ct < " << ECAT->getSize() << "; " 12142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "$ct++)"; 12152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startBlock(); 12162e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string ElementVarName(VarName); 12182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementVarName.append("[$ct]"); 12192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genAllocateVarOfType(C, ElementType, ElementVarName); 12202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.endBlock(); 12222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 12242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 12252ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassVector: 12262ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassMatrix: 12272ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case RSExportType::ExportClassRecord: { 12282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << VarName << " = new " << GetTypeName(T) << "();\n"; 12292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 12302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } 12312e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 12332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 1234602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferIfNull(Context &C, const char *Index) { 1235602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME 1236602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet " == null) " RS_TYPE_ITEM_BUFFER_NAME " = " 1237602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "new " RS_TYPE_ITEM_CLASS_NAME 1238602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "[getType().getX() /* count */];\n"; 12399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (Index != NULL) 12402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME "[" << Index 12412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "] == null) " RS_TYPE_ITEM_BUFFER_NAME "[" << Index 12422ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "] = " 12432ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "new " RS_TYPE_ITEM_CLASS_NAME "();\n"; 12449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1246602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genNewItemBufferPackerIfNull(Context &C) { 12472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 12482ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet " == null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 12492ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 12502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".sizeof * getType().getX()/* count */" 12512ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ");\n"; 1252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 1255602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::genTypeClass(Context &C, const RSExportRecordType *ERT, 1256602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 1257a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines std::string ClassName = ERT->getElementName(); 1258f69e1e58cf65555c4be3f6c5c53f89eb044f1db5Tim Murray std::string superClassName = C.getRSPackageName(); 1259f69e1e58cf65555c4be3f6c5c53f89eb044f1db5Tim Murray superClassName += RS_TYPE_CLASS_SUPER_CLASS_NAME; 12609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12612ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (!C.startClass(Context::AM_Public, false, ClassName, 12622ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet superClassName.c_str(), ErrorMsg)) 12639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 12649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12654cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 12664cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 12672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genTypeItemClass(C, ERT); 12689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 12702ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "private " RS_TYPE_ITEM_CLASS_NAME " " RS_TYPE_ITEM_BUFFER_NAME 12712ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "[]" 12722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ";\n"; 12732ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "private FieldPacker " RS_TYPE_ITEM_BUFFER_PACKER_NAME ";\n"; 12742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "private static " 12752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "java.lang.ref.WeakReference<Element> " RS_TYPE_ELEMENT_REF_NAME 12762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet " = new java.lang.ref.WeakReference<Element>(null);\n"; 12779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassConstructor(C, ERT); 127938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk genTypeClassCopyToArrayLocal(C, ERT); 12809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassCopyToArray(C, ERT); 12819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassItemSetter(C, ERT); 12829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassItemGetter(C, ERT); 12839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassComponentSetter(C, ERT); 12849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassComponentGetter(C, ERT); 12859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassCopyAll(C, ERT); 128682754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines if (!mRSContext->isCompatLib()) { 128782754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines // Skip the resize method if we are targeting a compatibility library. 128882754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines genTypeClassResize(C); 128982754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines } 12909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endClass(); 12929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 129366aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang C.resetFieldIndex(); 129466aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang C.clearFieldIndexMap(); 129566aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 12969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 12979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1299602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeItemClass(Context &C, 1300602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 1301ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "static public class " RS_TYPE_ITEM_CLASS_NAME; 13029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 13039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13042ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "public static final int sizeof = " << ERT->getAllocSize() 13052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ";\n"; 13069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 13082968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << "\n"; 13099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 13102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 13112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 13129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 13132968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ";\n"; 13149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 13159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 13172968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.out() << "\n"; 1318ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << RS_TYPE_ITEM_CLASS_NAME "()"; 13199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 13209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 13222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FE = ERT->fields_end(); 13232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet FI != FE; FI++) { 13249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 13252e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genAllocateVarOfType(C, F->getType(), F->getName()); 13269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 13279e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 13289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 13299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 13329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1335602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassConstructor(Context &C, 1336602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 13379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 13389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, "Element", "createElement", 1, 1340d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "RenderScript", RenderScriptVar); 1341381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1342e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // TODO(all): Fix weak-refs + multi-context issue. 1343e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // C.indent() << "Element e = " << RS_TYPE_ELEMENT_REF_NAME 13442968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << ".get();\n"; 13452968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // C.indent() << "if (e != null) return e;\n"; 13462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genBuildElement(C, "eb", ERT, RenderScriptVar, /* IsInline = */ true); 13472968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return eb.create();\n"; 13482968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // C.indent() << "e = eb.create();\n"; 1349e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines // C.indent() << RS_TYPE_ELEMENT_REF_NAME 13502968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // << " = new java.lang.ref.WeakReference<Element>(e);\n"; 13512968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet // C.indent() << "return e;\n"; 13529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 13539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1354381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // private with element 13552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Private, false, NULL, C.getClassName(), 1, 1356381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams "RenderScript", RenderScriptVar); 13572968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_NAME " = null;\n"; 13582968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = null;\n"; 13592968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 1360381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 1361381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1362381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D without usage 13632ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 2, 13642ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "count"); 13659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13662968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_NAME " = null;\n"; 13672968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = null;\n"; 13682968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 13699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 13702968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "init(" << RenderScriptVar << ", count);\n"; 13719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 13729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1373381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // 1D with usage 13742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 3, 13752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "RenderScript", RenderScriptVar, "int", "count", "int", 13762ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "usages"); 137791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 13782968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_NAME " = null;\n"; 13792968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME " = null;\n"; 13802968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "mElement = createElement(" << RenderScriptVar << ");\n"; 138191fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 13822968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "init(" << RenderScriptVar << ", count, usages);\n"; 138391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.endFunction(); 138491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 1385381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D with usage 13862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, C.getClassName().c_str(), 13872ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "create1D", 3, "RenderScript", RenderScriptVar, "int", "dimX", 1388381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams "int", "usages"); 1389381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.indent() << C.getClassName() << " obj = new " << C.getClassName() << "(" 13902968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << RenderScriptVar << ");\n"; 1391e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines C.indent() << "obj.mAllocation = Allocation.createSized(" 13922968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet "rs, obj.mElement, dimX, usages);\n"; 13932968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return obj;\n"; 1394381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 1395381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1396381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create1D without usage 13972ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, C.getClassName().c_str(), 13982ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "create1D", 2, "RenderScript", RenderScriptVar, "int", 13992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "dimX"); 1400e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines C.indent() << "return create1D(" << RenderScriptVar 14012968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ", dimX, Allocation.USAGE_SCRIPT);\n"; 1402381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 1403381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1404381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D without usage 14052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, C.getClassName().c_str(), 14062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "create2D", 3, "RenderScript", RenderScriptVar, "int", "dimX", 1407381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams "int", "dimY"); 1408e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines C.indent() << "return create2D(" << RenderScriptVar 14092968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ", dimX, dimY, Allocation.USAGE_SCRIPT);\n"; 1410381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 1411381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1412381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // create2D with usage 14132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, C.getClassName().c_str(), 14142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "create2D", 4, "RenderScript", RenderScriptVar, "int", "dimX", 14152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "int", "dimY", "int", "usages"); 1416381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1417381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.indent() << C.getClassName() << " obj = new " << C.getClassName() << "(" 14182968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << RenderScriptVar << ");\n"; 14192968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Type.Builder b = new Type.Builder(rs, obj.mElement);\n"; 14202968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "b.setX(dimX);\n"; 14212968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "b.setY(dimY);\n"; 14222968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Type t = b.create();\n"; 14232968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 14242968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return obj;\n"; 1425381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 1426381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1427381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createTypeBuilder 14282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, "Type.Builder", "createTypeBuilder", 14292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet 1, "RenderScript", RenderScriptVar); 14302968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Element e = createElement(" << RenderScriptVar << ");\n"; 14312968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return new Type.Builder(rs, e);\n"; 1432381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 1433381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams 1434381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams // createCustom with usage 14352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_Public, true, C.getClassName().c_str(), 14362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "createCustom", 3, "RenderScript", RenderScriptVar, 14372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "Type.Builder", "tb", "int", "usages"); 1438381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.indent() << C.getClassName() << " obj = new " << C.getClassName() << "(" 14392968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << RenderScriptVar << ");\n"; 14402968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Type t = tb.create();\n"; 14412968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "if (t.getElement() != obj.mElement) {\n"; 1442e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines C.indent() << " throw new RSIllegalArgumentException(" 14432968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet "\"Type.Builder did not match expected element type.\");\n"; 14442968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "}\n"; 14452968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);\n"; 14462968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return obj;\n"; 1447381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams C.endFunction(); 14489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1449462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1450602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyToArray(Context &C, 1451602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 1452602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.startFunction(Context::AM_Private, false, "void", "copyToArray", 2, 1453602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index"); 14549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferPackerIfNull(C); 14569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 14572ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".reset(index * " RS_TYPE_ITEM_CLASS_NAME ".sizeof);\n"; 14589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "copyToArrayLocal(i, " RS_TYPE_ITEM_BUFFER_PACKER_NAME ");\n"; 146038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 146138eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk C.endFunction(); 146238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk} 146338eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 1464602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 1465602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc BrouilletRSReflectionJava::genTypeClassCopyToArrayLocal(Context &C, 1466602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 1467602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.startFunction(Context::AM_Private, false, "void", "copyToArrayLocal", 2, 1468602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "FieldPacker", "fp"); 146938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk 147038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk genPackVarOfType(C, ERT, "i", "fp"); 14719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 14739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1474462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1475602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemSetter(Context &C, 1476602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 1477602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, "void", "set", 3, 1478602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "i", "int", "index", "boolean", 1479602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "copyNow"); 14809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferIfNull(C, NULL); 14812968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << RS_TYPE_ITEM_BUFFER_NAME "[index] = i;\n"; 14829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if (copyNow) "; 14849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 14859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14862968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "copyToArray(i, index);\n"; 148738eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk C.indent() << "FieldPacker fp = new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 14882968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet ".sizeof);\n"; 14892968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "copyToArrayLocal(i, fp);\n"; 14902968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "mAllocation.setFromFieldPacker(index, fp);\n"; 14919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 14939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 14949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 14969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1497462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1498602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassItemGetter(Context &C, 1499602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 1500602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, 1501602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet RS_TYPE_ITEM_CLASS_NAME, "get", 1, "int", "index"); 15022968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) return null;\n"; 15032968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "return " RS_TYPE_ITEM_BUFFER_NAME "[index];\n"; 15049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 1505462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1506462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1507602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 1508602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentSetter(Context &C, 1509602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 15109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 1511602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 1512602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 15139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 15149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 1515c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t FieldStoreSize = F->getType()->getStoreSize(); 15169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned FieldIndex = C.getFieldIndex(F); 15179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 15182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, "void", 15192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "set_" + F->getName(), 3, "int", "index", 15202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet GetTypeName(F->getType()).c_str(), "v", "boolean", 15212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "copyNow"); 15229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferPackerIfNull(C); 15239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferIfNull(C, "index"); 1524ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << RS_TYPE_ITEM_BUFFER_NAME "[index]." << F->getName() 15252968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << " = v;\n"; 1526462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1527462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if (copyNow) "; 1528462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 15292dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 15309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldOffset > 0) 153192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 15322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".reset(index * " RS_TYPE_ITEM_CLASS_NAME ".sizeof + " << FieldOffset 15332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ");\n"; 15349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 153592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 15362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".reset(index * " RS_TYPE_ITEM_CLASS_NAME ".sizeof);\n"; 15379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 1538462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize 15402ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ");\n"; 15419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), "v", "fp"); 1542a036a8a7186f7c2f088917107f2c854fbd2187b8Jason Sams C.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 15432968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ", fp);\n"; 1544462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 15469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1547462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15489b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao C.endFunction(); 15499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 15509c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 15519c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 1552602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 1553602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc BrouilletRSReflectionJava::genTypeClassComponentGetter(Context &C, 1554602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 15559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 1556602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FE = ERT->fields_end(); 1557602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet FI != FE; FI++) { 15589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 15592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, 15602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet GetTypeName(F->getType()).c_str(), "get_" + F->getName(), 1, 1561d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 1562ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) return " 15632968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << GetTypeNullValue(F->getType()) << ";\n"; 1564ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray C.indent() << "return " RS_TYPE_ITEM_BUFFER_NAME "[index]." << F->getName() 15652968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ";\n"; 15669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 15679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 15689c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 15699b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 1570602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassCopyAll(Context &C, 1571602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT) { 157238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk C.startFunction(Context::AM_PublicSynchronized, false, "void", "copyAll", 0); 1573462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15742ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "for (int ct = 0; ct < " RS_TYPE_ITEM_BUFFER_NAME 15752ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".length; ct++)" 15762968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet " copyToArray(" RS_TYPE_ITEM_BUFFER_NAME "[ct], ct);\n"; 15772ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() 15782ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "mAllocation.setFromFieldPacker(0, " RS_TYPE_ITEM_BUFFER_PACKER_NAME 15792ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ");\n"; 1580462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 1582462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1583462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1584602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genTypeClassResize(Context &C) { 15852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.startFunction(Context::AM_PublicSynchronized, false, "void", "resize", 1, 1586d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "newSize"); 1587d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 15883caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.indent() << "if (mItemArray != null) "; 15893caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.startBlock(); 15902968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "int oldSize = mItemArray.length;\n"; 15912968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "int copySize = Math.min(oldSize, newSize);\n"; 15922968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "if (newSize == oldSize) return;\n"; 15932968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "Item ni[] = new Item[newSize];\n"; 15942968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);\n"; 15952968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "mItemArray = ni;\n"; 15963caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.endBlock(); 15972968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet C.indent() << "mAllocation.resize(newSize);\n"; 1598d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 15992ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME 16002ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet " != null) " RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 16012ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 16022ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ".sizeof * getType().getX()/* count */" 16032ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ");\n"; 1604cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams 1605d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.endFunction(); 1606d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 1607d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 16089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 1609462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 1611602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genBuildElement(Context &C, 1612602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *ElementBuilderName, 1613602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const RSExportRecordType *ERT, 1614602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *RenderScriptVar, 1615602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet bool IsInline) { 1616602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet C.indent() << "Element.Builder " << ElementBuilderName 1617602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet << " = " 1618602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet "new Element.Builder(" << RenderScriptVar << ");\n"; 1619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 16212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genAddElementToElementBuilder(C, ERT, "", ElementBuilderName, RenderScriptVar, 16222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* ArraySize = */ 0); 1623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 162489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (!IsInline) 162589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.indent() << "return " << ElementBuilderName << ".create();" << std::endl; 1626462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1627462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16282ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet#define EB_ADD(x) \ 16292ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet do { \ 16302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.indent() << ElementBuilderName << ".add(" << x << ", \"" << VarName \ 16312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "\""; \ 16322ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet if (ArraySize > 0) \ 16332ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.out() << ", " << ArraySize; \ 16342ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.out() << ");\n"; \ 16352ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet C.incFieldIndex(); \ 16362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet } while (false) 16379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1638602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::genAddElementToElementBuilder( 1639602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet Context &C, const RSExportType *ET, const std::string &VarName, 1640602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *ElementBuilderName, const char *RenderScriptVar, 1641602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet unsigned ArraySize) { 164247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines std::string ElementConstruct = GetBuiltinElementConstruct(ET); 16439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 164447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (ElementConstruct != "") { 16459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 16469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 16479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((ET->getClass() == RSExportType::ExportClassPrimitive) || 16482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang (ET->getClass() == RSExportType::ExportClassVector)) { 16499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 16502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportPrimitiveType *>(ET); 165147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines const char *DataTypeName = 165247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines RSExportPrimitiveType::getRSReflectionType(EPT)->rs_type; 16532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Size = 16542ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet (ET->getClass() == RSExportType::ExportClassVector) 16552ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ? static_cast<const RSExportVectorType *>(ET)->getNumElement() 16562ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet : 1; 16579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 165847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines if (EPT->getClass() == RSExportType::ExportClassPrimitive) { 165947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines // Element.createUser() 16602ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet EB_ADD("Element.createUser(" << RenderScriptVar << ", Element.DataType." 166147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines << DataTypeName << ")"); 166247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines } else { 166347aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassVector) && 166447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines "Unexpected type."); 166547aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines EB_ADD("Element.createVector(" << RenderScriptVar 16662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ", Element.DataType." << DataTypeName 16672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << ", " << Size << ")"); 16689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 166992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#ifndef NDEBUG 16709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 16719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 16729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 16736e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 167492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 167592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 167692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 16776e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 167892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#endif 16792e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassConstantArray) { 16802e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 16812e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 16822e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 168389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 168489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 16852ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genAddElementToElementBuilder(C, ECAT->getElementType(), VarName, 16862ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementBuilderName, RenderScriptVar, 168789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ECAT->getSize()); 168889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 168989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 169089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 169189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 16922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genBuildElement(C, NewElementBuilderName.c_str(), 16932ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ElementType), 169489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 16952ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* IsInline = */ true); 169689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ArraySize = ECAT->getSize(); 169789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 169889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 16999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassRecord) { 17009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 17019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 17026315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 17036315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 17049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 17052ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 17062ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet int Pos = 0; // relative pos from now on 17079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 17092ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet E = ERT->fields_end(); 17102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet I != E; I++) { 17119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 17129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName; 17139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 1714c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet const RSExportType *T = F->getType(); 1715c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldStoreSize = T->getStoreSize(); 1716c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet int FieldAllocSize = T->getAllocSize(); 17179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 17199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 17209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 17219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 17229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 17241ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines genAddPaddingToElementBuilder(C, (FieldOffset - Pos), 17251ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines ElementBuilderName, RenderScriptVar); 17269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 17289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.addFieldIndexMapping(F); 172989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 17302ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genAddElementToElementBuilder(C, F->getType(), FieldName, 17312ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet ElementBuilderName, RenderScriptVar, 0); 173289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 173389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 173489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 173589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 17362ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet genBuildElement(C, NewElementBuilderName.c_str(), 17372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(F->getType()), 173889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 17392ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet /* IsInline = */ true); 174089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 17412ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const std::string &VarName = FieldName; // Hack for EB_ADD macro 174289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 174389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 17449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1745a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 1746a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // There is padding within the field type. This is only necessary 1747a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines // for HC-targeted APIs. 17481ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines genAddPaddingToElementBuilder(C, (FieldAllocSize - FieldStoreSize), 17491ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines ElementBuilderName, RenderScriptVar); 1750a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 17519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 17539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1754bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 17559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 1756c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet size_t RecordAllocSize = ERT->getAllocSize(); 17570a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 17581ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines genAddPaddingToElementBuilder(C, RecordAllocSize - Pos, 17591ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines ElementBuilderName, RenderScriptVar); 17609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 17616e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 1762b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 17639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1764462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1765462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1766602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid 17671ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen HinesRSReflectionJava::genAddPaddingToElementBuilder(Context &C, int PaddingSize, 17681ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines const char *ElementBuilderName, 17691ce012a517e37bdc63493c7fb2aaee19b6361f92Stephen Hines const char *RenderScriptVar) { 1770602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet unsigned ArraySize = 0; // Hack the EB_ADD macro 17719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 17729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName = C.createPaddingField(); 17739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 177489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U32(" << RenderScriptVar << ")"); 17759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 17769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 177789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U16(" << RenderScriptVar << ")"); 17789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 17799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 178089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U8(" << RenderScriptVar << ")"); 17819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 1782462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 17839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1785462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1786462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 17879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 1788462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1789602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::reflect(const std::string &OutputPathBase, 1790602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &OutputPackageName, 1791602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &RSPackageName, 1792602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &InputFileName, 1793602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &OutputBCFileName, 1794602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet bool EmbedBitcodeInJava) { 17959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context *C = NULL; 17969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ResourceId = ""; 1797a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines std::string PaddingPrefix = ""; 1798a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines 1799a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) { 1800a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines PaddingPrefix = "#padding_"; 1801a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } else { 1802a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines PaddingPrefix = "#rs_padding_"; 1803a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines } 1804462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(OutputBCFileName, ResourceId)) 18069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1807462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ResourceId.empty()) 18099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ResourceId = "<Resource ID>"; 1810462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1811b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (OutputPackageName.empty() || OutputPackageName == "-") 1812b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao C = new Context(OutputPathBase, InputFileName, "<Package Name>", 18132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet RSPackageName, ResourceId, PaddingPrefix, true, 18142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet EmbedBitcodeInJava); 18159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1816b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao C = new Context(OutputPathBase, InputFileName, OutputPackageName, 18172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet RSPackageName, ResourceId, PaddingPrefix, false, 18182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet EmbedBitcodeInJava); 1819462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (C != NULL) { 18219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ErrorMsg, ScriptClassName; 18229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // class ScriptC_<ScriptName> 18239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(InputFileName, ScriptClassName)) 18249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1825462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ScriptClassName.empty()) 18279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ScriptClassName = "<Input Script Name>"; 1828462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 1830462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mRSContext->getLicenseNote() != NULL) { 18329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C->setLicenseNote(*(mRSContext->getLicenseNote())); 18339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1834d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 18359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!genScriptClass(*C, ScriptClassName, ErrorMsg)) { 18369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cerr << "Failed to generate class " << ScriptClassName << " (" 18372968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ErrorMsg << ")\n"; 18389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 18399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1840462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18414cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ScriptClassName); 18424cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 18439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // class ScriptField_<TypeName> 18442ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (RSContext::const_export_type_iterator 18452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TI = mRSContext->export_types_begin(), 18469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TE = mRSContext->export_types_end(); 18472ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet TI != TE; TI++) { 18489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = TI->getValue(); 18499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ET->getClass() == RSExportType::ExportClassRecord) { 18519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 18522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet static_cast<const RSExportRecordType *>(ET); 18539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) { 18559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cerr << "Failed to generate type class for struct '" 18562968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet << ERT->getName() << "' (" << ErrorMsg << ")\n"; 18579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1858462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 18599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 18619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1862462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1864462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1865462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18662ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet/************************** RSReflectionJava::Context 18672ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet * **************************/ 1868602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletconst char *const RSReflectionJava::Context::ApacheLicenseNote = 1869462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 18709d234b6c83c9d6baab71433fdecab6bfde34a956Stephen Hines " * Copyright (C) 2011-2013 The Android Open Source Project\n" 18719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 18739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * you may not use this file except in compliance with the License.\n" 18749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * You may obtain a copy of the License at\n" 18759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 18779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 18799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 18809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or " 18819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "implied.\n" 18829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * See the License for the specific language governing permissions and\n" 18839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * limitations under the License.\n" 18849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " */\n" 18859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "\n"; 18869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1887602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::Context::openClassFile(const std::string &ClassName, 1888602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 18898c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!mUseStdout) { 18908c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mOF.clear(); 18912ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet std::string Path = RSSlangReflectUtils::ComputePackagedPath( 18922ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet mOutputPathBase.c_str(), mPackageName.c_str()); 18938c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18948c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!SlangUtils::CreateDirectoryWithParents(Path, &ErrorMsg)) 18958c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 18968c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18978d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael std::string ClassFile = Path + OS_PATH_SEPARATOR_STR + ClassName + ".java"; 18988c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 18998c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mOF.open(ClassFile.c_str()); 19008c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!mOF.good()) { 19018c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang ErrorMsg = "failed to open file '" + ClassFile + "' for write"; 19028c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 19038c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 19048c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 19058c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return true; 19068c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang} 19078c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 1908602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletconst char *RSReflectionJava::Context::AccessModifierStr(AccessModifier AM) { 19099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 19102ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Public: 19112ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public"; 19122ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 19132ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Protected: 19142ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "protected"; 19152ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 19162ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_Private: 19172ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "private"; 19182ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 19192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet case AM_PublicSynchronized: 19202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return "public synchronized"; 19212ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 19222ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet default: 19232ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet return ""; 19242ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet break; 19259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1928602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::Context::startClass(AccessModifier AM, bool IsStatic, 1929602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &ClassName, 1930602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *SuperClassName, 1931602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet std::string &ErrorMsg) { 19329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mVerbose) 19332968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet std::cout << "Generating " << ClassName << ".java ...\n"; 19349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19358c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 19368c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!openClassFile(ClassName, ErrorMsg)) 19378c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 19388c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // License 19409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << mLicenseNote; 19419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Notice of generated file 19432968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "/*\n"; 19442968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " * This file is auto-generated. DO NOT MODIFY!\n"; 19452ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet out() << " * The source Renderscript file: " << SanitizeString(mInputRSFile) 19462ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet << "\n"; 19472968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " */\n"; 19489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 19509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mPackageName.empty()) 19512968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "package " << mPackageName << ";\n"; 19522968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "\n"; 19539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 19552968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "import " << mRSPackageName << ".*;\n"; 195644d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines if (getEmbedBitcodeInJava()) { 195744d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines out() << "import " << mPackageName << "." 195844d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines << RSSlangReflectUtils::JavaBitcodeClassNameFromRSFileName( 19592ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet mInputRSFile.c_str()) << ";\n"; 196044d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } else { 19612968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "import android.content.res.Resources;\n"; 196244d495d2ad8c350a8f586502c9ee8e97a513646aStephen Hines } 19632968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "\n"; 19649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 19669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 19672968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << "/**\n"; 19682968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " * @hide\n"; 19692968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " */\n"; 19709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 19729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ClassName; 19739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (SuperClassName != NULL) 19749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " extends " << SuperClassName; 19759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 19779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 19799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1982462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1983602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::Context::endClass() { 19849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 19859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mUseStdout) 19869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mOF.close(); 19879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 1988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1989462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1990602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::Context::startBlock(bool ShouldIndent) { 19919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ShouldIndent) 19922968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet indent() << "{\n"; 19939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 19942968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet out() << " {\n"; 19959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao incIndentLevel(); 1996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1998602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::Context::endBlock() { 19999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao decIndentLevel(); 20002968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet indent() << "}\n\n"; 2001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2003602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::Context::startTypeClass(const std::string &ClassName) { 20049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "public static class " << ClassName; 20059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 2006462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2007462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20082ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletvoid RSReflectionJava::Context::endTypeClass() { endBlock(); } 2009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2010602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::Context::startFunction(AccessModifier AM, bool IsStatic, 2011602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *ReturnType, 2012602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &FunctionName, 2013602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet int Argc, ...) { 20149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 20159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 20169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 2017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 20192ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgType = va_arg(vl, const char *); 20202ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet const char *ArgName = va_arg(vl, const char *); 2021462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20226315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 20239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 20249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 2025462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 2027462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2029602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletvoid RSReflectionJava::Context::startFunction(AccessModifier AM, bool IsStatic, 2030602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const char *ReturnType, 2031602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const std::string &FunctionName, 2032602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouillet const ArgTy &Args) { 20339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 20349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 20359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 20372ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); I != E; I++) { 20389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 20399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ", "; 20409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 20419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 2042462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << I->first << " " << I->second; 20449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ")"; 20479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 2048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2049462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20502ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletvoid RSReflectionJava::Context::endFunction() { endBlock(); } 2051e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 20522ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouilletbool 20532ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc BrouilletRSReflectionJava::Context::addTypeNameForElement(const std::string &TypeName) { 20541f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mTypesToCheck.find(TypeName) == mTypesToCheck.end()) { 20551f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mTypesToCheck.insert(TypeName); 20561f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 20571f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 20581f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 20591f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 20601f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 20611f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 2062602def74e8afa68b72a1f9391c31d6ff152add53Jean-Luc Brouilletbool RSReflectionJava::Context::addTypeNameForFieldPacker( 20631f6c331d622ac645ab68a016aa4c577998547373Stephen Hines const std::string &TypeName) { 20641f6c331d622ac645ab68a016aa4c577998547373Stephen Hines if (mFieldPackerTypes.find(TypeName) == mFieldPackerTypes.end()) { 20651f6c331d622ac645ab68a016aa4c577998547373Stephen Hines mFieldPackerTypes.insert(TypeName); 20661f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return true; 20671f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } else { 20681f6c331d622ac645ab68a016aa4c577998547373Stephen Hines return false; 20691f6c331d622ac645ab68a016aa4c577998547373Stephen Hines } 20701f6c331d622ac645ab68a016aa4c577998547373Stephen Hines} 20711f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 20722ce118e843fcbd53488b503933136bb4fdbdfbc1Jean-Luc Brouillet} // namespace slang 2073