16b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom/* 26b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project 36b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * 46b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 56b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * you may not use this file except in compliance with the License. 66b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * You may obtain a copy of the License at 76b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * 86b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 96b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * 106b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 116b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 126b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * See the License for the specific language governing permissions and 146b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * limitations under the License. 156b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom */ 166b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_PRIMITIVE_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_PRIMITIVE_H_ 196b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 206b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#include <sys/types.h> 216b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 2207ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 23761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 24ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "mirror/object_reference.h" 256b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 266b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstromnamespace art { 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 286b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstromclass Object; 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 306b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 316b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstromclass Primitive { 326b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom public: 336b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom enum Type { 346b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimNot = 0, 356b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimBoolean, 366b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimByte, 376b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimChar, 386b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimShort, 396b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimInt, 406b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimLong, 416b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimFloat, 426b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimDouble, 436b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom kPrimVoid, 446b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom }; 456b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 466b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom static Type GetType(char type) { 476b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom switch (type) { 486b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'B': 496b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimByte; 506b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'C': 516b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimChar; 526b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'D': 536b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimDouble; 546b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'F': 556b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimFloat; 566b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'I': 576b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimInt; 586b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'J': 596b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimLong; 606b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'S': 616b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimShort; 626b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'Z': 636b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimBoolean; 646b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case 'V': 656b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimVoid; 666b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom default: 676b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return kPrimNot; 686b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 696b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 706b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 716b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom static size_t ComponentSize(Type type) { 726b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom switch (type) { 73169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers case kPrimVoid: return 0; 746b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimBoolean: 756b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimByte: return 1; 766b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimChar: 776b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimShort: return 2; 786b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimInt: 796b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimFloat: return 4; 806b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimLong: 816b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimDouble: return 8; 82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers case kPrimNot: return sizeof(mirror::HeapReference<mirror::Object>); 836b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom default: 846b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom LOG(FATAL) << "Invalid type " << static_cast<int>(type); 856b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return 0; 866b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 876b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 886b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 896b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom static size_t FieldSize(Type type) { 906b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom return ComponentSize(type) <= 4 ? 4 : 8; 916b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 926b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 9391250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes static const char* Descriptor(Type type) { 946b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom switch (type) { 956b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimBoolean: 9691250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "Z"; 976b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimByte: 9891250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "B"; 996b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimChar: 10091250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "C"; 1016b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimShort: 10291250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "S"; 1036b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimInt: 10491250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "I"; 1056b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimFloat: 10691250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "F"; 1076b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimLong: 10891250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "J"; 1096b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case kPrimDouble: 11091250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "D"; 1116d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers case kPrimVoid: 11291250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return "V"; 1136b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom default: 1146b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom LOG(FATAL) << "Primitive char conversion on invalid type " << static_cast<int>(type); 11591250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes return NULL; 1166b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 1176b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom } 1186b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 1196b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom private: 1206b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom DISALLOW_IMPLICIT_CONSTRUCTORS(Primitive); 1216b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom}; 1226b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 123ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstromstd::ostream& operator<<(std::ostream& os, const Primitive::Type& state); 124ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom 1256b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom} // namespace art 1266b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom 127fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_PRIMITIVE_H_ 128