diff options
author | Ian Rogers <irogers@google.com> | 2014-02-11 16:30:46 -0800 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-02-11 17:02:21 -0800 |
commit | 0177e53ea521ad58b70c305700dab32f1ac773b7 (patch) | |
tree | db15627a19a04634cf84cecd15b813319d80d225 /runtime/reflection.cc | |
parent | abaf927f29f6feceb3df3e6ced7d01970ba0dbe9 (diff) | |
download | art-0177e53ea521ad58b70c305700dab32f1ac773b7.tar.gz art-0177e53ea521ad58b70c305700dab32f1ac773b7.tar.bz2 art-0177e53ea521ad58b70c305700dab32f1ac773b7.zip |
Work in the direction of hard float quick ABIs.
Pass a shorty to ArtMethod::Invoke so that register setup can use it.
Document x86-64 ABI.
Add extra debug output for one JNI native method registration fails, namely a
dump of the Class and its dex file's location.
Add hack to get testing of OatMethod's without GC maps working in 64bit.
Change-Id: Ic06b68e18eac33637df2caf5e7e775ff95ae70f3
Diffstat (limited to 'runtime/reflection.cc')
-rw-r--r-- | runtime/reflection.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/runtime/reflection.cc b/runtime/reflection.cc index ac8f5ef6c4..0bfa70f279 100644 --- a/runtime/reflection.cc +++ b/runtime/reflection.cc @@ -220,36 +220,46 @@ mirror::Object* BoxPrimitive(Primitive::Type src_class, const JValue& value) { } jmethodID m = NULL; + const char* shorty; switch (src_class) { case Primitive::kPrimBoolean: m = WellKnownClasses::java_lang_Boolean_valueOf; + shorty = "LZ"; break; case Primitive::kPrimByte: m = WellKnownClasses::java_lang_Byte_valueOf; + shorty = "LB"; break; case Primitive::kPrimChar: m = WellKnownClasses::java_lang_Character_valueOf; + shorty = "LC"; break; case Primitive::kPrimDouble: m = WellKnownClasses::java_lang_Double_valueOf; + shorty = "LD"; break; case Primitive::kPrimFloat: m = WellKnownClasses::java_lang_Float_valueOf; + shorty = "LF"; break; case Primitive::kPrimInt: m = WellKnownClasses::java_lang_Integer_valueOf; + shorty = "LI"; break; case Primitive::kPrimLong: m = WellKnownClasses::java_lang_Long_valueOf; + shorty = "LJ"; break; case Primitive::kPrimShort: m = WellKnownClasses::java_lang_Short_valueOf; + shorty = "LS"; break; case Primitive::kPrimVoid: // There's no such thing as a void field, and void methods invoked via reflection return null. - return NULL; + return nullptr; default: LOG(FATAL) << static_cast<int>(src_class); + shorty = nullptr; } ScopedObjectAccessUnchecked soa(Thread::Current()); @@ -257,7 +267,7 @@ mirror::Object* BoxPrimitive(Primitive::Type src_class, const JValue& value) { CHECK_EQ(soa.Self()->GetState(), kRunnable); } - ArgArray arg_array(NULL, 0); + ArgArray arg_array(nullptr, 0); JValue result; if (src_class == Primitive::kPrimDouble || src_class == Primitive::kPrimLong) { arg_array.AppendWide(value.GetJ()); @@ -266,7 +276,7 @@ mirror::Object* BoxPrimitive(Primitive::Type src_class, const JValue& value) { } soa.DecodeMethod(m)->Invoke(soa.Self(), arg_array.GetArray(), arg_array.GetNumBytes(), - &result, 'L'); + &result, shorty); return result.GetL(); } |