< prev index next >

src/hotspot/share/oops/access.hpp

load_proxy

*** 304,326 **** 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 { private: P *const _addr; public: ! LoadProxy(P* addr) : _addr(addr) {} template <typename T> ! inline operator T() { ! return load<decorators, P, T>(_addr); } ! inline operator P() { ! return load<decorators, P, P>(_addr); } }; // Infer the type that should be returned from a load_at. template <DecoratorSet decorators> --- 304,335 ---- template <DecoratorSet decorators> oop resolve(oop src); // Infer the type that should be returned from a load. template <typename P, DecoratorSet decorators> ! class OopLoadProxy: public StackObj { private: P *const _addr; public: ! 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 bool operator ==(const T& other) const { ! return load<decorators | INTERNAL_VALUE_IS_OOP, P, T>(_addr) == other; } ! 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,342 **** --- 342,384 ---- 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,419 **** 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) { verify_heap_oop_decorators<load_mo_decorators>(); ! return AccessInternal::LoadAtProxy<decorators | INTERNAL_VALUE_IS_OOP>(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>(); --- 449,461 ---- AS_DECORATOR_MASK>(); AccessInternal::arraycopy<decorators>(src_obj, dst_obj, src, dst, length); } // Oop heap accesses ! static inline AccessInternal::OopLoadAtProxy<decorators> oop_load_at(oop base, ptrdiff_t offset) { verify_heap_oop_decorators<load_mo_decorators>(); ! 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,488 **** 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) { verify_oop_decorators<load_mo_decorators>(); ! return AccessInternal::LoadProxy<P, decorators | INTERNAL_VALUE_IS_OOP>(addr); } template <typename P, typename T> static inline void oop_store(P* addr, T value) { verify_oop_decorators<store_mo_decorators>(); --- 518,530 ---- return AccessInternal::atomic_xchg<decorators>(new_value, addr); } // Oop accesses template <typename P> ! static inline AccessInternal::OopLoadProxy<P, decorators> oop_load(P* addr) { verify_oop_decorators<load_mo_decorators>(); ! 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 >