< prev index next >

src/hotspot/share/oops/access.hpp

load_proxy
   template <DecoratorSet decorators>
   oop resolve(oop src);
 
   // Infer the type that should be returned from a load.
   template <typename P, DecoratorSet decorators>
-  class LoadProxy: public StackObj {
+  class OopLoadProxy: public StackObj {
   private:
     P *const _addr;
   public:
-    LoadProxy(P* addr) : _addr(addr) {}
+    OopLoadProxy(P* addr) : _addr(addr) {}
+
+    inline operator oop() {
+      return load<decorators | INTERNAL_VALUE_IS_OOP, P, oop>(_addr);
+    }
+
+    inline operator narrowOop() {
+      return load<decorators | INTERNAL_VALUE_IS_OOP, P, narrowOop>(_addr);
+    }
 
     template <typename T>
-    inline operator T() {
-      return load<decorators, P, T>(_addr);
+    inline bool operator ==(const T& other) const {
+      return load<decorators | INTERNAL_VALUE_IS_OOP, P, T>(_addr) == other;
     }
 
-    inline operator P() {
-      return load<decorators, P, P>(_addr);
+    template <typename T>
+    inline bool operator !=(const T& other) const {
+      return load<decorators | INTERNAL_VALUE_IS_OOP, P, T>(_addr) != other;
     }
   };
 
   // Infer the type that should be returned from a load_at.
   template <DecoratorSet decorators>

@@ -333,10 +342,43 template <typename T> inline operator T() const { return load_at<decorators, T>(_base, _offset); } + + template <typename T> + inline bool operator ==(const T& other) const { return load_at<decorators, T>(_base, _offset) == other; } + + template <typename T> + inline bool operator !=(const T& other) const { return load_at<decorators, T>(_base, _offset) != other; } + }; + + template <DecoratorSet decorators> + class OopLoadAtProxy: public StackObj { + private: + const oop _base; + const ptrdiff_t _offset; + public: + OopLoadAtProxy(oop base, ptrdiff_t offset) : _base(base), _offset(offset) {} + + inline operator oop() const { + return load_at<decorators | INTERNAL_VALUE_IS_OOP, oop>(_base, _offset); + } + + inline operator narrowOop() const { + return load_at<decorators | INTERNAL_VALUE_IS_OOP, narrowOop>(_base, _offset); + } + + template <typename T> + inline bool operator ==(const T& other) const { + return load_at<decorators | INTERNAL_VALUE_IS_OOP, T>(_base, _offset) == other; + } + + template <typename T> + inline bool operator !=(const T& other) const { + return load_at<decorators | INTERNAL_VALUE_IS_OOP, T>(_base, _offset) != other; + } }; } template <DecoratorSet decorators = INTERNAL_EMPTY> class Access: public AllStatic {
@@ -407,13 +449,13 AS_DECORATOR_MASK>(); AccessInternal::arraycopy<decorators>(src_obj, dst_obj, src, dst, length); } // Oop heap accesses - static inline AccessInternal::LoadAtProxy<decorators | INTERNAL_VALUE_IS_OOP> oop_load_at(oop base, ptrdiff_t offset) { + static inline AccessInternal::OopLoadAtProxy<decorators> oop_load_at(oop base, ptrdiff_t offset) { verify_heap_oop_decorators<load_mo_decorators>(); - return AccessInternal::LoadAtProxy<decorators | INTERNAL_VALUE_IS_OOP>(base, offset); + return AccessInternal::OopLoadAtProxy<decorators>(base, offset); } template <typename T> static inline void oop_store_at(oop base, ptrdiff_t offset, T value) { verify_heap_oop_decorators<store_mo_decorators>();
@@ -476,13 +518,13 return AccessInternal::atomic_xchg<decorators>(new_value, addr); } // Oop accesses template <typename P> - static inline AccessInternal::LoadProxy<P, decorators | INTERNAL_VALUE_IS_OOP> oop_load(P* addr) { + static inline AccessInternal::OopLoadProxy<P, decorators> oop_load(P* addr) { verify_oop_decorators<load_mo_decorators>(); - return AccessInternal::LoadProxy<P, decorators | INTERNAL_VALUE_IS_OOP>(addr); + return AccessInternal::OopLoadProxy<P, decorators>(addr); } template <typename P, typename T> static inline void oop_store(P* addr, T value) { verify_oop_decorators<store_mo_decorators>();
< prev index next >