< prev index next >
src/share/vm/utilities/globalDefinitions.hpp
Print this page
*** 1401,1410 ****
--- 1401,1436 ----
#endif /* COMPILER2 */
# endif /* ASSERT */
#define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))
+ //----------------------------------------------------------------------------------------------------
+ // Sum and product which can never overflow: they wrap, just like the
+ // Java operations. Note that we don't intend these to be used for
+ // general-purpose arithmetic: their purpose is to emulate Java
+ // operations.
+
+ // The goal of this code to avoid undefined or implementation-defined
+ // behaviour. The use of an lvalue to reference cast is explicitly
+ // permitted by Lvalues and rvalues [basic.lval]. [Section 3.10 Para
+ // 15 in C++03]
+ #define JAVA_INTEGER_OP(OP, NAME, TYPE, UNSIGNED_TYPE) \
+ inline TYPE NAME (TYPE in1, TYPE in2) { \
+ UNSIGNED_TYPE ures = static_cast<UNSIGNED_TYPE>(in1); \
+ ures OP ## = static_cast<UNSIGNED_TYPE>(in2); \
+ return reinterpret_cast<TYPE&>(ures); \
+ }
+
+ JAVA_INTEGER_OP(+, java_add, jint, juint)
+ JAVA_INTEGER_OP(-, java_subtract, jint, juint)
+ JAVA_INTEGER_OP(*, java_multiply, jint, juint)
+ JAVA_INTEGER_OP(+, java_add, jlong, julong)
+ JAVA_INTEGER_OP(-, java_subtract, jlong, julong)
+ JAVA_INTEGER_OP(*, java_multiply, jlong, julong)
+
+ #undef JAVA_INTEGER_OP
+
// Dereference vptr
// All C++ compilers that we know of have the vtbl pointer in the first
// word. If there are exceptions, this function needs to be made compiler
// specific.
static inline void* dereference_vptr(const void* addr) {
< prev index next >