slang_rs_reflection.cpp revision a6b54146b93eec68f6daa4b1877639cdc34801dc
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines * Copyright 2010-2012, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflection.h"
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <sys/stat.h>
20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdarg>
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <cctype>
23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <algorithm>
25d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines#include <sstream>
26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string>
27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <utility>
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/APFloat.h"
3089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang#include "llvm/ADT/StringExtras.h"
316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
328d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael#include "os_sep.h"
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h"
346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h"
35593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_export_foreach.h"
366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_func.h"
376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_reflect_utils.h"
384cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "slang_version.h"
39e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_utils.h"
406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
41192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams#include "slang_rs_reflection_base.h"
42192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX      "ScriptC_"
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC"
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME   "android.renderscript.Script.FieldBase"
47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME          "Item"
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME         "mItemArray"
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME  "mIOBuffer"
52381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams#define RS_TYPE_ELEMENT_REF_NAME         "mElementCache"
53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX       "mExportVarIdx_"
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_PREFIX             "mExportVar_"
56a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines#define RS_EXPORT_VAR_ELEM_PREFIX        "mExportVarElem_"
57a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines#define RS_EXPORT_VAR_DIM_PREFIX         "mExportVarDim_"
585d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines#define RS_EXPORT_VAR_CONST_PREFIX       "const_"
59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
60a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines#define RS_ELEM_PREFIX                   "__"
61a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX      "mExportFuncIdx_"
63593a894650e81be54173106ec266f0311cebebd3Stephen Hines#define RS_EXPORT_FOREACH_INDEX_PREFIX   "mExportForEachIdx_"
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX  "mAlloction_"
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_"
67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
68e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang {
69462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Some utility function using internal in RSReflection
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic bool GetClassNameFromFileName(const std::string &FileName,
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     std::string &ClassName) {
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ClassName.clear();
74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (FileName.empty() || (FileName == "-"))
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return true;
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ClassName =
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      RSSlangReflectUtils::JavaClassNameFromRSFileName(FileName.c_str());
80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changstatic const char *GetMatrixTypeName(const RSExportMatrixType *EMT) {
8592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  static const char *MatrixTypeJavaNameMap[] = {
8692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    /* 2x2 */ "Matrix2f",
8792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    /* 3x3 */ "Matrix3f",
8892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    /* 4x4 */ "Matrix4f",
8992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  };
9092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  unsigned Dim = EMT->getDim();
9192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
9292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  if ((Dim - 2) < (sizeof(MatrixTypeJavaNameMap) / sizeof(const char*)))
9392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    return MatrixTypeJavaNameMap[ EMT->getDim() - 2 ];
9492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
956e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert(false && "GetMatrixTypeName : Unsupported matrix dimension");
9692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  return NULL;
9792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang}
9892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
996e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hinesstatic const char *GetVectorAccessor(unsigned Index) {
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static const char *VectorAccessorMap[] = {
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /* 0 */ "x",
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /* 1 */ "y",
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /* 2 */ "z",
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    /* 3 */ "w",
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  };
106324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
1076e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((Index < (sizeof(VectorAccessorMap) / sizeof(const char*))) &&
1086e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Out-of-bound index to access vector member");
109324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return VectorAccessorMap[Index];
111324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao}
112324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostatic const char *GetPackerAPIName(const RSExportPrimitiveType *EPT) {
1146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  static const char *PrimitiveTypePackerAPINameMap[] = {
11591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    "",         // RSExportPrimitiveType::DataTypeFloat16
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addF32",   // RSExportPrimitiveType::DataTypeFloat32
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addF64",   // RSExportPrimitiveType::DataTypeFloat64
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addI8",    // RSExportPrimitiveType::DataTypeSigned8
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addI16",   // RSExportPrimitiveType::DataTypeSigned16
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addI32",   // RSExportPrimitiveType::DataTypeSigned32
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addI64",   // RSExportPrimitiveType::DataTypeSigned64
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU8",    // RSExportPrimitiveType::DataTypeUnsigned8
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU16",   // RSExportPrimitiveType::DataTypeUnsigned16
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU32",   // RSExportPrimitiveType::DataTypeUnsigned32
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU64",   // RSExportPrimitiveType::DataTypeUnsigned64
12691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    "addBoolean",  // RSExportPrimitiveType::DataTypeBoolean
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU16",   // RSExportPrimitiveType::DataTypeUnsigned565
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU16",   // RSExportPrimitiveType::DataTypeUnsigned5551
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addU16",   // RSExportPrimitiveType::DataTypeUnsigned4444
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
132aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk    "addMatrix",   // RSExportPrimitiveType::DataTypeRSMatrix2x2
133aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk    "addMatrix",   // RSExportPrimitiveType::DataTypeRSMatrix3x3
134aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk    "addMatrix",   // RSExportPrimitiveType::DataTypeRSMatrix4x4
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSElement
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSType
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSAllocation
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSSampler
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSScript
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSMesh
142db6dfdfcb7e8183f1c796475e5098ee4be80b5b8Jason Sams    "addObj",   // RSExportPrimitiveType::DataTypeRSPath
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSProgramFragment
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSProgramVertex
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSProgramRaster
1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSProgramStore
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "addObj",   // RSExportPrimitiveType::DataTypeRSFont
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  };
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  unsigned TypeId = EPT->getType();
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (TypeId < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*)))
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return PrimitiveTypePackerAPINameMap[ EPT->getType() ];
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1546e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert(false && "GetPackerAPIName : Unknown primitive data type");
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return NULL;
156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
158d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hinesstatic std::string GetTypeName(const RSExportType *ET, bool Brackets = true) {
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  switch (ET->getClass()) {
1602e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassPrimitive: {
161fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines      return RSExportPrimitiveType::getRSReflectionType(
162fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines          static_cast<const RSExportPrimitiveType*>(ET))->java_name;
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassPointer: {
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportType *PointeeType =
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportPointerType*>(ET)->getPointeeType();
1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (PointeeType->getClass() != RSExportType::ExportClassRecord)
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        return "Allocation";
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      else
171a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines        return PointeeType->getElementName();
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassVector: {
17447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      const RSExportVectorType *EVT =
17547aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines          static_cast<const RSExportVectorType*>(ET);
17647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      std::stringstream VecName;
17747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix
17847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines              << EVT->getNumElement();
17947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      return VecName.str();
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
18192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    case RSExportType::ExportClassMatrix: {
18292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      return GetMatrixTypeName(static_cast<const RSExportMatrixType*>(ET));
1832e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
1842e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassConstantArray: {
1852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      const RSExportConstantArrayType* CAT =
1862e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang          static_cast<const RSExportConstantArrayType*>(ET);
1872e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      std::string ElementTypeName = GetTypeName(CAT->getElementType());
188d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      if (Brackets) {
189d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines        ElementTypeName.append("[]");
190d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      }
1912e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      return ElementTypeName;
19292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassRecord: {
194a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      return ET->getElementName() + "."RS_TYPE_ITEM_CLASS_NAME;
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    default: {
1976e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unknown class of type");
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return "";
202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
204cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liaostatic const char *GetTypeNullValue(const RSExportType *ET) {
205cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao  switch (ET->getClass()) {
206cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    case RSExportType::ExportClassPrimitive: {
2071ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang      const RSExportPrimitiveType *EPT =
2081ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang          static_cast<const RSExportPrimitiveType*>(ET);
2091ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang      if (EPT->isRSObjectType())
210cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao        return "null";
2111ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang      else if (EPT->getType() == RSExportPrimitiveType::DataTypeBoolean)
2121ab1a450fed988c70c621c24dcf655733ccd3708Zonr Chang        return "false";
213cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao      else
214cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao        return "0";
215cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao      break;
216cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    }
217cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    case RSExportType::ExportClassPointer:
218cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    case RSExportType::ExportClassVector:
219cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    case RSExportType::ExportClassMatrix:
220cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    case RSExportType::ExportClassConstantArray:
221cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    case RSExportType::ExportClassRecord: {
222cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao      return "null";
223cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao      break;
224cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    }
225cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    default: {
2266e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unknown class of type");
227cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    }
228cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao  }
229cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao  return "";
230cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao}
231cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao
23247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hinesstatic std::string GetBuiltinElementConstruct(const RSExportType *ET) {
2332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  if (ET->getClass() == RSExportType::ExportClassPrimitive) {
234a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    return std::string("Element.") + ET->getElementName();
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else if (ET->getClass() == RSExportType::ExportClassVector) {
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const RSExportVectorType *EVT = static_cast<const RSExportVectorType*>(ET);
2372b8fb64be3047df940a219872b331eb11de2758dStephen Hines    if (EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) {
2382b8fb64be3047df940a219872b331eb11de2758dStephen Hines      if (EVT->getNumElement() == 2)
2392b8fb64be3047df940a219872b331eb11de2758dStephen Hines        return "Element.F32_2";
2402b8fb64be3047df940a219872b331eb11de2758dStephen Hines      else if (EVT->getNumElement() == 3)
2412b8fb64be3047df940a219872b331eb11de2758dStephen Hines        return "Element.F32_3";
2422b8fb64be3047df940a219872b331eb11de2758dStephen Hines      else if (EVT->getNumElement() == 4)
2432b8fb64be3047df940a219872b331eb11de2758dStephen Hines        return "Element.F32_4";
2442b8fb64be3047df940a219872b331eb11de2758dStephen Hines    } else if (EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) {
2452b8fb64be3047df940a219872b331eb11de2758dStephen Hines      if (EVT->getNumElement() == 4)
2462b8fb64be3047df940a219872b331eb11de2758dStephen Hines        return "Element.U8_4";
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
24892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  } else if (ET->getClass() == RSExportType::ExportClassMatrix) {
24992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    const RSExportMatrixType *EMT = static_cast<const RSExportMatrixType *>(ET);
25092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    switch (EMT->getDim()) {
25189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      case 2: return "Element.MATRIX_2X2";
25289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      case 3: return "Element.MATRIX_3X3";
25389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      case 4: return "Element.MATRIX_4X4";
2546e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      default: slangAssert(false && "Unsupported dimension of matrix");
25592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
25747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  // RSExportType::ExportClassPointer can't be generated in a struct.
258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
25947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  return "";
26048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines}
26148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
26248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate script class **********************/
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genScriptClass(Context &C,
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                  const std::string &ClassName,
2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                  std::string &ErrorMsg) {
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!C.startClass(Context::AM_Public,
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    ClassName,
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    RS_SCRIPT_CLASS_SUPER_CLASS_NAME,
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    ErrorMsg))
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genScriptClassConstructor(C);
2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Reflect export variable
2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(),
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           E = mRSContext->export_vars_end();
2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I != E;
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I++)
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    genExportVariable(C, *I);
2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2834a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines  // Reflect export for each functions (only available on ICS+)
2844cc499d6e5ec602309501873449c938af61170b2Stephen Hines  if (mRSContext->getTargetAPI() >= SLANG_ICS_TARGET_API) {
2854a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines    for (RSContext::const_export_foreach_iterator
2864a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines             I = mRSContext->export_foreach_begin(),
2874a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines             E = mRSContext->export_foreach_end();
2884a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines         I != E; I++)
2894a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines      genExportForEach(C, *I);
2904a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines  }
291593a894650e81be54173106ec266f0311cebebd3Stephen Hines
2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Reflect export function
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (RSContext::const_export_func_iterator
2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I = mRSContext->export_funcs_begin(),
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           E = mRSContext->export_funcs_end();
2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I != E; I++)
2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    genExportFunction(C, *I);
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endClass();
3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genScriptClassConstructor(Context &C) {
3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "// Constructor" << std::endl;
3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Public,
3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  NULL,
3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  C.getClassName(),
310b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams                  3,
311b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams                  "RenderScript", "rs",
312b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams                  "Resources", "resources",
313b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams                  "int", "id");
314b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams  // Call constructor of super class
315b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams  C.indent() << "super(rs, resources, id);" << std::endl;
316b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams
317b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams  // If an exported variable has initial value, reflect it
318b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams
319b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams  for (RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(),
320b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams           E = mRSContext->export_vars_end();
321b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams       I != E;
322b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams       I++) {
323b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams    const RSExportVar *EV = *I;
324d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines    if (!EV->getInit().isUninit()) {
325b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams      genInitExportVariable(C, EV->getType(), EV->getName(), EV->getInit());
326d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines    } else if (EV->getArraySize()) {
327d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      // Always create an initial zero-init array object.
328d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = new "
329d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines                 << GetTypeName(EV->getType(), false) << "["
330d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines                 << EV->getArraySize() << "];" << std::endl;
331d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      size_t NumInits = EV->getNumInits();
332d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      const RSExportConstantArrayType *ECAT =
333d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines          static_cast<const RSExportConstantArrayType*>(EV->getType());
334d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      const RSExportType *ET = ECAT->getElementType();
335d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      for (size_t i = 0; i < NumInits; i++) {
336d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines        std::stringstream Name;
337d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines        Name << EV->getName() << "[" << i << "]";
338d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines        genInitExportVariable(C, ET, Name.str(), EV->getInitArray(i));
339d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines      }
340d369cda199b11ae28a1935e06398c2162cf146f3Stephen Hines    }
341a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    if (mRSContext->getTargetAPI() >= SLANG_JB_TARGET_API) {
342a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      genTypeInstance(C, EV->getType());
343a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    }
344b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams  }
345b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams
34648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  for (RSContext::const_export_foreach_iterator
34748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines           I = mRSContext->export_foreach_begin(),
34848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines           E = mRSContext->export_foreach_end();
34948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines       I != E;
35048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines       I++) {
35148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    const RSExportForEach *EF = *I;
35248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
35348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    const RSExportType *IET = EF->getInType();
35448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    if (IET) {
355a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      genTypeInstanceFromPointer(C, IET);
35648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    }
35748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    const RSExportType *OET = EF->getOutType();
35848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    if (OET) {
359a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      genTypeInstanceFromPointer(C, OET);
36048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    }
36148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  }
36248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
363b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams  C.endFunction();
364b6902e2d07d1a0f20723f8502c65438a18d8b6e3Jason Sams
36548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  for (std::set<std::string>::iterator I = C.mTypesToCheck.begin(),
36648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines                                       E = C.mTypesToCheck.end();
36748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines       I != E;
36848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines       I++) {
369a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    C.indent() << "private Element " RS_ELEM_PREFIX << *I << ";" << std::endl;
37048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  }
37148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
3729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
3739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genInitBoolExportVariable(Context &C,
3769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                             const std::string &VarName,
3779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                             const clang::APValue &Val) {
3786e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert(!Val.isUninit() && "Not a valid initializer");
379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = ";
3816e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((Val.getKind() == clang::APValue::Int) &&
3826e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Bool type has wrong initial APValue");
383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
38492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  C.out() << ((Val.getInt().getSExtValue() == 0) ? "false" : "true")
38592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang          << ";" << std::endl;
386324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao
3879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
388462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3905d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hinesvoid RSReflection::genInitPrimitiveExportVariable(
3915d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines      Context &C,
3925d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines      const std::string &VarName,
3935d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines      const clang::APValue &Val) {
3945d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  slangAssert(!Val.isUninit() && "Not a valid initializer");
3955d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines
3965d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = ";
397192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams  C.out() << RSReflectionBase::genInitValue(Val);
3989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.out() << ";" << std::endl;
39948bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
4009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
40148bac230fe966771f3074975fc2426ffde519edfShih-wei Liao}
40248bac230fe966771f3074975fc2426ffde519edfShih-wei Liao
4039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genInitExportVariable(Context &C,
4049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                         const RSExportType *ET,
4059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                         const std::string &VarName,
4069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                         const clang::APValue &Val) {
4076e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert(!Val.isUninit() && "Not a valid initializer");
4089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  switch (ET->getClass()) {
4102e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassPrimitive: {
4119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportPrimitiveType *EPT =
4129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportPrimitiveType*>(ET);
41391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao      if (EPT->getType() == RSExportPrimitiveType::DataTypeBoolean) {
4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        genInitBoolExportVariable(C, VarName, Val);
4159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      } else {
4169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        genInitPrimitiveExportVariable(C, VarName, Val);
4172239ecece40c177e071f56326cd5ef423806394dShih-wei Liao      }
4189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
419324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    }
4209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassPointer: {
4219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (!Val.isInt() || Val.getInt().getSExtValue() != 0)
4229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        std::cout << "Initializer which is non-NULL to pointer type variable "
4239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     "will be ignored" << std::endl;
4249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
4259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
4269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassVector: {
4279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportVectorType *EVT =
4289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportVectorType*>(ET);
4299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      switch (Val.getKind()) {
4309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        case clang::APValue::Int:
4319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        case clang::APValue::Float: {
4322e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang          for (unsigned i = 0; i < EVT->getNumElement(); i++) {
4339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            std::string Name =  VarName + "." + GetVectorAccessor(i);
4349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            genInitPrimitiveExportVariable(C, Name, Val);
4359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          }
4369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          break;
43748bac230fe966771f3074975fc2426ffde519edfShih-wei Liao        }
4389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        case clang::APValue::Vector: {
43947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines          std::stringstream VecName;
44047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines          VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix
44147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                  << EVT->getNumElement();
4429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          C.indent() << RS_EXPORT_VAR_PREFIX << VarName << " = new "
44347aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                     << VecName.str() << "();" << std::endl;
4449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
4459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          unsigned NumElements =
4469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao              std::min(static_cast<unsigned>(EVT->getNumElement()),
4479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       Val.getVectorLength());
4489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          for (unsigned i = 0; i < NumElements; i++) {
4499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const clang::APValue &ElementVal = Val.getVectorElt(i);
4509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            std::string Name = VarName + "." + GetVectorAccessor(i);
4519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            genInitPrimitiveExportVariable(C, Name, ElementVal);
4529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          }
4539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          break;
454324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        }
455fa6ef56a6ca3dc3061218a75a7e68e5357fcb82cLogan Chien        case clang::APValue::MemberPointer:
4569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        case clang::APValue::Uninitialized:
4579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        case clang::APValue::ComplexInt:
4589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        case clang::APValue::ComplexFloat:
4594c622e0953afe3dca4da0aee364a811f3ccb61d9Stephen Hines        case clang::APValue::LValue:
4604c622e0953afe3dca4da0aee364a811f3ccb61d9Stephen Hines        case clang::APValue::Array:
4614c622e0953afe3dca4da0aee364a811f3ccb61d9Stephen Hines        case clang::APValue::Struct:
4620444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines        case clang::APValue::Union:
4630444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines        case clang::APValue::AddrLabelDiff: {
4646e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines          slangAssert(false && "Unexpected type of value of initializer.");
465324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        }
4669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
4679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
468324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    }
46992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // TODO(zonr): Resolving initializer of a record (and matrix) type variable
47092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // is complex. It cannot obtain by just simply evaluating the initializer
47192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    // expression.
47292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    case RSExportType::ExportClassMatrix:
4732e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassConstantArray:
4749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassRecord: {
4759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#if 0
4769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      unsigned InitIndex = 0;
4776315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      const RSExportRecordType *ERT =
4786315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr          static_cast<const RSExportRecordType*>(ET);
479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4806e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert((Val.getKind() == clang::APValue::Vector) &&
4816e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines          "Unexpected type of initializer for record type variable");
482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      C.indent() << RS_EXPORT_VAR_PREFIX << VarName
484a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << " = new " << ERT->getElementName()
4859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                 <<  "."RS_TYPE_ITEM_CLASS_NAME"();" << std::endl;
486462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(),
4889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               E = ERT->fields_end();
4899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I != E;
4909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I++) {
4919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const RSExportRecordType::Field *F = *I;
4929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        std::string FieldName = VarName + "." + F->getName();
493462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (InitIndex > Val.getVectorLength())
4959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          break;
496462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        genInitPrimitiveExportVariable(C,
4989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       FieldName,
4999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       Val.getVectorElt(InitIndex++));
5009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
5019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif
5026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unsupported initializer for record/matrix/constant "
5036e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                           "array type variable currently");
5049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
505462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
5069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    default: {
5076e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unknown class of type");
5089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
5099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
5109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
511462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
512462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
5139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genExportVariable(Context &C, const RSExportVar *EV) {
5149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportType *ET = EV->getType();
515462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
5169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX
5179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EV->getName() << " = " << C.getNextExportVarSlot() << ";"
5189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
519462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
5209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  switch (ET->getClass()) {
5212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassPrimitive: {
5229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genPrimitiveTypeExportVariable(C, EV);
5239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
524462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
5259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassPointer: {
5269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genPointerTypeExportVariable(C, EV);
5279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
528462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
5299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassVector: {
5309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genVectorTypeExportVariable(C, EV);
5319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
5329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
53392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    case RSExportType::ExportClassMatrix: {
53492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      genMatrixTypeExportVariable(C, EV);
53592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      break;
53692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
5372e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassConstantArray: {
5382e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      genConstantArrayTypeExportVariable(C, EV);
5392e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      break;
5402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
5419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassRecord: {
5429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genRecordTypeExportVariable(C, EV);
5439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
544c382c607cd3bbd94f8e8e26bc6d6e72efaad2d55Shih-wei Liao    }
5459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    default: {
5466e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unknown class of type");
5479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
5489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
5509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
551462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
552462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
5539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genExportFunction(Context &C, const RSExportFunc *EF) {
5549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX
5559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EF->getName() << " = " << C.getNextExportFuncSlot() << ";"
5569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
5579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // invoke_*()
5599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  Context::ArgTy Args;
5609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5610da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang  if (EF->hasParam()) {
5620da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    for (RSExportFunc::const_param_iterator I = EF->params_begin(),
5630da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang             E = EF->params_end();
5640da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang         I != E;
5650da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang         I++) {
5660da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang      Args.push_back(std::make_pair(GetTypeName((*I)->getType()),
5670da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang                                    (*I)->getName()));
5680da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    }
5699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
5709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Public,
5729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
5739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "void",
5743fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao                  "invoke_" + EF->getName(/*Mangle=*/ false),
5753fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao                      // We are using un-mangled name since Java
5763fa286b4c2f110c6be2bbfac9c715bb1ec880338Shih-wei Liao                      // supports method overloading.
5779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  Args);
5789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!EF->hasParam()) {
5809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");"
5819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << std::endl;
5829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else {
5839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const RSExportRecordType *ERT = EF->getParamPacketType();
5849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string FieldPackerName = EF->getName() + "_fp";
5859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str()))
5879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str());
5889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", "
5909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << FieldPackerName << ");" << std::endl;
5919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
5929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
5939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
5949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
5959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
596462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
597593a894650e81be54173106ec266f0311cebebd3Stephen Hinesvoid RSReflection::genExportForEach(Context &C, const RSExportForEach *EF) {
598c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines  if (EF->isDummyRoot()) {
599c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines    // Skip reflection for dummy root() kernels. Note that we have to
600c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines    // advance the next slot number for ForEach, however.
601c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines    C.indent() << "//private final static int "RS_EXPORT_FOREACH_INDEX_PREFIX
602c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines               << EF->getName() << " = " << C.getNextExportForEachSlot() << ";"
603c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines               << std::endl;
604c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines    return;
605c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines  }
606c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines
607593a894650e81be54173106ec266f0311cebebd3Stephen Hines  C.indent() << "private final static int "RS_EXPORT_FOREACH_INDEX_PREFIX
608593a894650e81be54173106ec266f0311cebebd3Stephen Hines             << EF->getName() << " = " << C.getNextExportForEachSlot() << ";"
609593a894650e81be54173106ec266f0311cebebd3Stephen Hines             << std::endl;
610593a894650e81be54173106ec266f0311cebebd3Stephen Hines
611b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  // forEach_*()
612593a894650e81be54173106ec266f0311cebebd3Stephen Hines  Context::ArgTy Args;
613593a894650e81be54173106ec266f0311cebebd3Stephen Hines
614b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  slangAssert(EF->getNumParameters() > 0);
615593a894650e81be54173106ec266f0311cebebd3Stephen Hines
616b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (EF->hasIn())
617b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    Args.push_back(std::make_pair("Allocation", "ain"));
618b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (EF->hasOut())
619593a894650e81be54173106ec266f0311cebebd3Stephen Hines    Args.push_back(std::make_pair("Allocation", "aout"));
620b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
621b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  const RSExportRecordType *ERT = EF->getParamPacketType();
622b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (ERT) {
623b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    for (RSExportForEach::const_param_iterator I = EF->params_begin(),
624593a894650e81be54173106ec266f0311cebebd3Stephen Hines             E = EF->params_end();
625593a894650e81be54173106ec266f0311cebebd3Stephen Hines         I != E;
626593a894650e81be54173106ec266f0311cebebd3Stephen Hines         I++) {
627593a894650e81be54173106ec266f0311cebebd3Stephen Hines      Args.push_back(std::make_pair(GetTypeName((*I)->getType()),
628593a894650e81be54173106ec266f0311cebebd3Stephen Hines                                    (*I)->getName()));
629593a894650e81be54173106ec266f0311cebebd3Stephen Hines    }
630593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
631593a894650e81be54173106ec266f0311cebebd3Stephen Hines
632593a894650e81be54173106ec266f0311cebebd3Stephen Hines  C.startFunction(Context::AM_Public,
633593a894650e81be54173106ec266f0311cebebd3Stephen Hines                  false,
634593a894650e81be54173106ec266f0311cebebd3Stephen Hines                  "void",
635593a894650e81be54173106ec266f0311cebebd3Stephen Hines                  "forEach_" + EF->getName(),
636593a894650e81be54173106ec266f0311cebebd3Stephen Hines                  Args);
637593a894650e81be54173106ec266f0311cebebd3Stephen Hines
638b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  const RSExportType *IET = EF->getInType();
639b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (IET) {
640b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    genTypeCheck(C, IET, "ain");
641b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  }
642593a894650e81be54173106ec266f0311cebebd3Stephen Hines
643b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  const RSExportType *OET = EF->getOutType();
644b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (OET) {
645b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    genTypeCheck(C, OET, "aout");
646593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
647593a894650e81be54173106ec266f0311cebebd3Stephen Hines
648b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (EF->hasIn() && EF->hasOut()) {
649b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "// Verify dimensions" << std::endl;
650b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "Type tIn = ain.getType();" << std::endl;
651b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "Type tOut = aout.getType();" << std::endl;
652b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "if ((tIn.getCount() != tOut.getCount()) ||" << std::endl;
653b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "    (tIn.getX() != tOut.getX()) ||" << std::endl;
654b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "    (tIn.getY() != tOut.getY()) ||" << std::endl;
655b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "    (tIn.getZ() != tOut.getZ()) ||" << std::endl;
656b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "    (tIn.hasFaces() != tOut.hasFaces()) ||" << std::endl;
657b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "    (tIn.hasMipmaps() != tOut.hasMipmaps())) {" << std::endl;
65848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    C.indent() << "    throw new RSRuntimeException(\"Dimension mismatch "
65948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines               << "between input and output parameters!\");";
660b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out()    << std::endl;
661b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.indent() << "}" << std::endl;
662593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
663593a894650e81be54173106ec266f0311cebebd3Stephen Hines
664b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  std::string FieldPackerName = EF->getName() + "_fp";
665b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (ERT) {
666b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    if (genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) {
667b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines      genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str());
668b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    }
669b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  }
670b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  C.indent() << "forEach("RS_EXPORT_FOREACH_INDEX_PREFIX << EF->getName();
671b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
672b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (EF->hasIn())
673b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out() << ", ain";
674b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  else
675b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out() << ", null";
676b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
677b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (EF->hasOut())
678b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out() << ", aout";
679b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  else
680b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out() << ", null";
681b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
682b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  if (EF->hasUsrData())
683b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out() << ", " << FieldPackerName;
684b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  else
685b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines    C.out() << ", null";
686b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
687b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  C.out() << ");" << std::endl;
688b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
689593a894650e81be54173106ec266f0311cebebd3Stephen Hines  C.endFunction();
690593a894650e81be54173106ec266f0311cebebd3Stephen Hines  return;
691593a894650e81be54173106ec266f0311cebebd3Stephen Hines}
692593a894650e81be54173106ec266f0311cebebd3Stephen Hines
693a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hinesvoid RSReflection::genTypeInstanceFromPointer(Context &C,
694a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                                              const RSExportType *ET) {
69548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  if (ET->getClass() == RSExportType::ExportClassPointer) {
69648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    const RSExportPointerType *EPT =
69748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines        static_cast<const RSExportPointerType*>(ET);
698a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    genTypeInstance(C, EPT->getPointeeType());
699a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines  }
700a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines}
70148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
702a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hinesvoid RSReflection::genTypeInstance(Context &C,
703a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                                   const RSExportType *ET) {
704a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines  switch (ET->getClass()) {
705a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    case RSExportType::ExportClassPrimitive:
706a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    case RSExportType::ExportClassVector:
707a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    case RSExportType::ExportClassConstantArray: {
708a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      std::string TypeName = ET->getElementName();
709a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      if (C.mTypesToCheck.find(TypeName) == C.mTypesToCheck.end()) {
710a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines        C.indent() << RS_ELEM_PREFIX << TypeName << " = Element." << TypeName
711a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                   << "(rs);" << std::endl;
712a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines        C.mTypesToCheck.insert(TypeName);
71348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines      }
714a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      break;
715a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    }
71648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
717a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    case RSExportType::ExportClassRecord: {
718a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      std::string ClassName = ET->getElementName();
719a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      if (C.mTypesToCheck.find(ClassName) == C.mTypesToCheck.end()) {
720a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines        C.indent() << RS_ELEM_PREFIX << ClassName << " = " << ClassName <<
721a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                      ".createElement(rs);" << std::endl;
722a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines        C.mTypesToCheck.insert(ClassName);
72348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines      }
724a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      break;
72548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    }
726a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
727a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    default:
728a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      break;
72948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  }
73048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines}
73148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
732b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hinesvoid RSReflection::genTypeCheck(Context &C,
733b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines                                const RSExportType *ET,
734b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines                                const char *VarName) {
735b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  C.indent() << "// check " << VarName << std::endl;
73648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
73748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  if (ET->getClass() == RSExportType::ExportClassPointer) {
73848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    const RSExportPointerType *EPT =
73948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines        static_cast<const RSExportPointerType*>(ET);
74048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    ET = EPT->getPointeeType();
74148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  }
74248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
74348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  std::string TypeName;
74448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
74548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  switch (ET->getClass()) {
746a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    case RSExportType::ExportClassPrimitive:
747a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    case RSExportType::ExportClassVector:
74848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    case RSExportType::ExportClassRecord: {
749a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      TypeName = ET->getElementName();
75048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines      break;
75148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    }
75248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
75348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    default:
75448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines      break;
75548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  }
75648b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
75748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  if (!TypeName.empty()) {
75848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    C.indent() << "if (!" << VarName
759a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines               << ".getType().getElement().isCompatible(" RS_ELEM_PREFIX
76048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines               << TypeName << ")) {" << std::endl;
76148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    C.indent() << "    throw new RSRuntimeException(\"Type mismatch with "
76248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines               << TypeName << "!\");" << std::endl;
76348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    C.indent() << "}" << std::endl;
76448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  }
76548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
766b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines  return;
767b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines}
768b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
769b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
770e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genPrimitiveTypeExportVariable(
771e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    Context &C,
772e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    const RSExportVar *EV) {
7736e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((EV->getType()->getClass() == RSExportType::ExportClassPrimitive)
7746e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              && "Variable should be type of primitive here");
7759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportPrimitiveType *EPT =
7779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      static_cast<const RSExportPrimitiveType*>(EV->getType());
778fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines  const char *TypeName =
779fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines      RSExportPrimitiveType::getRSReflectionType(EPT)->java_name;
7809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX
7829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EV->getName() << ";" << std::endl;
7839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7845d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  if (EV->isConst()) {
7855d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines    C.indent() << "public final static " << TypeName
7865d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines               << " " RS_EXPORT_VAR_CONST_PREFIX << EV->getName() << " = ";
7875d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines    const clang::APValue &Val = EV->getInit();
788192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams    C.out() << RSReflectionBase::genInitValue(Val, EPT->getType() ==
789192392fc5ffedc06eb8ae2b89d703b3c658fddd6Jason Sams        RSExportPrimitiveType::DataTypeBoolean) << ";" << std::endl;
7905d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  } else {
7915d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines    // set_*()
7929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.startFunction(Context::AM_Public,
7939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
7949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "void",
7959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "set_" + EV->getName(),
7969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    1,
797d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                    TypeName, "v");
7989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl;
7999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
800650c02be6719a961027c86d6b9a142014eb889dbJason Sams    C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName()
801650c02be6719a961027c86d6b9a142014eb889dbJason Sams               << ", v);" << std::endl;
802462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
803462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
8049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
805462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genGetExportVariable(C, TypeName, EV->getName());
807462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
809462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
810462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context &C,
8129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                const RSExportVar *EV) {
8139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportType *ET = EV->getType();
8149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportType *PointeeType;
8159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string TypeName;
816462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8176e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((ET->getClass() == RSExportType::ExportClassPointer) &&
8186e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Variable should be type of pointer here");
819462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType();
8219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  TypeName = GetTypeName(ET);
822462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX
8249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EV->getName() << ";" << std::endl;
825462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
82689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang  // bind_*()
8279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Public,
8289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
8299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "void",
8309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "bind_" + EV->getName(),
8319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  1,
832d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  TypeName.c_str(), "v");
833462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl;
8359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "if (v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX
8369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EV->getName() << ");" << std::endl;
837462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (PointeeType->getClass() == RSExportType::ExportClassRecord)
8399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "else bindAllocation(v.getAllocation(), "
8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");"
8419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << std::endl;
8429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
8439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX
8449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << EV->getName() << ");" << std::endl;
845462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
847462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genGetExportVariable(C, TypeName, EV->getName());
849462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
851462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
852462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context &C,
8549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                               const RSExportVar *EV) {
8556e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((EV->getType()->getClass() == RSExportType::ExportClassVector) &&
8566e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Variable should be type of vector here");
8579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportVectorType *EVT =
8599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      static_cast<const RSExportVectorType*>(EV->getType());
86047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  std::stringstream VecName;
86147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  VecName << EVT->getRSReflectionType(EVT)->rs_java_vector_prefix
86247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines          << EVT->getNumElement();
86347aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  std::string TypeName = VecName.str();
8649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const char *FieldPackerName = "fp";
8659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX
8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EV->getName() << ";" << std::endl;
8689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // set_*()
8709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!EV->isConst()) {
8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.startFunction(Context::AM_Public,
8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
8739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "void",
8749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "set_" + EV->getName(),
8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    1,
87647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                    TypeName.c_str(), "v");
8779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl;
8789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (genCreateFieldPacker(C, EVT, FieldPackerName))
8809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genPackVarOfType(C, EVT, "v", FieldPackerName);
881a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
882a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) {
883a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // Legacy apps must use the old setVar() without Element/dim components.
884a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", "
885a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << FieldPackerName << ");" << std::endl;
886a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    } else {
887a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // We only have support for one-dimensional array reflection today,
888a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // but the entry point (i.e. setVar()) takes an array of dimensions.
889a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "int []__dimArr = new int[1];" << std::endl;
890a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "__dimArr[0] = 1;" << std::endl;
891a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", "
892a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << FieldPackerName << ", " RS_ELEM_PREFIX
893a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << EVT->getElementName() << ", __dimArr);" << std::endl;
894a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    }
895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.endFunction();
8979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
8999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genGetExportVariable(C, TypeName, EV->getName());
9009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
90392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Changvoid RSReflection::genMatrixTypeExportVariable(Context &C,
90492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                                               const RSExportVar *EV) {
9056e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((EV->getType()->getClass() == RSExportType::ExportClassMatrix) &&
9066e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Variable should be type of matrix here");
90792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
90892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  const RSExportMatrixType *EMT =
90992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      static_cast<const RSExportMatrixType*>(EV->getType());
91092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  const char *TypeName = GetMatrixTypeName(EMT);
91192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  const char *FieldPackerName = "fp";
91292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
91392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX
91492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang             << EV->getName() << ";" << std::endl;
91592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
91692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  // set_*()
91792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  if (!EV->isConst()) {
91892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    C.startFunction(Context::AM_Public,
91992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    false,
92092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    "void",
92192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    "set_" + EV->getName(),
92292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    1,
92392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    TypeName, "v");
92492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl;
92592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
92692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    if (genCreateFieldPacker(C, EMT, FieldPackerName))
92792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      genPackVarOfType(C, EMT, "v", FieldPackerName);
92892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", "
92992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang               << FieldPackerName << ");" << std::endl;
93092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
93192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    C.endFunction();
93292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  }
93392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
93492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  genGetExportVariable(C, TypeName, EV->getName());
93592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  return;
93692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang}
93792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
938e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genConstantArrayTypeExportVariable(
939e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    Context &C,
940e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    const RSExportVar *EV) {
9416e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((EV->getType()->getClass() ==
9426e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines               RSExportType::ExportClassConstantArray) &&
9436e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Variable should be type of constant array here");
9442e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9452e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  const RSExportConstantArrayType *ECAT =
9462e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      static_cast<const RSExportConstantArrayType*>(EV->getType());
9472e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  std::string TypeName = GetTypeName(ECAT);
9482e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  const char *FieldPackerName = "fp";
9492e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9502e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX
9512e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang             << EV->getName() << ";" << std::endl;
9522e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9532e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  // set_*()
9542e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  if (!EV->isConst()) {
9552e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    C.startFunction(Context::AM_Public,
9562e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                    false,
9572e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                    "void",
9582e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                    "set_" + EV->getName(),
9592e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                    1,
9602e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                    TypeName.c_str(), "v");
9612e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl;
9622e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9632e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    if (genCreateFieldPacker(C, ECAT, FieldPackerName))
9642e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      genPackVarOfType(C, ECAT, "v", FieldPackerName);
965a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
966a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) {
967a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", "
968a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << FieldPackerName << ");" << std::endl;
969a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    } else {
970a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // We only have support for one-dimensional array reflection today,
971a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // but the entry point (i.e. setVar()) takes an array of dimensions.
972a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "int []__dimArr = new int[1];" << std::endl;
973a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "__dimArr[0] = " << ECAT->getSize() << ";" << std::endl;
974a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", "
975a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << FieldPackerName << ", " RS_ELEM_PREFIX
976a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << ECAT->getElementName() << ", __dimArr);" << std::endl;
977a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    }
9782e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9792e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    C.endFunction();
9802e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  }
9812e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9822e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  genGetExportVariable(C, TypeName, EV->getName());
9832e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  return;
9842e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang}
9852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
9869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context &C,
9879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                               const RSExportVar *EV) {
9886e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines  slangAssert((EV->getType()->getClass() == RSExportType::ExportClassRecord) &&
9896e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines              "Variable should be type of struct here");
9909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportRecordType *ERT =
9929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      static_cast<const RSExportRecordType*>(EV->getType());
993a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines  std::string TypeName = ERT->getElementName() + "."RS_TYPE_ITEM_CLASS_NAME;
9949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const char *FieldPackerName = "fp";
9959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX
9979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << EV->getName() << ";" << std::endl;
9989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // set_*()
10009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!EV->isConst()) {
10019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.startFunction(Context::AM_Public,
10029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
10039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "void",
10049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "set_" + EV->getName(),
10059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    1,
1006d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                    TypeName.c_str(), "v");
10079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << std::endl;
10089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (genCreateFieldPacker(C, ERT, FieldPackerName))
10109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genPackVarOfType(C, ERT, "v", FieldPackerName);
1011a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
1012a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    if (mRSContext->getTargetAPI() < SLANG_JB_TARGET_API) {
1013a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // Legacy apps must use the old setVar() without Element/dim components.
1014a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName()
1015a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << ", " << FieldPackerName << ");" << std::endl;
1016a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    } else {
1017a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // We only have support for one-dimensional array reflection today,
1018a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      // but the entry point (i.e. setVar()) takes an array of dimensions.
1019a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "int []__dimArr = new int[1];" << std::endl;
1020a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "__dimArr[0] = 1;" << std::endl;
1021a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines      C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", "
1022a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << FieldPackerName << ", " RS_ELEM_PREFIX
1023a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                 << ERT->getElementName() << ", __dimArr);" << std::endl;
1024a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines    }
10251ebc0ca6ffa7effb875883d18205ed4943ab8fc2Shih-wei Liao
10269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.endFunction();
10279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genGetExportVariable(C, TypeName.c_str(), EV->getName());
10309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
10319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1032462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genGetExportVariable(Context &C,
10349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        const std::string &TypeName,
10359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        const std::string &VarName) {
10369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Public,
10379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
10389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  TypeName.c_str(),
10399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "get_" + VarName,
10409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  0);
1041462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << std::endl;
1043462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
10449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
10459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
10469c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao}
10479c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
10489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************* Methods to generate script class /end *******************/
10499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genCreateFieldPacker(Context &C,
10519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        const RSExportType *ET,
10529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                        const char *FieldPackerName) {
10539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  size_t AllocSize = RSExportType::GetTypeAllocSize(ET);
10549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (AllocSize > 0)
10559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker("
10569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << AllocSize << ");" << std::endl;
10579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
10589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
10599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
10609c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao}
10619c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
10629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genPackVarOfType(Context &C,
10639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const RSExportType *ET,
10649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const char *VarName,
10659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const char *FieldPackerName) {
10669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  switch (ET->getClass()) {
10679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassPrimitive:
10689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassVector: {
10699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      C.indent() << FieldPackerName << "."
10709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                 << GetPackerAPIName(
10719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     static_cast<const RSExportPrimitiveType*>(ET))
10729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                 << "(" << VarName << ");" << std::endl;
10739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
10749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
10759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassPointer: {
10769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Must reflect as type Allocation in Java
10779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportType *PointeeType =
10789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportPointerType*>(ET)->getPointeeType();
10799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (PointeeType->getClass() != RSExportType::ExportClassRecord)
10819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        C.indent() << FieldPackerName << ".addI32(" << VarName
10829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                   << ".getPtr());" << std::endl;
10839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      else
10849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        C.indent() << FieldPackerName << ".addI32(" << VarName
10859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                   << ".getAllocation().getPtr());" << std::endl;
10869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
10879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
108892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    case RSExportType::ExportClassMatrix: {
1089aa180e98d5209fb44e7d5ecaec758be4a43078cdAlex Sakhartchouk      C.indent() << FieldPackerName << ".addMatrix(" << VarName << ");"
109092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                 << std::endl;
109192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      break;
109292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    }
10932e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassConstantArray: {
10942e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      const RSExportConstantArrayType *ECAT =
10952e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang          static_cast<const RSExportConstantArrayType *>(ET);
10962e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
109789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      // TODO(zonr): more elegant way. Currently, we obtain the unique index
109889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      //             variable (this method involves recursive call which means
109989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      //             we may have more than one level loop, therefore we can't
110089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      //             always use the same index variable name here) name given
110189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      //             in the for-loop from counting the '.' in @VarName.
110289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      unsigned Level = 0;
110389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      size_t LastDotPos = 0;
11042e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      std::string ElementVarName(VarName);
110589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang
110689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      while (LastDotPos != std::string::npos) {
110789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        LastDotPos = ElementVarName.find_first_of('.', LastDotPos + 1);
110889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        Level++;
110989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      }
111089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      std::string IndexVarName("ct");
111189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      IndexVarName.append(llvm::utostr_32(Level));
111289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang
111389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      C.indent() << "for (int " << IndexVarName << " = 0; " <<
111489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                          IndexVarName << " < " << ECAT->getSize() << "; " <<
111589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                          IndexVarName << "++)";
111689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      C.startBlock();
111789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang
111889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      ElementVarName.append("[" + IndexVarName + "]");
11192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      genPackVarOfType(C, ECAT->getElementType(), ElementVarName.c_str(),
11202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                       FieldPackerName);
11212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
11222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      C.endBlock();
11232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      break;
11242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
11259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case RSExportType::ExportClassRecord: {
11266315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      const RSExportRecordType *ERT =
11276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr          static_cast<const RSExportRecordType*>(ET);
11289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Relative pos from now on in field packer
11299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      unsigned Pos = 0;
11309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
11319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(),
11329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               E = ERT->fields_end();
11339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I != E;
11349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I++) {
11359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const RSExportRecordType::Field *F = *I;
11369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        std::string FieldName;
11379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        size_t FieldOffset = F->getOffsetInParent();
11389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
11399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType());
1140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (VarName != NULL)
11429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          FieldName = VarName + ("." + F->getName());
11439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        else
11449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          FieldName = F->getName();
1145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (FieldOffset > Pos)
11479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          C.indent() << FieldPackerName << ".skip("
11489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                     << (FieldOffset - Pos) << ");" << std::endl;
1149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName);
1151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // There is padding in the field type
11539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (FieldAllocSize > FieldStoreSize)
11549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            C.indent() << FieldPackerName << ".skip("
11559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       << (FieldAllocSize - FieldStoreSize)
11569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       << ");" << std::endl;
1157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          Pos = FieldOffset + FieldAllocSize;
11599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // There maybe some padding after the struct
1162d22724aead836dc039f5f9521ad7d38845d07ea0Andrew Hsieh      if (RSExportType::GetTypeAllocSize(ERT) > Pos)
11636b201eb3306b9609a991728a52ce948974bd4aedStephen Hines        C.indent() << FieldPackerName << ".skip("
1164d22724aead836dc039f5f9521ad7d38845d07ea0Andrew Hsieh                   << RSExportType::GetTypeAllocSize(ERT) - Pos << ");"
11659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                   << std::endl;
11669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
1167f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao    }
11689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    default: {
11696e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unknown class of type");
1170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
11719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
11749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
11762e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Changvoid RSReflection::genAllocateVarOfType(Context &C,
11772e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                                        const RSExportType *T,
11782e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                                        const std::string &VarName) {
11792e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  switch (T->getClass()) {
11802e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassPrimitive: {
11812e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // Primitive type like int in Java has its own storage once it's declared.
11822e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      //
11832e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // FIXME: Should we allocate storage for RS object?
11842e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // if (static_cast<const RSExportPrimitiveType *>(T)->isRSObjectType())
11852e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      //  C.indent() << VarName << " = new " << GetTypeName(T) << "();"
11862e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      //             << std::endl;
11872e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      break;
11882e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
11892e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassPointer: {
11902e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // Pointer type is an instance of Allocation or a TypeClass whose value is
11912e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // expected to be assigned by programmer later in Java program. Therefore
11922e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // we don't reflect things like [VarName] = new Allocation();
11932e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      C.indent() << VarName << " = null;" << std::endl;
11942e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      break;
11952e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
11962e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassConstantArray: {
11972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      const RSExportConstantArrayType *ECAT =
11982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang          static_cast<const RSExportConstantArrayType *>(T);
11992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      const RSExportType *ElementType = ECAT->getElementType();
12002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
12012f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang      C.indent() << VarName << " = new " << GetTypeName(ElementType)
12022f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang                 << "[" << ECAT->getSize() << "];" << std::endl;
12032f1451cf567125d8ebd2cacfa83a10fdf3a7ab5aZonr Chang
12042e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      // Primitive type element doesn't need allocation code.
12052e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      if (ElementType->getClass() != RSExportType::ExportClassPrimitive) {
12062e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        C.indent() << "for (int $ct = 0; $ct < " << ECAT->getSize() << "; "
12072e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                            "$ct++)";
12082e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        C.startBlock();
12092e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
12102e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        std::string ElementVarName(VarName);
12112e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        ElementVarName.append("[$ct]");
12122e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        genAllocateVarOfType(C, ElementType, ElementVarName);
12132e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
12142e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        C.endBlock();
12152e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      }
12162e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      break;
12172e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
12182e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassVector:
12192e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassMatrix:
12202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    case RSExportType::ExportClassRecord: {
12212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      C.indent() << VarName << " = new " << GetTypeName(T) << "();"
12222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                 << std::endl;
12232e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      break;
12242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    }
12252e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  }
12262e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  return;
12272e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang}
12282e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
1229e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genNewItemBufferIfNull(Context &C,
1230e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                                          const char *Index) {
1231e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  C.indent() << "if (" RS_TYPE_ITEM_BUFFER_NAME " == null) "
1232e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                  RS_TYPE_ITEM_BUFFER_NAME " = "
1233e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                    "new " RS_TYPE_ITEM_CLASS_NAME
1234e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                      "[getType().getX() /* count */];"
12359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
12369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (Index != NULL)
12379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] == null) "
123892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    RS_TYPE_ITEM_BUFFER_NAME"[" << Index << "] = "
123992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                      "new "RS_TYPE_ITEM_CLASS_NAME"();" << std::endl;
12409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
12419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1242462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genNewItemBufferPackerIfNull(Context &C) {
1244e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME " == null) "
1245e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                  RS_TYPE_ITEM_BUFFER_PACKER_NAME " = "
1246e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                    "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME
1247e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                      ".sizeof * getType().getX()/* count */"
1248e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                        ");" << std::endl;
12499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
1250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
12529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********************** Methods to generate type class  **********************/
12539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::genTypeClass(Context &C,
12549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                const RSExportRecordType *ERT,
12559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                std::string &ErrorMsg) {
1256a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines  std::string ClassName = ERT->getElementName();
12579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!C.startClass(Context::AM_Public,
12599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
12609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    ClassName,
12619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    RS_TYPE_CLASS_SUPER_CLASS_NAME,
12629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    ErrorMsg))
12639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
12649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12654cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  mGeneratedFileNames->push_back(ClassName);
12664cc67fce91f43215d61b2695746eab102a3db516Stephen Hines
12672e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  genTypeItemClass(C, ERT);
12689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Declare item buffer and item buffer packer
12709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[]"
12719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      ";" << std::endl;
12729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";"
12739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
1274e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "private static java.lang.ref.WeakReference<Element> "
1275e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             RS_TYPE_ELEMENT_REF_NAME
1276381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams             " = new java.lang.ref.WeakReference<Element>(null);" << std::endl;
12779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassConstructor(C, ERT);
127938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  genTypeClassCopyToArrayLocal(C, ERT);
12809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassCopyToArray(C, ERT);
12819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassItemSetter(C, ERT);
12829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassItemGetter(C, ERT);
12839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassComponentSetter(C, ERT);
12849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassComponentGetter(C, ERT);
12859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genTypeClassCopyAll(C, ERT);
1286d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  genTypeClassResize(C);
12879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
12889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endClass();
12899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
129066aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang  C.resetFieldIndex();
129166aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang  C.clearFieldIndexMap();
129266aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang
12939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
12949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1295462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1296e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesvoid RSReflection::genTypeItemClass(Context &C,
1297e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines                                    const RSExportRecordType *ERT) {
12989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME;
12999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startBlock();
13009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "public static final int sizeof = "
13029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << RSExportType::GetTypeAllocSize(ERT) << ";" << std::endl;
13039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Member elements
13059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.out() << std::endl;
13069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(),
13079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           FE = ERT->fields_end();
13089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI != FE;
13099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI++) {
13109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName()
13119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << ";" << std::endl;
13129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
13139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Constructor
13159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.out() << std::endl;
13169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_TYPE_ITEM_CLASS_NAME"()";
13179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startBlock();
13189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(),
13209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           FE = ERT->fields_end();
13219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI != FE;
13229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI++) {
13239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const RSExportRecordType::Field *F = *FI;
13242e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    genAllocateVarOfType(C, F->getType(), F->getName());
13259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
13269e86e1926328d9ecf3cd0922e55299db901f6469Shih-wei Liao
13279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // end Constructor
13289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endBlock();
1329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // end Item class
13319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endBlock();
1332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13332e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  return;
1334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassConstructor(Context &C,
13379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                           const RSExportRecordType *ERT) {
13389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const char *RenderScriptVar = "rs";
13399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Public,
13419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  true,
13429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "Element",
13439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "createElement",
13449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  1,
1345d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "RenderScript", RenderScriptVar);
1346381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1347e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  // TODO(all): Fix weak-refs + multi-context issue.
1348e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  // C.indent() << "Element e = " << RS_TYPE_ELEMENT_REF_NAME
1349e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  //            << ".get();" << std::endl;
1350e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  // C.indent() << "if (e != null) return e;" << std::endl;
1351381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  genBuildElement(C, "eb", ERT, RenderScriptVar, /* IsInline = */true);
1352ee35ab7a313dcf2b23f9446e52b822c79d50db4eStephen Hines  C.indent() << "return eb.create();" << std::endl;
1353e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  // C.indent() << "e = eb.create();" << std::endl;
1354e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  // C.indent() << RS_TYPE_ELEMENT_REF_NAME
1355e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  //            << " = new java.lang.ref.WeakReference<Element>(e);"
1356e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  //            << std::endl;
1357e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  // C.indent() << "return e;" << std::endl;
13589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
13599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1360381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1361381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // private with element
1362381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Private,
1363381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  false,
1364381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  NULL,
1365381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  C.getClassName(),
1366381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  1,
1367381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar);
1368381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl;
1369381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl;
1370e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "mElement = createElement(" << RenderScriptVar << ");"
1371e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << std::endl;
1372381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
1373381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1374381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // 1D without usage
13759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Public,
13769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
13779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  NULL,
13789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  C.getClassName(),
13799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  2,
1380d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "RenderScript", RenderScriptVar,
1381d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "int", "count");
13829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
13839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl;
13849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl;
13859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "mElement = createElement(" << RenderScriptVar << ");"
13869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
13879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Call init() in super class
13889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "init(" << RenderScriptVar << ", count);" << std::endl;
13899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
13909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1391381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // 1D with usage
139291fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  C.startFunction(Context::AM_Public,
139391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  false,
139491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  NULL,
139591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  C.getClassName(),
139691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  3,
139791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  "RenderScript", RenderScriptVar,
139891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  "int", "count",
139991fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams                  "int", "usages");
140091fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams
140191fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << std::endl;
140291fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << std::endl;
140391fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  C.indent() << "mElement = createElement(" << RenderScriptVar << ");"
140491fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams             << std::endl;
140591fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  // Call init() in super class
140691fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  C.indent() << "init(" << RenderScriptVar << ", count, usages);" << std::endl;
140791fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams  C.endFunction();
140891fe83b56e6ffabecdb1292ff3694275ef07aed9Jason Sams
1409381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1410381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // create1D with usage
1411381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Public,
1412381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  true,
1413381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  C.getClassName().c_str(),
1414381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "create1D",
1415381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  3,
1416381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar,
1417381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "dimX",
1418381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "usages");
1419381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << C.getClassName() << " obj = new " << C.getClassName() << "("
1420381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams             << RenderScriptVar << ");" << std::endl;
1421e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "obj.mAllocation = Allocation.createSized("
1422e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines                "rs, obj.mElement, dimX, usages);" << std::endl;
1423381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "return obj;" << std::endl;
1424381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
1425381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1426381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // create1D without usage
1427381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Public,
1428381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  true,
1429381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  C.getClassName().c_str(),
1430381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "create1D",
1431381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  2,
1432381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar,
1433381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "dimX");
1434e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "return create1D(" << RenderScriptVar
1435e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << ", dimX, Allocation.USAGE_SCRIPT);" << std::endl;
1436381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
1437381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1438381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1439381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // create2D without usage
1440381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Public,
1441381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  true,
1442381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  C.getClassName().c_str(),
1443381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "create2D",
1444381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  3,
1445381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar,
1446381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "dimX",
1447381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "dimY");
1448e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "return create2D(" << RenderScriptVar
1449e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << ", dimX, dimY, Allocation.USAGE_SCRIPT);" << std::endl;
1450381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
1451381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1452381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // create2D with usage
1453381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Public,
1454381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  true,
1455381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  C.getClassName().c_str(),
1456381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "create2D",
1457381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  4,
1458381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar,
1459381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "dimX",
1460381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "dimY",
1461381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "usages");
1462381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1463381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << C.getClassName() << " obj = new " << C.getClassName() << "("
1464381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams             << RenderScriptVar << ");" << std::endl;
1465e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "Type.Builder b = new Type.Builder(rs, obj.mElement);"
1466e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << std::endl;
1467381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "b.setX(dimX);" << std::endl;
1468381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "b.setY(dimY);" << std::endl;
1469381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "Type t = b.create();" << std::endl;
1470e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);"
1471e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << std::endl;
1472381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "return obj;" << std::endl;
1473381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
1474381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1475381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1476381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // createTypeBuilder
1477381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Public,
1478381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  true,
1479381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "Type.Builder",
1480381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "createTypeBuilder",
1481381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  1,
1482381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar);
1483e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "Element e = createElement(" << RenderScriptVar << ");"
1484e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << std::endl;
1485381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "return new Type.Builder(rs, e);" << std::endl;
1486381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
1487381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
1488381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  // createCustom with usage
1489381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.startFunction(Context::AM_Public,
1490381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  true,
1491381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  C.getClassName().c_str(),
1492381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "createCustom",
1493381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  3,
1494381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "RenderScript", RenderScriptVar,
1495381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "Type.Builder", "tb",
1496381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams                  "int", "usages");
1497381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << C.getClassName() << " obj = new " << C.getClassName() << "("
1498381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams             << RenderScriptVar << ");" << std::endl;
1499381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "Type t = tb.create();" << std::endl;
1500381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "if (t.getElement() != obj.mElement) {" << std::endl;
1501e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "    throw new RSIllegalArgumentException("
1502e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines                "\"Type.Builder did not match expected element type.\");"
1503381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams             << std::endl;
1504381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "}" << std::endl;
1505e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines  C.indent() << "obj.mAllocation = Allocation.createTyped(rs, t, usages);"
1506e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines             << std::endl;
1507381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.indent() << "return obj;" << std::endl;
1508381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams  C.endFunction();
15099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1510462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1511381e95f95d7eb14144081a1ca74f96c5e06ba089Jason Sams
15129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context &C,
15139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                           const RSExportRecordType *ERT) {
15149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startFunction(Context::AM_Private,
15159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
15169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "void",
15179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "copyToArray",
15189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  2,
1519d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  RS_TYPE_ITEM_CLASS_NAME, "i",
1520d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "int", "index");
15219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genNewItemBufferPackerIfNull(C);
15239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME
152492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);"
152592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang             << std::endl;
15269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
152738eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.indent() << "copyToArrayLocal(i, " RS_TYPE_ITEM_BUFFER_PACKER_NAME
152838eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                ");" << std::endl;
152938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk
153038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.endFunction();
153138eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  return;
153238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk}
153338eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk
153438eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchoukvoid RSReflection::genTypeClassCopyToArrayLocal(Context &C,
153538eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                                                const RSExportRecordType *ERT) {
153638eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.startFunction(Context::AM_Private,
153738eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                  false,
153838eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                  "void",
153938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                  "copyToArrayLocal",
154038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                  2,
154138eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                  RS_TYPE_ITEM_CLASS_NAME, "i",
154238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                  "FieldPacker", "fp");
154338eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk
154438eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  genPackVarOfType(C, ERT, "i", "fp");
15459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
15479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
15489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassItemSetter(Context &C,
15516315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                                          const RSExportRecordType *ERT) {
155238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.startFunction(Context::AM_PublicSynchronized,
15539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
15549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "void",
15559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "set",
15569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  3,
1557d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  RS_TYPE_ITEM_CLASS_NAME, "i",
1558d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "int", "index",
1559d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "boolean", "copyNow");
15609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genNewItemBufferIfNull(C, NULL);
15619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << std::endl;
15629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "if (copyNow) ";
15649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.startBlock();
15659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "copyToArray(i, index);" << std::endl;
156738eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.indent() << "FieldPacker fp = new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME
156838eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk                ".sizeof);" << std::endl;
156938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.indent() << "copyToArrayLocal(i, fp);" << std::endl;
157038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.indent() << "mAllocation.setFromFieldPacker(index, fp);" << std::endl;
15719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // End of if (copyNow)
15739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endBlock();
15749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
15769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
15779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}
1578462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassItemGetter(Context &C,
15809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          const RSExportRecordType *ERT) {
158138eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.startFunction(Context::AM_PublicSynchronized,
15829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  false,
15839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  RS_TYPE_ITEM_CLASS_NAME,
15849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  "get",
15859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                  1,
1586d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "int", "index");
15879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return null;"
15889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
15899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index];" << std::endl;
15909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
15919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
1592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1593462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassComponentSetter(Context &C,
15959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                               const RSExportRecordType *ERT) {
15969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(),
15979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           FE = ERT->fields_end();
15989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI != FE;
15999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI++) {
16009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const RSExportRecordType::Field *F = *FI;
16019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    size_t FieldOffset = F->getOffsetInParent();
16029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
16039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    unsigned FieldIndex = C.getFieldIndex(F);
16049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
160538eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk    C.startFunction(Context::AM_PublicSynchronized,
16069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
16079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "void",
16089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "set_" + F->getName(), 3,
1609d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                    "int", "index",
1610d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                    GetTypeName(F->getType()).c_str(), "v",
1611d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                    "boolean", "copyNow");
16129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    genNewItemBufferPackerIfNull(C);
16139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    genNewItemBufferIfNull(C, "index");
16149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName()
16159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << " = v;" << std::endl;
1616462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1617462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.indent() << "if (copyNow) ";
1618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    C.startBlock();
16192dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao
16209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (FieldOffset > 0)
162192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME
162292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof + "
162392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                 << FieldOffset << ");" << std::endl;
16249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
162592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME
162692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                    ".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);"
162792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang                 << std::endl;
16289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    genPackVarOfType(C, F->getType(), "v", RS_TYPE_ITEM_BUFFER_PACKER_NAME);
1629462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
16309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.indent() << "FieldPacker fp = new FieldPacker(" << FieldStoreSize << ");"
16319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               << std::endl;
16329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    genPackVarOfType(C, F->getType(), "v", "fp");
1633a036a8a7186f7c2f088917107f2c854fbd2187b8Jason Sams    C.indent() << "mAllocation.setFromFieldPacker(index, " << FieldIndex
1634329179389684e74bbb6ef5a95c6fbc769cac05c0Stephen Hines               << ", fp);"
163566aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang               << std::endl;
1636462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
16379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // End of if (copyNow)
16389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.endBlock();
1639462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
16409b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao    C.endFunction();
16419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
16429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
16439c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao}
16449c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
16459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassComponentGetter(Context &C,
16469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                               const RSExportRecordType *ERT) {
16479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(),
16489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           FE = ERT->fields_end();
16499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI != FE;
16509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       FI++) {
16519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const RSExportRecordType::Field *F = *FI;
165238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk    C.startFunction(Context::AM_PublicSynchronized,
16539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    false,
16549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    GetTypeName(F->getType()).c_str(),
16559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    "get_" + F->getName(),
16569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    1,
1657d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                    "int", "index");
1658cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao    C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) return "
1659cf950c49a909350e529ddecffaae8be5429b9479Shih-wei Liao               << GetTypeNullValue(F->getType()) << ";" << std::endl;
16606315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    C.indent() << "return "RS_TYPE_ITEM_BUFFER_NAME"[index]." << F->getName()
16616315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr               << ";" << std::endl;
16629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    C.endFunction();
16639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
16649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
16659c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao}
16669b1f50b1cab0687f2f218a924e4ff90184aebe0aShih-wei Liao
16679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genTypeClassCopyAll(Context &C,
16689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       const RSExportRecordType *ERT) {
166938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.startFunction(Context::AM_PublicSynchronized, false, "void", "copyAll", 0);
1670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
16712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  C.indent() << "for (int ct = 0; ct < "RS_TYPE_ITEM_BUFFER_NAME".length; ct++)"
16722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                  " copyToArray("RS_TYPE_ITEM_BUFFER_NAME"[ct], ct);"
16739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
16740661778f3810bc090f025b69fc84eed3cde9cecfStephen Hines  C.indent() << "mAllocation.setFromFieldPacker(0, "
16750661778f3810bc090f025b69fc84eed3cde9cecfStephen Hines                  RS_TYPE_ITEM_BUFFER_PACKER_NAME");"
16769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             << std::endl;
1677462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
16789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.endFunction();
16799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
1680462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1681462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1682d42a429f42fd6f272188af64f412cd604f02b365Zonr Changvoid RSReflection::genTypeClassResize(Context &C) {
168338eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  C.startFunction(Context::AM_PublicSynchronized,
1684d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  false,
1685d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "void",
1686d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "resize",
1687d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  1,
1688d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang                  "int", "newSize");
1689d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang
16903caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams  C.indent() << "if (mItemArray != null) ";
16913caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams  C.startBlock();
1692d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.indent() << "int oldSize = mItemArray.length;" << std::endl;
1693d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.indent() << "int copySize = Math.min(oldSize, newSize);" << std::endl;
16943caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams  C.indent() << "if (newSize == oldSize) return;" << std::endl;
1695d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.indent() << "Item ni[] = new Item[newSize];" << std::endl;
1696d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.indent() << "System.arraycopy(mItemArray, 0, ni, 0, copySize);"
1697d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang             << std::endl;
1698d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.indent() << "mItemArray = ni;" << std::endl;
16993caea7dd00c8a8a39712bcd9b6323093967b077bJason Sams  C.endBlock();
1700d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.indent() << "mAllocation.resize(newSize);" << std::endl;
1701d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang
1702cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams  C.indent() << "if (" RS_TYPE_ITEM_BUFFER_PACKER_NAME " != null) "
1703cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams                  RS_TYPE_ITEM_BUFFER_PACKER_NAME " = "
1704cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams                    "new FieldPacker(" RS_TYPE_ITEM_CLASS_NAME
1705cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams                      ".sizeof * getType().getX()/* count */"
1706cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams                        ");" << std::endl;
1707cedffd91a421770b3a6aa3c858c7c8db55962628Jason Sams
1708d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  C.endFunction();
1709d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  return;
1710d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang}
1711d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang
17129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******************** Methods to generate type class /end ********************/
1713462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/********** Methods to create Element in Java of given record type ***********/
171589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Changvoid RSReflection::genBuildElement(Context &C,
171689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                   const char *ElementBuilderName,
171789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                   const RSExportRecordType *ERT,
171889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                   const char *RenderScriptVar,
171989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                   bool IsInline) {
17209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  C.indent() << "Element.Builder " << ElementBuilderName << " = "
17219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      "new Element.Builder(" << RenderScriptVar << ");" << std::endl;
1722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // eb.add(...)
17249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  genAddElementToElementBuilder(C,
17259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                ERT,
17269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                "",
17279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                ElementBuilderName,
172889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                RenderScriptVar,
172989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                /* ArraySize = */0);
1730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
173189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang  if (!IsInline)
173289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang    C.indent() << "return " << ElementBuilderName << ".create();" << std::endl;
17339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
1734462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
173689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang#define EB_ADD(x) do {                                              \
173792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  C.indent() << ElementBuilderName                                  \
173889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang             << ".add(" << x << ", \"" << VarName << "\"";  \
173989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang  if (ArraySize > 0)                                                \
174089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang    C.out() << ", " << ArraySize;                                   \
174189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang  C.out() << ");" << std::endl;                                     \
174289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang  C.incFieldIndex();                                                \
174389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang} while (false)
17449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context &C,
17469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                 const RSExportType *ET,
17479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                 const std::string &VarName,
17489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                 const char *ElementBuilderName,
174989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                                 const char *RenderScriptVar,
175089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                                 unsigned ArraySize) {
175147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  std::string ElementConstruct = GetBuiltinElementConstruct(ET);
17529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
175347aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines  if (ElementConstruct != "") {
17549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")");
17559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  } else {
17569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if ((ET->getClass() == RSExportType::ExportClassPrimitive) ||
17572e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang        (ET->getClass() == RSExportType::ExportClassVector)) {
17589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportPrimitiveType *EPT =
17599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportPrimitiveType*>(ET);
176047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      const char *DataTypeName =
176147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines          RSExportPrimitiveType::getRSReflectionType(EPT)->rs_type;
17629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      int Size = (ET->getClass() == RSExportType::ExportClassVector) ?
17639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportVectorType*>(ET)->getNumElement() :
17649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          1;
17659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
176647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      if (EPT->getClass() == RSExportType::ExportClassPrimitive) {
176747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines        // Element.createUser()
176847aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines        EB_ADD("Element.createUser(" << RenderScriptVar
176947aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                                     << ", Element.DataType."
177047aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                                     << DataTypeName << ")");
177147aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines      } else {
177247aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines        slangAssert((ET->getClass() == RSExportType::ExportClassVector) &&
177347aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                    "Unexpected type.");
177447aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines        EB_ADD("Element.createVector(" << RenderScriptVar
177547aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                                       << ", Element.DataType."
177647aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                                       << DataTypeName << ", "
177747aca4e016665d333fdcd01a9cef16c13d7836a8Stephen Hines                                       << Size << ")");
17789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
177992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#ifndef NDEBUG
17809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else if (ET->getClass() == RSExportType::ExportClassPointer) {
17819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Pointer type variable should be resolved in
17829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // GetBuiltinElementConstruct()
17836e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "??");
178492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    } else if (ET->getClass() == RSExportType::ExportClassMatrix) {
178592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      // Matrix type variable should be resolved
178692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang      // in GetBuiltinElementConstruct()
17876e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "??");
178892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#endif
17892e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang    } else if (ET->getClass() == RSExportType::ExportClassConstantArray) {
17902e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang      const RSExportConstantArrayType *ECAT =
17912e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang          static_cast<const RSExportConstantArrayType *>(ET);
17922e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang
179389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      const RSExportType *ElementType = ECAT->getElementType();
179489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      if (ElementType->getClass() != RSExportType::ExportClassRecord) {
179589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        genAddElementToElementBuilder(C,
179689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                      ECAT->getElementType(),
179789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                      VarName,
179889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                      ElementBuilderName,
179989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                      RenderScriptVar,
180089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                      ECAT->getSize());
180189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      } else {
180289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        std::string NewElementBuilderName(ElementBuilderName);
180389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        NewElementBuilderName.append(1, '_');
180489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang
180589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        genBuildElement(C,
180689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                        NewElementBuilderName.c_str(),
180789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                        static_cast<const RSExportRecordType*>(ElementType),
180889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                        RenderScriptVar,
180989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                        /* IsInline = */true);
181089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        ArraySize = ECAT->getSize();
181189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        EB_ADD(NewElementBuilderName << ".create()");
181289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      }
18139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else if (ET->getClass() == RSExportType::ExportClassRecord) {
18149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // Simalar to case of RSExportType::ExportClassRecord in genPackVarOfType.
18159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      //
18166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      // TODO(zonr): Generalize these two function such that there's no
18176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      //             duplicated codes.
18189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportRecordType *ERT =
18199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          static_cast<const RSExportRecordType*>(ET);
18209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      int Pos = 0;    // relative pos from now on
18219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      for (RSExportRecordType::const_field_iterator I = ERT->fields_begin(),
18239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               E = ERT->fields_end();
18249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I != E;
18259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           I++) {
18269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const RSExportRecordType::Field *F = *I;
18279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        std::string FieldName;
18289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        int FieldOffset = F->getOffsetInParent();
18299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        int FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType());
18309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        int FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType());
18319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!VarName.empty())
18339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          FieldName = VarName + "." + F->getName();
18349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        else
18359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          FieldName = F->getName();
18369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // Alignment
18389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        genAddPaddingToElementBuiler(C,
18399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     (FieldOffset - Pos),
18409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     ElementBuilderName,
18419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     RenderScriptVar);
18429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // eb.add(...)
18449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        C.addFieldIndexMapping(F);
184589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        if (F->getType()->getClass() != RSExportType::ExportClassRecord) {
184689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang          genAddElementToElementBuilder(C,
184789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                        F->getType(),
184889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                        FieldName,
184989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                        ElementBuilderName,
185089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                        RenderScriptVar,
185189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                        0);
185289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        } else {
185389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang          std::string NewElementBuilderName(ElementBuilderName);
185489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang          NewElementBuilderName.append(1, '_');
185589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang
185689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang          genBuildElement(C,
185789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                          NewElementBuilderName.c_str(),
185889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                          static_cast<const RSExportRecordType*>(F->getType()),
185989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                          RenderScriptVar,
186089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                          /* IsInline = */true);
186189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang
186289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang          const std::string &VarName = FieldName;  // Hack for EB_ADD macro
186389273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang          EB_ADD(NewElementBuilderName << ".create()");
186489273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang        }
18659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1866a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines        if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) {
1867a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines          // There is padding within the field type. This is only necessary
1868a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines          // for HC-targeted APIs.
1869a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines          genAddPaddingToElementBuiler(C,
1870a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines                                       (FieldAllocSize - FieldStoreSize),
1871a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines                                       ElementBuilderName,
1872a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines                                       RenderScriptVar);
1873a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines        }
18749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        Pos = FieldOffset + FieldAllocSize;
18769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1877bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao
18789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      // There maybe some padding after the struct
1879049229ba647d3d3cddef7a81b3ae9d3e0729a842Stephen Hines      size_t RecordAllocSize = RSExportType::GetTypeAllocSize(ERT);
18800a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao
18819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      genAddPaddingToElementBuiler(C,
1882049229ba647d3d3cddef7a81b3ae9d3e0729a842Stephen Hines                                   RecordAllocSize - Pos,
18839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                   ElementBuilderName,
18849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                   RenderScriptVar);
18859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else {
18866e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(false && "Unknown class of type");
1887b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao    }
18889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
18919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context &C,
18929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                int PaddingSize,
18939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                const char *ElementBuilderName,
18946315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                                                const char *RenderScriptVar) {
189589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang  unsigned ArraySize = 0;   // Hack the EB_ADD macro
18969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  while (PaddingSize > 0) {
18979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const std::string &VarName = C.createPaddingField();
18989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (PaddingSize >= 4) {
189989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      EB_ADD("Element.U32(" << RenderScriptVar << ")");
19009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      PaddingSize -= 4;
19019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else if (PaddingSize >= 2) {
190289273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      EB_ADD("Element.U16(" << RenderScriptVar << ")");
19039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      PaddingSize -= 2;
19049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } else if (PaddingSize >= 1) {
190589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang      EB_ADD("Element.U8(" << RenderScriptVar << ")");
19069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      PaddingSize -= 1;
1907462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
19089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
19099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
1910462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1911462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1912462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD
19139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/******** Methods to create Element in Java of given record type /end ********/
1914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1915b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaobool RSReflection::reflect(const std::string &OutputPathBase,
1916b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                           const std::string &OutputPackageName,
19179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                           const std::string &InputFileName,
19189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                           const std::string &OutputBCFileName) {
19199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  Context *C = NULL;
19209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string ResourceId = "";
1921a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines  std::string PaddingPrefix = "";
1922a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines
1923a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines  if (mRSContext->getTargetAPI() < SLANG_ICS_TARGET_API) {
1924a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines    PaddingPrefix = "#padding_";
1925a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines  } else {
1926a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines    PaddingPrefix = "#rs_padding_";
1927a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines  }
1928462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!GetClassNameFromFileName(OutputBCFileName, ResourceId))
19309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
1931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (ResourceId.empty())
19339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    ResourceId = "<Resource ID>";
1934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1935b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  if (OutputPackageName.empty() || OutputPackageName == "-")
1936b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    C = new Context(OutputPathBase, InputFileName, "<Package Name>",
1937a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines                    ResourceId, PaddingPrefix, true);
19389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
1939b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    C = new Context(OutputPathBase, InputFileName, OutputPackageName,
1940a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines                    ResourceId, PaddingPrefix, false);
1941462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (C != NULL) {
19439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string ErrorMsg, ScriptClassName;
19449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // class ScriptC_<ScriptName>
19459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!GetClassNameFromFileName(InputFileName, ScriptClassName))
19469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return false;
1947462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (ScriptClassName.empty())
19499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      ScriptClassName = "<Input Script Name>";
1950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX);
1952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (mRSContext->getLicenseNote() != NULL) {
19549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      C->setLicenseNote(*(mRSContext->getLicenseNote()));
19559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1956d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
19579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!genScriptClass(*C, ScriptClassName, ErrorMsg)) {
19589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      std::cerr << "Failed to generate class " << ScriptClassName << " ("
19599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                << ErrorMsg << ")" << std::endl;
19609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return false;
19619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1962462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19634cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    mGeneratedFileNames->push_back(ScriptClassName);
19644cc67fce91f43215d61b2695746eab102a3db516Stephen Hines
19659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // class ScriptField_<TypeName>
19669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    for (RSContext::const_export_type_iterator TI =
19679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             mRSContext->export_types_begin(),
19689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             TE = mRSContext->export_types_end();
19699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao         TI != TE;
19709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao         TI++) {
19719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const RSExportType *ET = TI->getValue();
19729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
19739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (ET->getClass() == RSExportType::ExportClassRecord) {
19749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const RSExportRecordType *ERT =
19759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            static_cast<const RSExportRecordType*>(ET);
19769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
19779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) {
19789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          std::cerr << "Failed to generate type class for struct '"
19799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    << ERT->getName() << "' (" << ErrorMsg << ")" << std::endl;
19809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          return false;
1981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
19829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
1983462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
19849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1985462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
1987462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
1988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao/************************** RSReflection::Context **************************/
19906315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrconst char *const RSReflection::Context::ApacheLicenseNote =
1991462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    "/*\n"
199241cc61093619da4e99581d0aef4487ce2751812eStephen Hines    " * Copyright (C) 2011-2012 The Android Open Source Project\n"
19939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " *\n"
19949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
19959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * you may not use this file except in compliance with the License.\n"
19969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * You may obtain a copy of the License at\n"
19979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " *\n"
19989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " *      http://www.apache.org/licenses/LICENSE-2.0\n"
19999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " *\n"
20009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * Unless required by applicable law or agreed to in writing, software\n"
20019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
20029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or "
20039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "implied.\n"
20049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * See the License for the specific language governing permissions and\n"
20059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " * limitations under the License.\n"
20069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    " */\n"
20079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    "\n";
20089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoconst char *const RSReflection::Context::Import[] = {
2010b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines  // Renderscript java class
20119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  "android.renderscript.*",
20129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Import R
20139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  "android.content.res.Resources",
20149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Import for debugging
20156b64b2bd2daf45a4a8bd8b5a11d09410bd53455fStephen Hines  // "android.util.Log",
2016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
2017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20188c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Changbool RSReflection::Context::openClassFile(const std::string &ClassName,
20198c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang                                          std::string &ErrorMsg) {
20208c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  if (!mUseStdout) {
20218c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    mOF.clear();
20228c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    std::string Path =
2023b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao        RSSlangReflectUtils::ComputePackagedPath(mOutputPathBase.c_str(),
20248c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang                                                 mPackageName.c_str());
20258c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
20268c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    if (!SlangUtils::CreateDirectoryWithParents(Path, &ErrorMsg))
20278c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang      return false;
20288c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
20298d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael    std::string ClassFile = Path + OS_PATH_SEPARATOR_STR + ClassName + ".java";
20308c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
20318c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    mOF.open(ClassFile.c_str());
20328c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    if (!mOF.good()) {
20338c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang      ErrorMsg = "failed to open file '" + ClassFile + "' for write";
20348c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang      return false;
20358c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    }
20368c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  }
20378c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  return true;
20388c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang}
20398c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
20409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoconst char *RSReflection::Context::AccessModifierStr(AccessModifier AM) {
20419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  switch (AM) {
20429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case AM_Public: return "public"; break;
20439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case AM_Protected: return "protected"; break;
20449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    case AM_Private: return "private"; break;
204538eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk    case AM_PublicSynchronized: return "public synchronized"; break;
20469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    default: return ""; break;
20479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2049462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM,
20519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       bool IsStatic,
20529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       const std::string &ClassName,
20539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       const char *SuperClassName,
20549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                       std::string &ErrorMsg) {
20559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mVerbose)
20569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::cout << "Generating " << ClassName << ".java ..." << std::endl;
20579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20588c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  // Open file for class
20598c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang  if (!openClassFile(ClassName, ErrorMsg))
20608c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    return false;
20618c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
20629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // License
20639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << mLicenseNote;
20649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Notice of generated file
20669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << "/*" << std::endl;
20679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << " * This file is auto-generated. DO NOT MODIFY!" << std::endl;
2068b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines  out() << " * The source Renderscript file: " << mInputRSFile << std::endl;
20699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << " */" << std::endl;
20709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Package
20729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!mPackageName.empty())
20739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    out() << "package " << mPackageName << ";" << std::endl;
20749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << std::endl;
20759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Imports
2077e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  for (unsigned i = 0; i < (sizeof(Import) / sizeof(const char*)); i++)
20789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    out() << "import " << Import[i] << ";" << std::endl;
20799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << std::endl;
20809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // All reflected classes should be annotated as hidden, so that they won't
20829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // be exposed in SDK.
20839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << "/**" << std::endl;
20849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << " * @hide" << std::endl;
20859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << " */" << std::endl;
20869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class "
20889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        << ClassName;
20899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (SuperClassName != NULL)
20909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    out() << " extends " << SuperClassName;
20919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  startBlock();
20939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mClassName = ClassName;
20959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
2097462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2098462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2099462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() {
21009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  endBlock();
21019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (!mUseStdout)
21029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mOF.close();
21039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clear();
21049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) {
21089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (ShouldIndent)
21099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    indent() << "{" << std::endl;
21109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  else
21119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    out() << " {" << std::endl;
21129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  incIndentLevel();
21139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() {
21179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  decIndentLevel();
21189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  indent() << "}" << std::endl << std::endl;
21199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string &ClassName) {
21239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  indent() << "public static class " << ClassName;
21249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  startBlock();
21259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() {
21299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  endBlock();
21309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM,
21349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          bool IsStatic,
21359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          const char *ReturnType,
21369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          const std::string &FunctionName,
21379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          int Argc, ...) {
21389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ArgTy Args;
21399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  va_list vl;
21409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  va_start(vl, Argc);
2141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  for (int i = 0; i < Argc; i++) {
21439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const char *ArgType = va_arg(vl, const char*);
21449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const char *ArgName = va_arg(vl, const char*);
2145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    Args.push_back(std::make_pair(ArgType, ArgName));
21479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
21489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  va_end(vl);
2149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  startFunction(AM, IsStatic, ReturnType, FunctionName, Args);
2151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21552dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM,
21562dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao                                          bool IsStatic,
21579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          const char *ReturnType,
21589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                          const std::string &FunctionName,
21596315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                                          const ArgTy &Args) {
21609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ")
21619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao           << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "(";
21629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
21639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool FirstArg = true;
21649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  for (ArgTy::const_iterator I = Args.begin(), E = Args.end();
21659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I != E;
21669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao       I++) {
21679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (!FirstArg)
21689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      out() << ", ";
21699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
21709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      FirstArg = false;
2171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    out() << I->first << " " << I->second;
21739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  out() << ")";
21769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  startBlock();
2177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() {
21829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  endBlock();
21839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return;
2184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
2185e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
2186e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace slang
2187