Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 6 additions & 14 deletions protobuf/runtime/src/com/google/protobuf/Descriptors.m
Original file line number Diff line number Diff line change
Expand Up @@ -51,24 +51,15 @@
#import "java/util/Arrays.h"
#import "java/util/Collections.h"

// Defines the field in the CGPValue union type to use for each field type.
#define VALUE_FIELD_Int valueInt
#define VALUE_FIELD_Long valueLong
#define VALUE_FIELD_Float valueFloat
#define VALUE_FIELD_Double valueDouble
#define VALUE_FIELD_Bool valueBool
#define VALUE_FIELD_Enum valueId
#define VALUE_FIELD_Retainable valueId

BOOL CGPIsRetainedType(CGPFieldJavaType type) {
switch (type) {
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_INT:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_LONG:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_FLOAT:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_DOUBLE:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_BOOLEAN:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_ENUM:
return NO;
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_ENUM:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_STRING:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_BYTE_STRING:
case ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_MESSAGE:
Expand All @@ -79,7 +70,7 @@ BOOL CGPIsRetainedType(CGPFieldJavaType type) {
size_t CGPGetTypeSize(CGPFieldJavaType type) {
#define GET_TYPE_SIZE_CASE(NAME) return sizeof(TYPE_##NAME);

SWITCH_TYPES_NO_ENUM(type, GET_TYPE_SIZE_CASE)
SWITCH_TYPES(type, GET_TYPE_SIZE_CASE, GET_TYPE_SIZE_CASE, GET_TYPE_SIZE_CASE)

#undef GET_TYPE_SIZE_CASE
}
Expand Down Expand Up @@ -329,7 +320,7 @@ static void CGPFieldFixDefaultValue(CGPFieldDescriptor *descriptor) {
CGPEnumDescriptor *enumDescriptor = [enumClass performSelector:@selector(getDescriptor)];
CGPEnumValueDescriptor *valueDescriptor =
IOSObjectArray_Get(enumDescriptor->values_, data->defaultValue.valueInt);
data->defaultValue.valueId = valueDescriptor->enum_;
data->defaultValue.valueEnum = valueDescriptor->enum_;
descriptor->valueType_ = enumDescriptor;
break;
}
Expand Down Expand Up @@ -459,9 +450,10 @@ id CGPFieldGetDefaultValue(CGPFieldDescriptor *field) {
}

#define GET_DEFAULT_VALUE_CASE(NAME) \
return CGPToReflectionType##NAME(field->data_->defaultValue.VALUE_FIELD_##NAME, field);
return CGPToReflectionType##NAME(field->data_->defaultValue.CGPValueField_##NAME);

SWITCH_TYPES_WITH_ENUM(CGPFieldGetJavaType(field), GET_DEFAULT_VALUE_CASE)
SWITCH_TYPES(CGPFieldGetJavaType(field), GET_DEFAULT_VALUE_CASE, GET_DEFAULT_VALUE_CASE,
GET_DEFAULT_VALUE_CASE)

#undef GET_DEFAULT_VALUE_CASE
}
Expand Down
128 changes: 109 additions & 19 deletions protobuf/runtime/src/com/google/protobuf/Descriptors_PackagePrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ typedef union {
jdouble valueDouble;
bool valueBool;
__unsafe_unretained id valueId;
__unsafe_unretained JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *valueEnum;
const void *valuePtr;
} CGPValue;

Expand All @@ -53,8 +54,7 @@ typedef union {
#define CGPValueField_Float valueFloat
#define CGPValueField_Double valueDouble
#define CGPValueField_Bool valueBool
#define CGPValueField_Enum valueId
#define CGPValueField_Retainable valueId
#define CGPValueField_Enum valueEnum
#define CGPValueField_Id valueId

typedef NS_OPTIONS(uint32_t, CGPMessageFlags) {
Expand Down Expand Up @@ -160,26 +160,13 @@ typedef struct CGPOneofData {

@end

// Functions that convert a value from its field storage type to the type
// expected by a reflection accessor. (accessing with a descriptor)
// For enums, the reflection type is a EnumValueDescriptor.
#define CGPToReflectionTypeInt(value, field) [JavaLangInteger valueOfWithInt:value]
#define CGPToReflectionTypeLong(value, field) [JavaLangLong valueOfWithLong:value]
#define CGPToReflectionTypeFloat(value, field) [JavaLangFloat valueOfWithFloat:value]
#define CGPToReflectionTypeDouble(value, field) [JavaLangDouble valueOfWithDouble:value]
#define CGPToReflectionTypeBool(value, field) [JavaLangBoolean valueOfWithBoolean:value]
#define CGPToReflectionTypeEnum(value, field) \
((CGPEnumDescriptor *)field->valueType_)->values_->buffer_[[(JavaLangEnum *)value ordinal]]
#define CGPToReflectionTypeRetainable(value, field) RETAIN_AND_AUTORELEASE(value)

CF_EXTERN_C_BEGIN

NS_RETURNS_RETAINED CGPDescriptor *CGPInitDescriptor(Class messageClass, Class builderClass,
CGPMessageFlags flags, size_t storageSize);

void CGPInitFields(
CGPDescriptor *descriptor, jint fieldCount, CGPFieldData *fieldData,
jint oneofCount, const CGPOneofData *oneofData);
void CGPInitFields(CGPDescriptor *descriptor, jint fieldCount, CGPFieldData *fieldData,
jint oneofCount, const CGPOneofData *oneofData);

CGP_ALWAYS_INLINE BOOL CGPIsExtendable(const CGPDescriptor *descriptor) {
return descriptor->flags_ & CGPMessageFlagExtendable;
Expand Down Expand Up @@ -264,8 +251,8 @@ CGP_ALWAYS_INLINE BOOL CGPJavaTypeIsEnum(CGPFieldJavaType type) {
return type == ComGoogleProtobufDescriptors_FieldDescriptor_JavaType_Enum_ENUM;
}

CGP_ALWAYS_INLINE jint CGPEnumGetIntValue(CGPEnumDescriptor *descriptor, id enumObj) {
return *(jint *)((char *)(ARCBRIDGE void *)enumObj + descriptor->valueOffset_);
CGP_ALWAYS_INLINE jint CGPEnumGetIntValue(CGPEnumDescriptor *descriptor, TYPE_Enum enumObj) {
return [enumObj getValueDescriptor]->number_;
}

id CGPFieldGetDefaultValue(CGPFieldDescriptor *field);
Expand Down Expand Up @@ -306,4 +293,107 @@ J2OBJC_FIELD_SETTER(ComGoogleProtobufDescriptors_FieldDescriptor_Type, javaType_

J2OBJC_FIELD_SETTER(ComGoogleProtobufDescriptors_FieldDescriptor_JavaType, defaultDefault_, id)

// Functions that box a value from its field storage type into an object type.
// For enums, the boxed type is a Java enum object.
CGP_ALWAYS_INLINE JavaLangInteger *CGPBoxedValueInt(jint value) {
return [JavaLangInteger valueOfWithInt:value];
}
CGP_ALWAYS_INLINE JavaLangLong *CGPBoxedValueLong(jlong value) {
return [JavaLangLong valueOfWithLong:value];
}
CGP_ALWAYS_INLINE JavaLangFloat *CGPBoxedValueFloat(jfloat value) {
return [JavaLangFloat valueOfWithFloat:value];
}
CGP_ALWAYS_INLINE JavaLangDouble *CGPBoxedValueDouble(jdouble value) {
return [JavaLangDouble valueOfWithDouble:value];
}
CGP_ALWAYS_INLINE JavaLangBoolean *CGPBoxedValueBool(bool value) {
return [JavaLangBoolean valueOfWithBoolean:value];
}
CGP_ALWAYS_INLINE JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *CGPBoxedValueEnum(
JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *value) {
return value;
}
CGP_ALWAYS_INLINE id CGPBoxedValueId(id value) { return value; }

// Functions that unbox a value into its primitive type.
CGP_ALWAYS_INLINE jint CGPUnboxValueInt(JavaLangInteger *value) { return [value intValue]; }
CGP_ALWAYS_INLINE jlong CGPUnboxValueLong(JavaLangLong *value) { return [value longLongValue]; }
CGP_ALWAYS_INLINE jfloat CGPUnboxValueFloat(JavaLangFloat *value) { return [value floatValue]; }
CGP_ALWAYS_INLINE jdouble CGPUnboxValueDouble(JavaLangDouble *value) { return [value doubleValue]; }
CGP_ALWAYS_INLINE bool CGPUnboxValueBool(JavaLangBoolean *value) { return [value booleanValue]; }
CGP_ALWAYS_INLINE JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *CGPUnboxValueEnum(
JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *value) {
return value;
}
CGP_ALWAYS_INLINE id CGPUnboxValueId(id value) { return value; }

// Functions that convert a value from its reflection to its storage type.
CGP_ALWAYS_INLINE jint CGPFromReflectionTypeInt(JavaLangInteger *value) { return [value intValue]; }
CGP_ALWAYS_INLINE jlong CGPFromReflectionTypeLong(JavaLangLong *value) {
return [value longLongValue];
}
CGP_ALWAYS_INLINE jfloat CGPFromReflectionTypeFloat(JavaLangFloat *value) {
return [value floatValue];
}
CGP_ALWAYS_INLINE jdouble CGPFromReflectionTypeDouble(JavaLangDouble *value) {
return [value doubleValue];
}
CGP_ALWAYS_INLINE bool CGPFromReflectionTypeBool(JavaLangBoolean *value) {
return [value booleanValue];
}
CGP_ALWAYS_INLINE JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *CGPFromReflectionTypeEnum(
CGPEnumValueDescriptor *value) {
return value->enum_;
}
CGP_ALWAYS_INLINE id CGPFromReflectionTypeId(id value) { return value; }

// Functions that convert a value from its field storage type to the type
// expected by a reflection accessor. (accessing with a descriptor)
// For enums, the reflection type is a EnumValueDescriptor.
CGP_ALWAYS_INLINE JavaLangInteger *CGPToReflectionTypeInt(jint value) {
return [JavaLangInteger valueOfWithInt:value];
}
CGP_ALWAYS_INLINE JavaLangLong *CGPToReflectionTypeLong(jlong value) {
return [JavaLangLong valueOfWithLong:value];
}
CGP_ALWAYS_INLINE JavaLangFloat *CGPToReflectionTypeFloat(jfloat value) {
return [JavaLangFloat valueOfWithFloat:value];
}
CGP_ALWAYS_INLINE JavaLangDouble *CGPToReflectionTypeDouble(jdouble value) {
return [JavaLangDouble valueOfWithDouble:value];
}
CGP_ALWAYS_INLINE JavaLangBoolean *CGPToReflectionTypeBool(bool value) {
return [JavaLangBoolean valueOfWithBoolean:value];
}
CGP_ALWAYS_INLINE CGPEnumValueDescriptor *CGPToReflectionTypeEnum(
JavaLangEnum<ComGoogleProtobufProtocolMessageEnum> *value) {
return [value getValueDescriptor];
}
CGP_ALWAYS_INLINE id CGPToReflectionTypeId(id value) { return RETAIN_AND_AUTORELEASE(value); }

// Functions that convert a value from its field storage type to its external
// type.
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Int ToExternalTypeInt(TYPE_Int value) { return value; }
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Long ToExternalTypeLong(TYPE_Long value) { return value; }
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Float ToExternalTypeFloat(TYPE_Float value) { return value; }
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Double ToExternalTypeDouble(TYPE_Double value) { return value; }
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Bool ToExternalTypeBool(TYPE_Bool value) { return value; }
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Enum ToExternalTypeEnum(TYPE_Enum value) {
return RETAIN_AND_AUTORELEASE(value);
}
CGP_ALWAYS_INLINE EXTERNAL_TYPE_Id ToExternalTypeId(TYPE_Id value) {
return RETAIN_AND_AUTORELEASE(value);
}

// Functions that convert a value from its external type to its field storage
// type.
CGP_ALWAYS_INLINE TYPE_Int ToTypeInt(EXTERNAL_TYPE_Int value) { return value; }
CGP_ALWAYS_INLINE TYPE_Long ToTypeLong(EXTERNAL_TYPE_Long value) { return value; }
CGP_ALWAYS_INLINE TYPE_Float ToTypeFloat(EXTERNAL_TYPE_Float value) { return value; }
CGP_ALWAYS_INLINE TYPE_Double ToTypeDouble(EXTERNAL_TYPE_Double value) { return value; }
CGP_ALWAYS_INLINE TYPE_Bool ToTypeBool(EXTERNAL_TYPE_Bool value) { return value; }
CGP_ALWAYS_INLINE TYPE_Enum ToTypeEnum(EXTERNAL_TYPE_Enum value) { return value; }
CGP_ALWAYS_INLINE TYPE_Id ToTypeId(EXTERNAL_TYPE_Id value) { return value; }

#endif // __ComGoogleProtobufDescriptors_PackagePrivate_H__
Loading