From c4722fa843b0902d73a1a206f0771e5fe9e7a433 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Wed, 14 Mar 2012 11:54:03 -0600 Subject: [PATCH] update Unsafe.setMemory to reflect new OpenJDK 7 signature and semantics --- classpath/sun/misc/Unsafe.java | 3 ++- src/builtin.cpp | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/classpath/sun/misc/Unsafe.java b/classpath/sun/misc/Unsafe.java index 84f22b88db..b7613d2559 100644 --- a/classpath/sun/misc/Unsafe.java +++ b/classpath/sun/misc/Unsafe.java @@ -11,7 +11,8 @@ public final class Unsafe { public native long allocateMemory(long bytes); - public native void setMemory(long address, long count, byte value); + public native void setMemory + (Object base, long offset, long count, byte value); public native void freeMemory(long address); diff --git a/src/builtin.cpp b/src/builtin.cpp index f7f2c12d29..0efc8fbbd2 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -352,13 +352,24 @@ Avian_sun_misc_Unsafe_freeMemory extern "C" JNIEXPORT void JNICALL Avian_sun_misc_Unsafe_setMemory -(Thread*, object, uintptr_t* arguments) +(Thread* t, object, uintptr_t* arguments) { - int64_t p; memcpy(&p, arguments + 1, 8); - int64_t count; memcpy(&count, arguments + 3, 8); - int8_t v = arguments[5]; + object base = reinterpret_cast(arguments[1]); + int64_t offset; memcpy(&offset, arguments + 2, 8); + int64_t count; memcpy(&count, arguments + 4, 8); + int8_t value = arguments[6]; - memset(reinterpret_cast(p), v, count); + fprintf(stderr, "base %p offset %p count %ld value %d\n", base, reinterpret_cast(offset), count, value); + + PROTECT(t, base); + + ACQUIRE(t, t->m->referenceLock); + + if (base) { + memset(&cast(base, offset), value, count); + } else { + memset(reinterpret_cast(offset), value, count); + } } // NB: The following primitive get/put methods are only used by the