@@ -1489,6 +1489,30 @@ 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+ uint8_t * dst_data;
1498+ CHECK (dst.getStorageIfAligned (&dst_data));
1499+ CHECK (offset <= dst.length ());
1500+ CHECK (dst.length () - offset <= std::numeric_limits<uint32_t >::max ());
1501+
1502+ const auto size = std::min (
1503+ {static_cast <uint32_t >(dst.length () - offset), max_length, src.length });
1504+
1505+ if (simdutf::validate_utf8 (src.data , size)) {
1506+ memcpy (dst_data + offset, src.data , size);
1507+ } else {
1508+ // TODO (fix): Fallback to SlowWriteString
1509+ }
1510+
1511+ return size;
1512+ }
1513+
1514+ static v8::CFunction fast_write_string_utf8 (v8::CFunction::Make(FastWriteStringUTF8));
1515+
14921516void Initialize (Local<Object> target,
14931517 Local<Value> unused,
14941518 Local<Context> context,
@@ -1568,7 +1592,7 @@ void Initialize(Local<Object> target,
15681592 target,
15691593 " utf8WriteStatic" ,
15701594 SlowWriteString<UTF8>,
1571- &fast_write_string );
1595+ &fast_write_string_utf8 );
15721596
15731597 SetMethod (context, target, " getZeroFillToggle" , GetZeroFillToggle);
15741598}
@@ -1615,6 +1639,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
16151639 registry->Register (SlowWriteString<UTF8>);
16161640 registry->Register (fast_write_string.GetTypeInfo ());
16171641 registry->Register (FastWriteString);
1642+ registry->Register (fast_write_string_utf8.GetTypeInfo ());
1643+ registry->Register (FastWriteStringUTF8);
16181644 registry->Register (StringWrite<ASCII>);
16191645 registry->Register (StringWrite<BASE64>);
16201646 registry->Register (StringWrite<BASE64URL>);
0 commit comments