slang_rs_reflection.cpp revision 593a894650e81be54173106ec266f0311cebebd3
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, 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> 25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <utility> 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/APFloat.h" 2989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang#include "llvm/ADT/StringExtras.h" 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 318d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael#include "os_sep.h" 326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h" 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h" 34593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_export_foreach.h" 356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h" 366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflect_utils.h" 37e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_utils.h" 386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX "ScriptC_" 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC" 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_CLASS_NAME_PREFIX "ScriptField_" 439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME "android.renderscript.Script.FieldBase" 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME "Item" 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME "mItemArray" 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME "mIOBuffer" 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX "mExportVarIdx_" 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_PREFIX "mExportVar_" 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX "mExportFuncIdx_" 54593a894650e81be54173106ec266f0311cebebd3Stephen Hines#define RS_EXPORT_FOREACH_INDEX_PREFIX "mExportForEachIdx_" 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX "mAlloction_" 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_" 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 59e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Some utility function using internal in RSReflection 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic bool GetClassNameFromFileName(const std::string &FileName, 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ClassName) { 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName.clear(); 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FileName.empty() || (FileName == "-")) 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 68462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName = 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RSSlangReflectUtils::JavaClassNameFromRSFileName(FileName.c_str()); 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetPrimitiveTypeName(const RSExportPrimitiveType *EPT) { 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *PrimitiveTypeJavaNameMap[] = { 7791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao "", // RSExportPrimitiveType::DataTypeFloat16 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "float", // RSExportPrimitiveType::DataTypeFloat32 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "double", // RSExportPrimitiveType::DataTypeFloat64 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "byte", // RSExportPrimitiveType::DataTypeSigned8 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "short", // RSExportPrimitiveType::DataTypeSigned16 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "int", // RSExportPrimitiveType::DataTypeSigned32 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "long", // RSExportPrimitiveType::DataTypeSigned64 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "short", // RSExportPrimitiveType::DataTypeUnsigned8 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "int", // RSExportPrimitiveType::DataTypeUnsigned16 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "long", // RSExportPrimitiveType::DataTypeUnsigned32 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "long", // RSExportPrimitiveType::DataTypeUnsigned64 8891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao "boolean", // RSExportPrimitiveType::DataTypeBoolean 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "int", // RSExportPrimitiveType::DataTypeUnsigned565 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "int", // RSExportPrimitiveType::DataTypeUnsigned5551 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "int", // RSExportPrimitiveType::DataTypeUnsigned4444 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "", // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix2x2 9592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "", // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix3x3 9692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "", // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix4x4 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "Element", // RSExportPrimitiveType::DataTypeRSElement 9992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "Type", // RSExportPrimitiveType::DataTypeRSType 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Allocation", // RSExportPrimitiveType::DataTypeRSAllocation 10192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "Sampler", // RSExportPrimitiveType::DataTypeRSSampler 10292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "Script", // RSExportPrimitiveType::DataTypeRSScript 10392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "Mesh", // RSExportPrimitiveType::DataTypeRSMesh 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "ProgramFragment", // RSExportPrimitiveType::DataTypeRSProgramFragment 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "ProgramVertex", // RSExportPrimitiveType::DataTypeRSProgramVertex 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "ProgramRaster", // RSExportPrimitiveType::DataTypeRSProgramRaster 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "ProgramStore", // RSExportPrimitiveType::DataTypeRSProgramStore 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Font", // RSExportPrimitiveType::DataTypeRSFont 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (TypeId < (sizeof(PrimitiveTypeJavaNameMap) / sizeof(const char*))) { 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return PrimitiveTypeJavaNameMap[ EPT->getType() ]; 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1166e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetPrimitiveTypeName : Unknown primitive data type"); 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetVectorTypeName(const RSExportVectorType *EVT) { 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *VectorTypeJavaNameMap[][3] = { 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 0 */ { "Byte2", "Byte3", "Byte4" }, 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 1 */ { "Short2", "Short3", "Short4" }, 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 2 */ { "Int2", "Int3", "Int4" }, 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 3 */ { "Long2", "Long3", "Long4" }, 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 4 */ { "Float2", "Float3", "Float4" }, 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char **BaseElement = NULL; 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (EVT->getType()) { 13291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned8: 13391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao case RSExportPrimitiveType::DataTypeBoolean: { 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao BaseElement = VectorTypeJavaNameMap[0]; 1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeSigned16: 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned8: { 1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao BaseElement = VectorTypeJavaNameMap[1]; 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeSigned32: 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned16: { 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao BaseElement = VectorTypeJavaNameMap[2]; 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeSigned64: 148a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines case RSExportPrimitiveType::DataTypeUnsigned64: 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned32: { 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao BaseElement = VectorTypeJavaNameMap[3]; 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataTypeFloat32: { 1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao BaseElement = VectorTypeJavaNameMap[4]; 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 1586e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "RSReflection::genElementTypeName : Unsupported " 1596e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "vector element data type"); 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1646e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EVT->getNumElement() > 1) && 1656e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines (EVT->getNumElement() <= 4) && 1666e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Number of element in vector type is invalid"); 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return BaseElement[EVT->getNumElement() - 2]; 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changstatic const char *GetMatrixTypeName(const RSExportMatrixType *EMT) { 17292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang static const char *MatrixTypeJavaNameMap[] = { 17392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* 2x2 */ "Matrix2f", 17492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* 3x3 */ "Matrix3f", 17592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* 4x4 */ "Matrix4f", 17692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang }; 17792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang unsigned Dim = EMT->getDim(); 17892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 17992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if ((Dim - 2) < (sizeof(MatrixTypeJavaNameMap) / sizeof(const char*))) 18092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return MatrixTypeJavaNameMap[ EMT->getDim() - 2 ]; 18192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1826e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetMatrixTypeName : Unsupported matrix dimension"); 18392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 18492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 18592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1866e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hinesstatic const char *GetVectorAccessor(unsigned Index) { 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *VectorAccessorMap[] = { 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 0 */ "x", 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 1 */ "y", 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 2 */ "z", 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 3 */ "w", 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 193324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1946e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Index < (sizeof(VectorAccessorMap) / sizeof(const char*))) && 1956e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Out-of-bound index to access vector member"); 196324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return VectorAccessorMap[Index]; 198324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 199324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetPackerAPIName(const RSExportPrimitiveType *EPT) { 2016315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static const char *PrimitiveTypePackerAPINameMap[] = { 20291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao "", // RSExportPrimitiveType::DataTypeFloat16 2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addF32", // RSExportPrimitiveType::DataTypeFloat32 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addF64", // RSExportPrimitiveType::DataTypeFloat64 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI8", // RSExportPrimitiveType::DataTypeSigned8 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI16", // RSExportPrimitiveType::DataTypeSigned16 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI32", // RSExportPrimitiveType::DataTypeSigned32 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI64", // RSExportPrimitiveType::DataTypeSigned64 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU8", // RSExportPrimitiveType::DataTypeUnsigned8 2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned16 2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU32", // RSExportPrimitiveType::DataTypeUnsigned32 2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU64", // RSExportPrimitiveType::DataTypeUnsigned64 21391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao "addBoolean", // RSExportPrimitiveType::DataTypeBoolean 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned565 2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned5551 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned4444 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 219aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk "addMatrix", // RSExportPrimitiveType::DataTypeRSMatrix2x2 220aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk "addMatrix", // RSExportPrimitiveType::DataTypeRSMatrix3x3 221aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk "addMatrix", // RSExportPrimitiveType::DataTypeRSMatrix4x4 2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSElement 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSType 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSAllocation 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSSampler 2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSScript 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSMesh 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramFragment 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramVertex 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramRaster 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramStore 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSFont 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (TypeId < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*))) 2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return PrimitiveTypePackerAPINameMap[ EPT->getType() ]; 2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2406e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetPackerAPIName : Unknown primitive data type"); 2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic std::string GetTypeName(const RSExportType *ET) { 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 2462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 2476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr return GetPrimitiveTypeName( 2486315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportPrimitiveType*>(ET)); 2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType = 2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() != RSExportType::ExportClassRecord) 2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return "Allocation"; 2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName(); 258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET)); 2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 26292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: { 26392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return GetMatrixTypeName(static_cast<const RSExportMatrixType*>(ET)); 2642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 2652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 2662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType* CAT = 2672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType*>(ET); 2682e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string ElementTypeName = GetTypeName(CAT->getElementType()); 2692e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang ElementTypeName.append("[]"); 2702e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return ElementTypeName; 27192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 2736315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + 2746315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "."RS_TYPE_ITEM_CLASS_NAME; 2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 2776e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ""; 282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 284cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liaostatic const char *GetTypeNullValue(const RSExportType *ET) { 285cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao switch (ET->getClass()) { 286cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassPrimitive: { 2871ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang const RSExportPrimitiveType *EPT = 2881ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang static_cast<const RSExportPrimitiveType*>(ET); 2891ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang if (EPT->isRSObjectType()) 290cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "null"; 2911ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang else if (EPT->getType() == RSExportPrimitiveType::DataTypeBoolean) 2921ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang return "false"; 293cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao else 294cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "0"; 295cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao break; 296cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 297cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassPointer: 298cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassVector: 299cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassMatrix: 300cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassConstantArray: 301cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassRecord: { 302cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "null"; 303cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao break; 304cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 305cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao default: { 3066e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 307cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 308cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 309cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return ""; 310cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao} 311cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao 3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetBuiltinElementConstruct(const RSExportType *ET) { 3132e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ET->getClass() == RSExportType::ExportClassPrimitive) { 3146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportPrimitiveType *EPT = 3156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportPrimitiveType*>(ET); 3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getKind() == RSExportPrimitiveType::DataKindUser) { 3179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *PrimitiveBuiltinElementConstructMap[] = { 31889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NULL, // RSExportPrimitiveType::DataTypeFloat16 31989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.F32", // RSExportPrimitiveType::DataTypeFloat32 32089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.F64", // RSExportPrimitiveType::DataTypeFloat64 32189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.I8", // RSExportPrimitiveType::DataTypeSigned8 32289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NULL, // RSExportPrimitiveType::DataTypeSigned16 32389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.I32", // RSExportPrimitiveType::DataTypeSigned32 32489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.I64", // RSExportPrimitiveType::DataTypeSigned64 32589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.U8", // RSExportPrimitiveType::DataTypeUnsigned8 32689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NULL, // RSExportPrimitiveType::DataTypeUnsigned16 32789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.U32", // RSExportPrimitiveType::DataTypeUnsigned32 32889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.U64", // RSExportPrimitiveType::DataTypeUnsigned64 32989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.BOOLEAN", // RSExportPrimitiveType::DataTypeBoolean 3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, // RSExportPrimitiveType::DataTypeUnsigned565 3329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, // RSExportPrimitiveType::DataTypeUnsigned5551 3339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, // RSExportPrimitiveType::DataTypeUnsigned4444 3349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 33592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix2x2 33692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix3x3 33792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix4x4 3389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 33989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.ELEMENT", // RSExportPrimitiveType::DataTypeRSElement 34089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.TYPE", // RSExportPrimitiveType::DataTypeRSType 34189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.ALLOCATION", // RSExportPrimitiveType::DataTypeRSAllocation 34289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.SAMPLER", // RSExportPrimitiveType::DataTypeRSSampler 34389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.SCRIPT", // RSExportPrimitiveType::DataTypeRSScript 34489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.MESH", // RSExportPrimitiveType::DataTypeRSMesh 345e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_FRAGMENT", 346e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramFragment 347e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_VERTEX", 348e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramVertex 349e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_RASTER", 350e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramRaster 351e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_STORE", 352e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramStore 353e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.FONT", 354e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSFont 3559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 3569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 3579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (TypeId < 3599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*))) 3609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return PrimitiveBuiltinElementConstructMap[ EPT->getType() ]; 3619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) { 3629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 36389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.A_8"; 3649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) { 3659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565) 36689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGB_565"; 3679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 36889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGB_888"; 3699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) { 3709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551) 37189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGBA_5551"; 3729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444) 37389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGBA_4444"; 3749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 37589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGBA_8888"; 376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassVector) { 3789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVectorType *EVT = static_cast<const RSExportVectorType*>(ET); 37991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao if (EVT->getKind() == RSExportPrimitiveType::DataKindUser) { 3809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 3819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getNumElement() == 2) 38289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.F32_2"; 3839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EVT->getNumElement() == 3) 38489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.F32_3"; 38591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao else if (EVT->getNumElement() == 4) 38689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.F32_4"; 3879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) { 3889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getNumElement() == 4) 38989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.U8_4"; 3909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 39292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 39392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportMatrixType *EMT = static_cast<const RSExportMatrixType *>(ET); 39492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang switch (EMT->getDim()) { 39589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang case 2: return "Element.MATRIX_2X2"; 39689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang case 3: return "Element.MATRIX_3X3"; 39789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang case 4: return "Element.MATRIX_4X4"; 3986e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines default: slangAssert(false && "Unsupported dimension of matrix"); 39992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 4009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 4019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Treat pointer type variable as unsigned int 4026315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): this is target dependent 40389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.USER_I32"; 4049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 408462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetElementDataKindName(RSExportPrimitiveType::DataKind DK) { 4109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *ElementDataKindNameMap[] = { 4119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.USER", // RSExportPrimitiveType::DataKindUser 4129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_L", // RSExportPrimitiveType::DataKindPixelL 4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_A", // RSExportPrimitiveType::DataKindPixelA 4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_LA", // RSExportPrimitiveType::DataKindPixelLA 4159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_RGB", // RSExportPrimitiveType::DataKindPixelRGB 4169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_RGBA", // RSExportPrimitiveType::DataKindPixelRGBA 4179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 4189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (static_cast<unsigned>(DK) < 4209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (sizeof(ElementDataKindNameMap) / sizeof(const char*))) 4219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ElementDataKindNameMap[ DK ]; 4229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 4239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetElementDataTypeName(RSExportPrimitiveType::DataType DT) { 4279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *ElementDataTypeNameMap[] = { 428e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // RSExportPrimitiveType::DataTypeFloat16 429e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.FLOAT_32", // RSExportPrimitiveType::DataTypeFloat32 430e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.FLOAT_64", // RSExportPrimitiveType::DataTypeFloat64 431e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_8", // RSExportPrimitiveType::DataTypeSigned8 432e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_16", // RSExportPrimitiveType::DataTypeSigned16 433e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_32", // RSExportPrimitiveType::DataTypeSigned32 434e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_64", // RSExportPrimitiveType::DataTypeSigned64 435e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_8", // RSExportPrimitiveType::DataTypeUnsigned8 436e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_16", 437e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeUnsigned16 438e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_32", 439e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeUnsigned32 440e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_64", 441e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeUnsigned64 442e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.BOOLEAN", 443e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeBoolean 44491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao 44591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao // RSExportPrimitiveType::DataTypeUnsigned565 4469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.UNSIGNED_5_6_5", 44791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao // RSExportPrimitiveType::DataTypeUnsigned5551 4489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.UNSIGNED_5_5_5_1", 44991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao // RSExportPrimitiveType::DataTypeUnsigned4444 4509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.UNSIGNED_4_4_4_4", 4519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 45292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // DataTypeRSMatrix* must have been resolved in GetBuiltinElementConstruct() 453e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix2x2 454e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix3x3 455e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix4x4 4569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_ELEMENT", // RSExportPrimitiveType::DataTypeRSElement 4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_TYPE", // RSExportPrimitiveType::DataTypeRSType 4599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSAllocation 4609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_ALLOCATION", 4619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSSampler 4629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_SAMPLER", 4639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSScript 4649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_SCRIPT", 4659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSMesh 4669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_MESH", 4679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramFragment 4689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_FRAGMENT", 4699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramVertex 4709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_VERTEX", 4719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramRaster 4729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_RASTER", 4739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramStore 4749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_STORE", 4759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSFont 4769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_FONT", 4779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 4789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (static_cast<unsigned>(DT) < 4809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (sizeof(ElementDataTypeNameMap) / sizeof(const char*))) 4819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ElementDataTypeNameMap[ DT ]; 4829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 4839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 484462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate script class **********************/ 4879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genScriptClass(Context &C, 4889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 4899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg) { 4909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!C.startClass(Context::AM_Public, 4919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 4929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName, 4939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_SCRIPT_CLASS_SUPER_CLASS_NAME, 4949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ErrorMsg)) 4959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 4969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genScriptClassConstructor(C); 4989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reflect export variable 5009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 5019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = mRSContext->export_vars_end(); 5029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 5039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) 5049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genExportVariable(C, *I); 5059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 506593a894650e81be54173106ec266f0311cebebd3Stephen Hines // Reflect export for each functions 507593a894650e81be54173106ec266f0311cebebd3Stephen Hines for (RSContext::const_export_foreach_iterator 508593a894650e81be54173106ec266f0311cebebd3Stephen Hines I = mRSContext->export_foreach_begin(), 509593a894650e81be54173106ec266f0311cebebd3Stephen Hines E = mRSContext->export_foreach_end(); 510593a894650e81be54173106ec266f0311cebebd3Stephen Hines I != E; I++) 511593a894650e81be54173106ec266f0311cebebd3Stephen Hines genExportForEach(C, *I); 512593a894650e81be54173106ec266f0311cebebd3Stephen Hines 5139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reflect export function 5149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_func_iterator 5159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I = mRSContext->export_funcs_begin(), 5169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = mRSContext->export_funcs_end(); 5179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; I++) 5189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genExportFunction(C, *I); 5199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endClass(); 5219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 5239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 524462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genScriptClassConstructor(Context &C) { 5269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "// Constructor" << std::endl; 5279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 5289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 5299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 5309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.getClassName(), 531b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 3, 532b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams "RenderScript", "rs", 533b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams "Resources", "resources", 534b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams "int", "id"); 535b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // Call constructor of super class 536b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams C.indent() << "super(rs, resources, id);" << std::endl; 537b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 538b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // If an exported variable has initial value, reflect it 539b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 540b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 541b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams E = mRSContext->export_vars_end(); 542b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams I != E; 543b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams I++) { 544b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams const RSExportVar *EV = *I; 545b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams if (!EV->getInit().isUninit()) 546b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit()); 547b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams } 548b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 549b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams C.endFunction(); 550b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 5519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 5529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 553462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genInitBoolExportVariable(Context &C, 5559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 5569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val) { 5576e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 558462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 5606e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Int) && 5616e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Bool type has wrong initial APValue"); 562462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 56392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.out() << ((Val.getInt().getSExtValue() == 0) ? "false" : "true") 56492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << ";" << std::endl; 565324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 5669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 567462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 568462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 569e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genInitPrimitiveExportVariable( 570e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Context &C, 571e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const std::string &VarName, 572e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const clang::APValue &Val) { 5736e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 57448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 5759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 5769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (Val.getKind()) { 5779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Int: { 578050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines llvm::APInt api = Val.getInt(); 579050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines C.out() << api.getSExtValue(); 580050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines if (api.getBitWidth() > 32) { 581050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines C.out() << "L"; 582050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines } 5839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 5849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 5859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Float: { 5869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::APFloat apf = Val.getFloat(); 5879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { 5889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << apf.convertToFloat() << "f"; 5899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 5909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << apf.convertToDouble(); 5919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 5929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 5939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 59448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 5959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexInt: 5969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexFloat: 5979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::LValue: 5989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Vector: { 5996e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && 6006e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Primitive type cannot have such kind of initializer"); 6019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 60248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 6039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 6046e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown kind of initializer"); 6059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << ";" << std::endl; 60848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 6099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 61048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 61148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 6129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genInitExportVariable(Context &C, 6139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 6149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 6159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val) { 6166e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 6179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 6192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 6209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 6219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(ET); 62291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeBoolean) { 6239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitBoolExportVariable(C, VarName, Val); 6249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 6259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, VarName, Val); 6262239ecece40c177e071f56326cd5ef423806394dShih-wei Liao } 6279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 628324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 6299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 6309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!Val.isInt() || Val.getInt().getSExtValue() != 0) 6319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cout << "Initializer which is non-NULL to pointer type variable " 6329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "will be ignored" << std::endl; 6339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 6349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 6369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVectorType *EVT = 6379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportVectorType*>(ET); 6389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (Val.getKind()) { 6399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Int: 6409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Float: { 6412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang for (unsigned i = 0; i < EVT->getNumElement(); i++) { 6429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 6439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, Name, Val); 6449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 64648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 6479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Vector: { 6489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " 6499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << GetVectorTypeName(EVT) << "();" << std::endl; 6509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned NumElements = 6529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::min(static_cast<unsigned>(EVT->getNumElement()), 6539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorLength()); 6549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (unsigned i = 0; i < NumElements; i++) { 6559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &ElementVal = Val.getVectorElt(i); 6569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 6579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, Name, ElementVal); 6589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 660324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 6619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Uninitialized: 6629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexInt: 6639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexFloat: 6649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::LValue: { 6656e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unexpected type of value of initializer."); 666324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 6679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 6689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 669324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 67092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // TODO(zonr): Resolving initializer of a record (and matrix) type variable 67192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // is complex. It cannot obtain by just simply evaluating the initializer 67292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // expression. 67392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: 6742e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: 6759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 6769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#if 0 6779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned InitIndex = 0; 6786315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 6796315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 680462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6816e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Vector) && 6826e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type of initializer for record type variable"); 683462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName 6859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << " = new "RS_TYPE_CLASS_NAME_PREFIX << ERT->getName() 6869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << "."RS_TYPE_ITEM_CLASS_NAME"();" << std::endl; 687462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 6899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 6909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 6919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 6929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 6939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName = VarName + "." + F->getName(); 694462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (InitIndex > Val.getVectorLength()) 6969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 697462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, 6999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName, 7009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorElt(InitIndex++)); 7019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif 7036e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unsupported initializer for record/matrix/constant " 7046e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "array type variable currently"); 7059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 7079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 7086e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 7099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 713462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genExportVariable(Context &C, const RSExportVar *EV) { 7159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 716462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX 7189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << " = " << C.getNextExportVarSlot() << ";" 7199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 7222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 7239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPrimitiveTypeExportVariable(C, EV); 7249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 725462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 7269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 7279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPointerTypeExportVariable(C, EV); 7289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 729462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 7309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 7319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genVectorTypeExportVariable(C, EV); 7329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 7339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 73492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: { 73592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang genMatrixTypeExportVariable(C, EV); 73692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang break; 73792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 7382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 7392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genConstantArrayTypeExportVariable(C, EV); 7402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 7412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 7429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 7439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genRecordTypeExportVariable(C, EV); 7449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 745c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 7469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 7476e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 7489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 752462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 753462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genExportFunction(Context &C, const RSExportFunc *EF) { 7559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX 7569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" 7579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 7589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // invoke_*() 7609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context::ArgTy Args; 7619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7620da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang if (EF->hasParam()) { 7630da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang for (RSExportFunc::const_param_iterator I = EF->params_begin(), 7640da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang E = EF->params_end(); 7650da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang I != E; 7660da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang I++) { 7670da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang Args.push_back(std::make_pair(GetTypeName((*I)->getType()), 7680da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang (*I)->getName())); 7690da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang } 7709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 7739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 7749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 7753fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao "invoke_" + EF->getName(/*Mangle=*/ false), 7763fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao // We are using un-mangled name since Java 7773fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao // supports method overloading. 7789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Args); 7799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EF->hasParam()) { 7819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" 7829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 7839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 7849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = EF->getParamPacketType(); 7859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 7869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 7889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 7899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " 7919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << FieldPackerName << ");" << std::endl; 7929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 7959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 7969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 797462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 798593a894650e81be54173106ec266f0311cebebd3Stephen Hinesvoid RSReflection::genExportForEach(Context &C, const RSExportForEach *EF) { 799593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.indent() << "private final static int "RS_EXPORT_FOREACH_INDEX_PREFIX 800593a894650e81be54173106ec266f0311cebebd3Stephen Hines << EF->getName() << " = " << C.getNextExportForEachSlot() << ";" 801593a894650e81be54173106ec266f0311cebebd3Stephen Hines << std::endl; 802593a894650e81be54173106ec266f0311cebebd3Stephen Hines 803593a894650e81be54173106ec266f0311cebebd3Stephen Hines // for_each_*() 804593a894650e81be54173106ec266f0311cebebd3Stephen Hines Context::ArgTy Args; 805593a894650e81be54173106ec266f0311cebebd3Stephen Hines 806593a894650e81be54173106ec266f0311cebebd3Stephen Hines std::string FieldPackerName = EF->getName() + "_fp"; 807593a894650e81be54173106ec266f0311cebebd3Stephen Hines size_t numParams = EF->getNumParameters(); 808593a894650e81be54173106ec266f0311cebebd3Stephen Hines 809593a894650e81be54173106ec266f0311cebebd3Stephen Hines slangAssert(numParams >= 1); 810593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair("Allocation", "ain")); 811593a894650e81be54173106ec266f0311cebebd3Stephen Hines //GetTypeName(RSExportPrimitiveType::DataTypeRSAllocation), "ain"); 812593a894650e81be54173106ec266f0311cebebd3Stephen Hines if (numParams >= 2) { 813593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair("Allocation", "aout")); 814593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 815593a894650e81be54173106ec266f0311cebebd3Stephen Hines if (numParams >= 3) { 816593a894650e81be54173106ec266f0311cebebd3Stephen Hines for (RSExportFunc::const_param_iterator I = EF->params_begin(), 817593a894650e81be54173106ec266f0311cebebd3Stephen Hines E = EF->params_end(); 818593a894650e81be54173106ec266f0311cebebd3Stephen Hines I != E; 819593a894650e81be54173106ec266f0311cebebd3Stephen Hines I++) { 820593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair(GetTypeName((*I)->getType()), 821593a894650e81be54173106ec266f0311cebebd3Stephen Hines (*I)->getName())); 822593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 823593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 824593a894650e81be54173106ec266f0311cebebd3Stephen Hines 825593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.startFunction(Context::AM_Public, 826593a894650e81be54173106ec266f0311cebebd3Stephen Hines false, 827593a894650e81be54173106ec266f0311cebebd3Stephen Hines "void", 828593a894650e81be54173106ec266f0311cebebd3Stephen Hines "forEach_" + EF->getName(), 829593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args); 830593a894650e81be54173106ec266f0311cebebd3Stephen Hines 831593a894650e81be54173106ec266f0311cebebd3Stephen Hines if (numParams >= 3) { 832593a894650e81be54173106ec266f0311cebebd3Stephen Hines const RSExportRecordType *ERT = EF->getParamPacketType(); 833593a894650e81be54173106ec266f0311cebebd3Stephen Hines 834593a894650e81be54173106ec266f0311cebebd3Stephen Hines if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 835593a894650e81be54173106ec266f0311cebebd3Stephen Hines genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 836593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 837593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.indent() << "forEach("RS_EXPORT_FOREACH_INDEX_PREFIX << EF->getName() 838593a894650e81be54173106ec266f0311cebebd3Stephen Hines << ", ain"; 839593a894650e81be54173106ec266f0311cebebd3Stephen Hines 840593a894650e81be54173106ec266f0311cebebd3Stephen Hines switch (numParams) { 841593a894650e81be54173106ec266f0311cebebd3Stephen Hines case 1: 842593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.out() << ", null, null);" << std::endl; 843593a894650e81be54173106ec266f0311cebebd3Stephen Hines break; 844593a894650e81be54173106ec266f0311cebebd3Stephen Hines case 2: 845593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.out() << ", aout, null);" << std::endl; 846593a894650e81be54173106ec266f0311cebebd3Stephen Hines break; 847593a894650e81be54173106ec266f0311cebebd3Stephen Hines case 3: 848593a894650e81be54173106ec266f0311cebebd3Stephen Hines default: 849593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.out() << ", aout, " << FieldPackerName << ");" << std::endl; 850593a894650e81be54173106ec266f0311cebebd3Stephen Hines break; 851593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 852593a894650e81be54173106ec266f0311cebebd3Stephen Hines 853593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.endFunction(); 854593a894650e81be54173106ec266f0311cebebd3Stephen Hines return; 855593a894650e81be54173106ec266f0311cebebd3Stephen Hines} 856593a894650e81be54173106ec266f0311cebebd3Stephen Hines 857e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genPrimitiveTypeExportVariable( 858e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Context &C, 859e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const RSExportVar *EV) { 8606e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassPrimitive) 8616e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines && "Variable should be type of primitive here"); 8629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 8649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(EV->getType()); 8659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *TypeName = GetPrimitiveTypeName(EPT); 8669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 8689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 8699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // set_*() 8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 8739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 8749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + EV->getName(), 8769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 877d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName, "v"); 8789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 8799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 880650c02be6719a961027c86d6b9a142014eb889dbJason Sams C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() 881650c02be6719a961027c86d6b9a142014eb889dbJason Sams << ", v);" << std::endl; 882462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 8849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 885462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 887462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context &C, 8929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVar *EV) { 8939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 8949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 8959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string TypeName; 896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8976e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 8986e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 9019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName = GetTypeName(ET); 902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 9049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 90689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 9079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 9089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 9099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 9109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "bind_" + EV->getName(), 9119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 912d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName.c_str(), "v"); 913462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 9159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if (v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX 9169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ");" << std::endl; 917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() == RSExportType::ExportClassRecord) 9199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "else bindAllocation(v.getAllocation(), " 9209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" 9219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 9229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 9239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX 9249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ");" << std::endl; 925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 932462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context &C, 9349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVar *EV) { 9356e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 9366e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 9379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVectorType *EVT = 9399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportVectorType*>(EV->getType()); 9409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *TypeName = GetVectorTypeName(EVT); 9419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName = "fp"; 9429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 9449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 9459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // set_*() 9479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 9489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 9499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 9509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 9519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + EV->getName(), 9529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 953d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName, "v"); 9549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 9559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, EVT, FieldPackerName)) 9579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, EVT, "v", FieldPackerName); 9589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " 9599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << FieldPackerName << ");" << std::endl; 960462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 9629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 9659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 966462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 96892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changvoid RSReflection::genMatrixTypeExportVariable(Context &C, 96992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportVar *EV) { 9706e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 9716e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 97292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 97392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportMatrixType *EMT = 97492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang static_cast<const RSExportMatrixType*>(EV->getType()); 97592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const char *TypeName = GetMatrixTypeName(EMT); 97692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const char *FieldPackerName = "fp"; 97792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 97892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 97992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << EV->getName() << ";" << std::endl; 98092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 98192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 98292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 98392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.startFunction(Context::AM_Public, 98492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang false, 98592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "void", 98692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "set_" + EV->getName(), 98792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1, 98892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang TypeName, "v"); 98992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 99092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 99192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (genCreateFieldPacker(C, EMT, FieldPackerName)) 99292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang genPackVarOfType(C, EMT, "v", FieldPackerName); 99392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " 99492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << FieldPackerName << ");" << std::endl; 99592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 99692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.endFunction(); 99792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 99892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 99992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang genGetExportVariable(C, TypeName, EV->getName()); 100092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return; 100192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 100292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1003e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genConstantArrayTypeExportVariable( 1004e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Context &C, 1005e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const RSExportVar *EV) { 10066e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == 10076e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines RSExportType::ExportClassConstantArray) && 10086e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of constant array here"); 10092e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10102e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 10112e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType*>(EV->getType()); 10122e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string TypeName = GetTypeName(ECAT); 10132e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const char *FieldPackerName = "fp"; 10142e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10152e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 10162e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang << EV->getName() << ";" << std::endl; 10172e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10182e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // set_*() 10192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (!EV->isConst()) { 10202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.startFunction(Context::AM_Public, 10212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang false, 10222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang "void", 10232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang "set_" + EV->getName(), 10242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 1, 10252e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang TypeName.c_str(), "v"); 10262e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 10272e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10282e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (genCreateFieldPacker(C, ECAT, FieldPackerName)) 10292e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genPackVarOfType(C, ECAT, "v", FieldPackerName); 10302e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " 10312e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang << FieldPackerName << ");" << std::endl; 10322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.endFunction(); 10342e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 10352e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genGetExportVariable(C, TypeName, EV->getName()); 10372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return; 10382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 10392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 10409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context &C, 10419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVar *EV) { 10426e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 10436e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 10449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 10469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportRecordType*>(EV->getType()); 10479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string TypeName = 10489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 10499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName = "fp"; 10509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 10529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 10539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // set_*() 10559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 10569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 10579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 10589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 10599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + EV->getName(), 10609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1061d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName.c_str(), "v"); 10629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 10639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, ERT, FieldPackerName)) 10659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, "v", FieldPackerName); 10669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() 10679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ", " << FieldPackerName << ");" << std::endl; 10681ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 10699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 10709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1071462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName.c_str(), EV->getName()); 10739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 10749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1075462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genGetExportVariable(Context &C, 10779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &TypeName, 10789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName) { 10799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 10809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 10819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName.c_str(), 10829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "get_" + VarName, 10839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 0); 1084462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << std::endl; 1086462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 10889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 10899c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 10909c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 10919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 10929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 10939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genCreateFieldPacker(Context &C, 10949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 10959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName) { 10969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t AllocSize = RSExportType::GetTypeAllocSize(ET); 10979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 10989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 10999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << AllocSize << ");" << std::endl; 11009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 11019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 11029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 11039c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 11049c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 11059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genPackVarOfType(Context &C, 11069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 11079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *VarName, 11089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName) { 11099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 11109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPrimitive: 11119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 11129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << "." 11139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << GetPackerAPIName( 11149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(ET)) 11159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << "(" << VarName << ");" << std::endl; 11169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 11179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 11189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 11199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Must reflect as type Allocation in Java 11209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType = 11219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 11229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() != RSExportType::ExportClassRecord) 11249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName 11259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ".getPtr());" << std::endl; 11269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 11279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName 11289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ".getAllocation().getPtr());" << std::endl; 11299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 11309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 113192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: { 1132aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk C.indent() << FieldPackerName << ".addMatrix(" << VarName << ");" 113392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << std::endl; 113492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang break; 113592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 11362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 11372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 11382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 11392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 114089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // TODO(zonr): more elegant way. Currently, we obtain the unique index 114189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // variable (this method involves recursive call which means 114289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // we may have more than one level loop, therefore we can't 114389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // always use the same index variable name here) name given 114489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // in the for-loop from counting the '.' in @VarName. 114589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned Level = 0; 114689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang size_t LastDotPos = 0; 11472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string ElementVarName(VarName); 114889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 114989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang while (LastDotPos != std::string::npos) { 115089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 115189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang Level++; 115289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 115389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string IndexVarName("ct"); 115489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang IndexVarName.append(llvm::utostr_32(Level)); 115589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 115689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.indent() << "for (int " << IndexVarName << " = 0; " << 115789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang IndexVarName << " < " << ECAT->getSize() << "; " << 115889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang IndexVarName << "++)"; 115989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.startBlock(); 116089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 116189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ElementVarName.append("[" + IndexVarName + "]"); 11622e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genPackVarOfType(C, ECAT->getElementType(), ElementVarName.c_str(), 11632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang FieldPackerName); 11642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 11652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.endBlock(); 11662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 11672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 11689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 11696315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 11706315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 11719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Relative pos from now on in field packer 11729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned Pos = 0; 11739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 11759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 11769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 11779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 11789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 11799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName; 11809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 11819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 11829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 1183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (VarName != NULL) 11859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + ("." + F->getName()); 11869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 11879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 1188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldOffset > Pos) 11909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".skip(" 11919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << (FieldOffset - Pos) << ");" << std::endl; 1192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName); 1194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There is padding in the field type 11969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldAllocSize > FieldStoreSize) 11979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".skip(" 11989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << (FieldAllocSize - FieldStoreSize) 11999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ");" << std::endl; 1200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 12029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 12059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos; 12069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (Padding > 0) 12079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".skip(" << Padding << ");" 12089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 12099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1210f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } 12119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 12126e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 1213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 12149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 12179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Changvoid RSReflection::genAllocateVarOfType(Context &C, 12202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportType *T, 12212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const std::string &VarName) { 12222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 12232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 12242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // Primitive type like int in Java has its own storage once it's declared. 12252e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // 12262e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // FIXME: Should we allocate storage for RS object? 12272e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 12282e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // C.indent() << VarName << " = new " << GetTypeName(T) << "();" 12292e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // << std::endl; 12302e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 12312e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPointer: { 12332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // Pointer type is an instance of Allocation or a TypeClass whose value is 12342e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // expected to be assigned by programmer later in Java program. Therefore 12352e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // we don't reflect things like [VarName] = new Allocation(); 12362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << VarName << " = null;" << std::endl; 12372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 12382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 12402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 12412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(T); 12422e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 12432e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12442f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang C.indent() << VarName << " = new " << GetTypeName(ElementType) 12452f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang << "[" << ECAT->getSize() << "];" << std::endl; 12462f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang 12472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // Primitive type element doesn't need allocation code. 12482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 12492e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "for (int $ct = 0; $ct < " << ECAT->getSize() << "; " 12502e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang "$ct++)"; 12512e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.startBlock(); 12522e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12532e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string ElementVarName(VarName); 12542e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang ElementVarName.append("[$ct]"); 12552e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genAllocateVarOfType(C, ElementType, ElementVarName); 12562e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 12572e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.endBlock(); 12582e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12592e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 12602e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12612e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassVector: 12622e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassMatrix: 12632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassRecord: { 12642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << VarName << " = new " << GetTypeName(T) << "();" 12652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang << std::endl; 12662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 12672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12682e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 12692e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return; 12702e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 12712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 1272e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genNewItemBufferIfNull(Context &C, 1273e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const char *Index) { 1274e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) " 1275e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines RS_TYPE_ITEM_BUFFER_NAME " = " 1276e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "new " RS_TYPE_ITEM_CLASS_NAME 1277e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "[getType().getX() /* count */];" 12789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 12799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (Index != NULL) 12809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] == null) " 128192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] = " 128292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "new "RS_TYPE_ITEM_CLASS_NAME"();" << std::endl; 12839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 12849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genNewItemBufferPackerIfNull(Context &C) { 1287e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME " == null) " 1288e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 1289e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 1290e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ".sizeof * getType().getX()/* count */" 1291e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ");" << std::endl; 12929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 12969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genTypeClass(Context &C, 12979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 12989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg) { 12999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 13009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!C.startClass(Context::AM_Public, 13029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 13039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName, 13049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_TYPE_CLASS_SUPER_CLASS_NAME, 13059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ErrorMsg)) 13069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 13079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13084cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 13094cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 13102e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genTypeItemClass(C, ERT); 13119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 13139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[]" 13149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ";" << std::endl; 13159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" 13169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 13179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassConstructor(C, ERT); 13199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassCopyToArray(C, ERT); 13209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassItemSetter(C, ERT); 13219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassItemGetter(C, ERT); 13229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassComponentSetter(C, ERT); 13239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassComponentGetter(C, ERT); 13249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassCopyAll(C, ERT); 1325d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang genTypeClassResize(C); 13269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endClass(); 13289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 132966aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang C.resetFieldIndex(); 133066aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang C.clearFieldIndexMap(); 133166aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 13329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 13339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1335e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genTypeItemClass(Context &C, 1336e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const RSExportRecordType *ERT) { 13379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME; 13389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 13399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "public static final int sizeof = " 13419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << RSExportType::GetTypeAllocSize(ERT) << ";" << std::endl; 13429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 13449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << std::endl; 13459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 13469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 13479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 13489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 13499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 13509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ";" << std::endl; 13519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 13529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 13549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << std::endl; 13559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_CLASS_NAME"()"; 13569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 13579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 13599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 13609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 13619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 13629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 13632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genAllocateVarOfType(C, F->getType(), F->getName()); 13649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 13659e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 13669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 13679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 13709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return; 1373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassConstructor(Context &C, 13769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 13779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 13789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 13809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao true, 13819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element", 13829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "createElement", 13839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1384d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "RenderScript", RenderScriptVar); 138589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genBuildElement(C, "eb", ERT, RenderScriptVar, /* IsInline = */false); 13869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 13879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 13899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 13909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 13919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.getClassName(), 13929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2, 1393d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "RenderScript", RenderScriptVar, 1394d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "count"); 13959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl; 13979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl; 13989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "mElement = createElement(" << RenderScriptVar << ");" 13999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 14009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 14019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "init(" << RenderScriptVar << ", count);" << std::endl; 14029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 14039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 140491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.startFunction(Context::AM_Public, 140591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams false, 140691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams NULL, 140791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.getClassName(), 140891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 3, 140991fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams "RenderScript", RenderScriptVar, 141091fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams "int", "count", 141191fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams "int", "usages"); 141291fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 141391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl; 141491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl; 141591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << "mElement = createElement(" << RenderScriptVar << ");" 141691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams << std::endl; 141791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 141891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << "init(" << RenderScriptVar << ", count, usages);" << std::endl; 141991fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.endFunction(); 142091fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 14219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 14229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1423462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context &C, 14259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 14269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Private, 14279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 14289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 14299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "copyToArray", 14309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2, 1431d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang RS_TYPE_ITEM_CLASS_NAME, "i", 1432d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 14339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferPackerIfNull(C); 14359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 143692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" 143792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << std::endl; 14389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 14409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 14429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 14439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1444462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassItemSetter(Context &C, 14466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT) { 14479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 14489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 14499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 14509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set", 14519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3, 1452d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang RS_TYPE_ITEM_CLASS_NAME, "i", 1453d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index", 1454d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "boolean", "copyNow"); 14559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferIfNull(C, NULL); 14569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << std::endl; 14579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if (copyNow) "; 14599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 14609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "copyToArray(i, index);" << std::endl; 1462a036a8a7186f7c2f088917107f2c854fbd2187b8Jason Sams C.indent() << "mAllocation.setFromFieldPacker(index, " 146342afde21ffd77fe454a6272f80a0b89fe7232ef8Jason Sams RS_TYPE_ITEM_BUFFER_PACKER_NAME");" << std::endl; 14649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 14669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 14679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 14699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 14709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1471462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassItemGetter(Context &C, 14739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 14749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 14759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 14769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_TYPE_ITEM_CLASS_NAME, 14779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "get", 14789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1479d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 14809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return null;" 14819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 14829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index];" << std::endl; 14839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 14849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1486462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassComponentSetter(Context &C, 14889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 14899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 14909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 14919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 14929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 14939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 14949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 14959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 14969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned FieldIndex = C.getFieldIndex(F); 14979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 14999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 15009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 15019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + F->getName(), 3, 1502d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index", 1503d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang GetTypeName(F->getType()).c_str(), "v", 1504d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "boolean", "copyNow"); 15059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferPackerIfNull(C); 15069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferIfNull(C, "index"); 15079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName() 15089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << " = v;" << std::endl; 1509462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1510462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if (copyNow) "; 1511462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 15122dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 15139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldOffset > 0) 151492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 151592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof + " 151692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << FieldOffset << ");" << std::endl; 15179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 151892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 151992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" 152092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << std::endl; 15219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 1522462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize << ");" 15249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 15259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), "v", "fp"); 1526a036a8a7186f7c2f088917107f2c854fbd2187b8Jason Sams C.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 1527329179389684e74bbb6ef5a95c6fbc769cac05c0Stephen Hines << ", fp);" 152866aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang << std::endl; 1529462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 15319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1532462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15339b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao C.endFunction(); 15349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 15359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 15369c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 15379c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 15389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassComponentGetter(Context &C, 15399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 15409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 15419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 15429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 15439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 15449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 15459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 15469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 15479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GetTypeName(F->getType()).c_str(), 15489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "get_" + F->getName(), 15499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1550d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 1551cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return " 1552cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao << GetTypeNullValue(F->getType()) << ";" << std::endl; 15536315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName() 15546315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr << ";" << std::endl; 15559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 15569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 15579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 15589c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 15599b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 15609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassCopyAll(Context &C, 15619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 15629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, false, "void", "copyAll", 0); 1563462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "for (int ct = 0; ct < "RS_TYPE_ITEM_BUFFER_NAME".length; ct++)" 15652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang " copyToArray("RS_TYPE_ITEM_BUFFER_NAME"[ct], ct);" 15669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 15670661778f3810bc090f025b69fc84eed3cde9cecfStephen Hines C.indent() << "mAllocation.setFromFieldPacker(0, " 15680661778f3810bc090f025b69fc84eed3cde9cecfStephen Hines RS_TYPE_ITEM_BUFFER_PACKER_NAME");" 15699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 1570462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 15729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1573462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1574462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1575d42a429f42fd6f272188af64f412cd604f02b365Zonr Changvoid RSReflection::genTypeClassResize(Context &C) { 1576d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.startFunction(Context::AM_Public, 1577d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang false, 1578d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "void", 1579d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "resize", 1580d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 1, 1581d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "newSize"); 1582d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 15833caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.indent() << "if (mItemArray != null) "; 15843caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.startBlock(); 1585d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "int oldSize = mItemArray.length;" << std::endl; 1586d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "int copySize = Math.min(oldSize, newSize);" << std::endl; 15873caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.indent() << "if (newSize == oldSize) return;" << std::endl; 1588d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "Item ni[] = new Item[newSize];" << std::endl; 1589d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);" 1590d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang << std::endl; 1591d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "mItemArray = ni;" << std::endl; 15923caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.endBlock(); 1593d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "mAllocation.resize(newSize);" << std::endl; 1594d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 1595cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME " != null) " 1596cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 1597cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 1598cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams ".sizeof * getType().getX()/* count */" 1599cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams ");" << std::endl; 1600cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams 1601d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.endFunction(); 1602d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang return; 1603d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 1604d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 16059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 1606462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 160889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Changvoid RSReflection::genBuildElement(Context &C, 160989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *ElementBuilderName, 161089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportRecordType *ERT, 161189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *RenderScriptVar, 161289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang bool IsInline) { 16139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "Element.Builder " << ElementBuilderName << " = " 16149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "new Element.Builder(" << RenderScriptVar << ");" << std::endl; 1615462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 16179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddElementToElementBuilder(C, 16189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ERT, 16199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "", 16209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 162189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 162289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang /* ArraySize = */0); 1623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 162489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (!IsInline) 162589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.indent() << "return " << ElementBuilderName << ".create();" << std::endl; 16269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1627462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1628462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 162989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang#define EB_ADD(x) do { \ 163092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << ElementBuilderName \ 163189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << ".add(" << x << ", \"" << VarName << "\""; \ 163289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ArraySize > 0) \ 163389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.out() << ", " << ArraySize; \ 163489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.out() << ");" << std::endl; \ 163589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.incFieldIndex(); \ 163689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang} while (false) 16379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context &C, 16399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 16409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 16419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 164289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *RenderScriptVar, 164389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned ArraySize) { 16449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementConstruct = GetBuiltinElementConstruct(ET); 16459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ElementConstruct != NULL) { 16479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 16489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 16499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((ET->getClass() == RSExportType::ExportClassPrimitive) || 16502e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang (ET->getClass() == RSExportType::ExportClassVector)) { 16519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 16529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(ET); 16539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *DataKindName = GetElementDataKindName(EPT->getKind()); 16549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *DataTypeName = GetElementDataTypeName(EPT->getType()); 16559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Size = (ET->getClass() == RSExportType::ExportClassVector) ? 16569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportVectorType*>(ET)->getNumElement() : 16579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1; 16589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (EPT->getKind()) { 16609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelL: 16619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelA: 16629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelLA: 16639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelRGB: 16649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelRGBA: { 16659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Element.createPixel() 166689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.createPixel(" << RenderScriptVar << ", " 166789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataTypeName << ", " 166889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataKindName << ")"); 16699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 16709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 16719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindUser: 16729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 16732e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (EPT->getClass() == RSExportType::ExportClassPrimitive) { 16749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Element.createUser() 167589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.createUser(" << RenderScriptVar << ", " 167689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataTypeName << ")"); 16779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 16786e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassVector) && 16796e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type."); 168089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.createVector(" << RenderScriptVar << ", " 168189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataTypeName << ", " 168289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << Size << ")"); 16839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 16849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1685bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 16869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 168792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#ifndef NDEBUG 16889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 16899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 16909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 16916e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 169292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 169392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 169492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 16956e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 169692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#endif 16972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassConstantArray) { 16982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 16992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 17002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 170189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 170289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 170389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genAddElementToElementBuilder(C, 170489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ECAT->getElementType(), 170589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang VarName, 170689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ElementBuilderName, 170789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 170889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ECAT->getSize()); 170989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 171089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 171189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 171289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 171389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genBuildElement(C, 171489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.c_str(), 171589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang static_cast<const RSExportRecordType*>(ElementType), 171689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 171789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang /* IsInline = */true); 171889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ArraySize = ECAT->getSize(); 171989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 172089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 17219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassRecord) { 17229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 17239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 17246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 17256315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 17269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 17279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportRecordType*>(ET); 17289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Pos = 0; // relative pos from now on 17299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 17319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 17329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 17339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 17349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 17359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName; 17369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 17379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 17389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 17399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 17419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 17429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 17439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 17449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 17469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddPaddingToElementBuiler(C, 17479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (FieldOffset - Pos), 17489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 17499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RenderScriptVar); 17509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 17529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.addFieldIndexMapping(F); 175389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 175489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genAddElementToElementBuilder(C, 175589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang F->getType(), 175689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang FieldName, 175789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ElementBuilderName, 175889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 175989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 0); 176089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 176189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 176289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 176389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 176489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genBuildElement(C, 176589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.c_str(), 176689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang static_cast<const RSExportRecordType*>(F->getType()), 176789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 176889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang /* IsInline = */true); 176989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 177089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const std::string &VarName = FieldName; // Hack for EB_ADD macro 177189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 177289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 17739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There is padding within the field type 17759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddPaddingToElementBuiler(C, 17769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (FieldAllocSize - FieldStoreSize), 17779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 17789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RenderScriptVar); 17799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 17819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1782bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 17839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 178489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang size_t RecordStoreSize = RSExportType::GetTypeStoreSize(ERT); 17850a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 17869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddPaddingToElementBuiler(C, 178789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RecordStoreSize - Pos, 17889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 17899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RenderScriptVar); 17909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 17916e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 1792b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 17939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1794462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1795462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context &C, 17979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int PaddingSize, 17989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 17996315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const char *RenderScriptVar) { 180089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned ArraySize = 0; // Hack the EB_ADD macro 18019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 18029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName = C.createPaddingField(); 18039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 180489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U32(" << RenderScriptVar << ")"); 18059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 18069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 180789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U16(" << RenderScriptVar << ")"); 18089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 18099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 181089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U8(" << RenderScriptVar << ")"); 18119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 1812462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 18139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 18149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1815462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1816462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1817462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 18189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 1819462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1820b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaobool RSReflection::reflect(const std::string &OutputPathBase, 1821b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &OutputPackageName, 18229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 18239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName) { 18249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context *C = NULL; 18259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ResourceId = ""; 1826462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(OutputBCFileName, ResourceId)) 18289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1829462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ResourceId.empty()) 18319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ResourceId = "<Resource ID>"; 1832462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1833b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (OutputPackageName.empty() || OutputPackageName == "-") 1834b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao C = new Context(OutputPathBase, InputFileName, "<Package Name>", 1835b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ResourceId, true); 18369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 1837b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao C = new Context(OutputPathBase, InputFileName, OutputPackageName, 1838b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ResourceId, false); 1839462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (C != NULL) { 18419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ErrorMsg, ScriptClassName; 18429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // class ScriptC_<ScriptName> 18439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(InputFileName, ScriptClassName)) 18449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1845462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ScriptClassName.empty()) 18479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ScriptClassName = "<Input Script Name>"; 1848462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 1850462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mRSContext->getLicenseNote() != NULL) { 18529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C->setLicenseNote(*(mRSContext->getLicenseNote())); 18539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1854d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 18559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!genScriptClass(*C, ScriptClassName, ErrorMsg)) { 18569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cerr << "Failed to generate class " << ScriptClassName << " (" 18579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ErrorMsg << ")" << std::endl; 18589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 18599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18614cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ScriptClassName); 18624cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 18639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // class ScriptField_<TypeName> 18649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_type_iterator TI = 18659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mRSContext->export_types_begin(), 18669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TE = mRSContext->export_types_end(); 18679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TI != TE; 18689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TI++) { 18699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = TI->getValue(); 18709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ET->getClass() == RSExportType::ExportClassRecord) { 18729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 18739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportRecordType*>(ET); 18749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 18759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) { 18769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cerr << "Failed to generate type class for struct '" 18779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ERT->getName() << "' (" << ErrorMsg << ")" << std::endl; 18789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 1879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 18809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1881462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 18829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1885462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1886462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/************************** RSReflection::Context **************************/ 18886315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrconst char *const RSReflection::Context::ApacheLicenseNote = 1889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 1890d09df09ae1e354c4fa595ab421b365ce5cd58cf3Stephen Hines " * Copyright (C) 2011 The Android Open Source Project\n" 18919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 18939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * you may not use this file except in compliance with the License.\n" 18949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * You may obtain a copy of the License at\n" 18959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 18979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 18989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 18999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 19009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or " 19019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "implied.\n" 19029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * See the License for the specific language governing permissions and\n" 19039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * limitations under the License.\n" 19049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " */\n" 19059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "\n"; 19069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoconst char *const RSReflection::Context::Import[] = { 19089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RenderScript java class 19099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "android.renderscript.*", 19109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Import R 19119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "android.content.res.Resources", 19129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Import for debugging 19136b64b2bd2daf45a4a8bd8b5a11d09410bd53455fStephen Hines // "android.util.Log", 1914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 1915462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19168c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Changbool RSReflection::Context::openClassFile(const std::string &ClassName, 19178c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang std::string &ErrorMsg) { 19188c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!mUseStdout) { 19198c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mOF.clear(); 19208c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang std::string Path = 1921b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSSlangReflectUtils::ComputePackagedPath(mOutputPathBase.c_str(), 19228c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mPackageName.c_str()); 19238c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19248c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!SlangUtils::CreateDirectoryWithParents(Path, &ErrorMsg)) 19258c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 19268c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19278d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael std::string ClassFile = Path + OS_PATH_SEPARATOR_STR + ClassName + ".java"; 19288c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19298c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mOF.open(ClassFile.c_str()); 19308c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!mOF.good()) { 19318c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang ErrorMsg = "failed to open file '" + ClassFile + "' for write"; 19328c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 19338c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 19348c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 19358c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return true; 19368c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang} 19378c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoconst char *RSReflection::Context::AccessModifierStr(AccessModifier AM) { 19399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 19409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case AM_Public: return "public"; break; 19419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case AM_Protected: return "protected"; break; 19429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case AM_Private: return "private"; break; 19439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: return ""; break; 19449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1946462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, 19489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 19499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 19509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *SuperClassName, 19519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg) { 19529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mVerbose) 19539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cout << "Generating " << ClassName << ".java ..." << std::endl; 19549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19558c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 19568c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!openClassFile(ClassName, ErrorMsg)) 19578c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 19588c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 19599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // License 19609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << mLicenseNote; 19619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Notice of generated file 19639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "/*" << std::endl; 19649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " * This file is auto-generated. DO NOT MODIFY!" << std::endl; 19659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " * The source RenderScript file: " << mInputRSFile << std::endl; 19669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " */" << std::endl; 19679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 19699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mPackageName.empty()) 19709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "package " << mPackageName << ";" << std::endl; 19719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << std::endl; 19729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 1974e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines for (unsigned i = 0; i < (sizeof(Import) / sizeof(const char*)); i++) 19759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "import " << Import[i] << ";" << std::endl; 19769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << std::endl; 19779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 19799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 19809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "/**" << std::endl; 19819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " * @hide" << std::endl; 19829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " */" << std::endl; 19839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 19859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ClassName; 19869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (SuperClassName != NULL) 19879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " extends " << SuperClassName; 19889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 19909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 19929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 1994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() { 19979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 19989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mUseStdout) 19999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mOF.close(); 20009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 20019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2004462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) { 20059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ShouldIndent) 20069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "{" << std::endl; 20079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 20089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " {" << std::endl; 20099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao incIndentLevel(); 20109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2011462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2013462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() { 20149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao decIndentLevel(); 20159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "}" << std::endl << std::endl; 20169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2018462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string &ClassName) { 20209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "public static class " << ClassName; 20219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 20229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2025462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() { 20269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 20279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 20319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 20329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 20339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 20349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Argc, ...) { 20359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 20369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 20379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 2038462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20396315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 20409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ArgType = va_arg(vl, const char*); 20419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ArgName = va_arg(vl, const char*); 2042462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 20449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 20459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 2046462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 2048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2050462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20522dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 20532dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao bool IsStatic, 20549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 20559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 20566315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const ArgTy &Args) { 20579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 20589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 20599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 20619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); 20629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 20639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 20649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 20659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ", "; 20669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 20679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 2068462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << I->first << " " << I->second; 20709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2071462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ")"; 20739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 2074462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2076462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2077462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2078462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() { 20799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 20809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2081462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2082e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 2083e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 2084