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