@@ -1489,6 +1489,32 @@ uint32_t FastWriteString(Local<Value> receiver,
14891489
14901490static v8::CFunction fast_write_string (v8::CFunction::Make(FastWriteString));
14911491
1492+ uint32_t FastWriteStringUTF8 (Local<Value> receiver,
1493+ const v8::FastApiTypedArray<uint8_t >& dst,
1494+ const v8::FastOneByteString& src,
1495+ uint32_t offset,
1496+ uint32_t max_length,
1497+ v8::FastApiCallbackOptions& options) {
1498+ uint8_t * dst_data;
1499+ CHECK (dst.getStorageIfAligned (&dst_data));
1500+ CHECK (offset <= dst.length ());
1501+ CHECK (dst.length () - offset <= std::numeric_limits<uint32_t >::max ());
1502+
1503+ const auto size = std::min (
1504+ {static_cast <uint32_t >(dst.length () - offset), max_length, src.length });
1505+
1506+ if (!simdutf::validate_utf8 (src.data , size)) {
1507+ options.fallback = true ;
1508+ return 0 ;
1509+ }
1510+
1511+ memcpy (dst_data + offset, src.data , size);
1512+
1513+ return size;
1514+ }
1515+
1516+ static v8::CFunction fast_write_string_utf8 (v8::CFunction::Make(FastWriteStringUTF8));
1517+
14921518void Initialize (Local<Object> target,
14931519 Local<Value> unused,
14941520 Local<Context> context,
@@ -1568,7 +1594,7 @@ void Initialize(Local<Object> target,
15681594 target,
15691595 " utf8WriteStatic" ,
15701596 SlowWriteString<UTF8>,
1571- &fast_write_string );
1597+ &fast_write_string_utf8 );
15721598
15731599 SetMethod (context, target, " getZeroFillToggle" , GetZeroFillToggle);
15741600}
@@ -1615,6 +1641,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
16151641 registry->Register (SlowWriteString<UTF8>);
16161642 registry->Register (fast_write_string.GetTypeInfo ());
16171643 registry->Register (FastWriteString);
1644+ registry->Register (fast_write_string_utf8.GetTypeInfo ());
1645+ registry->Register (FastWriteStringUTF8);
16181646 registry->Register (StringWrite<ASCII>);
16191647 registry->Register (StringWrite<BASE64>);
16201648 registry->Register (StringWrite<BASE64URL>);
0 commit comments