mirror of
https://github.com/corda/corda.git
synced 2025-02-07 19:40:25 +00:00
ensure Object.notify is available for Android classpath build and reduce duplication
This commit is contained in:
parent
e7e54ad52b
commit
d930fbcda2
@ -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<object>(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<void**>(clone) + 1,
|
||||
reinterpret_cast<void**>(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<char*>(classNameSlash->body().begin()));
|
||||
throwNew(t,
|
||||
GcCloneNotSupportedException::Type,
|
||||
"%s",
|
||||
RUNTIME_ARRAY_BODY(classNameDot));
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
GcStackTraceElement* makeStackTraceElement(Thread* t, GcTraceElement* e)
|
||||
{
|
||||
PROTECT(t, e);
|
||||
|
@ -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);
|
||||
|
@ -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<object>(arguments[0]);
|
||||
|
||||
unsigned hash = objectHash(t, this_);
|
||||
GcString* s = makeString(
|
||||
t, "%s@0x%x", objectClass(t, this_)->name()->body().begin(), hash);
|
||||
|
||||
return reinterpret_cast<int64_t>(s);
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_lang_Object_getVMClass(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
return reinterpret_cast<int64_t>(
|
||||
objectClass(t, reinterpret_cast<object>(arguments[0])));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT void JNICALL
|
||||
Avian_java_lang_Object_wait(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
object this_ = reinterpret_cast<object>(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<object>(arguments[0]));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT void JNICALL
|
||||
Avian_java_lang_Object_notifyAll(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
notifyAll(t, reinterpret_cast<object>(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<object>(arguments[0]));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_lang_Object_clone(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
return reinterpret_cast<int64_t>(
|
||||
clone(t, reinterpret_cast<object>(arguments[0])));
|
||||
}
|
||||
|
@ -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<object>(arguments[0]);
|
||||
|
||||
unsigned hash = objectHash(t, this_);
|
||||
GcString* s = makeString(
|
||||
t, "%s@0x%x", objectClass(t, this_)->name()->body().begin(), hash);
|
||||
|
||||
return reinterpret_cast<int64_t>(s);
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_lang_Object_getVMClass(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
return reinterpret_cast<int64_t>(
|
||||
objectClass(t, reinterpret_cast<object>(arguments[0])));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_lang_Object_clone(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
return reinterpret_cast<int64_t>(
|
||||
clone(t, reinterpret_cast<object>(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<object>(arguments[0]), milliseconds);
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT void JNICALL
|
||||
Avian_java_lang_Object_notifyAll(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
notifyAll(t, reinterpret_cast<object>(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<object>(arguments[0]));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_lang_reflect_Method_getCaller(Thread* t, object, uintptr_t*)
|
||||
{
|
||||
|
@ -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<object>(arguments[0]);
|
||||
|
||||
unsigned hash = objectHash(t, this_);
|
||||
GcString* s = makeString(
|
||||
t, "%s@0x%x", objectClass(t, this_)->name()->body().begin(), hash);
|
||||
|
||||
return reinterpret_cast<int64_t>(s);
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_lang_Object_getVMClass(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
return reinterpret_cast<int64_t>(
|
||||
objectClass(t, reinterpret_cast<object>(arguments[0])));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT void JNICALL
|
||||
Avian_java_lang_Object_wait(Thread* t, object, uintptr_t* arguments)
|
||||
{
|
||||
object this_ = reinterpret_cast<object>(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<object>(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<object>(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<object>(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<int64_t>(
|
||||
clone(t, reinterpret_cast<object>(arguments[0])));
|
||||
}
|
||||
|
||||
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||
Avian_java_io_ObjectInputStream_makeInstance(Thread* t,
|
||||
object,
|
||||
|
@ -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<object>(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<void**>(clone) + 1,
|
||||
reinterpret_cast<void**>(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<char*>(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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user