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