55#include " node_external_reference.h"
66#include " node_i18n.h"
77#include " util-inl.h"
8+ #include " v8-fast-api-calls.h"
89#include " v8.h"
910
1011#include < cstdint>
1415namespace node {
1516namespace url {
1617
18+ using v8::CFunction;
1719using v8::Context;
20+ using v8::FastOneByteString;
1821using v8::FunctionCallbackInfo;
1922using v8::HandleScope;
2023using v8::Isolate;
@@ -113,7 +116,6 @@ void BindingData::DomainToUnicode(const FunctionCallbackInfo<Value>& args) {
113116 .ToLocalChecked ());
114117}
115118
116- // TODO(@anonrig): Add V8 Fast API for CanParse method
117119void BindingData::CanParse (const FunctionCallbackInfo<Value>& args) {
118120 CHECK_GE (args.Length (), 1 );
119121 CHECK (args[0 ]->IsString ()); // input
@@ -140,6 +142,17 @@ void BindingData::CanParse(const FunctionCallbackInfo<Value>& args) {
140142 args.GetReturnValue ().Set (out.has_value ());
141143}
142144
145+ bool BindingData::FastCanParse (Local<Value> receiver,
146+ const FastOneByteString& input) {
147+ std::string_view input_view (input.data , input.length );
148+
149+ auto output = ada::parse<ada::url_aggregator>(input_view);
150+
151+ return output.has_value ();
152+ }
153+
154+ CFunction BindingData::fast_can_parse_ (CFunction::Make(FastCanParse));
155+
143156void BindingData::Format (const FunctionCallbackInfo<Value>& args) {
144157 CHECK_GT (args.Length (), 4 );
145158 CHECK (args[0 ]->IsString ()); // url href
@@ -320,20 +333,23 @@ void BindingData::Initialize(Local<Object> target,
320333
321334 SetMethodNoSideEffect (context, target, " domainToASCII" , DomainToASCII);
322335 SetMethodNoSideEffect (context, target, " domainToUnicode" , DomainToUnicode);
323- SetMethodNoSideEffect (context, target, " canParse" , CanParse);
324336 SetMethodNoSideEffect (context, target, " format" , Format);
325337 SetMethod (context, target, " parse" , Parse);
326338 SetMethod (context, target, " update" , Update);
339+ SetFastMethodNoSideEffect (
340+ context, target, " canParse" , CanParse, &fast_can_parse_);
327341}
328342
329343void BindingData::RegisterExternalReferences (
330344 ExternalReferenceRegistry* registry) {
331345 registry->Register (DomainToASCII);
332346 registry->Register (DomainToUnicode);
333- registry->Register (CanParse);
334347 registry->Register (Format);
335348 registry->Register (Parse);
336349 registry->Register (Update);
350+ registry->Register (CanParse);
351+ registry->Register (FastCanParse);
352+ registry->Register (fast_can_parse_.GetTypeInfo ());
337353}
338354
339355std::string FromFilePath (const std::string_view file_path) {
0 commit comments