Wed, 01 May 2013 08:07:59 -0700
8013418: assert(i == total_args_passed) in AdapterHandlerLibrary::get_adapter since 8-b87
Summary: Do not treat static methods as miranda methods.
Reviewed-by: dholmes, acorn
duke@435 | 1 | /* |
coleenp@4037 | 2 | * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
duke@435 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
duke@435 | 4 | * |
duke@435 | 5 | * This code is free software; you can redistribute it and/or modify it |
duke@435 | 6 | * under the terms of the GNU General Public License version 2 only, as |
duke@435 | 7 | * published by the Free Software Foundation. |
duke@435 | 8 | * |
duke@435 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
duke@435 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
duke@435 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
duke@435 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
duke@435 | 13 | * accompanied this code). |
duke@435 | 14 | * |
duke@435 | 15 | * You should have received a copy of the GNU General Public License version |
duke@435 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
duke@435 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
duke@435 | 18 | * |
trims@1907 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
trims@1907 | 20 | * or visit www.oracle.com if you need additional information or have any |
trims@1907 | 21 | * questions. |
duke@435 | 22 | * |
duke@435 | 23 | */ |
duke@435 | 24 | |
stefank@2314 | 25 | #ifndef SHARE_VM_OOPS_OOPSHIERARCHY_HPP |
stefank@2314 | 26 | #define SHARE_VM_OOPS_OOPSHIERARCHY_HPP |
stefank@2314 | 27 | |
stefank@2314 | 28 | #include "runtime/globals.hpp" |
stefank@2314 | 29 | #include "utilities/globalDefinitions.hpp" |
stefank@2314 | 30 | |
duke@435 | 31 | // OBJECT hierarchy |
duke@435 | 32 | // This hierarchy is a representation hierarchy, i.e. if A is a superclass |
duke@435 | 33 | // of B, A's representation is a prefix of B's representation. |
duke@435 | 34 | |
coleenp@548 | 35 | typedef juint narrowOop; // Offset instead of address for an oop within a java object |
ysr@1280 | 36 | typedef void* OopOrNarrowOopStar; |
coleenp@4037 | 37 | typedef class markOopDesc* markOop; |
coleenp@548 | 38 | |
duke@435 | 39 | #ifndef CHECK_UNHANDLED_OOPS |
duke@435 | 40 | |
coleenp@548 | 41 | typedef class oopDesc* oop; |
duke@435 | 42 | typedef class instanceOopDesc* instanceOop; |
coleenp@548 | 43 | typedef class arrayOopDesc* arrayOop; |
coleenp@548 | 44 | typedef class objArrayOopDesc* objArrayOop; |
coleenp@548 | 45 | typedef class typeArrayOopDesc* typeArrayOop; |
duke@435 | 46 | |
duke@435 | 47 | #else |
duke@435 | 48 | |
duke@435 | 49 | // When CHECK_UNHANDLED_OOPS is defined, an "oop" is a class with a |
duke@435 | 50 | // carefully chosen set of constructors and conversion operators to go |
duke@435 | 51 | // to and from the underlying oopDesc pointer type. |
duke@435 | 52 | // |
duke@435 | 53 | // Because oop and its subclasses <type>Oop are class types, arbitrary |
duke@435 | 54 | // conversions are not accepted by the compiler, and you may get a message |
duke@435 | 55 | // about overloading ambiguity (between long and int is common when converting |
duke@435 | 56 | // from a constant in 64 bit mode), or unable to convert from type to 'oop'. |
duke@435 | 57 | // Applying a cast to one of these conversion operators first will get to the |
duke@435 | 58 | // underlying oopDesc* type if appropriate. |
duke@435 | 59 | // Converting NULL to oop to Handle implicit is no longer accepted by the |
duke@435 | 60 | // compiler because there are too many steps in the conversion. Use Handle() |
duke@435 | 61 | // instead, which generates less code anyway. |
duke@435 | 62 | |
duke@435 | 63 | class Thread; |
duke@435 | 64 | class PromotedObject; |
duke@435 | 65 | |
duke@435 | 66 | |
duke@435 | 67 | class oop { |
duke@435 | 68 | oopDesc* _o; |
duke@435 | 69 | |
duke@435 | 70 | void register_oop(); |
duke@435 | 71 | void unregister_oop(); |
duke@435 | 72 | |
duke@435 | 73 | // friend class markOop; |
duke@435 | 74 | public: |
duke@435 | 75 | void set_obj(const void* p) { |
duke@435 | 76 | raw_set_obj(p); |
duke@435 | 77 | if (CheckUnhandledOops) register_oop(); |
duke@435 | 78 | } |
duke@435 | 79 | void raw_set_obj(const void* p) { _o = (oopDesc*)p; } |
duke@435 | 80 | |
duke@435 | 81 | oop() { set_obj(NULL); } |
duke@435 | 82 | oop(const volatile oop& o) { set_obj(o.obj()); } |
duke@435 | 83 | oop(const void* p) { set_obj(p); } |
duke@435 | 84 | oop(intptr_t i) { set_obj((void *)i); } |
duke@435 | 85 | #ifdef _LP64 |
duke@435 | 86 | oop(int i) { set_obj((void *)i); } |
duke@435 | 87 | #endif |
duke@435 | 88 | ~oop() { |
duke@435 | 89 | if (CheckUnhandledOops) unregister_oop(); |
duke@435 | 90 | } |
duke@435 | 91 | |
duke@435 | 92 | oopDesc* obj() const volatile { return _o; } |
duke@435 | 93 | |
duke@435 | 94 | // General access |
duke@435 | 95 | oopDesc* operator->() const { return obj(); } |
duke@435 | 96 | bool operator==(const oop o) const { return obj() == o.obj(); } |
duke@435 | 97 | bool operator==(void *p) const { return obj() == p; } |
coleenp@4037 | 98 | bool operator!=(const volatile oop o) const { return obj() != o.obj(); } |
duke@435 | 99 | bool operator!=(void *p) const { return obj() != p; } |
duke@435 | 100 | bool operator==(intptr_t p) const { return obj() == (oopDesc*)p; } |
duke@435 | 101 | bool operator!=(intptr_t p) const { return obj() != (oopDesc*)p; } |
duke@435 | 102 | |
duke@435 | 103 | bool operator<(oop o) const { return obj() < o.obj(); } |
duke@435 | 104 | bool operator>(oop o) const { return obj() > o.obj(); } |
duke@435 | 105 | bool operator<=(oop o) const { return obj() <= o.obj(); } |
duke@435 | 106 | bool operator>=(oop o) const { return obj() >= o.obj(); } |
duke@435 | 107 | bool operator!() const { return !obj(); } |
duke@435 | 108 | |
duke@435 | 109 | // Cast |
duke@435 | 110 | operator void* () const { return (void *)obj(); } |
duke@435 | 111 | operator HeapWord* () const { return (HeapWord*)obj(); } |
duke@435 | 112 | operator oopDesc* () const { return obj(); } |
duke@435 | 113 | operator intptr_t* () const { return (intptr_t*)obj(); } |
duke@435 | 114 | operator PromotedObject* () const { return (PromotedObject*)obj(); } |
duke@435 | 115 | operator markOop () const { return markOop(obj()); } |
duke@435 | 116 | |
duke@435 | 117 | operator address () const { return (address)obj(); } |
coleenp@4037 | 118 | operator intptr_t () const volatile { return (intptr_t)obj(); } |
duke@435 | 119 | |
duke@435 | 120 | // from javaCalls.cpp |
duke@435 | 121 | operator jobject () const { return (jobject)obj(); } |
duke@435 | 122 | // from javaClasses.cpp |
duke@435 | 123 | operator JavaThread* () const { return (JavaThread*)obj(); } |
xlu@948 | 124 | |
xlu@948 | 125 | #ifndef _LP64 |
duke@435 | 126 | // from jvm.cpp |
duke@435 | 127 | operator jlong* () const { return (jlong*)obj(); } |
xlu@948 | 128 | #endif |
duke@435 | 129 | |
duke@435 | 130 | // from parNewGeneration and other things that want to get to the end of |
coleenp@4142 | 131 | // an oop for stuff (like ObjArrayKlass.cpp) |
duke@435 | 132 | operator oop* () const { return (oop *)obj(); } |
duke@435 | 133 | }; |
duke@435 | 134 | |
duke@435 | 135 | #define DEF_OOP(type) \ |
duke@435 | 136 | class type##OopDesc; \ |
duke@435 | 137 | class type##Oop : public oop { \ |
duke@435 | 138 | public: \ |
duke@435 | 139 | type##Oop() : oop() {} \ |
duke@435 | 140 | type##Oop(const volatile oop& o) : oop(o) {} \ |
duke@435 | 141 | type##Oop(const void* p) : oop(p) {} \ |
duke@435 | 142 | operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \ |
duke@435 | 143 | type##OopDesc* operator->() const { \ |
duke@435 | 144 | return (type##OopDesc*)obj(); \ |
duke@435 | 145 | } \ |
coleenp@4037 | 146 | }; |
duke@435 | 147 | |
duke@435 | 148 | DEF_OOP(instance); |
duke@435 | 149 | DEF_OOP(array); |
duke@435 | 150 | DEF_OOP(objArray); |
duke@435 | 151 | DEF_OOP(typeArray); |
duke@435 | 152 | |
duke@435 | 153 | #endif // CHECK_UNHANDLED_OOPS |
duke@435 | 154 | |
coleenp@4037 | 155 | // The metadata hierarchy is separate from the oop hierarchy |
coleenp@4037 | 156 | |
coleenp@4037 | 157 | // class MetaspaceObj |
coleenp@4037 | 158 | class ConstMethod; |
coleenp@4037 | 159 | class ConstantPoolCache; |
coleenp@4037 | 160 | class MethodData; |
coleenp@4037 | 161 | // class Metadata |
coleenp@4037 | 162 | class Method; |
coleenp@4037 | 163 | class ConstantPool; |
coleenp@4037 | 164 | // class CHeapObj |
coleenp@4037 | 165 | class CompiledICHolder; |
coleenp@4037 | 166 | |
coleenp@4037 | 167 | |
duke@435 | 168 | // The klass hierarchy is separate from the oop hierarchy. |
duke@435 | 169 | |
duke@435 | 170 | class Klass; |
coleenp@4037 | 171 | class InstanceKlass; |
coleenp@4047 | 172 | class InstanceMirrorKlass; |
coleenp@4047 | 173 | class InstanceClassLoaderKlass; |
coleenp@4047 | 174 | class InstanceRefKlass; |
coleenp@4142 | 175 | class ArrayKlass; |
coleenp@4142 | 176 | class ObjArrayKlass; |
coleenp@4142 | 177 | class TypeArrayKlass; |
stefank@2314 | 178 | |
stefank@2314 | 179 | #endif // SHARE_VM_OOPS_OOPSHIERARCHY_HPP |