summaryrefslogtreecommitdiffstats
path: root/runtime/entrypoints/quick/quick_fillarray_entrypoints.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/entrypoints/quick/quick_fillarray_entrypoints.cc')
-rw-r--r--runtime/entrypoints/quick/quick_fillarray_entrypoints.cc46
1 files changed, 11 insertions, 35 deletions
diff --git a/runtime/entrypoints/quick/quick_fillarray_entrypoints.cc b/runtime/entrypoints/quick/quick_fillarray_entrypoints.cc
index 4ec2879..06bbabc 100644
--- a/runtime/entrypoints/quick/quick_fillarray_entrypoints.cc
+++ b/runtime/entrypoints/quick/quick_fillarray_entrypoints.cc
@@ -15,49 +15,25 @@
*/
#include "callee_save_frame.h"
-#include "common_throws.h"
-#include "dex_instruction.h"
#include "mirror/array.h"
-#include "mirror/object-inl.h"
+#include "mirror/art_method-inl.h"
+#include "entrypoints/entrypoint_utils.h"
namespace art {
/*
- * Fill the array with predefined constant values, throwing exceptions if the array is null or
- * not of sufficient length.
- *
- * NOTE: When dealing with a raw dex file, the data to be copied uses
- * little-endian ordering. Require that oat2dex do any required swapping
- * so this routine can get by with a memcpy().
- *
- * Format of the data:
- * ushort ident = 0x0300 magic value
- * ushort width width of each element in the table
- * uint size number of elements in the table
- * ubyte data[size*width] table of data values (may contain a single-byte
- * padding at the end)
+ * Handle fill array data by copying appropriate part of dex file into array.
*/
-extern "C" int artHandleFillArrayDataFromCode(mirror::Array* array,
- const Instruction::ArrayDataPayload* payload,
- Thread* self, StackReference<mirror::ArtMethod>* sp)
+extern "C" int artHandleFillArrayDataFromCode(uint32_t payload_offset, mirror::Array* array,
+ mirror::ArtMethod* method, Thread* self,
+ StackReference<mirror::ArtMethod>* sp)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
- DCHECK_EQ(payload->ident, static_cast<uint16_t>(Instruction::kArrayDataSignature));
- if (UNLIKELY(array == NULL)) {
- ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA");
- return -1; // Error
- }
- DCHECK(array->IsArrayInstance() && !array->IsObjectArray());
- if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) {
- ThrowLocation throw_location = self->GetCurrentLocationForThrow();
- self->ThrowNewExceptionF(throw_location, "Ljava/lang/ArrayIndexOutOfBoundsException;",
- "failed FILL_ARRAY_DATA; length=%d, index=%d",
- array->GetLength(), payload->element_count - 1);
- return -1; // Error
- }
- uint32_t size_in_bytes = payload->element_count * payload->element_width;
- memcpy(array->GetRawData(payload->element_width, 0), payload->data, size_in_bytes);
- return 0; // Success
+ const uint16_t* const insns = method->GetCodeItem()->insns_;
+ const Instruction::ArrayDataPayload* payload =
+ reinterpret_cast<const Instruction::ArrayDataPayload*>(insns + payload_offset);
+ bool success = FillArrayData(array, payload);
+ return success ? 0 : -1;
}
} // namespace art