1306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers/*
2306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * Copyright (C) 2012 The Android Open Source Project
3306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers *
4306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License");
5306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * you may not use this file except in compliance with the License.
6306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * You may obtain a copy of the License at
7306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers *
8306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers *      http://www.apache.org/licenses/LICENSE-2.0
9306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers *
10306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * Unless required by applicable law or agreed to in writing, software
11306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS,
12306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * See the License for the specific language governing permissions and
14306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers * limitations under the License.
15306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers */
16306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_JVALUE_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_JVALUE_H_
19306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
20306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers#include "base/macros.h"
21306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
2262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#include <stdint.h>
2362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers
24306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogersnamespace art {
252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror {
26306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogersclass Object;
272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}  // namespace mirror
28306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
29306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogersunion PACKED(4) JValue {
30306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  // We default initialize JValue instances to all-zeros.
31306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  JValue() : j(0) {}
32306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
33306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int8_t GetB() const { return b; }
34306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetB(int8_t new_b) {
357934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom    i = ((static_cast<int32_t>(new_b) << 24) >> 24);  // Sign-extend.
36306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  }
37306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
38306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  uint16_t GetC() const { return c; }
39306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetC(uint16_t new_c) { c = new_c; }
40306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
41306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  double GetD() const { return d; }
42306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetD(double new_d) { d = new_d; }
43306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
44306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  float GetF() const { return f; }
45306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetF(float new_f) { f = new_f; }
46306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
47306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int32_t GetI() const { return i; }
48306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetI(int32_t new_i) { i = new_i; }
49306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
50306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int64_t GetJ() const { return j; }
51306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetJ(int64_t new_j) { j = new_j; }
52306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Object* GetL() const { return l; }
542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  void SetL(mirror::Object* new_l) { l = new_l; }
55306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
56306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int16_t GetS() const { return s; }
57306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetS(int16_t new_s) {
587934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom    i = ((static_cast<int32_t>(new_s) << 16) >> 16);  // Sign-extend.
59306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  }
60306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
61306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  uint8_t GetZ() const { return z; }
62306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  void SetZ(uint8_t new_z) { z = new_z; }
63306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
64ef484d442a3dcae2cd1842c5be0623f5cf71e4abMingyao Yang  mirror::Object** GetGCRoot() { return &l; }
65ef484d442a3dcae2cd1842c5be0623f5cf71e4abMingyao Yang
66306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers private:
67306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  uint8_t z;
68306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int8_t b;
69306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  uint16_t c;
70306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int16_t s;
71306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int32_t i;
72306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  int64_t j;
73306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  float f;
74306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  double d;
752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Object* l;
76306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers};
77306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
78306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers}  // namespace art
79306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
80fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_JVALUE_H_
81