Remove NAMES global type namespace
We now pass around an instance of JavaTypeNamespace to
resolve types.
Add a const pointer to this namespace to java Type objects.
This enables a lot of cases where we need to refer to the
type namespace as we dynamically resolve types.
Prototype a method to remove INT_TYPE global constant by looking
up the appropriate type in an instance of JavaTypeNamespace.
Bug: 24303749
Test: Compiles, unittests pass
Change-Id: I3bb25ffb875e1e55f0548b6cd0e84e3e8bbf817e
diff --git a/type_java.cpp b/type_java.cpp
index d51c76f..cffdf44 100644
--- a/type_java.cpp
+++ b/type_java.cpp
@@ -24,8 +24,6 @@
namespace android {
namespace aidl {
-JavaTypeNamespace NAMES;
-
Type* VOID_TYPE;
Type* BOOLEAN_TYPE;
Type* BYTE_TYPE;
@@ -57,102 +55,11 @@
Expression* TRUE_VALUE;
Expression* FALSE_VALUE;
-void register_base_types() {
- VOID_TYPE = new BasicType("void", "XXX", "XXX", "XXX", "XXX", "XXX");
- NAMES.Add(VOID_TYPE);
-
- BOOLEAN_TYPE = new BooleanType();
- NAMES.Add(BOOLEAN_TYPE);
-
- BYTE_TYPE = new BasicType("byte", "writeByte", "readByte", "writeByteArray",
- "createByteArray", "readByteArray");
- NAMES.Add(BYTE_TYPE);
-
- CHAR_TYPE = new CharType();
- NAMES.Add(CHAR_TYPE);
-
- INT_TYPE = new BasicType("int", "writeInt", "readInt", "writeIntArray",
- "createIntArray", "readIntArray");
- NAMES.Add(INT_TYPE);
-
- LONG_TYPE = new BasicType("long", "writeLong", "readLong", "writeLongArray",
- "createLongArray", "readLongArray");
- NAMES.Add(LONG_TYPE);
-
- FLOAT_TYPE =
- new BasicType("float", "writeFloat", "readFloat", "writeFloatArray",
- "createFloatArray", "readFloatArray");
- NAMES.Add(FLOAT_TYPE);
-
- DOUBLE_TYPE =
- new BasicType("double", "writeDouble", "readDouble", "writeDoubleArray",
- "createDoubleArray", "readDoubleArray");
- NAMES.Add(DOUBLE_TYPE);
-
- STRING_TYPE = new StringType();
- NAMES.Add(STRING_TYPE);
-
- OBJECT_TYPE = new Type("java.lang", "Object", Type::BUILT_IN, false, false);
- NAMES.Add(OBJECT_TYPE);
-
- CHAR_SEQUENCE_TYPE = new CharSequenceType();
- NAMES.Add(CHAR_SEQUENCE_TYPE);
-
- MAP_TYPE = new MapType();
- NAMES.Add(MAP_TYPE);
-
- LIST_TYPE = new ListType();
- NAMES.Add(LIST_TYPE);
-
- TEXT_UTILS_TYPE =
- new Type("android.text", "TextUtils", Type::BUILT_IN, false, false);
- NAMES.Add(TEXT_UTILS_TYPE);
-
- REMOTE_EXCEPTION_TYPE = new RemoteExceptionType();
- NAMES.Add(REMOTE_EXCEPTION_TYPE);
-
- RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType();
- NAMES.Add(RUNTIME_EXCEPTION_TYPE);
-
- IBINDER_TYPE = new IBinderType();
- NAMES.Add(IBINDER_TYPE);
-
- IINTERFACE_TYPE = new IInterfaceType();
- NAMES.Add(IINTERFACE_TYPE);
-
- BINDER_NATIVE_TYPE = new BinderType();
- NAMES.Add(BINDER_NATIVE_TYPE);
-
- BINDER_PROXY_TYPE = new BinderProxyType();
- NAMES.Add(BINDER_PROXY_TYPE);
-
- PARCEL_TYPE = new ParcelType();
- NAMES.Add(PARCEL_TYPE);
-
- PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType();
- NAMES.Add(PARCELABLE_INTERFACE_TYPE);
-
- CONTEXT_TYPE =
- new Type("android.content", "Context", Type::BUILT_IN, false, false);
- NAMES.Add(CONTEXT_TYPE);
-
- CLASSLOADER_TYPE = new ClassLoaderType();
- NAMES.Add(CLASSLOADER_TYPE);
-
- NULL_VALUE = new LiteralExpression("null");
- THIS_VALUE = new LiteralExpression("this");
- SUPER_VALUE = new LiteralExpression("super");
- TRUE_VALUE = new LiteralExpression("true");
- FALSE_VALUE = new LiteralExpression("false");
-
- NAMES.AddGenericType("java.util", "List", 1);
- NAMES.AddGenericType("java.util", "Map", 2);
-}
-
-static Type* make_generic_type(const string& package, const string& name,
+static Type* make_generic_type(const JavaTypeNamespace* types,
+ const string& package, const string& name,
const vector<const Type*>& args) {
if (package == "java.util" && name == "List") {
- return new GenericListType("java.util", "List", args);
+ return new GenericListType(types, "java.util", "List", args);
}
return NULL;
// return new GenericType(package, name, args);
@@ -160,8 +67,10 @@
// ================================================================
-Type::Type(const string& name, int kind, bool canWriteToParcel, bool canBeOut)
- : m_package(),
+Type::Type(const JavaTypeNamespace* types, const string& name, int kind,
+ bool canWriteToParcel, bool canBeOut)
+ : m_types(types),
+ m_package(),
m_name(name),
m_declFile(""),
m_declLine(-1),
@@ -171,10 +80,11 @@
m_qualifiedName = name;
}
-Type::Type(const string& package, const string& name, int kind,
- bool canWriteToParcel, bool canBeOut, const string& declFile,
- int declLine)
- : m_package(package),
+Type::Type(const JavaTypeNamespace* types, const string& package,
+ const string& name, int kind, bool canWriteToParcel, bool canBeOut,
+ const string& declFile, int declLine)
+ : m_types(types),
+ m_package(package),
m_name(name),
m_declFile(declFile),
m_declLine(declLine),
@@ -274,12 +184,13 @@
// ================================================================
-BasicType::BasicType(const string& name, const string& marshallParcel,
+BasicType::BasicType(const JavaTypeNamespace* types, const string& name,
+ const string& marshallParcel,
const string& unmarshallParcel,
const string& writeArrayParcel,
const string& createArrayParcel,
const string& readArrayParcel)
- : Type(name, BUILT_IN, true, false),
+ : Type(types, name, BUILT_IN, true, false),
m_marshallParcel(marshallParcel),
m_unmarshallParcel(unmarshallParcel),
m_writeArrayParcel(writeArrayParcel),
@@ -315,7 +226,8 @@
// ================================================================
-BooleanType::BooleanType() : Type("boolean", BUILT_IN, true, false) {}
+BooleanType::BooleanType(const JavaTypeNamespace* types)
+ : Type(types, "boolean", BUILT_IN, true, false) {}
void BooleanType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -350,11 +262,13 @@
// ================================================================
-CharType::CharType() : Type("char", BUILT_IN, true, false) {}
+CharType::CharType(const JavaTypeNamespace* types)
+ : Type(types, "char", BUILT_IN, true, false) {}
void CharType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
- addTo->Add(new MethodCall(parcel, "writeInt", 1, new Cast(INT_TYPE, v)));
+ addTo->Add(
+ new MethodCall(parcel, "writeInt", 1, new Cast(m_types->IntType(), v)));
}
void CharType::CreateFromParcel(StatementBlock* addTo, Variable* v,
@@ -381,7 +295,8 @@
// ================================================================
-StringType::StringType() : Type("java.lang", "String", BUILT_IN, true, false) {}
+StringType::StringType(const JavaTypeNamespace* types)
+ : Type(types, "java.lang", "String", BUILT_IN, true, false) {}
string StringType::CreatorName() const {
return "android.os.Parcel.STRING_CREATOR";
@@ -416,8 +331,8 @@
// ================================================================
-CharSequenceType::CharSequenceType()
- : Type("java.lang", "CharSequence", BUILT_IN, true, false) {}
+CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
+ : Type(types, "java.lang", "CharSequence", BUILT_IN, true, false) {}
string CharSequenceType::CreatorName() const {
return "android.os.Parcel.STRING_CREATOR";
@@ -469,8 +384,8 @@
// ================================================================
-RemoteExceptionType::RemoteExceptionType()
- : Type("android.os", "RemoteException", BUILT_IN, false, false) {}
+RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "RemoteException", BUILT_IN, false, false) {}
void RemoteExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -484,8 +399,8 @@
// ================================================================
-RuntimeExceptionType::RuntimeExceptionType()
- : Type("java.lang", "RuntimeException", BUILT_IN, false, false) {}
+RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
+ : Type(types, "java.lang", "RuntimeException", BUILT_IN, false, false) {}
void RuntimeExceptionType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -500,8 +415,8 @@
// ================================================================
-IBinderType::IBinderType()
- : Type("android.os", "IBinder", BUILT_IN, true, false) {}
+IBinderType::IBinderType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "IBinder", BUILT_IN, true, false) {}
void IBinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -530,8 +445,8 @@
// ================================================================
-IInterfaceType::IInterfaceType()
- : Type("android.os", "IInterface", BUILT_IN, false, false) {}
+IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "IInterface", BUILT_IN, false, false) {}
void IInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -545,8 +460,8 @@
// ================================================================
-BinderType::BinderType()
- : Type("android.os", "Binder", BUILT_IN, false, false) {}
+BinderType::BinderType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "Binder", BUILT_IN, false, false) {}
void BinderType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -560,8 +475,8 @@
// ================================================================
-BinderProxyType::BinderProxyType()
- : Type("android.os", "BinderProxy", BUILT_IN, false, false) {}
+BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "BinderProxy", BUILT_IN, false, false) {}
void BinderProxyType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -575,8 +490,8 @@
// ================================================================
-ParcelType::ParcelType()
- : Type("android.os", "Parcel", BUILT_IN, false, false) {}
+ParcelType::ParcelType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "Parcel", BUILT_IN, false, false) {}
void ParcelType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -590,8 +505,8 @@
// ================================================================
-ParcelableInterfaceType::ParcelableInterfaceType()
- : Type("android.os", "Parcelable", BUILT_IN, false, false) {}
+ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
+ : Type(types, "android.os", "Parcelable", BUILT_IN, false, false) {}
void ParcelableInterfaceType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -606,7 +521,8 @@
// ================================================================
-MapType::MapType() : Type("java.util", "Map", BUILT_IN, true, true) {}
+MapType::MapType(const JavaTypeNamespace* types)
+ : Type(types, "java.util", "Map", BUILT_IN, true, true) {}
void MapType::WriteToParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, int flags) const {
@@ -638,7 +554,8 @@
// ================================================================
-ListType::ListType() : Type("java.util", "List", BUILT_IN, true, true) {}
+ListType::ListType(const JavaTypeNamespace* types)
+ : Type(types, "java.util", "List", BUILT_IN, true, true) {}
string ListType::InstantiableName() const { return "java.util.ArrayList"; }
@@ -662,11 +579,12 @@
// ================================================================
-UserDataType::UserDataType(const string& package, const string& name,
+UserDataType::UserDataType(const JavaTypeNamespace* types,
+ const string& package, const string& name,
bool builtIn, bool canWriteToParcel,
const string& declFile, int declLine)
- : Type(package, name, builtIn ? BUILT_IN : USERDATA, canWriteToParcel, true,
- declFile, declLine) {}
+ : Type(types, package, name, builtIn ? BUILT_IN : USERDATA,
+ canWriteToParcel, true, declFile, declLine) {}
string UserDataType::CreatorName() const {
return QualifiedName() + ".CREATOR";
@@ -752,11 +670,12 @@
// ================================================================
-InterfaceType::InterfaceType(const string& package, const string& name,
+InterfaceType::InterfaceType(const JavaTypeNamespace* types,
+ const string& package, const string& name,
bool builtIn, bool oneway, const string& declFile,
int declLine)
- : Type(package, name, builtIn ? BUILT_IN : INTERFACE, true, false, declFile,
- declLine),
+ : Type(types, package, name, builtIn ? BUILT_IN : INTERFACE, true, false,
+ declFile, declLine),
m_oneway(oneway) {}
bool InterfaceType::OneWay() const { return m_oneway; }
@@ -773,18 +692,17 @@
void InterfaceType::CreateFromParcel(StatementBlock* addTo, Variable* v,
Variable* parcel, Variable**) const {
// v = Interface.asInterface(parcel.readStrongBinder());
- string type = v->type->QualifiedName();
- type += ".Stub";
+ string stub_type = v->type->QualifiedName() + ".Stub";
addTo->Add(new Assignment(
- v, new MethodCall(NAMES.Find(type), "asInterface", 1,
+ v, new MethodCall(m_types->Find(stub_type), "asInterface", 1,
new MethodCall(parcel, "readStrongBinder"))));
}
// ================================================================
-GenericType::GenericType(const string& package, const string& name,
- const vector<const Type*>& args)
- : Type(package, name, BUILT_IN, true, true) {
+GenericType::GenericType(const JavaTypeNamespace* types, const string& package,
+ const string& name, const vector<const Type*>& args)
+ : Type(types, package, name, BUILT_IN, true, true) {
m_args = args;
m_importName = package + '.' + name;
@@ -828,9 +746,11 @@
// ================================================================
-GenericListType::GenericListType(const string& package, const string& name,
+GenericListType::GenericListType(const JavaTypeNamespace* types,
+ const string& package, const string& name,
const vector<const Type*>& args)
- : GenericType(package, name, args), m_creator(args[0]->CreatorName()) {}
+ : GenericType(types, package, name, args),
+ m_creator(args[0]->CreatorName()) {}
string GenericListType::CreatorName() const {
return "android.os.Parcel.arrayListCreator";
@@ -883,12 +803,106 @@
// ================================================================
-ClassLoaderType::ClassLoaderType()
- : Type("java.lang", "ClassLoader", BUILT_IN, false, false) {}
+ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
+ : Type(types, "java.lang", "ClassLoader", BUILT_IN, false, false) {}
// ================================================================
-JavaTypeNamespace::JavaTypeNamespace() {}
+JavaTypeNamespace::JavaTypeNamespace() {
+ VOID_TYPE = new BasicType(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX");
+ Add(VOID_TYPE);
+
+ BOOLEAN_TYPE = new BooleanType(this);
+ Add(BOOLEAN_TYPE);
+
+ BYTE_TYPE =
+ new BasicType(this, "byte", "writeByte", "readByte", "writeByteArray",
+ "createByteArray", "readByteArray");
+ Add(BYTE_TYPE);
+
+ CHAR_TYPE = new CharType(this);
+ Add(CHAR_TYPE);
+
+ INT_TYPE = new BasicType(this, "int", "writeInt", "readInt", "writeIntArray",
+ "createIntArray", "readIntArray");
+ Add(INT_TYPE);
+ m_int_type = INT_TYPE;
+
+ LONG_TYPE =
+ new BasicType(this, "long", "writeLong", "readLong", "writeLongArray",
+ "createLongArray", "readLongArray");
+ Add(LONG_TYPE);
+
+ FLOAT_TYPE =
+ new BasicType(this, "float", "writeFloat", "readFloat", "writeFloatArray",
+ "createFloatArray", "readFloatArray");
+ Add(FLOAT_TYPE);
+
+ DOUBLE_TYPE =
+ new BasicType(this, "double", "writeDouble", "readDouble",
+ "writeDoubleArray", "createDoubleArray", "readDoubleArray");
+ Add(DOUBLE_TYPE);
+
+ STRING_TYPE = new StringType(this);
+ Add(STRING_TYPE);
+
+ OBJECT_TYPE =
+ new Type(this, "java.lang", "Object", Type::BUILT_IN, false, false);
+ Add(OBJECT_TYPE);
+
+ CHAR_SEQUENCE_TYPE = new CharSequenceType(this);
+ Add(CHAR_SEQUENCE_TYPE);
+
+ MAP_TYPE = new MapType(this);
+ Add(MAP_TYPE);
+
+ LIST_TYPE = new ListType(this);
+ Add(LIST_TYPE);
+
+ TEXT_UTILS_TYPE =
+ new Type(this, "android.text", "TextUtils", Type::BUILT_IN, false, false);
+ Add(TEXT_UTILS_TYPE);
+
+ REMOTE_EXCEPTION_TYPE = new RemoteExceptionType(this);
+ Add(REMOTE_EXCEPTION_TYPE);
+
+ RUNTIME_EXCEPTION_TYPE = new RuntimeExceptionType(this);
+ Add(RUNTIME_EXCEPTION_TYPE);
+
+ IBINDER_TYPE = new IBinderType(this);
+ Add(IBINDER_TYPE);
+
+ IINTERFACE_TYPE = new IInterfaceType(this);
+ Add(IINTERFACE_TYPE);
+
+ BINDER_NATIVE_TYPE = new BinderType(this);
+ Add(BINDER_NATIVE_TYPE);
+
+ BINDER_PROXY_TYPE = new BinderProxyType(this);
+ Add(BINDER_PROXY_TYPE);
+
+ PARCEL_TYPE = new ParcelType(this);
+ Add(PARCEL_TYPE);
+
+ PARCELABLE_INTERFACE_TYPE = new ParcelableInterfaceType(this);
+ Add(PARCELABLE_INTERFACE_TYPE);
+
+ CONTEXT_TYPE = new Type(this, "android.content", "Context", Type::BUILT_IN,
+ false, false);
+ Add(CONTEXT_TYPE);
+
+ CLASSLOADER_TYPE = new ClassLoaderType(this);
+ Add(CLASSLOADER_TYPE);
+
+ NULL_VALUE = new LiteralExpression("null");
+ THIS_VALUE = new LiteralExpression("this");
+ SUPER_VALUE = new LiteralExpression("super");
+ TRUE_VALUE = new LiteralExpression("true");
+ FALSE_VALUE = new LiteralExpression("false");
+
+ AddGenericType("java.util", "List", 1);
+ AddGenericType("java.util", "Map", 2);
+}
JavaTypeNamespace::~JavaTypeNamespace() {
int N = m_types.size();
@@ -914,8 +928,7 @@
if (type->Kind() != existing->Kind()) {
fprintf(stderr, "%s:%d attempt to redefine %s as %s,\n",
type->DeclFile().c_str(), type->DeclLine(),
- type->QualifiedName().c_str(),
- type->HumanReadableKind().c_str());
+ type->QualifiedName().c_str(), type->HumanReadableKind().c_str());
fprintf(stderr, "%s:%d previously defined here as %s.\n",
existing->DeclFile().c_str(), existing->DeclLine(),
existing->HumanReadableKind().c_str());
@@ -926,8 +939,7 @@
}
void JavaTypeNamespace::AddGenericType(const string& package,
- const string& name,
- int args) {
+ const string& name, int args) {
Generic g;
g.package = package;
g.name = name;
@@ -971,25 +983,24 @@
bool JavaTypeNamespace::AddParcelableType(user_data_type* p,
const std::string& filename) {
- Type* type = new UserDataType(p->package ? p->package : "", p->name.data,
- false, p->parcelable, filename, p->name.lineno);
+ Type* type =
+ new UserDataType(this, p->package ? p->package : "", p->name.data, false,
+ p->parcelable, filename, p->name.lineno);
return Add(type);
}
bool JavaTypeNamespace::AddBinderType(interface_type* b,
const std::string& filename) {
- Type* type = new InterfaceType(b->package ? b->package : "",
- b->name.data, false, b->oneway,
- filename, b->name.lineno);
- // for interfaces, also add the stub and proxy types
- Type* stub = new Type(b->package ? b->package : "",
- string{b->name.data} + ".Stub",
- Type::GENERATED, false, false,
- filename, b->name.lineno);
- Type* proxy = new Type(b->package ? b->package : "",
- string{b->name.data} + ".Stub.Proxy",
- Type::GENERATED, false, false,
- filename, b->name.lineno);
+ // for interfaces, add the stub, proxy, and interface types.
+ Type* type =
+ new InterfaceType(this, b->package ? b->package : "", b->name.data, false,
+ b->oneway, filename, b->name.lineno);
+ Type* stub = new Type(this, b->package ? b->package : "",
+ string{b->name.data} + ".Stub", Type::GENERATED, false,
+ false, filename, b->name.lineno);
+ Type* proxy = new Type(this, b->package ? b->package : "",
+ string{b->name.data} + ".Stub.Proxy", Type::GENERATED,
+ false, false, filename, b->name.lineno);
bool success = true;
success &= Add(type);
@@ -1057,7 +1068,7 @@
// construct a GenericType, add it to our name set so they always get
// the same object, and return it.
- result = make_generic_type(g->package, g->name, args);
+ result = make_generic_type(this, g->package, g->name, args);
if (result == NULL) {
LOG(ERROR) << "internal error";
return NULL;
@@ -1099,5 +1110,7 @@
}
}
+const Type* JavaTypeNamespace::IntType() const { return m_int_type; }
+
} // namespace aidl
} // namespace android