diff options
Diffstat (limited to 'runtime/entrypoints/quick/quick_fillarray_entrypoints.cc')
-rw-r--r-- | runtime/entrypoints/quick/quick_fillarray_entrypoints.cc | 46 |
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 |