Skip to content

Commit 7e2c712

Browse files
committed
do nsmutablestring to js string conversion, add searchParams in URL, fix bufferFromData
1 parent e1a99a0 commit 7e2c712

File tree

7 files changed

+142
-14
lines changed

7 files changed

+142
-14
lines changed

NativeScript/ffi/ClassMember.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ inline id assertSelf(napi_env env, napi_value jsThis) {
318318
}
319319
}
320320

321-
NSLog(@"objcNativeCall: %p, %@", self, NSStringFromSelector(method->methodOrGetter.selector));
321+
// NSLog(@"objcNativeCall: %p, %@", self, NSStringFromSelector(method->methodOrGetter.selector));
322322

323323
if (!objcNativeCall(env, cif, self, avalues, rvalue)) {
324324
return nullptr;

NativeScript/ffi/Interop.mm

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ void registerInterop(napi_env env, napi_value global) {
224224
},
225225
};
226226

227-
napi_define_properties(env, interop, 11, properties);
227+
napi_define_properties(env, interop, 12, properties);
228228

229229
napi_set_named_property(env, global, "interop", interop);
230230
}
@@ -479,7 +479,9 @@ napi_value interop_bufferFromData(napi_env env, napi_callback_info info) {
479479
}
480480

481481
napi_value result;
482-
napi_create_external_arraybuffer(env, (void*)data.bytes, data.length, nullptr, nullptr, nullptr);
482+
483+
napi_create_external_arraybuffer(env, (void*)data.bytes, data.length, nullptr, nullptr, &result);
484+
483485
return result;
484486
}
485487

@@ -550,7 +552,7 @@ napi_value interop_bufferFromData(napi_env env, napi_callback_info info) {
550552
napi_value result;
551553
napi_new_instance(env, jsPointer, 0, nullptr, &result);
552554
Pointer* ptr = Pointer::unwrap(env, result);
553-
555+
554556
ptr->data = data;
555557
return result;
556558
}

NativeScript/ffi/TypeConv.mm

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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,
11161122
static 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+
11191182
class 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
}

NativeScript/runtime/modules/url/URL.cpp

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "URL.h"
22

3+
#include "URLSearchParams.h"
34
#include "native_api_util.h"
45

56
using namespace ada;
@@ -110,6 +111,53 @@ napi_value URL::GetSearch(napi_env env, napi_callback_info info) {
110111
return GetUrlProperty(env, info, &url_aggregator::get_search);
111112
}
112113

114+
napi_value URL::GetSearchParams(napi_env env, napi_callback_info info) {
115+
NAPI_PREAMBLE
116+
URL* instance = GetInstance(env, info);
117+
if (!instance) return nullptr;
118+
119+
auto search = instance->GetURL()->get_search();
120+
121+
// Remove the leading '?' if present
122+
std::string_view search_string = search;
123+
if (!search_string.empty() && search_string[0] == '?') {
124+
search_string = search_string.substr(1);
125+
}
126+
127+
// Create URLSearchParams from the search string
128+
url_search_params params(search_string);
129+
URLSearchParams* searchParams = new URLSearchParams(params);
130+
131+
// Get the URLSearchParams constructor
132+
napi_value global;
133+
NAPI_GUARD(napi_get_global(env, &global)) {
134+
delete searchParams;
135+
return nullptr;
136+
}
137+
138+
napi_value constructor;
139+
NAPI_GUARD(
140+
napi_get_named_property(env, global, "URLSearchParams", &constructor)) {
141+
delete searchParams;
142+
return nullptr;
143+
}
144+
145+
napi_value result;
146+
NAPI_GUARD(napi_new_instance(env, constructor, 0, nullptr, &result)) {
147+
delete searchParams;
148+
return nullptr;
149+
}
150+
151+
// Wrap the native URLSearchParams instance
152+
NAPI_GUARD(napi_wrap(env, result, searchParams, URLSearchParams::Destructor,
153+
searchParams, nullptr)) {
154+
delete searchParams;
155+
return nullptr;
156+
}
157+
158+
return result;
159+
}
160+
113161
napi_value URL::GetUserName(napi_env env, napi_callback_info info) {
114162
return GetUrlProperty(env, info, &url_aggregator::get_username);
115163
}
@@ -299,7 +347,7 @@ void URL::Destructor(napi_env env, void* data, void* hint) {
299347
void URL::Init(napi_env env, napi_value global) {
300348
NAPI_PREAMBLE
301349
napi_value ctor;
302-
static const int instance_prop_count = 12;
350+
static const int instance_prop_count = 13;
303351
napi_property_descriptor properties[instance_prop_count] = {
304352
{"hash", nullptr, nullptr, GetHash, SetHash, nullptr, napi_default,
305353
nullptr},
@@ -321,6 +369,8 @@ void URL::Init(napi_env env, napi_value global) {
321369
napi_default, nullptr},
322370
{"search", nullptr, nullptr, GetSearch, SetSearch, nullptr, napi_default,
323371
nullptr},
372+
{"searchParams", nullptr, nullptr, GetSearchParams, nullptr, nullptr,
373+
napi_default, nullptr},
324374
{"username", nullptr, nullptr, GetUserName, SetUserName, nullptr,
325375
napi_default, nullptr},
326376
{"toString", nullptr, ToString, nullptr, nullptr, nullptr, napi_default,

NativeScript/runtime/modules/url/URL.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class URL {
4747
static napi_value GetSearch(napi_env env, napi_callback_info info);
4848
static napi_value SetSearch(napi_env env, napi_callback_info info);
4949

50+
static napi_value GetSearchParams(napi_env env, napi_callback_info info);
51+
5052
static napi_value GetUserName(napi_env env, napi_callback_info info);
5153
static napi_value SetUserName(napi_env env, napi_callback_info info);
5254

metadata-generator/include/Metadata.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ enum MDTypeKind : uint8_t {
5151
mdTypeInstanceObject,
5252
// 5. NSString Type Object
5353
mdTypeNSStringObject,
54+
// 6. NSMutableString Type Object
55+
mdTypeNSMutableStringObject,
5456

5557
mdTypeClass,
5658
mdTypeSelector,

metadata-generator/src/MetadataWriter/TypeSpec.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ MDTypeInfo* MDMetadataWriter::getTypeInfo(TypeSpec& type) {
115115
} else {
116116
if (type.className == "NSString") {
117117
info->kind = mdTypeNSStringObject;
118+
} else if (type.className == "NSMutableString") {
119+
info->kind = mdTypeNSMutableStringObject;
118120
} else if (factory.classes.contains(type.className)) {
119121
info->kind = mdTypeClassObject;
120122
MDResolvable res{type.className, &info->classOffset};
@@ -395,6 +397,9 @@ std::string MDTypeInfoSerde::encode(MDTypeInfo* type) {
395397
case mdTypeNSStringObject:
396398
result = "@'NSString'";
397399
break;
400+
case mdTypeNSMutableStringObject:
401+
result = "@'NSMutableString'";
402+
break;
398403
case mdTypeInstanceObject:
399404
result = "@\"instancetype\"";
400405
break;

0 commit comments

Comments
 (0)