Skip to content

Commit

Permalink
Rearrange fields of J2ObjcClassInfo for better packing.
Browse files Browse the repository at this point in the history
	Change on 2016/06/17 by kstanger <kstanger@google.com>

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125218907
  • Loading branch information
kstanger authored and Keith Stanger committed Jun 24, 2016
1 parent 8ae1b9f commit 1e2496b
Show file tree
Hide file tree
Showing 18 changed files with 65 additions and 69 deletions.
2 changes: 1 addition & 1 deletion jre_emul/Classes/IOSClass.m
Expand Up @@ -1450,7 +1450,7 @@ + (const J2ObjcClassInfo *)__metadata {
"<T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/reflect/AnnotatedElement;"
"Ljava/lang/reflect/GenericDeclaration;Ljava/io/Serializable;Ljava/lang/reflect/Type;" };
static const J2ObjcClassInfo _IOSClass = {
6, "Class", "java.lang", -1, 0x11, 63, methods, 1, fields, -1, -1, 38, -1, ptrTable };
"Class", "java.lang", ptrTable, methods, fields, 7, 0x11, 63, 1, -1, -1, -1, 38, -1 };
return &_IOSClass;
}

Expand Down
15 changes: 7 additions & 8 deletions jre_emul/Classes/IOSReflection.h
Expand Up @@ -30,7 +30,7 @@
@class IOSClass;

// Current metadata structure version
#define J2OBJC_METADATA_VERSION 6
#define J2OBJC_METADATA_VERSION 7

// A raw value is the union of all possible native types.
typedef union {
Expand Down Expand Up @@ -74,23 +74,22 @@ typedef struct J2ObjcFieldInfo {
ptr_idx annotationsIdx;
} J2ObjcFieldInfo;

// TODO(kstanger): Optimize the size of this struct by using the pointer table
// and rearranging the fields for better packing.
typedef struct J2ObjcClassInfo {
const unsigned version;
const char *typeName;
const char *packageName;
ptr_idx enclosingClassIdx;
const void **ptrTable;
const J2ObjcMethodInfo *methods;
const J2ObjcFieldInfo *fields;
// Pointer types are above version for better packing.
const uint16_t version;
uint16_t modifiers;
uint16_t methodCount;
const J2ObjcMethodInfo *methods;
uint16_t fieldCount;
const J2ObjcFieldInfo *fields;
ptr_idx enclosingClassIdx;
ptr_idx innerClassesIdx;
ptr_idx enclosingMethodIdx;
ptr_idx genericSignatureIdx;
ptr_idx annotationsIdx;
const void **ptrTable;
} J2ObjcClassInfo;

// Autoboxing support.
Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/NSCopying+JavaCloneable.m
Expand Up @@ -25,7 +25,7 @@ @implementation NSCopying

+ (const J2ObjcClassInfo *)__metadata {
static const J2ObjcClassInfo _NSCopying = {
6, "Cloneable", "java.lang", -1, 0x609, 0, NULL, 0, NULL, -1, -1, -1, -1, NULL };
"Cloneable", "java.lang", NULL, NULL, NULL, 7, 0x609, 0, 0, -1, -1, -1, -1, -1 };
return &_NSCopying;
}

Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/NSException+JavaThrowable.m
Expand Up @@ -441,7 +441,7 @@ + (const J2ObjcClassInfo *)__metadata {
"initCause", "printStackTrace", "setStackTrace", "addSuppressed", "toString",
"Ljava/util/List<Ljava/lang/Throwable;>;" };
static const J2ObjcClassInfo _NSException = {
6, "Throwable", "java.lang", -1, 0x1, 18, methods, 5, fields, -1, -1, -1, -1, ptrTable };
"Throwable", "java.lang", ptrTable, methods, fields, 7, 0x1, 18, 5, -1, -1, -1, -1, -1 };
return &_NSException;
}

Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/NSNumber+JavaNumber.m
Expand Up @@ -41,7 +41,7 @@ + (const J2ObjcClassInfo *)__metadata {
};
static const void *ptrTable[] = { "byteValue", "longValue" };
static const J2ObjcClassInfo _NSNumber = {
6, "Number", "java.lang", -1, 0x401, 7, methods, 1, fields, -1, -1, -1, -1, ptrTable };
"Number", "java.lang", ptrTable, methods, fields, 7, 0x401, 7, 1, -1, -1, -1, -1, -1 };
return &_NSNumber;
}

Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/NSObject+JavaObject.m
Expand Up @@ -188,7 +188,7 @@ + (const J2ObjcClassInfo *)__metadata {
"()Ljava/lang/Class<*>;", "hashCode", "equals", "LJavaLangCloneNotSupportedException;",
"toString", "finalize", "LNSException;", "wait", "LJavaLangInterruptedException;" };
static const J2ObjcClassInfo _NSObject = {
6, "Object", "java.lang", -1, 0x1, 12, methods, 0, NULL, -1, -1, -1, -1, ptrTable };
"Object", "java.lang", ptrTable, methods, NULL, 7, 0x1, 12, 0, -1, -1, -1, -1, -1 };
return &_NSObject;
}

Expand Down
6 changes: 3 additions & 3 deletions jre_emul/Classes/NSString+JavaString.m
Expand Up @@ -1034,7 +1034,7 @@ + (const J2ObjcClassInfo *)__metadata {
"Ljava/lang/Object;Ljava/lang/CharSequence;Ljava/lang/Comparable<Ljava/lang/String;>;"
"Ljava/io/Serializable;" };
static const J2ObjcClassInfo _NSString = {
6, "String", "java.lang", -1, 0x1, 78, methods, 3, fields, 34, -1, 35, -1, ptrTable };
"String", "java.lang", ptrTable, methods, fields, 7, 0x1, 78, 3, -1, 34, -1, 35, -1 };
return &_NSString;
}

Expand Down Expand Up @@ -1070,8 +1070,8 @@ + (const J2ObjcClassInfo *)__metadata {
"compare", "LNSString",
"Ljava/lang/Object;Ljava/util/Comparator<Ljava/lang/String;>;Ljava/io/Serializable;" };
static const J2ObjcClassInfo _NSString_CaseInsensitiveComparator = {
6, "CaseInsensitiveComparator", "java.lang", 1, 0xa, 2, methods, 1, fields, -1, -1, 2, -1,
ptrTable };
"CaseInsensitiveComparator", "java.lang", ptrTable, methods, fields, 7, 0xa, 2, 1, 1, -1, -1, 2,
-1 };
return &_NSString_CaseInsensitiveComparator;
}

Expand Down
4 changes: 2 additions & 2 deletions jre_emul/Classes/java/lang/AbstractStringBuilder.m
Expand Up @@ -711,8 +711,8 @@ + (const J2ObjcClassInfo *)__metadata {
"toString", "subSequence", "indexOf", "lastIndexOf", "codePointAt", "codePointBefore",
"codePointCount", "offsetByCodePoints" };
static const J2ObjcClassInfo _JavaLangAbstractStringBuilder = {
6, "AbstractStringBuilder", "java.lang", -1, 0x400, 42, methods, 1, fields, -1, -1, -1, -1,
ptrTable };
"AbstractStringBuilder", "java.lang", ptrTable, methods, fields, 7, 0x400, 42, 1, -1, -1, -1,
-1, -1 };
return &_JavaLangAbstractStringBuilder;
}

Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/java/lang/Iterable.m
Expand Up @@ -34,7 +34,7 @@ + (const J2ObjcClassInfo *)__metadata {
static const void *ptrTable[] = {
"()Ljava/util/Iterator<TT;>;", "<T:Ljava/lang/Object;>Ljava/lang/Object;" };
static const J2ObjcClassInfo _JavaLangIterable = {
6, "Iterable", "java.lang", -1, 0x609, 1, methods, 0, NULL, -1, -1, 1, -1, ptrTable };
"Iterable", "java.lang", ptrTable, methods, NULL, 7, 0x609, 1, 0, -1, -1, -1, 1, -1 };
return &_JavaLangIterable;
}

Expand Down
4 changes: 2 additions & 2 deletions jre_emul/Classes/java/lang/reflect/AccessibleObject.m
Expand Up @@ -112,8 +112,8 @@ + (const J2ObjcClassInfo *)__metadata {
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)TT;", "isAnnotationPresent",
"(Ljava/lang/Class<+Ljava/lang/annotation/Annotation;>;)Z" };
static const J2ObjcClassInfo _JavaLangReflectAccessibleObject = {
6, "AccessibleObject", "java.lang.reflect", -1, 0x1, 8, methods, 0, NULL, -1, -1, -1, -1,
ptrTable };
"AccessibleObject", "java.lang.reflect", ptrTable, methods, NULL, 7, 0x1, 8, 0, -1, -1, -1, -1,
-1 };
return &_JavaLangReflectAccessibleObject;
}

Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/java/lang/reflect/Constructor.m
Expand Up @@ -173,7 +173,7 @@ + (const J2ObjcClassInfo *)__metadata {
"<T:Ljava/lang/Object;>Ljava/lang/reflect/AccessibleObject;"
"Ljava/lang/reflect/GenericDeclaration;Ljava/lang/reflect/Member;" };
static const J2ObjcClassInfo _JavaLangReflectConstructor = {
6, "Constructor", "java.lang.reflect", -1, 0x1, 17, methods, 0, NULL, -1, -1, 6, -1, ptrTable
"Constructor", "java.lang.reflect", ptrTable, methods, NULL, 7, 0x1, 17, 0, -1, -1, -1, 6, -1
};
return &_JavaLangReflectConstructor;
}
Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/java/lang/reflect/Field.m
Expand Up @@ -399,7 +399,7 @@ + (const J2ObjcClassInfo *)__metadata {
"setByte", "setChar", "setDouble", "setFloat", "setInt", "setLong", "setShort", "getAnnotation",
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)TT;" };
static const J2ObjcClassInfo _JavaLangReflectField = {
6, "Field", "java.lang.reflect", -1, 0x1, 29, methods, 0, NULL, -1, -1, -1, -1, ptrTable };
"Field", "java.lang.reflect", ptrTable, methods, NULL, 7, 0x1, 29, 0, -1, -1, -1, -1, -1 };
return &_JavaLangReflectField;
}

Expand Down
2 changes: 1 addition & 1 deletion jre_emul/Classes/java/lang/reflect/Method.m
Expand Up @@ -300,7 +300,7 @@ + (const J2ObjcClassInfo *)__metadata {
"LJavaLangReflectInvocationTargetException;", "getAnnotation",
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)TT;" };
static const J2ObjcClassInfo _JavaLangReflectMethod = {
6, "Method", "java.lang.reflect", -1, 0x1, 20, methods, 0, NULL, -1, -1, -1, -1, ptrTable };
"Method", "java.lang.reflect", ptrTable, methods, NULL, 7, 0x1, 20, 0, -1, -1, -1, -1, -1 };
return &_JavaLangReflectMethod;
}

Expand Down
4 changes: 2 additions & 2 deletions protobuf/runtime/src/com/google/protobuf/Descriptors.m
Expand Up @@ -558,7 +558,7 @@ + (const J2ObjcClassInfo *)__metadata {
"LComGoogleProtobufDescriptors_FieldDescriptor",
"Ljava/lang/Enum<Lcom/google/protobuf/Descriptors$FieldDescriptor$Type;>;" };
static const J2ObjcClassInfo _ComGoogleProtobufDescriptors_FieldDescriptor_Type = {
6, "Type", "com.google.protobuf", 19, 0x4019, 3, methods, 19, fields, -1, -1, 20, -1, ptrTable
"Type", "com.google.protobuf", ptrTable, methods, fields, 7, 0x4019, 3, 19, 19, -1, -1, 20, -1
};
return &_ComGoogleProtobufDescriptors_FieldDescriptor_Type;
}
Expand Down Expand Up @@ -683,7 +683,7 @@ + (const J2ObjcClassInfo *)__metadata {
"LComGoogleProtobufDescriptors_FieldDescriptor",
"Ljava/lang/Enum<Lcom/google/protobuf/Descriptors$FieldDescriptor$JavaType;>;" };
static const J2ObjcClassInfo _ComGoogleProtobufDescriptors_FieldDescriptor_JavaType = {
6, "JavaType", "com.google.protobuf", 9, 0x4019, 0, NULL, 10, fields, -1, -1, 10, -1, ptrTable
"JavaType", "com.google.protobuf", ptrTable, NULL, fields, 7, 0x4019, 0, 10, 9, -1, -1, 10, -1
};
return &_ComGoogleProtobufDescriptors_FieldDescriptor_JavaType;
}
Expand Down
Expand Up @@ -55,7 +55,7 @@
public class MetadataWriter extends TreeVisitor {

// Metadata structure version. Increment it when any structure changes are made.
public static final int METADATA_VERSION = 6;
public static final int METADATA_VERSION = 7;

private static final NativeTypeBinding CLASS_INFO_TYPE =
new NativeTypeBinding("const J2ObjcClassInfo *");
Expand Down Expand Up @@ -116,32 +116,30 @@ private MetadataGenerator(AbstractTypeDeclaration typeNode, List<Statement> stmt

private void generateClassMetadata() {
String fullName = nameTable.getFullName(type);
StringBuilder sb = new StringBuilder();
int methodMetadataCount = generateMethodsMetadata();
int fieldMetadataCount = generateFieldsMetadata();
String simpleName = type.getName();
if (type.isAnonymous()) {
simpleName = ""; // Anonymous classes have an empty simple name.
}
String pkgName = Strings.emptyToNull(type.getPackage().getName());
String annotationsFunc = annotationGenerator.createFunction(typeNode);
sb.append("static const J2ObjcClassInfo _").append(fullName).append(" = { ");
sb.append(METADATA_VERSION).append(", ");
sb.append(cStr(simpleName)).append(", ");
sb.append(cStr(pkgName)).append(", ");
sb.append(cStrIdx(getTypeName(type.getDeclaringClass()))).append(", ");
sb.append("0x").append(Integer.toHexString(getTypeModifiers(type))).append(", ");
sb.append(methodMetadataCount).append(", ");
sb.append(methodMetadataCount > 0 ? "methods, " : "NULL, ");
sb.append(fieldMetadataCount).append(", ");
sb.append(fieldMetadataCount > 0 ? "fields, " : "NULL, ");
sb.append(cStrIdx(getTypeList(type.getDeclaredTypes()))).append(", ");
sb.append(cStrIdx(getEnclosingMethodSelector())).append(", ");
sb.append(cStrIdx(SignatureGenerator.createClassSignature(type))).append(", ");
sb.append(funcPtrIdx(annotationsFunc)).append(", ");
sb.append(getPtrTableEntry());
sb.append(" };");
stmts.add(new NativeStatement(sb.toString()));
String metadata = UnicodeUtils.format(
"static const J2ObjcClassInfo _%s = { "
+ "%s, %s, %%s, %s, %s, %d, 0x%x, %d, %d, %s, %s, %s, %s, %s };",
fullName,
cStr(type.isAnonymous() ? "" : type.getName()),
cStr(Strings.emptyToNull(type.getPackage().getName())),
methodMetadataCount > 0 ? "methods" : "NULL",
fieldMetadataCount > 0 ? "fields" : "NULL",
METADATA_VERSION,
getTypeModifiers(type),
methodMetadataCount,
fieldMetadataCount,
cStrIdx(getTypeName(type.getDeclaringClass())),
cStrIdx(getTypeList(type.getDeclaredTypes())),
cStrIdx(getEnclosingMethodSelector()),
cStrIdx(SignatureGenerator.createClassSignature(type)),
funcPtrIdx(annotationsFunc));
// Add the pointer table in a second format pass since it's value is dependent on all other
// values.
metadata = UnicodeUtils.format(metadata, getPtrTableEntry());
stmts.add(new NativeStatement(metadata));
stmts.add(new ReturnStatement(new NativeExpression("&_" + fullName, CLASS_INFO_TYPE)));
}

Expand Down
Expand Up @@ -20,7 +20,6 @@
import com.google.devtools.j2objc.GenerationTest;
import com.google.devtools.j2objc.Options;
import com.google.devtools.j2objc.Options.MemoryManagementOption;
import com.google.devtools.j2objc.translate.MetadataWriter;

import java.io.IOException;
import java.io.PrintWriter;
Expand Down Expand Up @@ -785,14 +784,6 @@ public void testInterfaceTypeLiteralAsAnnotationValue() throws IOException {
assertTranslation(translation, "JavaLangCharSequence_class_()");
}

public void testMetadataHeaderGeneration() throws IOException {
String translation = translateSourceFile("package foo; class Test {}", "Test", "foo/Test.m");
assertTranslation(translation, "+ (const J2ObjcClassInfo *)__metadata");
assertTranslation(translation, "static const J2ObjcClassInfo _FooTest = { "
+ Integer.toString(MetadataWriter.METADATA_VERSION)
+ ", \"Test\", \"foo\"");
}

public void testReservedWordAsAnnotationPropertyName() throws IOException {
String translation = translateSourceFile(
"package foo; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) "
Expand Down
Expand Up @@ -25,6 +25,14 @@
*/
public class MetadataWriterTest extends GenerationTest {

public void testMetadataHeaderGeneration() throws IOException {
String translation = translateSourceFile("package foo; class Test {}", "Test", "foo/Test.m");
assertTranslation(translation, "+ (const J2ObjcClassInfo *)__metadata");
assertTranslation(translation,
"static const J2ObjcClassInfo _FooTest = { \"Test\", \"foo\", NULL, methods, NULL, "
+ Integer.toString(MetadataWriter.METADATA_VERSION));
}

public void testConstructorsHaveNullJavaName() throws IOException {
String translation = translateSourceFile("class Test {}", "Test", "Test.m");
assertTranslatedLines(translation,
Expand Down Expand Up @@ -114,8 +122,8 @@ public void testInnerClassesMetadata() throws IOException {
, "A", "A.m");
assertTranslation(translation, "static const void *ptrTable[] = { \"LA_B;LA_C;LA_D;LA_E;\" };");
assertTranslation(translation,
"static const J2ObjcClassInfo _A = { 6, \"A\", NULL, -1, 0x0, 1, methods, "
+ "0, NULL, 0, -1, -1, -1, ptrTable };");
"static const J2ObjcClassInfo _A = { \"A\", NULL, ptrTable, methods, NULL, 7, 0x0, 1, 0, "
+ "-1, 0, -1, -1, -1 };");
}

public void testEnclosingMethodAndConstructor() throws IOException {
Expand All @@ -124,17 +132,17 @@ public void testEnclosingMethodAndConstructor() throws IOException {
"A", "A.m");
assertTranslatedLines(translation,
"static const void *ptrTable[] = { \"LA\", \"initWithNSString:\" };",
"static const J2ObjcClassInfo _A_1B = { 6, \"B\", NULL, 0, 0x0, 1, methods, "
+ "0, NULL, -1, 1, -1, -1, ptrTable };");
"static const J2ObjcClassInfo _A_1B = { \"B\", NULL, ptrTable, methods, NULL, 7, 0x0, 1, "
+ "0, 0, -1, 1, -1, -1 };");
assertTranslatedLines(translation,
"static const void *ptrTable[] = { \"LA\", \"LA_1C_D;\", \"testWithInt:withLong:\" };",
"static const J2ObjcClassInfo _A_1C = { 6, \"C\", NULL, 0, 0x0, 1, methods, "
+ "0, NULL, 1, 2, -1, -1, ptrTable };");
"static const J2ObjcClassInfo _A_1C = { \"C\", NULL, ptrTable, methods, NULL, 7, 0x0, 1, "
+ "0, 0, 1, 2, -1, -1 };");

// Verify D is not enclosed by test(), as it's enclosed by C.
assertTranslation(translation,
"J2ObjcClassInfo _A_1C_D = { 6, \"D\", NULL, 0, 0x0, 1, methods, "
+ "0, NULL, -1, -1, -1, -1, ptrTable }");
"J2ObjcClassInfo _A_1C_D = { \"D\", NULL, ptrTable, methods, NULL, 7, 0x0, 1, 0, 0, -1, "
+ "-1, -1, -1 };");
}

public void testMethodAnnotationNoParameters() throws IOException {
Expand Down
Expand Up @@ -263,7 +263,7 @@ public void testRenamePackageAnnotation() throws IOException {
translation = getTranslatedFile("foo/bar/Test.m");
assertTranslation(translation, "#include \"foo/bar/Test.h\""); // should be full path.
assertTranslation(translation, "@implementation FBTest");
assertTranslation(translation, "J2ObjcClassInfo _FBTest = { 6, \"Test\", \"foo.bar\", ");
assertTranslation(translation, "J2ObjcClassInfo _FBTest = { \"Test\", \"foo.bar\", ");
}

public void testRenamePackageAnnotationEnum() throws IOException {
Expand All @@ -287,7 +287,7 @@ public void testRenamePackageAnnotationEnum() throws IOException {
translation = getTranslatedFile("foo/bar/Test.m");
assertTranslation(translation, "#include \"foo/bar/Test.h\""); // should be full path.
assertTranslation(translation, "@implementation FBTest");
assertTranslation(translation, "J2ObjcClassInfo _FBTest = { 6, \"Test\", \"foo.bar\", ");
assertTranslation(translation, "J2ObjcClassInfo _FBTest = { \"Test\", \"foo.bar\", ");

// Make sure package-info class doesn't use prefix for its own type name.
translation = translateSourceFile("foo.bar.package-info", "foo/bar/package-info.m");
Expand Down

0 comments on commit 1e2496b

Please sign in to comment.