Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 90353f9

Browse files
Add lc_array to the supported types in the LC IDL
1 parent d38ae2d commit 90353f9

File tree

5 files changed

+75
-3
lines changed

5 files changed

+75
-3
lines changed

lcidlc/src/Interface.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ static const char *s_interface_native_types[] =
6767
"boolean",
6868
"c-string",
6969
"c-data",
70+
"lc-array",
7071
"utf8-c-string",
7172
"utf8-c-data",
7273
"utf16-c-string",
@@ -549,6 +550,7 @@ bool InterfaceDefineHandlerParameter(InterfaceRef self, Position p_where, Parame
549550
// RULE: default values not supported for c-data, objc-data, objc-dictionary, objc-array types
550551
if (p_optional && p_default != nil &&
551552
(t_native_type == kNativeTypeCData ||
553+
t_native_type == kNativeTypeLCArray ||
552554
t_native_type == kNativeTypeObjcData ||
553555
t_native_type == kNativeTypeObjcArray ||
554556
t_native_type == kNativeTypeObjcDictionary))

lcidlc/src/InterfaceGenerate.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ static const char *type_to_cstring(NameRef p_type, bool p_is_ref)
5454
return p_is_ref ? "char *" : "const char *";
5555
else if (NameEqualToCString(p_type, "c-data"))
5656
return "LCBytes";
57+
else if (NameEqualToCString(p_type, "lc-array"))
58+
return p_is_ref ? "LCArrayRef" : "const LCArrayRef";
5759
else if (NameEqualToCString(p_type, "integer"))
5860
return "int";
5961
else if (NameEqualToCString(p_type, "real"))
@@ -453,6 +455,58 @@ class CDataTypeMapper: public CTypesTypeMapper
453455
const char* m_tag;
454456
};
455457

458+
class LCArrayTypeMapper: public CTypesTypeMapper
459+
{
460+
public:
461+
462+
LCArrayTypeMapper(NativeType p_type)
463+
{
464+
m_tag = NativeTypeGetTag(p_type);
465+
}
466+
467+
virtual const char *GetTypedef(ParameterType mode)
468+
{
469+
return mode == kParameterTypeIn ? "const LCArrayRef" : "LCArrayRef";
470+
}
471+
472+
virtual void Initialize(CoderRef p_coder, ParameterType p_mode, const char *p_name)
473+
{
474+
if (p_mode == kParameterTypeInOut)
475+
{
476+
CoderWriteStatement(p_coder, "LCArrayRef %s, original__%s", p_name, p_name);
477+
CoderWriteStatement(p_coder, "original__%s = %s = nil;", p_name, p_name);
478+
}
479+
else
480+
{
481+
CoderWriteStatement(p_coder, "LCArrayRef %s", p_name);
482+
CoderWriteStatement(p_coder, "%s = nil", p_name);
483+
}
484+
}
485+
486+
virtual void Default(CoderRef p_coder, ParameterType p_mode, const char *p_name, ValueRef p_value)
487+
{
488+
CoderWriteStatement(p_coder, "success = false", StringGetCStringPtr(p_value), p_name);
489+
CodeInOutCopy(p_coder, p_mode, p_name);
490+
}
491+
492+
virtual void Finalize(CoderRef p_coder, ParameterType p_mode, const char *p_name)
493+
{
494+
CoderWriteStatement(p_coder, "LCArrayRelease(%s)", p_name);
495+
if (p_mode == kParameterTypeInOut)
496+
{
497+
CoderBeginIf(p_coder, "%s != original__%s", p_name, p_name);
498+
CoderWriteStatement(p_coder, "LCArrayRelease(original__%s)", p_name);
499+
CoderEndIf(p_coder);
500+
}
501+
}
502+
503+
protected:
504+
const char *GetTag(void) {return m_tag;}
505+
506+
private:
507+
const char* m_tag;
508+
};
509+
456510
//////////
457511

458512
class EnumTypeMapper: public TypeMapper
@@ -1114,6 +1168,7 @@ static TypeMapper *map_parameter_type(InterfaceRef self, HandlerMapping p_mappin
11141168
case kNativeTypeUTF8CData:
11151169
case kNativeTypeUTF16CData:
11161170
return new CDataTypeMapper(t_type);
1171+
case kNativeTypeLCArray: return new LCArrayTypeMapper(t_type);
11171172
// case kNativeTypeCArray:
11181173
// case kNativeTypeCDictionary:
11191174
case kNativeTypeObjcString: return new ObjcStringTypeMapper;

lcidlc/src/NativeType.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ NativeType NativeTypeFromName(NameRef p_type)
3232
return kNativeTypeCString;
3333
else if (NameEqualToCString(p_type, "c-data"))
3434
return kNativeTypeCData;
35+
else if (NameEqualToCString(p_type, "lc-array"))
36+
return kNativeTypeLCArray;
3537
else if (NameEqualToCString(p_type, "utf8-c-string"))
3638
return kNativeTypeUTF8CString;
3739
else if (NameEqualToCString(p_type, "utf8-c-data"))
@@ -74,6 +76,8 @@ const char *NativeTypeGetTypedef(NativeType p_type)
7476
case kNativeTypeUTF8CData:
7577
case kNativeTypeUTF16CData:
7678
return "LCBytes";
79+
case kNativeTypeLCArray:
80+
return "LCArrayRef";
7781
case kNativeTypeObjcString:
7882
return "NSString*";
7983
case kNativeTypeObjcNumber:
@@ -140,6 +144,8 @@ const char *NativeTypeGetTag(NativeType p_type)
140144
return "utf8cdata";
141145
case kNativeTypeUTF16CData:
142146
return "utf16cdata";
147+
case kNativeTypeLCArray:
148+
return "lc_array";
143149
case kNativeTypeInteger:
144150
return "int";
145151
case kNativeTypeReal:
@@ -190,6 +196,7 @@ const char *NativeTypeGetInitializer(NativeType p_type)
190196
case kNativeTypeCString:
191197
case kNativeTypeUTF8CString:
192198
case kNativeTypeUTF16CString:
199+
case kNativeTypeLCArray:
193200
case kNativeTypeObjcString:
194201
case kNativeTypeObjcNumber:
195202
case kNativeTypeObjcData:
@@ -313,6 +320,8 @@ const char *native_type_to_type_in_cstring(NativeType p_type)
313320
case kNativeTypeUTF8CData:
314321
case kNativeTypeUTF16CData:
315322
return "LCBytes";
323+
case kNativeTypeLCArray:
324+
return "const LCArrayRef";
316325
case kNativeTypeInteger:
317326
case kNativeTypeEnum:
318327
return "int";
@@ -338,6 +347,8 @@ const char *native_type_to_type_out_cstring(NativeType p_type)
338347
case kNativeTypeUTF8CData:
339348
case kNativeTypeUTF16CData:
340349
return "LCBytes";
350+
case kNativeTypeLCArray:
351+
return "LCArrayRef";
341352
case kNativeTypeInteger:
342353
case kNativeTypeEnum:
343354
return "int";

lcidlc/src/NativeType.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ enum NativeType
3434
kNativeTypeUTF8CData,
3535
kNativeTypeUTF16CString,
3636
kNativeTypeUTF16CData,
37+
kNativeTypeLCArray,
3738
kNativeTypeCArray,
3839
kNativeTypeCDictionary,
3940
kNativeTypeObjcString,

lcidlc/src/Support.mm

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,8 @@ static LCError LCValueFetch(MCVariableRef p_var, unsigned int p_options, void *r
749749
break;
750750
case kLCValueOptionAsLCArray:
751751
t_options_to_use = kMCOptionAsVariable;
752-
t_value_to_use = &t_array_value;
752+
t_error = (LCError)MCVariableCreate(&t_array_value);
753+
t_value_to_use = t_array_value;
753754
break;
754755

755756
// SN-2014-07-01: [[ ExternalsApiV6 ]] Handling unicode types
@@ -822,7 +823,8 @@ static LCError LCValueFetch(MCVariableRef p_var, unsigned int p_options, void *r
822823
if (s_interface -> version < 6)
823824
{
824825
t_options_to_use = kMCOptionAsVariable;
825-
t_value_to_use = &t_array_value;
826+
t_error = (LCError)MCVariableCreate(&t_array_value);
827+
t_value_to_use = t_array_value;
826828
}
827829
else
828830
{
@@ -834,7 +836,8 @@ static LCError LCValueFetch(MCVariableRef p_var, unsigned int p_options, void *r
834836
if (s_interface -> version < 6)
835837
{
836838
t_options_to_use = kMCOptionAsVariable;
837-
t_value_to_use = &t_array_value;
839+
t_error = (LCError)MCVariableCreate(&t_array_value);
840+
t_value_to_use = t_array_value;
838841
}
839842
else
840843
{

0 commit comments

Comments
 (0)