blob: c2808fecca164614050f5340bee4bf3ce9336014 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/android/java/java_type.h"
#include "base/logging.h"
namespace content {
namespace {
JavaType JavaTypeFromJNIName(const std::string& jni_name) {
JavaType result;
DCHECK(!jni_name.empty());
switch (jni_name[0]) {
case 'Z':
result.type = JavaType::TypeBoolean;
break;
case 'B':
result.type = JavaType::TypeByte;
break;
case 'C':
result.type = JavaType::TypeChar;
break;
case 'S':
result.type = JavaType::TypeShort;
break;
case 'I':
result.type = JavaType::TypeInt;
break;
case 'J':
result.type = JavaType::TypeLong;
break;
case 'F':
result.type = JavaType::TypeFloat;
break;
case 'D':
result.type = JavaType::TypeDouble;
break;
case '[':
result.type = JavaType::TypeArray;
// LIVECONNECT_COMPLIANCE: We don't support multi-dimensional arrays, so
// there's no need to populate the inner types.
break;
case 'L':
result.type = jni_name == "Ljava.lang.String;" ?
JavaType::TypeString :
JavaType::TypeObject;
break;
default:
// Includes void (V).
NOTREACHED();
}
return result;
}
} // namespace
JavaType::JavaType() {
}
JavaType::JavaType(const JavaType& other) {
*this = other;
}
JavaType::~JavaType() {
}
JavaType& JavaType::operator=(const JavaType& other) {
type = other.type;
if (other.inner_type) {
DCHECK_EQ(JavaType::TypeArray, type);
inner_type.reset(new JavaType(*other.inner_type));
} else {
inner_type.reset();
}
return *this;
}
JavaType JavaType::CreateFromBinaryName(const std::string& binary_name) {
JavaType result;
DCHECK(!binary_name.empty());
if (binary_name == "boolean") {
result.type = JavaType::TypeBoolean;
} else if (binary_name == "byte") {
result.type = JavaType::TypeByte;
} else if (binary_name == "char") {
result.type = JavaType::TypeChar;
} else if (binary_name == "short") {
result.type = JavaType::TypeShort;
} else if (binary_name == "int") {
result.type = JavaType::TypeInt;
} else if (binary_name == "long") {
result.type = JavaType::TypeLong;
} else if (binary_name == "float") {
result.type = JavaType::TypeFloat;
} else if (binary_name == "double") {
result.type = JavaType::TypeDouble;
} else if (binary_name == "void") {
result.type = JavaType::TypeVoid;
} else if (binary_name[0] == '[') {
result.type = JavaType::TypeArray;
// The inner type of an array is represented in JNI format.
result.inner_type.reset(new JavaType(JavaTypeFromJNIName(
binary_name.substr(1))));
} else if (binary_name == "java.lang.String") {
result.type = JavaType::TypeString;
} else {
result.type = JavaType::TypeObject;
}
return result;
}
} // namespace content