@@ -634,16 +634,16 @@ void toNative(napi_env env, napi_value value, void* result, bool* shouldFree,
634
634
}
635
635
636
636
void free (napi_env env, void * value) override {
637
- if (pointeeType && pointeeType->kind == mdTypeNSStringObject) {
638
- // CFStringRef needs CFRelease, not free()
639
- CFStringRef cfStr = (CFStringRef)value;
640
- if (cfStr != nullptr ) {
641
- CFRelease (cfStr);
642
- }
643
- } else {
644
- // Default behavior for C strings
645
- ::free (value);
637
+ // if (pointeeType && pointeeType->kind == mdTypeNSStringObject) {
638
+ // CFStringRef needs CFRelease, not free()
639
+ CFStringRef cfStr = (CFStringRef)value;
640
+ if (cfStr != nullptr ) {
641
+ CFRelease (cfStr);
646
642
}
643
+ // } else {
644
+ // // Default behavior for C strings
645
+ // ::free(value);
646
+ // }
647
647
}
648
648
649
649
void encode (std::string* encoding) override { *encoding += " ^v" ; }
@@ -890,6 +890,12 @@ napi_value toJS(napi_env env, void* value, uint32_t flags) override {
890
890
return null;
891
891
}
892
892
893
+ if ([obj isKindOfClass: [NSMutableString class ]]) {
894
+ napi_value result;
895
+ napi_create_string_utf8 (env, [obj UTF8String ], [obj length ], &result);
896
+ return result;
897
+ }
898
+
893
899
auto bridgeState = ObjCBridgeState::InstanceData (env);
894
900
895
901
ObjectOwnership ownership;
@@ -1116,6 +1122,63 @@ void toNative(napi_env env, napi_value value, void* result, bool* shouldFree,
1116
1122
static const std::shared_ptr<ObjCNSStringObjectTypeConv> objcNSStringObjectTypeConv =
1117
1123
std::make_shared<ObjCNSStringObjectTypeConv>();
1118
1124
1125
+ class ObjCNSMutableStringObjectTypeConv : public TypeConv {
1126
+ public:
1127
+ ObjCNSMutableStringObjectTypeConv () { type = &ffi_type_pointer; }
1128
+
1129
+ napi_value toJS (napi_env env, void * value, uint32_t flags) override {
1130
+ NSString * str = *((NSString **)value);
1131
+
1132
+ if (str == nullptr ) {
1133
+ return nullptr ;
1134
+ }
1135
+
1136
+ napi_value result;
1137
+ napi_create_string_utf8 (env, [str UTF8String ], [str length ], &result);
1138
+ return result;
1139
+ }
1140
+
1141
+ void toNative (napi_env env, napi_value value, void * result, bool * shouldFree,
1142
+ bool * shouldFreeAny) override {
1143
+ NAPI_PREAMBLE
1144
+
1145
+ napi_valuetype type;
1146
+ napi_typeof (env, value, &type);
1147
+ if (type == napi_string) {
1148
+ NSMutableString ** res = (NSMutableString **)result;
1149
+
1150
+ size_t len = 0 ;
1151
+ NAPI_GUARD (napi_get_value_string_utf8 (env, value, nullptr , len, &len)) {
1152
+ NAPI_THROW_LAST_ERROR
1153
+ return ;
1154
+ }
1155
+
1156
+ char * str = (char *)malloc (len + 1 );
1157
+
1158
+ NAPI_GUARD (napi_get_value_string_utf8 (env, value, str, len + 1 , &len)) {
1159
+ NAPI_THROW_LAST_ERROR
1160
+ ::free (str);
1161
+ return ;
1162
+ }
1163
+
1164
+ str[len] = ' \0 ' ;
1165
+
1166
+ *res = [[NSMutableString alloc ] initWithUTF8String: str];
1167
+
1168
+ ::free (str);
1169
+ return ;
1170
+ }
1171
+
1172
+ ObjCObjectTypeConv typeConv;
1173
+ typeConv.toNative (env, value, result, shouldFree, shouldFreeAny);
1174
+ }
1175
+
1176
+ void encode (std::string* encoding) override { *encoding += " @" ; }
1177
+ };
1178
+
1179
+ static const std::shared_ptr<ObjCNSMutableStringObjectTypeConv> objcNSMutableStringObjectTypeConv =
1180
+ std::make_shared<ObjCNSMutableStringObjectTypeConv>();
1181
+
1119
1182
class ObjCClassTypeConv : public TypeConv {
1120
1183
public:
1121
1184
ObjCClassTypeConv () { type = &ffi_type_pointer; }
@@ -1595,6 +1658,10 @@ void toNative(napi_env env, napi_value value, void* result, bool* shouldFree,
1595
1658
return objcNSStringObjectTypeConv;
1596
1659
}
1597
1660
1661
+ case mdTypeNSMutableStringObject: {
1662
+ return objcNSMutableStringObjectTypeConv;
1663
+ }
1664
+
1598
1665
case mdTypeClass: {
1599
1666
return objcClassTypeConv;
1600
1667
}
0 commit comments