slang_rs_reflection.cpp revision 48b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines * Copyright 2010-2011, 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] = { 1224f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines /* 0 */ { "Byte2", "Byte3", "Byte4" }, 1234f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines /* 1 */ { "Short2", "Short3", "Short4" }, 1244f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines /* 2 */ { "Int2", "Int3", "Int4" }, 1254f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines /* 3 */ { "Long2", "Long3", "Long4" }, 1264f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines /* 4 */ { "Float2", "Float3", "Float4" }, 1274f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines /* 5 */ { "Double2", "Double3", "Double4" } 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char **BaseElement = NULL; 1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (EVT->getType()) { 13348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeSigned8: { 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 } 1574f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines case RSExportPrimitiveType::DataTypeFloat64: { 1584f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines BaseElement = VectorTypeJavaNameMap[5]; 1594f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines break; 1604f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines } 1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 16248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(false && "RSReflection::GetVectorTypeName : Unsupported " 1636e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "vector element data type"); 1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1686e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EVT->getNumElement() > 1) && 1696e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines (EVT->getNumElement() <= 4) && 17048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "Number of elements in vector type is invalid"); 17148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 17248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines return BaseElement[EVT->getNumElement() - 2]; 17348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 17448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 17548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hinesstatic const char *GetVectorElementName(const RSExportVectorType *EVT) { 17648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static const char *VectorElementNameMap[][3] = { 17748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 0 */ { "U8_2", "U8_3", "U8_4" }, 17848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 1 */ { "I8_2", "I8_3", "I8_4" }, 17948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 2 */ { "U16_2", "U16_3", "U16_4" }, 18048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 3 */ { "I16_2", "I16_3", "I16_4" }, 18148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 4 */ { "U32_2", "U32_3", "U32_4" }, 18248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 5 */ { "I32_2", "I32_3", "I32_4" }, 18348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 6 */ { "U64_2", "U64_3", "U64_4" }, 18448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 7 */ { "I64_2", "I64_3", "I64_4" }, 18548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 8 */ { "F32_2", "F32_3", "F32_4" }, 18648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines /* 9 */ { "F64_2", "F64_3", "F64_4" }, 18748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines }; 18848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 18948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const char **BaseElement = NULL; 19048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 19148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (EVT->getType()) { 19248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeUnsigned8: { 19348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[0]; 19448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 19548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 19648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeSigned8: { 19748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[1]; 19848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 19948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 20048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeUnsigned16: { 20148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[2]; 20248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 20348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 20448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeSigned16: { 20548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[3]; 20648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 20748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 20848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeUnsigned32: { 20948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[4]; 21048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 21148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 21248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeSigned32: { 21348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[5]; 21448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 21548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 21648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeUnsigned64: { 21748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[6]; 21848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 21948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 22048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeSigned64: { 22148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[7]; 22248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 22348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 22448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeFloat32: { 22548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[8]; 22648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 22748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 22848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataTypeFloat64: { 22948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines BaseElement = VectorElementNameMap[9]; 23048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 23148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 23248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines default: { 23348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(false && "RSReflection::GetVectorElementName : Unsupported " 23448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "vector element data type"); 23548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 23648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 23748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 23848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 23948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert((EVT->getNumElement() > 1) && 24048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines (EVT->getNumElement() <= 4) && 24148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "Number of elements in vector type is invalid"); 242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return BaseElement[EVT->getNumElement() - 2]; 244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 24692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changstatic const char *GetMatrixTypeName(const RSExportMatrixType *EMT) { 24792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang static const char *MatrixTypeJavaNameMap[] = { 24892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* 2x2 */ "Matrix2f", 24992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* 3x3 */ "Matrix3f", 25092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* 4x4 */ "Matrix4f", 25192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang }; 25292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang unsigned Dim = EMT->getDim(); 25392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 25492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if ((Dim - 2) < (sizeof(MatrixTypeJavaNameMap) / sizeof(const char*))) 25592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return MatrixTypeJavaNameMap[ EMT->getDim() - 2 ]; 25692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 2576e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetMatrixTypeName : Unsupported matrix dimension"); 25892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return NULL; 25992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 26092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 2616e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hinesstatic const char *GetVectorAccessor(unsigned Index) { 2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *VectorAccessorMap[] = { 2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 0 */ "x", 2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 1 */ "y", 2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 2 */ "z", 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* 3 */ "w", 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 268324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 2696e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Index < (sizeof(VectorAccessorMap) / sizeof(const char*))) && 2706e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Out-of-bound index to access vector member"); 271324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return VectorAccessorMap[Index]; 273324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao} 274324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetPackerAPIName(const RSExportPrimitiveType *EPT) { 2766315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static const char *PrimitiveTypePackerAPINameMap[] = { 27791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao "", // RSExportPrimitiveType::DataTypeFloat16 2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addF32", // RSExportPrimitiveType::DataTypeFloat32 2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addF64", // RSExportPrimitiveType::DataTypeFloat64 2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI8", // RSExportPrimitiveType::DataTypeSigned8 2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI16", // RSExportPrimitiveType::DataTypeSigned16 2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI32", // RSExportPrimitiveType::DataTypeSigned32 2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addI64", // RSExportPrimitiveType::DataTypeSigned64 2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU8", // RSExportPrimitiveType::DataTypeUnsigned8 2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned16 2869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU32", // RSExportPrimitiveType::DataTypeUnsigned32 2879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU64", // RSExportPrimitiveType::DataTypeUnsigned64 28891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao "addBoolean", // RSExportPrimitiveType::DataTypeBoolean 2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned565 2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned5551 2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addU16", // RSExportPrimitiveType::DataTypeUnsigned4444 2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 294aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk "addMatrix", // RSExportPrimitiveType::DataTypeRSMatrix2x2 295aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk "addMatrix", // RSExportPrimitiveType::DataTypeRSMatrix3x3 296aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk "addMatrix", // RSExportPrimitiveType::DataTypeRSMatrix4x4 2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSElement 2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSType 3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSAllocation 3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSSampler 3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSScript 3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSMesh 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramFragment 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramVertex 3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramRaster 3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSProgramStore 3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "addObj", // RSExportPrimitiveType::DataTypeRSFont 3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (TypeId < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*))) 3139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return PrimitiveTypePackerAPINameMap[ EPT->getType() ]; 3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3156e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "GetPackerAPIName : Unknown primitive data type"); 3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic std::string GetTypeName(const RSExportType *ET) { 3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 3212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 3226315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr return GetPrimitiveTypeName( 3236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportPrimitiveType*>(ET)); 3249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 3269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType = 3279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 3289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() != RSExportType::ExportClassRecord) 3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return "Allocation"; 3319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 3329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName(); 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 3349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 3359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET)); 3369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 33792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: { 33892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return GetMatrixTypeName(static_cast<const RSExportMatrixType*>(ET)); 3392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 3402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 3412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType* CAT = 3422e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType*>(ET); 3432e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string ElementTypeName = GetTypeName(CAT->getElementType()); 3442e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang ElementTypeName.append("[]"); 3452e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return ElementTypeName; 34692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 3479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 3486315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + 3496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr "."RS_TYPE_ITEM_CLASS_NAME; 3509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 3526e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 3539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ""; 357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 359cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liaostatic const char *GetTypeNullValue(const RSExportType *ET) { 360cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao switch (ET->getClass()) { 361cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassPrimitive: { 3621ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang const RSExportPrimitiveType *EPT = 3631ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang static_cast<const RSExportPrimitiveType*>(ET); 3641ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang if (EPT->isRSObjectType()) 365cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "null"; 3661ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang else if (EPT->getType() == RSExportPrimitiveType::DataTypeBoolean) 3671ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang return "false"; 368cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao else 369cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "0"; 370cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao break; 371cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 372cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassPointer: 373cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassVector: 374cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassMatrix: 375cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassConstantArray: 376cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao case RSExportType::ExportClassRecord: { 377cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return "null"; 378cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao break; 379cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 380cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao default: { 3816e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 382cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 383cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao } 384cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao return ""; 385cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao} 386cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao 3879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetBuiltinElementConstruct(const RSExportType *ET) { 3882e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ET->getClass() == RSExportType::ExportClassPrimitive) { 3896315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportPrimitiveType *EPT = 3906315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportPrimitiveType*>(ET); 3919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getKind() == RSExportPrimitiveType::DataKindUser) { 3929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *PrimitiveBuiltinElementConstructMap[] = { 39389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NULL, // RSExportPrimitiveType::DataTypeFloat16 39489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.F32", // RSExportPrimitiveType::DataTypeFloat32 39589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.F64", // RSExportPrimitiveType::DataTypeFloat64 39689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.I8", // RSExportPrimitiveType::DataTypeSigned8 3974f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines "Element.I16", // RSExportPrimitiveType::DataTypeSigned16 39889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.I32", // RSExportPrimitiveType::DataTypeSigned32 39989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.I64", // RSExportPrimitiveType::DataTypeSigned64 40089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.U8", // RSExportPrimitiveType::DataTypeUnsigned8 4014f9e08bd32ea91d42160d4b8f2f452947dbacbdfStephen Hines "Element.U16", // RSExportPrimitiveType::DataTypeUnsigned16 40289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.U32", // RSExportPrimitiveType::DataTypeUnsigned32 40389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.U64", // RSExportPrimitiveType::DataTypeUnsigned64 40489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.BOOLEAN", // RSExportPrimitiveType::DataTypeBoolean 4059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, // RSExportPrimitiveType::DataTypeUnsigned565 4079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, // RSExportPrimitiveType::DataTypeUnsigned5551 4089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, // RSExportPrimitiveType::DataTypeUnsigned4444 4099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 41092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix2x2 41192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix3x3 41292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix4x4 4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 41489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.ELEMENT", // RSExportPrimitiveType::DataTypeRSElement 41589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.TYPE", // RSExportPrimitiveType::DataTypeRSType 41689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.ALLOCATION", // RSExportPrimitiveType::DataTypeRSAllocation 41789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.SAMPLER", // RSExportPrimitiveType::DataTypeRSSampler 41889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.SCRIPT", // RSExportPrimitiveType::DataTypeRSScript 41989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang "Element.MESH", // RSExportPrimitiveType::DataTypeRSMesh 420e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_FRAGMENT", 421e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramFragment 422e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_VERTEX", 423e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramVertex 424e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_RASTER", 425e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramRaster 426e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.PROGRAM_STORE", 427e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSProgramStore 428e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.FONT", 429e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeRSFont 4309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 4319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned TypeId = EPT->getType(); 4329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (TypeId < 4349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*))) 4359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return PrimitiveBuiltinElementConstructMap[ EPT->getType() ]; 4369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) { 4379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 43889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.A_8"; 4399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) { 4409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565) 44189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGB_565"; 4429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 44389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGB_888"; 4449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) { 4459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551) 44689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGBA_5551"; 4479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444) 44889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGBA_4444"; 4499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 45089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.RGBA_8888"; 451462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 4529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassVector) { 4539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVectorType *EVT = static_cast<const RSExportVectorType*>(ET); 45491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao if (EVT->getKind() == RSExportPrimitiveType::DataKindUser) { 4559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 4569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getNumElement() == 2) 45789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.F32_2"; 4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else if (EVT->getNumElement() == 3) 45989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.F32_3"; 46091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao else if (EVT->getNumElement() == 4) 46189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.F32_4"; 4629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) { 4639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (EVT->getNumElement() == 4) 46489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.U8_4"; 4659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 4669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 46792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 46892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportMatrixType *EMT = static_cast<const RSExportMatrixType *>(ET); 46992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang switch (EMT->getDim()) { 47089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang case 2: return "Element.MATRIX_2X2"; 47189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang case 3: return "Element.MATRIX_3X3"; 47289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang case 4: return "Element.MATRIX_4X4"; 4736e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines default: slangAssert(false && "Unsupported dimension of matrix"); 47492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 4759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 4769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Treat pointer type variable as unsigned int 4776315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): this is target dependent 47889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang return "Element.USER_I32"; 4799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 480462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 4849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetElementDataKindName(RSExportPrimitiveType::DataKind DK) { 4859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *ElementDataKindNameMap[] = { 4869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.USER", // RSExportPrimitiveType::DataKindUser 4879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_L", // RSExportPrimitiveType::DataKindPixelL 4889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_A", // RSExportPrimitiveType::DataKindPixelA 4899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_LA", // RSExportPrimitiveType::DataKindPixelLA 4909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_RGB", // RSExportPrimitiveType::DataKindPixelRGB 4919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataKind.PIXEL_RGBA", // RSExportPrimitiveType::DataKindPixelRGBA 4929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 4939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 4949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (static_cast<unsigned>(DK) < 4959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (sizeof(ElementDataKindNameMap) / sizeof(const char*))) 4969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ElementDataKindNameMap[ DK ]; 4979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 4989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 500462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetElementDataTypeName(RSExportPrimitiveType::DataType DT) { 5029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *ElementDataTypeNameMap[] = { 503e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // RSExportPrimitiveType::DataTypeFloat16 504e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.FLOAT_32", // RSExportPrimitiveType::DataTypeFloat32 505e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.FLOAT_64", // RSExportPrimitiveType::DataTypeFloat64 506e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_8", // RSExportPrimitiveType::DataTypeSigned8 507e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_16", // RSExportPrimitiveType::DataTypeSigned16 508e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_32", // RSExportPrimitiveType::DataTypeSigned32 509e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.SIGNED_64", // RSExportPrimitiveType::DataTypeSigned64 510e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_8", // RSExportPrimitiveType::DataTypeUnsigned8 511e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_16", 512e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeUnsigned16 513e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_32", 514e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeUnsigned32 515e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.UNSIGNED_64", 516e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeUnsigned64 517e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "Element.DataType.BOOLEAN", 518e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines // RSExportPrimitiveType::DataTypeBoolean 51991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao 52091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao // RSExportPrimitiveType::DataTypeUnsigned565 5219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.UNSIGNED_5_6_5", 52291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao // RSExportPrimitiveType::DataTypeUnsigned5551 5239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.UNSIGNED_5_5_5_1", 52491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao // RSExportPrimitiveType::DataTypeUnsigned4444 5259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.UNSIGNED_4_4_4_4", 5269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 52792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // DataTypeRSMatrix* must have been resolved in GetBuiltinElementConstruct() 528e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix2x2 529e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix3x3 530e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix4x4 5319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_ELEMENT", // RSExportPrimitiveType::DataTypeRSElement 5339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_TYPE", // RSExportPrimitiveType::DataTypeRSType 5349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSAllocation 5359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_ALLOCATION", 5369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSSampler 5379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_SAMPLER", 5389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSScript 5399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_SCRIPT", 5409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSMesh 5419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_MESH", 5429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramFragment 5439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_FRAGMENT", 5449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramVertex 5459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_VERTEX", 5469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramRaster 5479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_RASTER", 5489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSProgramStore 5499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_PROGRAM_STORE", 5509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RSExportPrimitiveType::DataTypeRSFont 5519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element.DataType.RS_FONT", 5529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 5539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 5549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (static_cast<unsigned>(DT) < 5559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (sizeof(ElementDataTypeNameMap) / sizeof(const char*))) 5569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ElementDataTypeNameMap[ DT ]; 5579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 5589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 559462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 560462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 56148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hinesstatic const char *GetElementJavaTypeName(RSExportPrimitiveType::DataType DT) { 56248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static const char *ElementJavaTypeNameMap[] = { 56348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines NULL, // RSExportPrimitiveType::DataTypeFloat16 56448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "F32", // RSExportPrimitiveType::DataTypeFloat32 56548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "F64", // RSExportPrimitiveType::DataTypeFloat64 56648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "I8", // RSExportPrimitiveType::DataTypeSigned8 56748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "I16", // RSExportPrimitiveType::DataTypeSigned16 56848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "I32", // RSExportPrimitiveType::DataTypeSigned32 56948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "I64", // RSExportPrimitiveType::DataTypeSigned64 57048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "U8", // RSExportPrimitiveType::DataTypeUnsigned8 57148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "U16", // RSExportPrimitiveType::DataTypeUnsigned16 57248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "U32", // RSExportPrimitiveType::DataTypeUnsigned32 57348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "U64", // RSExportPrimitiveType::DataTypeUnsigned64 57448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "BOOLEAN", // RSExportPrimitiveType::DataTypeBoolean 57548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 57648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "RGB_565", // RSExportPrimitiveType::DataTypeUnsigned565 57748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "RGBA_5551", // RSExportPrimitiveType::DataTypeUnsigned5551 57848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "RGBA_4444", // RSExportPrimitiveType::DataTypeUnsigned4444 57948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 58048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines // DataTypeRSMatrix* must have been resolved in GetBuiltinElementConstruct() 58148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix2x2 58248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix3x3 58348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines NULL, // (Dummy) RSExportPrimitiveType::DataTypeRSMatrix4x4 58448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 58548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "ELEMENT", // RSExportPrimitiveType::DataTypeRSElement 58648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "TYPE", // RSExportPrimitiveType::DataTypeRSType 58748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "ALLOCATION", // RSExportPrimitiveType::DataTypeRSAllocation 58848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "SAMPLER", // RSExportPrimitiveType::DataTypeRSSampler 58948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "SCRIPT", // RSExportPrimitiveType::DataTypeRSScript 59048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "MESH", // RSExportPrimitiveType::DataTypeRSMesh 59148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "PROGRAM_FRAGMENT", // RSExportPrimitiveType::DataTypeRSProgramFragment 59248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "PROGRAM_VERTEX", // RSExportPrimitiveType::DataTypeRSProgramVertex 59348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "PROGRAM_RASTER", // RSExportPrimitiveType::DataTypeRSProgramRaster 59448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "PROGRAM_STORE", // RSExportPrimitiveType::DataTypeRSProgramStore 59548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines "FONT", // RSExportPrimitiveType::DataTypeRSFont 59648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines }; 59748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 59848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (static_cast<unsigned>(DT) < 59948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines (sizeof(ElementJavaTypeNameMap) / sizeof(const char*))) 60048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines return ElementJavaTypeNameMap[DT]; 60148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines else 60248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines return NULL; 60348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 60448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 60548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 6069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate script class **********************/ 6079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genScriptClass(Context &C, 6089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 6099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg) { 6109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!C.startClass(Context::AM_Public, 6119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 6129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName, 6139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_SCRIPT_CLASS_SUPER_CLASS_NAME, 6149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ErrorMsg)) 6159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 6169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genScriptClassConstructor(C); 6189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reflect export variable 6209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 6219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = mRSContext->export_vars_end(); 6229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 6239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) 6249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genExportVariable(C, *I); 6259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 626593a894650e81be54173106ec266f0311cebebd3Stephen Hines // Reflect export for each functions 627593a894650e81be54173106ec266f0311cebebd3Stephen Hines for (RSContext::const_export_foreach_iterator 628593a894650e81be54173106ec266f0311cebebd3Stephen Hines I = mRSContext->export_foreach_begin(), 629593a894650e81be54173106ec266f0311cebebd3Stephen Hines E = mRSContext->export_foreach_end(); 630593a894650e81be54173106ec266f0311cebebd3Stephen Hines I != E; I++) 631593a894650e81be54173106ec266f0311cebebd3Stephen Hines genExportForEach(C, *I); 632593a894650e81be54173106ec266f0311cebebd3Stephen Hines 6339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Reflect export function 6349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_func_iterator 6359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I = mRSContext->export_funcs_begin(), 6369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = mRSContext->export_funcs_end(); 6379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; I++) 6389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genExportFunction(C, *I); 6399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endClass(); 6419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 6429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 6439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 644462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genScriptClassConstructor(Context &C) { 6469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "// Constructor" << std::endl; 6479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 6489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 6499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 6509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.getClassName(), 651b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 3, 652b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams "RenderScript", "rs", 653b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams "Resources", "resources", 654b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams "int", "id"); 655b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // Call constructor of super class 656b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams C.indent() << "super(rs, resources, id);" << std::endl; 657b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 658b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams // If an exported variable has initial value, reflect it 659b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 660b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(), 661b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams E = mRSContext->export_vars_end(); 662b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams I != E; 663b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams I++) { 664b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams const RSExportVar *EV = *I; 665b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams if (!EV->getInit().isUninit()) 666b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit()); 667b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams } 668b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 66948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines for (RSContext::const_export_foreach_iterator 67048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I = mRSContext->export_foreach_begin(), 67148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines E = mRSContext->export_foreach_end(); 67248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I != E; 67348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I++) { 67448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportForEach *EF = *I; 67548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 67648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *IET = EF->getInType(); 67748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (IET) { 67848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines genTypeInstance(C, IET); 67948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 68048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *OET = EF->getOutType(); 68148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (OET) { 68248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines genTypeInstance(C, OET); 68348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 68448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 68548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 686b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams C.endFunction(); 687b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams 68848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines for (std::set<std::string>::iterator I = C.mTypesToCheck.begin(), 68948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines E = C.mTypesToCheck.end(); 69048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I != E; 69148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines I++) { 69248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "private Element __" << *I << ";" << std::endl; 69348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 69448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 6959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 6969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 697462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genInitBoolExportVariable(Context &C, 6999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 7009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val) { 7016e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 7039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 7046e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Int) && 7056e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Bool type has wrong initial APValue"); 706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 70792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.out() << ((Val.getInt().getSExtValue() == 0) ? "false" : "true") 70892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << ";" << std::endl; 709324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao 7109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 713e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genInitPrimitiveExportVariable( 714e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Context &C, 715e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const std::string &VarName, 716e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const clang::APValue &Val) { 7176e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 71848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 7199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = "; 7209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (Val.getKind()) { 7219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Int: { 722050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines llvm::APInt api = Val.getInt(); 723050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines C.out() << api.getSExtValue(); 724050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines if (api.getBitWidth() > 32) { 725050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines C.out() << "L"; 726050eb857325d6cd35f23fae6c82200aff5a9bcc1Stephen Hines } 7279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 7289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Float: { 7309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::APFloat apf = Val.getFloat(); 7319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { 7329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << apf.convertToFloat() << "f"; 7339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 7349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << apf.convertToDouble(); 7359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 7379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 73848bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 7399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexInt: 7409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexFloat: 7419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::LValue: 7429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Vector: { 7436e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && 7446e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Primitive type cannot have such kind of initializer"); 7459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 74648bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 7479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 7486e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown kind of initializer"); 7499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << ";" << std::endl; 75248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 7539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 75448bac230fe966771f3074975fc2426ffde519edfShih-wei Liao} 75548bac230fe966771f3074975fc2426ffde519edfShih-wei Liao 7569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genInitExportVariable(Context &C, 7579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 7589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 7599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &Val) { 7606e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(!Val.isUninit() && "Not a valid initializer"); 7619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 7632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 7649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 7659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(ET); 76691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao if (EPT->getType() == RSExportPrimitiveType::DataTypeBoolean) { 7679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitBoolExportVariable(C, VarName, Val); 7689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 7699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, VarName, Val); 7702239ecece40c177e071f56326cd5ef423806394dShih-wei Liao } 7719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 772324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 7739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 7749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!Val.isInt() || Val.getInt().getSExtValue() != 0) 7759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cout << "Initializer which is non-NULL to pointer type variable " 7769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "will be ignored" << std::endl; 7779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 7789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 7809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVectorType *EVT = 7819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportVectorType*>(ET); 7829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (Val.getKind()) { 7839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Int: 7849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Float: { 7852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang for (unsigned i = 0; i < EVT->getNumElement(); i++) { 7869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 7879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, Name, Val); 7889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 7899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 79048bac230fe966771f3074975fc2426ffde519edfShih-wei Liao } 7919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Vector: { 7929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new " 7939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << GetVectorTypeName(EVT) << "();" << std::endl; 7949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 7959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned NumElements = 7969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::min(static_cast<unsigned>(EVT->getNumElement()), 7979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorLength()); 7989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (unsigned i = 0; i < NumElements; i++) { 7999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::APValue &ElementVal = Val.getVectorElt(i); 8009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string Name = VarName + "." + GetVectorAccessor(i); 8019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, Name, ElementVal); 8029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 804324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 8059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::Uninitialized: 8069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexInt: 8079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::ComplexFloat: 8089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case clang::APValue::LValue: { 8096e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unexpected type of value of initializer."); 810324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 8119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 813324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao } 81492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // TODO(zonr): Resolving initializer of a record (and matrix) type variable 81592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // is complex. It cannot obtain by just simply evaluating the initializer 81692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // expression. 81792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: 8182e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: 8199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 8209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#if 0 8219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned InitIndex = 0; 8226315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 8236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 824462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8256e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((Val.getKind() == clang::APValue::Vector) && 8266e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type of initializer for record type variable"); 827462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << VarName 8299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << " = new "RS_TYPE_CLASS_NAME_PREFIX << ERT->getName() 8309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << "."RS_TYPE_ITEM_CLASS_NAME"();" << std::endl; 831462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 8339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 8349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 8359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 8369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 8379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName = VarName + "." + F->getName(); 838462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (InitIndex > Val.getVectorLength()) 8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 841462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genInitPrimitiveExportVariable(C, 8439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName, 8449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Val.getVectorElt(InitIndex++)); 8459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif 8476e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unsupported initializer for record/matrix/constant " 8486e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "array type variable currently"); 8499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 850462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 8519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 8526e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 8539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 856462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 857462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genExportVariable(Context &C, const RSExportVar *EV) { 8599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 860462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX 8629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << " = " << C.getNextExportVarSlot() << ";" 8639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 864462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 8662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPrimitiveTypeExportVariable(C, EV); 8689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 869462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 8709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPointerTypeExportVariable(C, EV); 8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 873462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 8749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genVectorTypeExportVariable(C, EV); 8769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 8779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 87892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: { 87992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang genMatrixTypeExportVariable(C, EV); 88092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang break; 88192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 8822e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 8832e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genConstantArrayTypeExportVariable(C, EV); 8842e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 8852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 8869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 8879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genRecordTypeExportVariable(C, EV); 8889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 889c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao } 8909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 8916e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 8929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 8939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 897462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genExportFunction(Context &C, const RSExportFunc *EF) { 8999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX 9009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" 9019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 9029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // invoke_*() 9049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context::ArgTy Args; 9059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9060da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang if (EF->hasParam()) { 9070da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang for (RSExportFunc::const_param_iterator I = EF->params_begin(), 9080da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang E = EF->params_end(); 9090da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang I != E; 9100da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang I++) { 9110da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang Args.push_back(std::make_pair(GetTypeName((*I)->getType()), 9120da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang (*I)->getName())); 9130da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang } 9149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 9159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 9179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 9189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 9193fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao "invoke_" + EF->getName(/*Mangle=*/ false), 9203fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao // We are using un-mangled name since Java 9213fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao // supports method overloading. 9229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Args); 9239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EF->hasParam()) { 9259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" 9269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 9279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 9289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = EF->getParamPacketType(); 9299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 9309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 9329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 9339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " 9359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << FieldPackerName << ");" << std::endl; 9369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 9379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 9399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 9409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 941462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 942593a894650e81be54173106ec266f0311cebebd3Stephen Hinesvoid RSReflection::genExportForEach(Context &C, const RSExportForEach *EF) { 943593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.indent() << "private final static int "RS_EXPORT_FOREACH_INDEX_PREFIX 944593a894650e81be54173106ec266f0311cebebd3Stephen Hines << EF->getName() << " = " << C.getNextExportForEachSlot() << ";" 945593a894650e81be54173106ec266f0311cebebd3Stephen Hines << std::endl; 946593a894650e81be54173106ec266f0311cebebd3Stephen Hines 947b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines // forEach_*() 948593a894650e81be54173106ec266f0311cebebd3Stephen Hines Context::ArgTy Args; 949593a894650e81be54173106ec266f0311cebebd3Stephen Hines 950b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines slangAssert(EF->getNumParameters() > 0); 951593a894650e81be54173106ec266f0311cebebd3Stephen Hines 952b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn()) 953b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines Args.push_back(std::make_pair("Allocation", "ain")); 954b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasOut()) 955593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair("Allocation", "aout")); 956b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 957b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportRecordType *ERT = EF->getParamPacketType(); 958b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 959b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines for (RSExportForEach::const_param_iterator I = EF->params_begin(), 960593a894650e81be54173106ec266f0311cebebd3Stephen Hines E = EF->params_end(); 961593a894650e81be54173106ec266f0311cebebd3Stephen Hines I != E; 962593a894650e81be54173106ec266f0311cebebd3Stephen Hines I++) { 963593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args.push_back(std::make_pair(GetTypeName((*I)->getType()), 964593a894650e81be54173106ec266f0311cebebd3Stephen Hines (*I)->getName())); 965593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 966593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 967593a894650e81be54173106ec266f0311cebebd3Stephen Hines 968593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.startFunction(Context::AM_Public, 969593a894650e81be54173106ec266f0311cebebd3Stephen Hines false, 970593a894650e81be54173106ec266f0311cebebd3Stephen Hines "void", 971593a894650e81be54173106ec266f0311cebebd3Stephen Hines "forEach_" + EF->getName(), 972593a894650e81be54173106ec266f0311cebebd3Stephen Hines Args); 973593a894650e81be54173106ec266f0311cebebd3Stephen Hines 974b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportType *IET = EF->getInType(); 975b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (IET) { 976b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines genTypeCheck(C, IET, "ain"); 977b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 978593a894650e81be54173106ec266f0311cebebd3Stephen Hines 979b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportType *OET = EF->getOutType(); 980b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (OET) { 981b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines genTypeCheck(C, OET, "aout"); 982593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 983593a894650e81be54173106ec266f0311cebebd3Stephen Hines 984b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn() && EF->hasOut()) { 985b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "// Verify dimensions" << std::endl; 986b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "Type tIn = ain.getType();" << std::endl; 987b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "Type tOut = aout.getType();" << std::endl; 988b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "if ((tIn.getCount() != tOut.getCount()) ||" << std::endl; 989b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << " (tIn.getX() != tOut.getX()) ||" << std::endl; 990b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << " (tIn.getY() != tOut.getY()) ||" << std::endl; 991b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << " (tIn.getZ() != tOut.getZ()) ||" << std::endl; 992b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << " (tIn.hasFaces() != tOut.hasFaces()) ||" << std::endl; 993b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << " (tIn.hasMipmaps() != tOut.hasMipmaps())) {" << std::endl; 99448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << " throw new RSRuntimeException(\"Dimension mismatch " 99548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines << "between input and output parameters!\");"; 996b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << std::endl; 997b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "}" << std::endl; 998593a894650e81be54173106ec266f0311cebebd3Stephen Hines } 999593a894650e81be54173106ec266f0311cebebd3Stephen Hines 1000b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines std::string FieldPackerName = EF->getName() + "_fp"; 1001b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (ERT) { 1002b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) { 1003b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 1004b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 1005b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines } 1006b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "forEach("RS_EXPORT_FOREACH_INDEX_PREFIX << EF->getName(); 1007b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1008b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasIn()) 1009b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", ain"; 1010b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 1011b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", null"; 1012b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1013b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasOut()) 1014b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", aout"; 1015b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 1016b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", null"; 1017b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1018b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines if (EF->hasUsrData()) 1019b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", " << FieldPackerName; 1020b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines else 1021b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ", null"; 1022b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1023b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.out() << ");" << std::endl; 1024b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1025593a894650e81be54173106ec266f0311cebebd3Stephen Hines C.endFunction(); 1026593a894650e81be54173106ec266f0311cebebd3Stephen Hines return; 1027593a894650e81be54173106ec266f0311cebebd3Stephen Hines} 1028593a894650e81be54173106ec266f0311cebebd3Stephen Hines 102948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hinesvoid RSReflection::genTypeInstance(Context &C, 103048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *ET) { 103148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 103248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 103348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportPointerType*>(ET); 103448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 103548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 103648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportType::ExportClassPrimitive: { 103748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPrimitiveType *EPT = 103848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportPrimitiveType*>(ET); 103948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(EPT); 104048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 104148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (EPT->getKind()) { 104248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataKindPixelL: 104348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataKindPixelA: 104448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataKindPixelLA: 104548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataKindPixelRGB: 104648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataKindPixelRGBA: { 104748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 104848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 104948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 105048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportPrimitiveType::DataKindUser: 105148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines default: { 105248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName = GetElementJavaTypeName(EPT->getType()); 105348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (C.mTypesToCheck.find(TypeName) == C.mTypesToCheck.end()) { 105448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "__" << TypeName << " = Element." << TypeName 105548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines << "(rs);" << std::endl; 105648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.mTypesToCheck.insert(TypeName); 105748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 105848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 105948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 106048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 106148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 106248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 106348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 106448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportType::ExportClassVector: { 106548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportVectorType *EVT = 106648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportVectorType*>(ET); 106748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(EVT); 106848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 106948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const char *TypeName = GetVectorElementName(EVT); 107048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (C.mTypesToCheck.find(TypeName) == C.mTypesToCheck.end()) { 107148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "__" << TypeName << " = Element." << TypeName 107248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines << "(rs);" << std::endl; 107348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.mTypesToCheck.insert(TypeName); 107448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 107548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 107648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 107748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 107848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportType::ExportClassRecord: { 107948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportRecordType *ERT = 108048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportRecordType*>(ET); 108148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(ERT); 108248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 108348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 108448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (C.mTypesToCheck.find(ClassName) == C.mTypesToCheck.end()) { 108548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "__" << ClassName << " = " << ClassName << 108648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ".createElement(rs);" << std::endl; 108748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.mTypesToCheck.insert(ClassName); 108848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 108948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 109048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 109148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 109248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines default: 109348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 109448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 109548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 109648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines} 109748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 1098b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hinesvoid RSReflection::genTypeCheck(Context &C, 1099b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const RSExportType *ET, 1100b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines const char *VarName) { 1101b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines C.indent() << "// check " << VarName << std::endl; 110248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 110348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (ET->getClass() == RSExportType::ExportClassPointer) { 110448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPointerType *EPT = 110548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportPointerType*>(ET); 110648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines ET = EPT->getPointeeType(); 110748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 110848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 110948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::string TypeName; 111048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 111148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines switch (ET->getClass()) { 111248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportType::ExportClassPrimitive: { 111348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportPrimitiveType *EPT = 111448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportPrimitiveType*>(ET); 111548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(EPT); 111648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 111748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (EPT->getKind() == RSExportPrimitiveType::DataKindUser) { 111848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines TypeName = GetElementJavaTypeName(EPT->getType()); 111948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 112048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 112148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 112248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 112348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportType::ExportClassVector: { 112448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportVectorType *EVT = 112548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportVectorType*>(ET); 112648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(EVT); 112748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines TypeName = GetVectorElementName(EVT); 112848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 112948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 113048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 113148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines case RSExportType::ExportClassRecord: { 113248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportRecordType *ERT = 113348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static_cast<const RSExportRecordType*>(ET); 113448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines slangAssert(ERT); 113548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines TypeName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 113648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 113748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 113848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 113948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines default: 114048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines break; 114148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 114248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 114348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines if (!TypeName.empty()) { 114448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "if (!" << VarName 114548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines << ".getType().getElement().isCompatible(__" 114648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines << TypeName << ")) {" << std::endl; 114748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << " throw new RSRuntimeException(\"Type mismatch with " 114848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines << TypeName << "!\");" << std::endl; 114948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines C.indent() << "}" << std::endl; 115048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines } 115148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 1152b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines return; 1153b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines} 1154b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1155b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 1156e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genPrimitiveTypeExportVariable( 1157e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Context &C, 1158e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const RSExportVar *EV) { 11596e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassPrimitive) 11606e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines && "Variable should be type of primitive here"); 11619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 11639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(EV->getType()); 11649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *TypeName = GetPrimitiveTypeName(EPT); 11659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 11679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 11689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // set_*() 11709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 11719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 11729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 11739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 11749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + EV->getName(), 11759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1176d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName, "v"); 11779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 11789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1179650c02be6719a961027c86d6b9a142014eb889dbJason Sams C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() 1180650c02be6719a961027c86d6b9a142014eb889dbJason Sams << ", v);" << std::endl; 1181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 11839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 1186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context &C, 11919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVar *EV) { 11929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = EV->getType(); 11939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType; 11949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string TypeName; 1195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11966e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassPointer) && 11976e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of pointer here"); 1198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 12009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName = GetTypeName(ET); 1201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 12039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 1204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 120589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // bind_*() 12069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 12079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 12089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 12099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "bind_" + EV->getName(), 12109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1211d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName.c_str(), "v"); 1212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 12149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if (v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX 12159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ");" << std::endl; 1216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() == RSExportType::ExportClassRecord) 12189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "else bindAllocation(v.getAllocation(), " 12199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" 12209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 12219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 12229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX 12239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ");" << std::endl; 1224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 1226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 1228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context &C, 12339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVar *EV) { 12346e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) && 12356e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of vector here"); 12369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVectorType *EVT = 12389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportVectorType*>(EV->getType()); 12399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *TypeName = GetVectorTypeName(EVT); 12409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName = "fp"; 12419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 12439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 12449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // set_*() 12469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 12479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 12489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 12499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 12509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + EV->getName(), 12519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1252d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName, "v"); 12539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 12549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, EVT, FieldPackerName)) 12569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, EVT, "v", FieldPackerName); 12579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " 12589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << FieldPackerName << ");" << std::endl; 1259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 12619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 12649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 126792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changvoid RSReflection::genMatrixTypeExportVariable(Context &C, 126892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportVar *EV) { 12696e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) && 12706e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of matrix here"); 127192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 127292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const RSExportMatrixType *EMT = 127392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang static_cast<const RSExportMatrixType*>(EV->getType()); 127492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const char *TypeName = GetMatrixTypeName(EMT); 127592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang const char *FieldPackerName = "fp"; 127692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 127792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 127892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << EV->getName() << ";" << std::endl; 127992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 128092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // set_*() 128192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (!EV->isConst()) { 128292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.startFunction(Context::AM_Public, 128392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang false, 128492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "void", 128592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "set_" + EV->getName(), 128692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1, 128792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang TypeName, "v"); 128892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 128992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 129092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang if (genCreateFieldPacker(C, EMT, FieldPackerName)) 129192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang genPackVarOfType(C, EMT, "v", FieldPackerName); 129292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " 129392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << FieldPackerName << ");" << std::endl; 129492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 129592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.endFunction(); 129692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 129792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 129892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang genGetExportVariable(C, TypeName, EV->getName()); 129992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return; 130092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang} 130192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 1302e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genConstantArrayTypeExportVariable( 1303e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Context &C, 1304e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const RSExportVar *EV) { 13056e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == 13066e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines RSExportType::ExportClassConstantArray) && 13076e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of constant array here"); 13082e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13092e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 13102e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType*>(EV->getType()); 13112e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string TypeName = GetTypeName(ECAT); 13122e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const char *FieldPackerName = "fp"; 13132e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13142e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 13152e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang << EV->getName() << ";" << std::endl; 13162e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13172e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // set_*() 13182e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (!EV->isConst()) { 13192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.startFunction(Context::AM_Public, 13202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang false, 13212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang "void", 13222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang "set_" + EV->getName(), 13232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 1, 13242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang TypeName.c_str(), "v"); 13252e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 13262e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13272e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (genCreateFieldPacker(C, ECAT, FieldPackerName)) 13282e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genPackVarOfType(C, ECAT, "v", FieldPackerName); 13292e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " 13302e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang << FieldPackerName << ");" << std::endl; 13312e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.endFunction(); 13332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 13342e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13352e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genGetExportVariable(C, TypeName, EV->getName()); 13362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return; 13372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 13382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 13399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context &C, 13409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportVar *EV) { 13416e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && 13426e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Variable should be type of struct here"); 13439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 13459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportRecordType*>(EV->getType()); 13469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string TypeName = 13479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 13489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName = "fp"; 13499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX 13519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << EV->getName() << ";" << std::endl; 13529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // set_*() 13549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!EV->isConst()) { 13559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 13569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 13579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 13589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + EV->getName(), 13599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1360d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang TypeName.c_str(), "v"); 13619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl; 13629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (genCreateFieldPacker(C, ERT, FieldPackerName)) 13649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, "v", FieldPackerName); 13659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() 13669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ", " << FieldPackerName << ");" << std::endl; 13671ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao 13689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 13699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genGetExportVariable(C, TypeName.c_str(), EV->getName()); 13729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 13739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genGetExportVariable(Context &C, 13769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &TypeName, 13779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName) { 13789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 13799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 13809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TypeName.c_str(), 13819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "get_" + VarName, 13829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 0); 1383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << std::endl; 1385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 13869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 13879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 13889c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 13899c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 13909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/ 13919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 13929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genCreateFieldPacker(Context &C, 13939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 13949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName) { 13959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t AllocSize = RSExportType::GetTypeAllocSize(ET); 13969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (AllocSize > 0) 13979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" 13989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << AllocSize << ");" << std::endl; 13999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 14009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 14019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 14029c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 14039c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 14049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genPackVarOfType(Context &C, 14059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 14069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *VarName, 14079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName) { 14089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (ET->getClass()) { 14099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPrimitive: 14109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassVector: { 14119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << "." 14129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << GetPackerAPIName( 14139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(ET)) 14149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << "(" << VarName << ");" << std::endl; 14159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 14169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 14179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassPointer: { 14189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Must reflect as type Allocation in Java 14199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *PointeeType = 14209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 14219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PointeeType->getClass() != RSExportType::ExportClassRecord) 14239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName 14249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ".getPtr());" << std::endl; 14259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 14269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName 14279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ".getAllocation().getPtr());" << std::endl; 14289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 14299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 143092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang case RSExportType::ExportClassMatrix: { 1431aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk C.indent() << FieldPackerName << ".addMatrix(" << VarName << ");" 143292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << std::endl; 143392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang break; 143492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 14352e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 14362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 14372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 14382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 143989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // TODO(zonr): more elegant way. Currently, we obtain the unique index 144089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // variable (this method involves recursive call which means 144189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // we may have more than one level loop, therefore we can't 144289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // always use the same index variable name here) name given 144389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang // in the for-loop from counting the '.' in @VarName. 144489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned Level = 0; 144589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang size_t LastDotPos = 0; 14462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string ElementVarName(VarName); 144789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 144889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang while (LastDotPos != std::string::npos) { 144989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1); 145089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang Level++; 145189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 145289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string IndexVarName("ct"); 145389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang IndexVarName.append(llvm::utostr_32(Level)); 145489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 145589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.indent() << "for (int " << IndexVarName << " = 0; " << 145689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang IndexVarName << " < " << ECAT->getSize() << "; " << 145789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang IndexVarName << "++)"; 145889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.startBlock(); 145989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 146089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ElementVarName.append("[" + IndexVarName + "]"); 14612e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genPackVarOfType(C, ECAT->getElementType(), ElementVarName.c_str(), 14622e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang FieldPackerName); 14632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 14642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.endBlock(); 14652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 14662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 14679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportType::ExportClassRecord: { 14686315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT = 14696315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr static_cast<const RSExportRecordType*>(ET); 14709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Relative pos from now on in field packer 14719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned Pos = 0; 14729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 14739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 14749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 14759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 14769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 14779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 14789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName; 14799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 14809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 14819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 1482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (VarName != NULL) 14849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + ("." + F->getName()); 14859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 14869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 1487462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldOffset > Pos) 14899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".skip(" 14909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << (FieldOffset - Pos) << ");" << std::endl; 1491462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName); 1493462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There is padding in the field type 14959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldAllocSize > FieldStoreSize) 14969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".skip(" 14979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << (FieldAllocSize - FieldStoreSize) 14989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ");" << std::endl; 1499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 15019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1502462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 15049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos; 15059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (Padding > 0) 15069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << FieldPackerName << ".skip(" << Padding << ");" 15079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 15089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1509f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao } 15109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 15116e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 1512462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 15139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 15169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1517462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15182e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Changvoid RSReflection::genAllocateVarOfType(Context &C, 15192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportType *T, 15202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const std::string &VarName) { 15212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang switch (T->getClass()) { 15222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPrimitive: { 15232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // Primitive type like int in Java has its own storage once it's declared. 15242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // 15252e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // FIXME: Should we allocate storage for RS object? 15262e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType()) 15272e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // C.indent() << VarName << " = new " << GetTypeName(T) << "();" 15282e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // << std::endl; 15292e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 15302e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 15312e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassPointer: { 15322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // Pointer type is an instance of Allocation or a TypeClass whose value is 15332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // expected to be assigned by programmer later in Java program. Therefore 15342e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // we don't reflect things like [VarName] = new Allocation(); 15352e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << VarName << " = null;" << std::endl; 15362e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 15372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 15382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassConstantArray: { 15392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 15402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(T); 15412e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 15422e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 15432f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang C.indent() << VarName << " = new " << GetTypeName(ElementType) 15442f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang << "[" << ECAT->getSize() << "];" << std::endl; 15452f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang 15462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang // Primitive type element doesn't need allocation code. 15472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassPrimitive) { 15482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "for (int $ct = 0; $ct < " << ECAT->getSize() << "; " 15492e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang "$ct++)"; 15502e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.startBlock(); 15512e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 15522e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang std::string ElementVarName(VarName); 15532e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang ElementVarName.append("[$ct]"); 15542e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genAllocateVarOfType(C, ElementType, ElementVarName); 15552e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 15562e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.endBlock(); 15572e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 15582e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 15592e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 15602e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassVector: 15612e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassMatrix: 15622e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang case RSExportType::ExportClassRecord: { 15632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << VarName << " = new " << GetTypeName(T) << "();" 15642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang << std::endl; 15652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang break; 15662e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 15672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 15682e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return; 15692e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang} 15702e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 1571e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genNewItemBufferIfNull(Context &C, 1572e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const char *Index) { 1573e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) " 1574e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines RS_TYPE_ITEM_BUFFER_NAME " = " 1575e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "new " RS_TYPE_ITEM_CLASS_NAME 1576e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "[getType().getX() /* count */];" 15779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 15789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (Index != NULL) 15799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] == null) " 158092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] = " 158192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang "new "RS_TYPE_ITEM_CLASS_NAME"();" << std::endl; 15829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 15839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1584462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genNewItemBufferPackerIfNull(Context &C) { 1586e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME " == null) " 1587e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 1588e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 1589e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ".sizeof * getType().getX()/* count */" 1590e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ");" << std::endl; 15919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1593462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class **********************/ 15959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genTypeClass(Context &C, 15969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 15979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg) { 15989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 15999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!C.startClass(Context::AM_Public, 16019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 16029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ClassName, 16039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_TYPE_CLASS_SUPER_CLASS_NAME, 16049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ErrorMsg)) 16059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 16069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16074cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ClassName); 16084cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 16092e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genTypeItemClass(C, ERT); 16109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Declare item buffer and item buffer packer 16129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[]" 16139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ";" << std::endl; 16149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" 16159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 16169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassConstructor(C, ERT); 16189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassCopyToArray(C, ERT); 16199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassItemSetter(C, ERT); 16209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassItemGetter(C, ERT); 16219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassComponentSetter(C, ERT); 16229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassComponentGetter(C, ERT); 16239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genTypeClassCopyAll(C, ERT); 1624d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang genTypeClassResize(C); 16259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endClass(); 16279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 162866aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang C.resetFieldIndex(); 162966aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang C.clearFieldIndexMap(); 163066aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang 16319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 16329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1633462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1634e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genTypeItemClass(Context &C, 1635e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines const RSExportRecordType *ERT) { 16369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME; 16379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 16389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "public static final int sizeof = " 16409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << RSExportType::GetTypeAllocSize(ERT) << ";" << std::endl; 16419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Member elements 16439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << std::endl; 16449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 16459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 16469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 16479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 16489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() 16499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ";" << std::endl; 16509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 16519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Constructor 16539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.out() << std::endl; 16549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_CLASS_NAME"()"; 16559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 16569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 16589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 16599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 16609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 16619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 16622e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang genAllocateVarOfType(C, F->getType(), F->getName()); 16639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 16649e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao 16659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Constructor 16669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // end Item class 16699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang return; 1672462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 16749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassConstructor(Context &C, 16759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 16769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar = "rs"; 16779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 16799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao true, 16809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "Element", 16819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "createElement", 16829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1683d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "RenderScript", RenderScriptVar); 168489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genBuildElement(C, "eb", ERT, RenderScriptVar, /* IsInline = */false); 16859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 16869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 16889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 16899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao NULL, 16909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.getClassName(), 16919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2, 1692d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "RenderScript", RenderScriptVar, 1693d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "count"); 16949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl; 16969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl; 16979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "mElement = createElement(" << RenderScriptVar << ");" 16989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 16999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Call init() in super class 17009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "init(" << RenderScriptVar << ", count);" << std::endl; 17019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 17029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 170391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.startFunction(Context::AM_Public, 170491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams false, 170591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams NULL, 170691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.getClassName(), 170791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 3, 170891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams "RenderScript", RenderScriptVar, 170991fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams "int", "count", 171091fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams "int", "usages"); 171191fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 171291fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl; 171391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl; 171491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << "mElement = createElement(" << RenderScriptVar << ");" 171591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams << std::endl; 171691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams // Call init() in super class 171791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.indent() << "init(" << RenderScriptVar << ", count, usages);" << std::endl; 171891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams C.endFunction(); 171991fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams 17209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 17219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context &C, 17249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 17259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Private, 17269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 17279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 17289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "copyToArray", 17299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2, 1730d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang RS_TYPE_ITEM_CLASS_NAME, "i", 1731d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 17329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferPackerIfNull(C); 17349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 173592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" 173692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << std::endl; 17379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 17399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 17419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 17429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1743462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassItemSetter(Context &C, 17456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const RSExportRecordType *ERT) { 17469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 17479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 17489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 17499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set", 17509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3, 1751d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang RS_TYPE_ITEM_CLASS_NAME, "i", 1752d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index", 1753d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "boolean", "copyNow"); 17549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferIfNull(C, NULL); 17559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << std::endl; 17569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if (copyNow) "; 17589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startBlock(); 17599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "copyToArray(i, index);" << std::endl; 1761a036a8a7186f7c2f088917107f2c854fbd2187b8Jason Sams C.indent() << "mAllocation.setFromFieldPacker(index, " 176242afde21ffd77fe454a6272f80a0b89fe7232ef8Jason Sams RS_TYPE_ITEM_BUFFER_PACKER_NAME");" << std::endl; 17639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 17659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 17669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 17689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 17699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 1770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassItemGetter(Context &C, 17729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 17739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 17749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 17759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RS_TYPE_ITEM_CLASS_NAME, 17769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "get", 17779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1778d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 17799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return null;" 17809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 17819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index];" << std::endl; 17829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 17839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1785462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 17869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassComponentSetter(Context &C, 17879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 17889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 17899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 17909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 17919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 17929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 17939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 17949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 17959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned FieldIndex = C.getFieldIndex(F); 17969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 17979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 17989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 17999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "void", 18009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "set_" + F->getName(), 3, 1801d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index", 1802d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang GetTypeName(F->getType()).c_str(), "v", 1803d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "boolean", "copyNow"); 18049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferPackerIfNull(C); 18059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genNewItemBufferIfNull(C, "index"); 18069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName() 18079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << " = v;" << std::endl; 1808462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1809462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if (copyNow) "; 1810462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 18112dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 18129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (FieldOffset > 0) 181392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 181492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof + " 181592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << FieldOffset << ");" << std::endl; 18169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 181792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME 181892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" 181992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang << std::endl; 18209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 1821462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize << ");" 18239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 18249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genPackVarOfType(C, F->getType(), "v", "fp"); 1825a036a8a7186f7c2f088917107f2c854fbd2187b8Jason Sams C.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex 1826329179389684e74bbb6ef5a95c6fbc769cac05c0Stephen Hines << ", fp);" 182766aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang << std::endl; 1828462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // End of if (copyNow) 18309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endBlock(); 1831462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18329b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao C.endFunction(); 18339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 18349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 18359c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 18369c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 18379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassComponentGetter(Context &C, 18389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 18399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), 18409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FE = ERT->fields_end(); 18419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI != FE; 18429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FI++) { 18439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *FI; 18449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, 18459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao false, 18469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao GetTypeName(F->getType()).c_str(), 18479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "get_" + F->getName(), 18489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1, 1849d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "index"); 1850cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return " 1851cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao << GetTypeNullValue(F->getType()) << ";" << std::endl; 18526315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName() 18536315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr << ";" << std::endl; 18549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 18559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 18569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 18579c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao} 18589b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao 18599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassCopyAll(Context &C, 18609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT) { 18619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.startFunction(Context::AM_Public, false, "void", "copyAll", 0); 1862462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang C.indent() << "for (int ct = 0; ct < "RS_TYPE_ITEM_BUFFER_NAME".length; ct++)" 18642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang " copyToArray("RS_TYPE_ITEM_BUFFER_NAME"[ct], ct);" 18659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 18660661778f3810bc090f025b69fc84eed3cde9cecfStephen Hines C.indent() << "mAllocation.setFromFieldPacker(0, " 18670661778f3810bc090f025b69fc84eed3cde9cecfStephen Hines RS_TYPE_ITEM_BUFFER_PACKER_NAME");" 18689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << std::endl; 1869462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.endFunction(); 18719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1872462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1873462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1874d42a429f42fd6f272188af64f412cd604f02b365Zonr Changvoid RSReflection::genTypeClassResize(Context &C) { 1875d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.startFunction(Context::AM_Public, 1876d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang false, 1877d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "void", 1878d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "resize", 1879d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 1, 1880d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang "int", "newSize"); 1881d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 18823caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.indent() << "if (mItemArray != null) "; 18833caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.startBlock(); 1884d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "int oldSize = mItemArray.length;" << std::endl; 1885d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "int copySize = Math.min(oldSize, newSize);" << std::endl; 18863caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.indent() << "if (newSize == oldSize) return;" << std::endl; 1887d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "Item ni[] = new Item[newSize];" << std::endl; 1888d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);" 1889d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang << std::endl; 1890d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "mItemArray = ni;" << std::endl; 18913caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams C.endBlock(); 1892d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.indent() << "mAllocation.resize(newSize);" << std::endl; 1893d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 1894cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME " != null) " 1895cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams RS_TYPE_ITEM_BUFFER_PACKER_NAME " = " 1896cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME 1897cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams ".sizeof * getType().getX()/* count */" 1898cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams ");" << std::endl; 1899cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams 1900d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang C.endFunction(); 1901d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang return; 1902d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang} 1903d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang 19049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/ 1905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/ 190789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Changvoid RSReflection::genBuildElement(Context &C, 190889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *ElementBuilderName, 190989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportRecordType *ERT, 191089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *RenderScriptVar, 191189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang bool IsInline) { 19129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.indent() << "Element.Builder " << ElementBuilderName << " = " 19139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "new Element.Builder(" << RenderScriptVar << ");" << std::endl; 1914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 19169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddElementToElementBuilder(C, 19179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ERT, 19189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "", 19199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 192089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 192189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang /* ArraySize = */0); 1922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 192389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (!IsInline) 192489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.indent() << "return " << ElementBuilderName << ".create();" << std::endl; 19259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 192889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang#define EB_ADD(x) do { \ 192992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang C.indent() << ElementBuilderName \ 193089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << ".add(" << x << ", \"" << VarName << "\""; \ 193189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ArraySize > 0) \ 193289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.out() << ", " << ArraySize; \ 193389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.out() << ");" << std::endl; \ 193489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang C.incFieldIndex(); \ 193589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang} while (false) 19369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context &C, 19389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET, 19399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 19409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 194189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *RenderScriptVar, 194289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned ArraySize) { 19439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementConstruct = GetBuiltinElementConstruct(ET); 19449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ElementConstruct != NULL) { 19469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 19479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 19489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if ((ET->getClass() == RSExportType::ExportClassPrimitive) || 19492e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang (ET->getClass() == RSExportType::ExportClassVector)) { 19509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportPrimitiveType *EPT = 19519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportPrimitiveType*>(ET); 19529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *DataKindName = GetElementDataKindName(EPT->getKind()); 19539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *DataTypeName = GetElementDataTypeName(EPT->getType()); 19549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Size = (ET->getClass() == RSExportType::ExportClassVector) ? 19559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportVectorType*>(ET)->getNumElement() : 19569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1; 19579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 19589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (EPT->getKind()) { 19599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelL: 19609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelA: 19619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelLA: 19629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelRGB: 19639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindPixelRGBA: { 19649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Element.createPixel() 196589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.createPixel(" << RenderScriptVar << ", " 196689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataTypeName << ", " 196789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataKindName << ")"); 19689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 19699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 19709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case RSExportPrimitiveType::DataKindUser: 19719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 19722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang if (EPT->getClass() == RSExportType::ExportClassPrimitive) { 19739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Element.createUser() 197489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.createUser(" << RenderScriptVar << ", " 197589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataTypeName << ")"); 19769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 19776e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((ET->getClass() == RSExportType::ExportClassVector) && 19786e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Unexpected type."); 197989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.createVector(" << RenderScriptVar << ", " 198089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << DataTypeName << ", " 198189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang << Size << ")"); 19829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 19839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 1984bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 19859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 198692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#ifndef NDEBUG 19879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassPointer) { 19889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Pointer type variable should be resolved in 19899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // GetBuiltinElementConstruct() 19906e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 199192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassMatrix) { 199292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // Matrix type variable should be resolved 199392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang // in GetBuiltinElementConstruct() 19946e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "??"); 199592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#endif 19962e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } else if (ET->getClass() == RSExportType::ExportClassConstantArray) { 19972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportConstantArrayType *ECAT = 19982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang static_cast<const RSExportConstantArrayType *>(ET); 19992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang 200089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const RSExportType *ElementType = ECAT->getElementType(); 200189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (ElementType->getClass() != RSExportType::ExportClassRecord) { 200289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genAddElementToElementBuilder(C, 200389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ECAT->getElementType(), 200489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang VarName, 200589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ElementBuilderName, 200689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 200789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ECAT->getSize()); 200889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 200989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 201089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 201189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 201289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genBuildElement(C, 201389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.c_str(), 201489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang static_cast<const RSExportRecordType*>(ElementType), 201589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 201689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang /* IsInline = */true); 201789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ArraySize = ECAT->getSize(); 201889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 201989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 20209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (ET->getClass() == RSExportType::ExportClassRecord) { 20219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType. 20229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 20236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // TODO(zonr): Generalize these two function such that there's no 20246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr // duplicated codes. 20259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 20269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportRecordType*>(ET); 20279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Pos = 0; // relative pos from now on 20289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(), 20309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao E = ERT->fields_end(); 20319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 20329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 20339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType::Field *F = *I; 20349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string FieldName; 20359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldOffset = F->getOffsetInParent(); 20369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 20379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 20389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!VarName.empty()) 20409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = VarName + "." + F->getName(); 20419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 20429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldName = F->getName(); 20439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Alignment 20459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddPaddingToElementBuiler(C, 20469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (FieldOffset - Pos), 20479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 20489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RenderScriptVar); 20499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // eb.add(...) 20519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C.addFieldIndexMapping(F); 205289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang if (F->getType()->getClass() != RSExportType::ExportClassRecord) { 205389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genAddElementToElementBuilder(C, 205489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang F->getType(), 205589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang FieldName, 205689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang ElementBuilderName, 205789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 205889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 0); 205989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } else { 206089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang std::string NewElementBuilderName(ElementBuilderName); 206189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.append(1, '_'); 206289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 206389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang genBuildElement(C, 206489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang NewElementBuilderName.c_str(), 206589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang static_cast<const RSExportRecordType*>(F->getType()), 206689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RenderScriptVar, 206789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang /* IsInline = */true); 206889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang 206989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const std::string &VarName = FieldName; // Hack for EB_ADD macro 207089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD(NewElementBuilderName << ".create()"); 207189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang } 20729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There is padding within the field type 20749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddPaddingToElementBuiler(C, 20759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (FieldAllocSize - FieldStoreSize), 20769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 20779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RenderScriptVar); 20789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 20799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Pos = FieldOffset + FieldAllocSize; 20809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2081bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 20829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // There maybe some padding after the struct 208389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang size_t RecordStoreSize = RSExportType::GetTypeStoreSize(ERT); 20840a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao 20859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao genAddPaddingToElementBuiler(C, 208689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang RecordStoreSize - Pos, 20879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ElementBuilderName, 20889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao RenderScriptVar); 20899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else { 20906e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Unknown class of type"); 2091b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 20929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2093462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2094462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 20959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context &C, 20969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int PaddingSize, 20979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 20986315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const char *RenderScriptVar) { 209989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned ArraySize = 0; // Hack the EB_ADD macro 21009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (PaddingSize > 0) { 21019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName = C.createPaddingField(); 21029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (PaddingSize >= 4) { 210389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U32(" << RenderScriptVar << ")"); 21049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 4; 21059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 2) { 210689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U16(" << RenderScriptVar << ")"); 21079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 2; 21089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } else if (PaddingSize >= 1) { 210989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang EB_ADD("Element.U8(" << RenderScriptVar << ")"); 21109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao PaddingSize -= 1; 2111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 21129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 21139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 21179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/ 2118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2119b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaobool RSReflection::reflect(const std::string &OutputPathBase, 2120b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &OutputPackageName, 21219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 21229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName) { 21239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Context *C = NULL; 21249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ResourceId = ""; 2125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(OutputBCFileName, ResourceId)) 21279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ResourceId.empty()) 21309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ResourceId = "<Resource ID>"; 2131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2132b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (OutputPackageName.empty() || OutputPackageName == "-") 2133b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao C = new Context(OutputPathBase, InputFileName, "<Package Name>", 2134b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ResourceId, true); 21359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 2136b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao C = new Context(OutputPathBase, InputFileName, OutputPackageName, 2137b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ResourceId, false); 2138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (C != NULL) { 21409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string ErrorMsg, ScriptClassName; 21419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // class ScriptC_<ScriptName> 21429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!GetClassNameFromFileName(InputFileName, ScriptClassName)) 21439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ScriptClassName.empty()) 21469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ScriptClassName = "<Input Script Name>"; 2147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 2149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mRSContext->getLicenseNote() != NULL) { 21519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao C->setLicenseNote(*(mRSContext->getLicenseNote())); 21529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2153d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh 21549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!genScriptClass(*C, ScriptClassName, ErrorMsg)) { 21559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cerr << "Failed to generate class " << ScriptClassName << " (" 21569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ErrorMsg << ")" << std::endl; 21579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 21589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21604cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames->push_back(ScriptClassName); 21614cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 21629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // class ScriptField_<TypeName> 21639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (RSContext::const_export_type_iterator TI = 21649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mRSContext->export_types_begin(), 21659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TE = mRSContext->export_types_end(); 21669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TI != TE; 21679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao TI++) { 21689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ET = TI->getValue(); 21699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ET->getClass() == RSExportType::ExportClassRecord) { 21719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT = 21729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static_cast<const RSExportRecordType*>(ET); 21739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) { 21759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cerr << "Failed to generate type class for struct '" 21769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ERT->getName() << "' (" << ErrorMsg << ")" << std::endl; 21779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return false; 2178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 21799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 21819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/************************** RSReflection::Context **************************/ 21876315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrconst char *const RSReflection::Context::ApacheLicenseNote = 2188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 2189d09df09ae1e354c4fa595ab421b365ce5cd58cf3Stephen Hines " * Copyright (C) 2011 The Android Open Source Project\n" 21909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 21919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 21929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * you may not use this file except in compliance with the License.\n" 21939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * You may obtain a copy of the License at\n" 21949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 21959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 21969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " *\n" 21979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 21989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 21999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or " 22009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "implied.\n" 22019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * See the License for the specific language governing permissions and\n" 22029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " * limitations under the License.\n" 22039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao " */\n" 22049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "\n"; 22059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoconst char *const RSReflection::Context::Import[] = { 22079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // RenderScript java class 22089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "android.renderscript.*", 22099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Import R 22109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao "android.content.res.Resources", 22119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Import for debugging 22126b64b2bd2daf45a4a8bd8b5a11d09410bd53455fStephen Hines // "android.util.Log", 2213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 2214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22158c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Changbool RSReflection::Context::openClassFile(const std::string &ClassName, 22168c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang std::string &ErrorMsg) { 22178c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!mUseStdout) { 22188c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mOF.clear(); 22198c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang std::string Path = 2220b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSSlangReflectUtils::ComputePackagedPath(mOutputPathBase.c_str(), 22218c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mPackageName.c_str()); 22228c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 22238c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!SlangUtils::CreateDirectoryWithParents(Path, &ErrorMsg)) 22248c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 22258c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 22268d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael std::string ClassFile = Path + OS_PATH_SEPARATOR_STR + ClassName + ".java"; 22278c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 22288c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang mOF.open(ClassFile.c_str()); 22298c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!mOF.good()) { 22308c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang ErrorMsg = "failed to open file '" + ClassFile + "' for write"; 22318c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 22328c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 22338c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang } 22348c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return true; 22358c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang} 22368c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 22379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoconst char *RSReflection::Context::AccessModifierStr(AccessModifier AM) { 22389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (AM) { 22399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case AM_Public: return "public"; break; 22409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case AM_Protected: return "protected"; break; 22419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao case AM_Private: return "private"; break; 22429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: return ""; break; 22439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, 22479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 22489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 22499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *SuperClassName, 22509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg) { 22519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mVerbose) 22529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::cout << "Generating " << ClassName << ".java ..." << std::endl; 22539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22548c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang // Open file for class 22558c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang if (!openClassFile(ClassName, ErrorMsg)) 22568c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang return false; 22578c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 22589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // License 22599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << mLicenseNote; 22609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Notice of generated file 22629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "/*" << std::endl; 22639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " * This file is auto-generated. DO NOT MODIFY!" << std::endl; 22649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " * The source RenderScript file: " << mInputRSFile << std::endl; 22659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " */" << std::endl; 22669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Package 22689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mPackageName.empty()) 22699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "package " << mPackageName << ";" << std::endl; 22709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << std::endl; 22719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Imports 2273e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines for (unsigned i = 0; i < (sizeof(Import) / sizeof(const char*)); i++) 22749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "import " << Import[i] << ";" << std::endl; 22759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << std::endl; 22769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // All reflected classes should be annotated as hidden, so that they won't 22789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // be exposed in SDK. 22799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << "/**" << std::endl; 22809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " * @hide" << std::endl; 22819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " */" << std::endl; 22829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " 22849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ClassName; 22859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (SuperClassName != NULL) 22869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " extends " << SuperClassName; 22879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 22899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ClassName; 22919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return true; 2293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() { 22969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 22979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!mUseStdout) 22989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mOF.close(); 22999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 23009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) { 23049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (ShouldIndent) 23059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "{" << std::endl; 23069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 23079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << " {" << std::endl; 23089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao incIndentLevel(); 23099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() { 23139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao decIndentLevel(); 23149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "}" << std::endl << std::endl; 23159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string &ClassName) { 23199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << "public static class " << ClassName; 23209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 23219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() { 23259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 23269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 23309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 23319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 23329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 23339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Argc, ...) { 23349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ArgTy Args; 23359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_list vl; 23369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_start(vl, Argc); 2337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr for (int i = 0; i < Argc; i++) { 23399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ArgType = va_arg(vl, const char*); 23409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ArgName = va_arg(vl, const char*); 2341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Args.push_back(std::make_pair(ArgType, ArgName)); 23439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 23449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao va_end(vl); 2345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 2347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23512dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 23522dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao bool IsStatic, 23539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 23549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 23556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr const ArgTy &Args) { 23569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") 23579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 23589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 23599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool FirstArg = true; 23609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao for (ArgTy::const_iterator I = Args.begin(), E = Args.end(); 23619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I != E; 23629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao I++) { 23639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (!FirstArg) 23649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ", "; 23659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 23669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FirstArg = false; 2367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << I->first << " " << I->second; 23699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << ")"; 23729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao startBlock(); 2373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() { 23789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao endBlock(); 23799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 2380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 2381e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 2382e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 2383