@@ -634,16 +634,16 @@ void toNative(napi_env env, napi_value value, void* result, bool* shouldFree,
634634 }
635635
636636 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);
646642 }
643+ // } else {
644+ // // Default behavior for C strings
645+ // ::free(value);
646+ // }
647647 }
648648
649649 void encode (std::string* encoding) override { *encoding += " ^v" ; }
@@ -890,6 +890,12 @@ napi_value toJS(napi_env env, void* value, uint32_t flags) override {
890890 return null;
891891 }
892892
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+
893899 auto bridgeState = ObjCBridgeState::InstanceData (env);
894900
895901 ObjectOwnership ownership;
@@ -1116,6 +1122,63 @@ void toNative(napi_env env, napi_value value, void* result, bool* shouldFree,
11161122static const std::shared_ptr<ObjCNSStringObjectTypeConv> objcNSStringObjectTypeConv =
11171123 std::make_shared<ObjCNSStringObjectTypeConv>();
11181124
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+
11191182class ObjCClassTypeConv : public TypeConv {
11201183 public:
11211184 ObjCClassTypeConv () { type = &ffi_type_pointer; }
@@ -1595,6 +1658,10 @@ void toNative(napi_env env, napi_value value, void* result, bool* shouldFree,
15951658 return objcNSStringObjectTypeConv;
15961659 }
15971660
1661+ case mdTypeNSMutableStringObject: {
1662+ return objcNSMutableStringObjectTypeConv;
1663+ }
1664+
15981665 case mdTypeClass: {
15991666 return objcClassTypeConv;
16001667 }
0 commit comments