176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier/* 276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * Copyright (C) 2014 The Android Open Source Project 376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * 476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * you may not use this file except in compliance with the License. 676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * You may obtain a copy of the License at 776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * 876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * 1076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 1176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 1276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * See the License for the specific language governing permissions and 1476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier * limitations under the License. 1576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier */ 1676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 1776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#ifndef ART_RUNTIME_REFLECTION_INL_H_ 1876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#define ART_RUNTIME_REFLECTION_INL_H_ 1976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 2076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "reflection.h" 2176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 2276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "base/stringprintf.h" 2376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "common_throws.h" 2476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "jvalue.h" 25daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier#include "mirror/object-inl.h" 2676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "primitive.h" 2776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "utils.h" 2876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 2976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartiernamespace art { 3076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 310aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffrayinline bool ConvertPrimitiveValue(bool unbox_for_result, 3276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier Primitive::Type srcType, Primitive::Type dstType, 3376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier const JValue& src, JValue* dst) { 3476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier DCHECK(srcType != Primitive::kPrimNot && dstType != Primitive::kPrimNot); 3576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (LIKELY(srcType == dstType)) { 3676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetJ(src.GetJ()); 3776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 3876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 3976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier switch (dstType) { 4076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimBoolean: // Fall-through. 4176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimChar: // Fall-through. 4276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimByte: 4376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier // Only expect assignment with source and destination of identical type. 4476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 4576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimShort: 4676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (srcType == Primitive::kPrimByte) { 4776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetS(src.GetI()); 4876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 4976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 5076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 5176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimInt: 5276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar || 5376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier srcType == Primitive::kPrimShort) { 5476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetI(src.GetI()); 5576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 5676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 5776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 5876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimLong: 5976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar || 6076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) { 6176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetJ(src.GetI()); 6276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 6376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 6476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 6576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimFloat: 6676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar || 6776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) { 6876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetF(src.GetI()); 6976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 7076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } else if (srcType == Primitive::kPrimLong) { 7176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetF(src.GetJ()); 7276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 7376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 7476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 7576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier case Primitive::kPrimDouble: 7676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar || 7776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) { 7876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetD(src.GetI()); 7976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 8076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } else if (srcType == Primitive::kPrimLong) { 8176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetD(src.GetJ()); 8276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 8376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } else if (srcType == Primitive::kPrimFloat) { 8476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier dst->SetD(src.GetF()); 8576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return true; 8676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 8776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 8876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier default: 8976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier break; 9076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 9176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (!unbox_for_result) { 920aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowIllegalArgumentException(StringPrintf("Invalid primitive conversion from %s to %s", 9376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier PrettyDescriptor(srcType).c_str(), 9476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier PrettyDescriptor(dstType).c_str()).c_str()); 9576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } else { 960aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowClassCastException(StringPrintf("Couldn't convert result of type %s to %s", 9776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier PrettyDescriptor(srcType).c_str(), 9876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier PrettyDescriptor(dstType).c_str()).c_str()); 9976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 10076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return false; 10176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier} 10276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 103daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierinline bool VerifyObjectIsClass(mirror::Object* o, mirror::Class* c) { 104daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (UNLIKELY(o == nullptr)) { 105daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier ThrowNullPointerException("null receiver"); 106daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return false; 107daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else if (UNLIKELY(!o->InstanceOf(c))) { 108daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier InvalidReceiverError(o, c); 109daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return false; 110daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 111daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return true; 112daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier} 113daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier 11476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier} // namespace art 11576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 11676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#endif // ART_RUNTIME_REFLECTION_INL_H_ 117