diff --git a/src/avian/classpath-common.h b/src/avian/classpath-common.h index 449167ea31..afc699383a 100644 --- a/src/avian/classpath-common.h +++ b/src/avian/classpath-common.h @@ -250,40 +250,6 @@ System::Library* loadLibrary(Thread* t, return lib; } -object clone(Thread* t, object o) -{ - PROTECT(t, o); - - GcClass* class_ = objectClass(t, o); - unsigned size = baseSize(t, o, class_) * BytesPerWord; - object clone; - - if (class_->arrayElementSize()) { - clone = static_cast(allocate(t, size, class_->objectMask())); - memcpy(clone, o, size); - // clear any object header flags: - setObjectClass(t, o, objectClass(t, o)); - } else if (instanceOf(t, type(t, GcCloneable::Type), o)) { - clone = make(t, class_); - memcpy(reinterpret_cast(clone) + 1, - reinterpret_cast(o) + 1, - size - BytesPerWord); - } else { - GcByteArray* classNameSlash = objectClass(t, o)->name(); - THREAD_RUNTIME_ARRAY(t, char, classNameDot, classNameSlash->length()); - replace('/', - '.', - RUNTIME_ARRAY_BODY(classNameDot), - reinterpret_cast(classNameSlash->body().begin())); - throwNew(t, - GcCloneNotSupportedException::Type, - "%s", - RUNTIME_ARRAY_BODY(classNameDot)); - } - - return clone; -} - GcStackTraceElement* makeStackTraceElement(Thread* t, GcTraceElement* e) { PROTECT(t, e); diff --git a/src/avian/machine.h b/src/avian/machine.h index 37a1a06e06..d310ac4b88 100644 --- a/src/avian/machine.h +++ b/src/avian/machine.h @@ -3199,6 +3199,8 @@ inline bool exceptionMatch(Thread* t, GcClass* type, GcThrowable* exception) object intern(Thread* t, object s); +object clone(Thread* t, object o); + void walk(Thread* t, Heap::Walker* w, object o, unsigned start); int walkNext(Thread* t, object o, int previous); diff --git a/src/builtin.cpp b/src/builtin.cpp index 1c2f173b16..f1b34ba89f 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -1330,3 +1330,58 @@ extern "C" AVIAN_EXPORT int64_t JNICALL { return Avian_java_lang_Class_getEnclosingMethod(t, method, arguments); } + + +extern "C" AVIAN_EXPORT int64_t JNICALL + Avian_java_lang_Object_toString(Thread* t, object, uintptr_t* arguments) +{ + object this_ = reinterpret_cast(arguments[0]); + + unsigned hash = objectHash(t, this_); + GcString* s = makeString( + t, "%s@0x%x", objectClass(t, this_)->name()->body().begin(), hash); + + return reinterpret_cast(s); +} + +extern "C" AVIAN_EXPORT int64_t JNICALL + Avian_java_lang_Object_getVMClass(Thread* t, object, uintptr_t* arguments) +{ + return reinterpret_cast( + objectClass(t, reinterpret_cast(arguments[0]))); +} + +extern "C" AVIAN_EXPORT void JNICALL + Avian_java_lang_Object_wait(Thread* t, object, uintptr_t* arguments) +{ + object this_ = reinterpret_cast(arguments[0]); + int64_t milliseconds; + memcpy(&milliseconds, arguments + 1, 8); + + vm::wait(t, this_, milliseconds); +} + +extern "C" AVIAN_EXPORT void JNICALL + Avian_java_lang_Object_notify(Thread* t, object, uintptr_t* arguments) +{ + notify(t, reinterpret_cast(arguments[0])); +} + +extern "C" AVIAN_EXPORT void JNICALL + Avian_java_lang_Object_notifyAll(Thread* t, object, uintptr_t* arguments) +{ + notifyAll(t, reinterpret_cast(arguments[0])); +} + +extern "C" AVIAN_EXPORT int64_t JNICALL + Avian_java_lang_Object_hashCode(Thread* t, object, uintptr_t* arguments) +{ + return objectHash(t, reinterpret_cast(arguments[0])); +} + +extern "C" AVIAN_EXPORT int64_t JNICALL + Avian_java_lang_Object_clone(Thread* t, object, uintptr_t* arguments) +{ + return reinterpret_cast( + clone(t, reinterpret_cast(arguments[0]))); +} diff --git a/src/classpath-android.cpp b/src/classpath-android.cpp index 0d71913b0d..c2fa2677f5 100644 --- a/src/classpath-android.cpp +++ b/src/classpath-android.cpp @@ -1245,53 +1245,6 @@ extern "C" AVIAN_EXPORT int64_t JNICALL return v; } -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_toString(Thread* t, object, uintptr_t* arguments) -{ - object this_ = reinterpret_cast(arguments[0]); - - unsigned hash = objectHash(t, this_); - GcString* s = makeString( - t, "%s@0x%x", objectClass(t, this_)->name()->body().begin(), hash); - - return reinterpret_cast(s); -} - -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_getVMClass(Thread* t, object, uintptr_t* arguments) -{ - return reinterpret_cast( - objectClass(t, reinterpret_cast(arguments[0]))); -} - -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_clone(Thread* t, object, uintptr_t* arguments) -{ - return reinterpret_cast( - clone(t, reinterpret_cast(arguments[0]))); -} - -extern "C" AVIAN_EXPORT void JNICALL - Avian_java_lang_Object_wait(Thread* t, object, uintptr_t* arguments) -{ - jlong milliseconds; - memcpy(&milliseconds, arguments + 1, sizeof(jlong)); - - wait(t, reinterpret_cast(arguments[0]), milliseconds); -} - -extern "C" AVIAN_EXPORT void JNICALL - Avian_java_lang_Object_notifyAll(Thread* t, object, uintptr_t* arguments) -{ - notifyAll(t, reinterpret_cast(arguments[0])); -} - -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_hashCode(Thread* t, object, uintptr_t* arguments) -{ - return objectHash(t, reinterpret_cast(arguments[0])); -} - extern "C" AVIAN_EXPORT int64_t JNICALL Avian_java_lang_reflect_Method_getCaller(Thread* t, object, uintptr_t*) { diff --git a/src/classpath-avian.cpp b/src/classpath-avian.cpp index 4f8740cc90..6bc72b77db 100644 --- a/src/classpath-avian.cpp +++ b/src/classpath-avian.cpp @@ -260,66 +260,6 @@ Classpath* makeClasspath(System*, } // namespace vm -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_toString(Thread* t, object, uintptr_t* arguments) -{ - object this_ = reinterpret_cast(arguments[0]); - - unsigned hash = objectHash(t, this_); - GcString* s = makeString( - t, "%s@0x%x", objectClass(t, this_)->name()->body().begin(), hash); - - return reinterpret_cast(s); -} - -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_getVMClass(Thread* t, object, uintptr_t* arguments) -{ - return reinterpret_cast( - objectClass(t, reinterpret_cast(arguments[0]))); -} - -extern "C" AVIAN_EXPORT void JNICALL - Avian_java_lang_Object_wait(Thread* t, object, uintptr_t* arguments) -{ - object this_ = reinterpret_cast(arguments[0]); - int64_t milliseconds; - memcpy(&milliseconds, arguments + 1, 8); - - vm::wait(t, this_, milliseconds); -} - -extern "C" AVIAN_EXPORT void JNICALL - Avian_java_lang_Object_notify(Thread* t, object, uintptr_t* arguments) -{ - object this_ = reinterpret_cast(arguments[0]); - - notify(t, this_); -} - -extern "C" AVIAN_EXPORT void JNICALL - Avian_java_lang_Object_notifyAll(Thread* t, object, uintptr_t* arguments) -{ - object this_ = reinterpret_cast(arguments[0]); - - notifyAll(t, this_); -} - -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_hashCode(Thread* t, object, uintptr_t* arguments) -{ - object this_ = reinterpret_cast(arguments[0]); - - return objectHash(t, this_); -} - -extern "C" AVIAN_EXPORT int64_t JNICALL - Avian_java_lang_Object_clone(Thread* t, object, uintptr_t* arguments) -{ - return reinterpret_cast( - clone(t, reinterpret_cast(arguments[0]))); -} - extern "C" AVIAN_EXPORT int64_t JNICALL Avian_java_io_ObjectInputStream_makeInstance(Thread* t, object, diff --git a/src/machine.cpp b/src/machine.cpp index ecc30b3361..8a7053e98f 100644 --- a/src/machine.cpp +++ b/src/machine.cpp @@ -5437,6 +5437,40 @@ object intern(Thread* t, object s) } } +object clone(Thread* t, object o) +{ + PROTECT(t, o); + + GcClass* class_ = objectClass(t, o); + unsigned size = baseSize(t, o, class_) * BytesPerWord; + object clone; + + if (class_->arrayElementSize()) { + clone = static_cast(allocate(t, size, class_->objectMask())); + memcpy(clone, o, size); + // clear any object header flags: + setObjectClass(t, o, objectClass(t, o)); + } else if (instanceOf(t, type(t, GcCloneable::Type), o)) { + clone = make(t, class_); + memcpy(reinterpret_cast(clone) + 1, + reinterpret_cast(o) + 1, + size - BytesPerWord); + } else { + GcByteArray* classNameSlash = objectClass(t, o)->name(); + THREAD_RUNTIME_ARRAY(t, char, classNameDot, classNameSlash->length()); + replace('/', + '.', + RUNTIME_ARRAY_BODY(classNameDot), + reinterpret_cast(classNameSlash->body().begin())); + throwNew(t, + GcCloneNotSupportedException::Type, + "%s", + RUNTIME_ARRAY_BODY(classNameDot)); + } + + return clone; +} + void walk(Thread* t, Heap::Walker* w, object o, unsigned start) { GcClass* class_ = t->m->heap->follow(objectClass(t, o));