mirror of
https://github.com/corda/corda.git
synced 2025-05-30 14:14:29 +00:00
Merge pull request #354 from dicej/notify
ensure Object.notify is available for Android classpath build and reduce...
This commit is contained in:
commit
e421e52eb2
@ -250,40 +250,6 @@ System::Library* loadLibrary(Thread* t,
|
|||||||
return lib;
|
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)
|
GcStackTraceElement* makeStackTraceElement(Thread* t, GcTraceElement* e)
|
||||||
{
|
{
|
||||||
PROTECT(t, e);
|
PROTECT(t, e);
|
||||||
|
@ -3199,6 +3199,8 @@ inline bool exceptionMatch(Thread* t, GcClass* type, GcThrowable* exception)
|
|||||||
|
|
||||||
object intern(Thread* t, object s);
|
object intern(Thread* t, object s);
|
||||||
|
|
||||||
|
object clone(Thread* t, object o);
|
||||||
|
|
||||||
void walk(Thread* t, Heap::Walker* w, object o, unsigned start);
|
void walk(Thread* t, Heap::Walker* w, object o, unsigned start);
|
||||||
|
|
||||||
int walkNext(Thread* t, object o, int previous);
|
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);
|
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;
|
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
|
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||||
Avian_java_lang_reflect_Method_getCaller(Thread* t, object, uintptr_t*)
|
Avian_java_lang_reflect_Method_getCaller(Thread* t, object, uintptr_t*)
|
||||||
{
|
{
|
||||||
|
@ -260,66 +260,6 @@ Classpath* makeClasspath(System*,
|
|||||||
|
|
||||||
} // namespace vm
|
} // 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
|
extern "C" AVIAN_EXPORT int64_t JNICALL
|
||||||
Avian_java_io_ObjectInputStream_makeInstance(Thread* t,
|
Avian_java_io_ObjectInputStream_makeInstance(Thread* t,
|
||||||
object,
|
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)
|
void walk(Thread* t, Heap::Walker* w, object o, unsigned start)
|
||||||
{
|
{
|
||||||
GcClass* class_ = t->m->heap->follow(objectClass(t, o));
|
GcClass* class_ = t->m->heap->follow(objectClass(t, o));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user