Skip to content

Commit

Permalink
Reduce method and field metadata size by using a pointer table. The m…
Browse files Browse the repository at this point in the history
…etadata structs contain 16bit indexes into the pointer table for fields that are frequently NULL. This reduces the space required by a null field from 64 to 16 bits (on 64-bit architectures).

Method and field metadata structs are also rearranged for better packing.
The result of this change is that a binary linked with jre_core is 3.33% smaller.

	Change on 2016/06/13 by kstanger <kstanger@google.com>

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124716979
  • Loading branch information
kstanger authored and Keith Stanger committed Jun 24, 2016
1 parent 9b30b3c commit 4d6aa11
Show file tree
Hide file tree
Showing 23 changed files with 936 additions and 855 deletions.
190 changes: 93 additions & 97 deletions jre_emul/Classes/IOSClass.m
Expand Up @@ -149,7 +149,11 @@ - (instancetype)initWithClass:(Class)cls {
// Can't use respondsToSelector here because that will search superclasses. // Can't use respondsToSelector here because that will search superclasses.
Method metadataMethod = JreFindClassMethod(cls, "__metadata"); Method metadataMethod = JreFindClassMethod(cls, "__metadata");
if (metadataMethod) { if (metadataMethod) {
metadata_ = (const J2ObjcClassInfo *) method_invoke(cls, metadataMethod); const J2ObjcClassInfo *metadata =
(const J2ObjcClassInfo *)method_invoke(cls, metadataMethod);
JreAssert(metadata->version == J2OBJC_METADATA_VERSION,
@"J2ObjC metadata is out-of-date, source must be re-translated.");
metadata_ = metadata;
} }
} }
} }
Expand Down Expand Up @@ -422,7 +426,7 @@ static jint countArgs(char *s) {
if (metadata) { if (metadata) {
const char *name = [javaName UTF8String]; const char *name = [javaName UTF8String];
for (int i = 0; i < metadata->methodCount; i++) { for (int i = 0; i < metadata->methodCount; i++) {
const char *cname = metadata->methods[i].javaName; const char *cname = JrePtrAtIndex(metadata->ptrTable, metadata->methods[i].javaNameIdx);
if (cname && strcmp(name, cname) == 0 if (cname && strcmp(name, cname) == 0
&& argCount == countArgs((char *)metadata->methods[i].selector)) { && argCount == countArgs((char *)metadata->methods[i].selector)) {
// Skip leading matches followed by "With", which follow the standard selector // Skip leading matches followed by "With", which follow the standard selector
Expand Down Expand Up @@ -1373,106 +1377,98 @@ + (void)load {
// Generated by running the translator over the java.lang.Class stub file. // Generated by running the translator over the java.lang.Class stub file.
+ (const J2ObjcClassInfo *)__metadata { + (const J2ObjcClassInfo *)__metadata {
static const J2ObjcMethodInfo methods[] = { static const J2ObjcMethodInfo methods[] = {
{ "forName:", "forName", "Ljava.lang.Class;", 0x9, "Ljava.lang.ClassNotFoundException;", { "forName:", "Ljava.lang.Class;", 0x9, 0, 1, 2 },
"(Ljava/lang/String;)Ljava/lang/Class<*>;" }, { "forName:initialize:classLoader:", "Ljava.lang.Class;", 0x9, 0, 1, 3 },
{ "forName:initialize:classLoader:", "forName", "Ljava.lang.Class;", 0x9, { "asSubclass:", "Ljava.lang.Class;", 0x1, 4, -1, 5 },
"Ljava.lang.ClassNotFoundException;", { "cast:", "TT;", 0x1, 6, -1, 7 },
"(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class<*>;" }, { "desiredAssertionStatus", "Z", 0x1, -1, -1, -1 },
{ "asSubclass:", "asSubclass", "Ljava.lang.Class;", 0x1, NULL, { "getAnnotationWithIOSClass:", "TA;", 0x1, 8, -1, 9 },
"<U:Ljava/lang/Object;>(Ljava/lang/Class<TU;>;)Ljava/lang/Class<+TU;>;" }, { "getAnnotations", "[Ljava.lang.annotation.Annotation;", 0x1, -1, -1, -1 },
{ "cast:", "cast", "TT;", 0x1, NULL, "(Ljava/lang/Object;)TT;" }, { "getCanonicalName", "Ljava.lang.String;", 0x1, -1, -1, -1 },
{ "desiredAssertionStatus", NULL, "Z", 0x1, NULL, NULL }, { "getClasses", "[Ljava.lang.Class;", 0x1, -1, -1, -1 },
{ "getAnnotationWithIOSClass:", "getAnnotation", "TA;", 0x1, NULL, { "getClassLoader", "Ljava.lang.ClassLoader;", 0x1, -1, -1, -1 },
"<A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;" }, { "getComponentType", "Ljava.lang.Class;", 0x1, -1, -1, 10 },
{ "getAnnotations", NULL, "[Ljava.lang.annotation.Annotation;", 0x1, NULL, NULL }, { "getConstructor:", "Ljava.lang.reflect.Constructor;", 0x81, 11, 12, 13 },
{ "getCanonicalName", NULL, "Ljava.lang.String;", 0x1, NULL, NULL }, { "getConstructors", "[Ljava.lang.reflect.Constructor;", 0x1, -1, 14, -1 },
{ "getClasses", NULL, "[Ljava.lang.Class;", 0x1, NULL, NULL }, { "getDeclaredAnnotations", "[Ljava.lang.annotation.Annotation;", 0x1, -1, -1, -1 },
{ "getClassLoader", NULL, "Ljava.lang.ClassLoader;", 0x1, NULL, NULL }, { "getDeclaredClasses", "[Ljava.lang.Class;", 0x1, -1, 14, -1 },
{ "getComponentType", NULL, "Ljava.lang.Class;", 0x1, NULL, "()Ljava/lang/Class<*>;" }, { "getDeclaredConstructor:", "Ljava.lang.reflect.Constructor;", 0x81, 15, 12, 13 },
{ "getConstructor:", "getConstructor", "Ljava.lang.reflect.Constructor;", 0x81, { "getDeclaredConstructors", "[Ljava.lang.reflect.Constructor;", 0x1, -1, 14, -1 },
"Ljava.lang.NoSuchMethodException;Ljava.lang.SecurityException;", { "getDeclaredField:", "Ljava.lang.reflect.Field;", 0x1, 16, 17, -1 },
"([Ljava/lang/Class<*>;)Ljava/lang/reflect/Constructor<TT;>;" }, { "getDeclaredFields", "[Ljava.lang.reflect.Field;", 0x1, -1, 14, -1 },
{ "getConstructors", NULL, "[Ljava.lang.reflect.Constructor;", 0x1, { "getDeclaredMethod:parameterTypes:", "Ljava.lang.reflect.Method;", 0x81, 18, 12, -1 },
"Ljava.lang.SecurityException;", NULL }, { "getDeclaredMethods", "[Ljava.lang.reflect.Method;", 0x1, -1, 14, -1 },
{ "getDeclaredAnnotations", NULL, "[Ljava.lang.annotation.Annotation;", 0x1, NULL, NULL }, { "getDeclaringClass", "Ljava.lang.Class;", 0x1, -1, -1, 10 },
{ "getDeclaredClasses", NULL, "[Ljava.lang.Class;", 0x1, "Ljava.lang.SecurityException;", NULL { "getEnclosingClass", "Ljava.lang.Class;", 0x1, -1, -1, 10 },
}, { "getEnclosingConstructor", "Ljava.lang.reflect.Constructor;", 0x1, -1, -1, 19 },
{ "getDeclaredConstructor:", "getDeclaredConstructor", "Ljava.lang.reflect.Constructor;", 0x81, { "getEnclosingMethod", "Ljava.lang.reflect.Method;", 0x1, -1, -1, -1 },
"Ljava.lang.NoSuchMethodException;Ljava.lang.SecurityException;", { "getEnumConstants", "[Ljava.lang.Object;", 0x1, -1, -1, -1 },
"([Ljava/lang/Class<*>;)Ljava/lang/reflect/Constructor<TT;>;" }, { "getEnumConstantsShared", "[Ljava.lang.Object;", 0x0, -1, -1, -1 },
{ "getDeclaredConstructors", NULL, "[Ljava.lang.reflect.Constructor;", 0x1, { "getField:", "Ljava.lang.reflect.Field;", 0x1, 20, 17, -1 },
"Ljava.lang.SecurityException;", NULL }, { "getFields", "[Ljava.lang.reflect.Field;", 0x1, -1, 14, -1 },
{ "getDeclaredField:", "getDeclaredField", "Ljava.lang.reflect.Field;", 0x1, { "getGenericInterfaces", "[Ljava.lang.reflect.Type;", 0x1, -1, -1, -1 },
"Ljava.lang.NoSuchFieldException;Ljava.lang.SecurityException;", NULL }, { "getGenericSuperclass", "Ljava.lang.reflect.Type;", 0x1, -1, -1, -1 },
{ "getDeclaredFields", NULL, "[Ljava.lang.reflect.Field;", 0x1, "Ljava.lang.SecurityException;", { "getInterfaces", "[Ljava.lang.Class;", 0x1, -1, -1, -1 },
NULL }, { "getMethod:parameterTypes:", "Ljava.lang.reflect.Method;", 0x81, 21, 12, -1 },
{ "getDeclaredMethod:parameterTypes:", "getDeclaredMethod", "Ljava.lang.reflect.Method;", 0x81, { "getMethods", "[Ljava.lang.reflect.Method;", 0x1, -1, 14, -1 },
"Ljava.lang.NoSuchMethodException;Ljava.lang.SecurityException;", NULL }, { "getModifiers", "I", 0x1, -1, -1, -1 },
{ "getDeclaredMethods", NULL, "[Ljava.lang.reflect.Method;", 0x1, { "getName", "Ljava.lang.String;", 0x1, -1, -1, -1 },
"Ljava.lang.SecurityException;", NULL }, { "getPackage", "Ljava.lang.Package;", 0x1, -1, -1, -1 },
{ "getDeclaringClass", NULL, "Ljava.lang.Class;", 0x1, NULL, "()Ljava/lang/Class<*>;" }, { "getProtectionDomain", "Ljava.security.ProtectionDomain;", 0x1, -1, -1, -1 },
{ "getEnclosingClass", NULL, "Ljava.lang.Class;", 0x1, NULL, "()Ljava/lang/Class<*>;" }, { "getResource:", "Ljava.net.URL;", 0x1, 22, -1, -1 },
{ "getEnclosingConstructor", NULL, "Ljava.lang.reflect.Constructor;", 0x1, NULL, { "getResourceAsStream:", "Ljava.io.InputStream;", 0x1, 23, -1, -1 },
"()Ljava/lang/reflect/Constructor<*>;" }, { "getSigners", "[Ljava.lang.Object;", 0x1, -1, -1, -1 },
{ "getEnclosingMethod", NULL, "Ljava.lang.reflect.Method;", 0x1, NULL, NULL }, { "getSimpleName", "Ljava.lang.String;", 0x1, -1, -1, -1 },
{ "getEnumConstants", NULL, "[Ljava.lang.Object;", 0x1, NULL, NULL }, { "getSuperclass", "Ljava.lang.Class;", 0x1, -1, -1, 24 },
{ "getEnumConstantsShared", NULL, "[Ljava.lang.Object;", 0x0, NULL, NULL }, { "getTypeParameters", "[Ljava.lang.reflect.TypeVariable;", 0x1, -1, -1, -1 },
{ "getField:", "getField", "Ljava.lang.reflect.Field;", 0x1, { "isAnnotation", "Z", 0x1, -1, -1, -1 },
"Ljava.lang.NoSuchFieldException;Ljava.lang.SecurityException;", NULL }, { "isAnnotationPresentWithIOSClass:", "Z", 0x1, 25, -1, 26 },
{ "getFields", NULL, "[Ljava.lang.reflect.Field;", 0x1, "Ljava.lang.SecurityException;", NULL { "isAnonymousClass", "Z", 0x1, -1, -1, -1 },
}, { "isArray", "Z", 0x1, -1, -1, -1 },
{ "getGenericInterfaces", NULL, "[Ljava.lang.reflect.Type;", 0x1, NULL, NULL }, { "isAssignableFrom:", "Z", 0x1, 27, -1, 28 },
{ "getGenericSuperclass", NULL, "Ljava.lang.reflect.Type;", 0x1, NULL, NULL }, { "isEnum", "Z", 0x1, -1, -1, -1 },
{ "getInterfaces", NULL, "[Ljava.lang.Class;", 0x1, NULL, NULL }, { "isInstance:", "Z", 0x1, 29, -1, -1 },
{ "getMethod:parameterTypes:", "getMethod", "Ljava.lang.reflect.Method;", 0x81, { "isInterface", "Z", 0x1, -1, -1, -1 },
"Ljava.lang.NoSuchMethodException;Ljava.lang.SecurityException;", NULL }, { "isLocalClass", "Z", 0x1, -1, -1, -1 },
{ "getMethods", NULL, "[Ljava.lang.reflect.Method;", 0x1, "Ljava.lang.SecurityException;", NULL { "isMemberClass", "Z", 0x1, -1, -1, -1 },
}, { "isPrimitive", "Z", 0x1, -1, -1, -1 },
{ "getModifiers", NULL, "I", 0x1, NULL, NULL }, { "isSynthetic", "Z", 0x1, -1, -1, -1 },
{ "getName", NULL, "Ljava.lang.String;", 0x1, NULL, NULL }, { "newInstance", "TT;", 0x1, -1, 30, 31 },
{ "getPackage", NULL, "Ljava.lang.Package;", 0x1, NULL, NULL }, { "description", "Ljava.lang.String;", 0x1, 32, -1, -1 },
{ "getProtectionDomain", NULL, "Ljava.security.ProtectionDomain;", 0x1, NULL, NULL }, { "getDeclaredAnnotationsByTypeWithIOSClass:", "[Ljava.lang.annotation.Annotation;", 0x1, 33,
{ "getResource:", "getResource", "Ljava.net.URL;", 0x1, NULL, NULL }, -1, 34 },
{ "getResourceAsStream:", "getResourceAsStream", "Ljava.io.InputStream;", 0x1, NULL, NULL }, { "getAnnotationsByTypeWithIOSClass:", "[Ljava.lang.annotation.Annotation;", 0x1, 35, -1, 34 },
{ "getSigners", NULL, "[Ljava.lang.Object;", 0x1, NULL, NULL }, { "getDeclaredAnnotationWithIOSClass:", "TT;", 0x1, 36, -1, 37 },
{ "getSimpleName", NULL, "Ljava.lang.String;", 0x1, NULL, NULL }, { "getAccessFlags", "I", 0x1, -1, -1, -1 },
{ "getSuperclass", NULL, "Ljava.lang.Class;", 0x1, NULL, "()Ljava/lang/Class<-TT;>;" }, { "init", NULL, 0x1, -1, -1, -1 },
{ "getTypeParameters", NULL, "[Ljava.lang.reflect.TypeVariable;", 0x1, NULL, NULL },
{ "isAnnotation", NULL, "Z", 0x1, NULL, NULL },
{ "isAnnotationPresentWithIOSClass:", "isAnnotationPresent", "Z", 0x1, NULL,
"(Ljava/lang/Class<+Ljava/lang/annotation/Annotation;>;)Z" },
{ "isAnonymousClass", NULL, "Z", 0x1, NULL, NULL },
{ "isArray", NULL, "Z", 0x1, NULL, NULL },
{ "isAssignableFrom:", "isAssignableFrom", "Z", 0x1, NULL, "(Ljava/lang/Class<*>;)Z" },
{ "isEnum", NULL, "Z", 0x1, NULL, NULL },
{ "isInstance:", "isInstance", "Z", 0x1, NULL, NULL },
{ "isInterface", NULL, "Z", 0x1, NULL, NULL },
{ "isLocalClass", NULL, "Z", 0x1, NULL, NULL },
{ "isMemberClass", NULL, "Z", 0x1, NULL, NULL },
{ "isPrimitive", NULL, "Z", 0x1, NULL, NULL },
{ "isSynthetic", NULL, "Z", 0x1, NULL, NULL },
{ "newInstance", NULL, "TT;", 0x1,
"Ljava.lang.InstantiationException;Ljava.lang.IllegalAccessException;", "()TT;" },
{ "description", "toString", "Ljava.lang.String;", 0x1, NULL, NULL },
{ "getDeclaredAnnotationsByTypeWithIOSClass:", "getDeclaredAnnotationsByType",
"[Ljava.lang.annotation.Annotation;", 0x1, NULL,
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)[TT;" },
{ "getAnnotationsByTypeWithIOSClass:", "getAnnotationsByType",
"[Ljava.lang.annotation.Annotation;", 0x1, NULL,
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)[TT;" },
{ "getDeclaredAnnotationWithIOSClass:", "getDeclaredAnnotation", "TT;", 0x1, NULL,
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)TT;" },
{ "getAccessFlags", NULL, "I", 0x1, NULL, NULL },
{ "init", NULL, NULL, 0x1, NULL, NULL },
}; };
static const J2ObjcFieldInfo fields[] = { static const J2ObjcFieldInfo fields[] = {
{ "serialVersionUID", NULL, 0x1a, "J", NULL, NULL, { "serialVersionUID", "J", .constantValue.asLong = IOSClass_serialVersionUID, 0x1a, -1, -1, -1
.constantValue.asLong = IOSClass_serialVersionUID }, },
}; };
static const void *ptrTable[] = {
"forName", "Ljava.lang.ClassNotFoundException;", "(Ljava/lang/String;)Ljava/lang/Class<*>;",
"(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class<*>;", "asSubclass",
"<U:Ljava/lang/Object;>(Ljava/lang/Class<TU;>;)Ljava/lang/Class<+TU;>;", "cast",
"(Ljava/lang/Object;)TT;", "getAnnotation",
"<A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;", "()Ljava/lang/Class<*>;",
"getConstructor", "Ljava.lang.NoSuchMethodException;Ljava.lang.SecurityException;",
"([Ljava/lang/Class<*>;)Ljava/lang/reflect/Constructor<TT;>;", "Ljava.lang.SecurityException;",
"getDeclaredConstructor", "getDeclaredField",
"Ljava.lang.NoSuchFieldException;Ljava.lang.SecurityException;", "getDeclaredMethod",
"()Ljava/lang/reflect/Constructor<*>;", "getField", "getMethod", "getResource",
"getResourceAsStream", "()Ljava/lang/Class<-TT;>;", "isAnnotationPresent",
"(Ljava/lang/Class<+Ljava/lang/annotation/Annotation;>;)Z", "isAssignableFrom",
"(Ljava/lang/Class<*>;)Z", "isInstance",
"Ljava.lang.InstantiationException;Ljava.lang.IllegalAccessException;", "()TT;", "toString",
"getDeclaredAnnotationsByType",
"<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)[TT;", "getAnnotationsByType",
"getDeclaredAnnotation", "<T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)TT;" };
static const J2ObjcClassInfo _IOSClass = { static const J2ObjcClassInfo _IOSClass = {
2, "Class", "java.lang", NULL, 0x11, 63, methods, 1, fields, 0, NULL, 0, NULL, NULL, 3, "Class", "java.lang", NULL, 0x11, 63, methods, 1, fields, 0, NULL, 0, NULL, NULL,
"<T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/reflect/AnnotatedElement;" "<T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/reflect/AnnotatedElement;"
"Ljava/lang/reflect/GenericDeclaration;Ljava/io/Serializable;Ljava/lang/reflect/Type;" }; "Ljava/lang/reflect/GenericDeclaration;Ljava/io/Serializable;Ljava/lang/reflect/Type;", ptrTable
};
return &_IOSClass; return &_IOSClass;
} }


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


// Current metadata structure version // Current metadata structure version
#define J2OBJC_METADATA_VERSION 2 #define J2OBJC_METADATA_VERSION 3


// A raw value is the union of all possible native types. // A raw value is the union of all possible native types.
typedef union { typedef union {
Expand All @@ -50,30 +50,34 @@ typedef union {
// all information provided by the reflection API is discoverable via the // all information provided by the reflection API is discoverable via the
// Objective-C runtime. // Objective-C runtime.


typedef int16_t ptr_idx;

typedef struct J2ObjcMethodInfo { typedef struct J2ObjcMethodInfo {
const char *selector; const char *selector;
const char *javaName;
const char *returnType; const char *returnType;
uint16_t modifiers; uint16_t modifiers;
const char *exceptions; ptr_idx javaNameIdx;
const char *genericSignature; ptr_idx exceptionsIdx;
ptr_idx genericSignatureIdx;
} J2ObjcMethodInfo; } J2ObjcMethodInfo;


typedef struct J2ObjcFieldInfo { typedef struct J2ObjcFieldInfo {
const char *name; const char *name;
const char *javaName;
uint16_t modifiers;
const char *type; const char *type;
const void *staticRef;
const char *genericSignature;
J2ObjcRawValue constantValue; J2ObjcRawValue constantValue;
uint16_t modifiers;
ptr_idx javaNameIdx;
ptr_idx staticRefIdx;
ptr_idx genericSignatureIdx;
} J2ObjcFieldInfo; } J2ObjcFieldInfo;


typedef struct J2ObjCEnclosingMethodInfo { typedef struct J2ObjCEnclosingMethodInfo {
const char *typeName; const char *typeName;
const char *selector; const char *selector;
} J2ObjCEnclosingMethodInfo; } J2ObjCEnclosingMethodInfo;


// TODO(kstanger): Optimize the size of this struct by using the pointer table
// and rearranging the fields for better packing.
typedef struct J2ObjcClassInfo { typedef struct J2ObjcClassInfo {
const unsigned version; const unsigned version;
const char *typeName; const char *typeName;
Expand All @@ -90,6 +94,7 @@ typedef struct J2ObjcClassInfo {
const char **innerClassnames; const char **innerClassnames;
const J2ObjCEnclosingMethodInfo *enclosingMethod; const J2ObjCEnclosingMethodInfo *enclosingMethod;
const char *genericSignature; const char *genericSignature;
const void **ptrTable;
} J2ObjcClassInfo; } J2ObjcClassInfo;


// Autoboxing support. // Autoboxing support.
Expand All @@ -104,6 +109,10 @@ extern struct objc_method_description *JreFindMethodDescFromMethodList(
SEL sel, Method *methods, unsigned int count); SEL sel, Method *methods, unsigned int count);
extern NSMethodSignature *JreSignatureOrNull(struct objc_method_description *methodDesc); extern NSMethodSignature *JreSignatureOrNull(struct objc_method_description *methodDesc);


__attribute__((always_inline)) inline const void *JrePtrAtIndex(const void **ptrTable, ptr_idx i) {
return i < 0 ? NULL : ptrTable[i];
}

// J2ObjcClassInfo accessor functions. // J2ObjcClassInfo accessor functions.
extern NSString *JreClassTypeName(const J2ObjcClassInfo *metadata); extern NSString *JreClassTypeName(const J2ObjcClassInfo *metadata);
extern NSString *JreClassQualifiedName(const J2ObjcClassInfo *metadata); extern NSString *JreClassQualifiedName(const J2ObjcClassInfo *metadata);
Expand All @@ -120,20 +129,20 @@ extern const J2ObjcMethodInfo *JreFindMethodInfo(
const J2ObjcClassInfo *metadata, NSString *methodName); const J2ObjcClassInfo *metadata, NSString *methodName);


// J2ObjcMethodInfo accessor functions. // J2ObjcMethodInfo accessor functions.
extern NSString *JreMethodName(const J2ObjcMethodInfo *metadata); extern NSString *JreMethodJavaName(const J2ObjcMethodInfo *metadata, const void **ptrTable);
extern NSString *JreMethodJavaName(const J2ObjcMethodInfo *metadata);
extern NSString *JreMethodObjcName(const J2ObjcMethodInfo *metadata); extern NSString *JreMethodObjcName(const J2ObjcMethodInfo *metadata);
extern IOSObjectArray *JreMethodExceptionTypes(const J2ObjcMethodInfo *metadata); extern IOSObjectArray *JreMethodExceptionTypes(
const J2ObjcMethodInfo *metadata, const void **ptrTable);
extern jboolean JreMethodIsConstructor(const J2ObjcMethodInfo *metadata); extern jboolean JreMethodIsConstructor(const J2ObjcMethodInfo *metadata);
extern NSString *JreMethodGenericString(const J2ObjcMethodInfo *metadata); extern NSString *JreMethodGenericString(const J2ObjcMethodInfo *metadata, const void **ptrTable);


__attribute__((always_inline)) inline jint JreMethodModifiers(const J2ObjcMethodInfo *metadata) { __attribute__((always_inline)) inline jint JreMethodModifiers(const J2ObjcMethodInfo *metadata) {
return metadata ? metadata->modifiers : JavaLangReflectModifier_PUBLIC; return metadata ? metadata->modifiers : JavaLangReflectModifier_PUBLIC;
} }


// metadata must not be NULL. // metadata must not be NULL.
__attribute__((always_inline)) inline SEL JreMethodSelector(const J2ObjcMethodInfo *metadata) { __attribute__((always_inline)) inline SEL JreMethodSelector(const J2ObjcMethodInfo *metadata) {
return sel_registerName(metadata->selector ? metadata->selector : metadata->javaName); return sel_registerName(metadata->selector);
} }


__attribute__((always_inline)) inline __attribute__((always_inline)) inline
Expand Down

0 comments on commit 4d6aa11

Please sign in to comment.