157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/*
257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Copyright (C) 2012 The Android Open Source Project
357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * you may not use this file except in compliance with the License.
657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * You may obtain a copy of the License at
757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
1057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Unless required by applicable law or agreed to in writing, software
1157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
1257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * See the License for the specific language governing permissions and
1457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * limitations under the License.
1557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */
1657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "callee_save_frame.h"
1898d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang#include "entrypoints/entrypoint_utils-inl.h"
192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker-inl.h"
20fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers#include "dex_file-inl.h"
217655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "gc/accounting/card_table-inl.h"
22ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "mirror/art_method-inl.h"
232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h"
244f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "mirror/object-inl.h"
2557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2657b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art {
2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Class* artInitializeStaticStorageFromCode(uint32_t type_idx,
29ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                             mirror::ArtMethod* referrer,
302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                             Thread* self,
31cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                             StackReference<mirror::ArtMethod>* sp)
32b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
33e2645d3e2db211bfd75775a2185c135ff387161aIan Rogers  // Called to ensure static storage base is initialized for direct static field reads and writes.
34e2645d3e2db211bfd75775a2185c135ff387161aIan Rogers  // A class may be accessing another class' fields when it doesn't have access, as access has been
35e2645d3e2db211bfd75775a2185c135ff387161aIan Rogers  // given by inheritance.
3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
37e2645d3e2db211bfd75775a2185c135ff387161aIan Rogers  return ResolveVerifyAndClinit(type_idx, referrer, self, true, false);
3857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Class* artInitializeTypeFromCode(uint32_t type_idx,
41ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                    mirror::ArtMethod* referrer,
42cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                    Thread* self,
43cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                    StackReference<mirror::ArtMethod>* sp)
44b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
45e2645d3e2db211bfd75775a2185c135ff387161aIan Rogers  // Called when method->dex_cache_resolved_types_[] misses.
4657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
4757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return ResolveVerifyAndClinit(type_idx, referrer, self, false, false);
4857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
4957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Class* artInitializeTypeAndVerifyAccessFromCode(uint32_t type_idx,
51cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe    mirror::ArtMethod* referrer,
52cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe    Thread* self,
53cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe    StackReference<mirror::ArtMethod>* sp) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
5457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  // Called when caller isn't guaranteed to have access to a type and the dex cache may be
55e2645d3e2db211bfd75775a2185c135ff387161aIan Rogers  // unpopulated.
5657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
5757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return ResolveVerifyAndClinit(type_idx, referrer, self, false, true);
5857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
5957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
60ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromextern "C" mirror::String* artResolveStringFromCode(mirror::ArtMethod* referrer,
612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                    int32_t string_idx,
62cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                    Thread* self,
63cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                    StackReference<mirror::ArtMethod>* sp)
64b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
6557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
6657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return ResolveStringFromCode(referrer, string_idx);
6757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}  // namespace art
70