quick_fillarray_entrypoints.cc revision 7655f29fabc0a12765de828914a18314382e5a35
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "callee_save_frame.h" 18#include "common_throws.h" 19#include "dex_instruction.h" 20#include "mirror/array.h" 21#include "mirror/object-inl.h" 22 23namespace art { 24 25/* 26 * Fill the array with predefined constant values, throwing exceptions if the array is null or 27 * not of sufficient length. 28 * 29 * NOTE: When dealing with a raw dex file, the data to be copied uses 30 * little-endian ordering. Require that oat2dex do any required swapping 31 * so this routine can get by with a memcpy(). 32 * 33 * Format of the data: 34 * ushort ident = 0x0300 magic value 35 * ushort width width of each element in the table 36 * uint size number of elements in the table 37 * ubyte data[size*width] table of data values (may contain a single-byte 38 * padding at the end) 39 */ 40extern "C" int artHandleFillArrayDataFromCode(mirror::Array* array, 41 const Instruction::ArrayDataPayload* payload, 42 Thread* self, mirror::AbstractMethod** sp) 43 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 44 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 45 DCHECK_EQ(payload->ident, static_cast<uint16_t>(Instruction::kArrayDataSignature)); 46 if (UNLIKELY(array == NULL)) { 47 ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 48 return -1; // Error 49 } 50 DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 51 if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 52 ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 53 self->ThrowNewExceptionF(throw_location, "Ljava/lang/ArrayIndexOutOfBoundsException;", 54 "failed FILL_ARRAY_DATA; length=%d, index=%d", 55 array->GetLength(), payload->element_count - 1); 56 return -1; // Error 57 } 58 uint32_t size_in_bytes = payload->element_count * payload->element_width; 59 memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 60 return 0; // Success 61} 62 63} // namespace art 64