1 /*
2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef SHARE_VM_RUNTIME_STACKVALUE_HPP
26 #define SHARE_VM_RUNTIME_STACKVALUE_HPP
27 
28 #include "code/location.hpp"
29 #include "runtime/handles.hpp"
30 
31 class StackValue : public ResourceObj {
32  private:
33   BasicType _type;
34   intptr_t  _integer_value; // Blank java stack slot value
35   Handle    _handle_value;  // Java stack slot value interpreted as a Handle
36  public:
37 
StackValue(intptr_t value)38   StackValue(intptr_t value) {
39     _type              = T_INT;
40     _integer_value     = value;
41   }
42 
StackValue(Handle value,intptr_t scalar_replaced=0)43   StackValue(Handle value, intptr_t scalar_replaced = 0) {
44     _type                = T_OBJECT;
45     _integer_value       = scalar_replaced;
46     _handle_value        = value;
47     assert(_integer_value == 0 ||  _handle_value.is_null(), "not null object should not be marked as scalar replaced");
48   }
49 
StackValue()50   StackValue() {
51     _type           = T_CONFLICT;
52     _integer_value  = 0;
53   }
54 
55   // Only used during deopt- preserve object type.
StackValue(intptr_t o,BasicType t)56   StackValue(intptr_t o, BasicType t) {
57     assert(t == T_OBJECT, "should not be used");
58     _type          = t;
59     _integer_value = o;
60   }
61 
get_obj() const62   Handle get_obj() const {
63     assert(type() == T_OBJECT, "type check");
64     return _handle_value;
65   }
66 
obj_is_scalar_replaced() const67   bool obj_is_scalar_replaced() const {
68     assert(type() == T_OBJECT, "type check");
69     return _integer_value != 0;
70   }
71 
set_obj(Handle value)72   void set_obj(Handle value) {
73     assert(type() == T_OBJECT, "type check");
74     _handle_value = value;
75   }
76 
get_int() const77   intptr_t get_int() const {
78     assert(type() == T_INT, "type check");
79     return _integer_value;
80   }
81 
82   // For special case in deopt.
get_int(BasicType t) const83   intptr_t get_int(BasicType t) const {
84     assert(t == T_OBJECT && type() == T_OBJECT, "type check");
85     return _integer_value;
86   }
87 
set_int(intptr_t value)88   void set_int(intptr_t value) {
89     assert(type() == T_INT, "type check");
90     _integer_value = value;
91   }
92 
type() const93   BasicType type() const { return  _type; }
94 
equal(StackValue * value)95   bool equal(StackValue *value) {
96     if (_type != value->_type) return false;
97     if (_type == T_OBJECT)
98       return (_handle_value == value->_handle_value);
99     else {
100       assert(_type == T_INT, "sanity check");
101       // [phh] compare only low addressed portions of intptr_t slots
102       return (*(int *)&_integer_value == *(int *)&value->_integer_value);
103     }
104   }
105 
106   static StackValue* create_stack_value(const frame* fr, const RegisterMap* reg_map, ScopeValue* sv);
107   static BasicLock*  resolve_monitor_lock(const frame* fr, Location location);
108 
109 #ifndef PRODUCT
110  public:
111   // Printing
112   void print_on(outputStream* st) const;
113 #endif
114 };
115 
116 #endif // SHARE_VM_RUNTIME_STACKVALUE_HPP
117