diff options
| author | Hiroshi Yamauchi <yamauchi@google.com> | 2013-08-28 14:32:38 -0700 |
|---|---|---|
| committer | Andrew Warfield <hiasant@gmail.com> | 2014-01-19 05:56:12 -0800 |
| commit | 0a0c4e9cb806ea19882b45798af903d6893e72bd (patch) | |
| tree | 596c47a4ea66abf3fe2aac13aec6055a71326fdd /vm/native/java_lang_System.cpp | |
| parent | 65d7f8447d61f8046fdc128b4849b1b84306e637 (diff) | |
A char array copy optimization (dalvik).
Bug: 7103825
(cherry picked from commit dc6cb9c7cb4ef636aa6f542615410b56a67b94dc)
Change-Id: I0b8ab789ffb8702bc134b32398c120cc3ed29b9c
Diffstat (limited to 'vm/native/java_lang_System.cpp')
| -rw-r--r-- | vm/native/java_lang_System.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/vm/native/java_lang_System.cpp b/vm/native/java_lang_System.cpp index 4485a9217..33c295554 100644 --- a/vm/native/java_lang_System.cpp +++ b/vm/native/java_lang_System.cpp @@ -365,6 +365,41 @@ static void Dalvik_java_lang_System_arraycopy(const u4* args, JValue* pResult) } /* + * public static void arraycopyCharUnchecked(char[] src, int srcPos, char[] dest, + * int destPos, int length) + * + * This is a char[] specialized, native, unchecked version of + * arraycopy(). This assumes error checking has been done. + */ +static void Dalvik_java_lang_System_arraycopyCharUnchecked(const u4* args, JValue* pResult) +{ + ArrayObject* srcArray = (ArrayObject*) args[0]; + int srcPos = args[1]; + ArrayObject* dstArray = (ArrayObject*) args[2]; + int dstPos = args[3]; + int length = args[4]; + assert(srcArray != NULL); + assert(dstArray != NULL); + assert(dvmIsArray(srcArray)); + assert(dvmIsArray(dstArray)); + assert(srcPos >= 0 && dstPos >= 0 && length >= 0 && + srcPos + length <= (int) srcArray->length && + dstPos + length <= (int) dstArray->length); +#ifndef NDEBUG + ClassObject* srcClass = srcArray->clazz; + ClassObject* dstClass = dstArray->clazz; + char srcType = srcClass->descriptor[1]; + char dstType = dstClass->descriptor[1]; + assert(srcType == 'C' && dstType == 'C'); +#endif + /* 2 bytes per element */ + move16((u1*) dstArray->contents + dstPos * 2, + (const u1*) srcArray->contents + srcPos * 2, + length * 2); + RETURN_VOID(); +} + +/* * static int identityHashCode(Object x) * * Returns that hash code that the default hashCode() @@ -381,6 +416,8 @@ static void Dalvik_java_lang_System_identityHashCode(const u4* args, const DalvikNativeMethod dvm_java_lang_System[] = { { "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V", Dalvik_java_lang_System_arraycopy }, + { "arraycopyCharUnchecked", "([CI[CII)V", + Dalvik_java_lang_System_arraycopyCharUnchecked }, { "identityHashCode", "(Ljava/lang/Object;)I", Dalvik_java_lang_System_identityHashCode }, { NULL, NULL, NULL }, |
