@@ -1442,6 +1442,52 @@ void CopyArrayBuffer(const FunctionCallbackInfo<Value>& args) {
1442
1442
memcpy (dest, src, bytes_to_copy);
1443
1443
}
1444
1444
1445
+ template <encoding encoding>
1446
+ void SlowWriteString (const FunctionCallbackInfo<Value>& args) {
1447
+ Environment* env = Environment::GetCurrent (args);
1448
+
1449
+ THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1450
+ SPREAD_BUFFER_ARG (args[0 ], ts_obj);
1451
+
1452
+ THROW_AND_RETURN_IF_NOT_STRING (env, args[1 ], " argument" );
1453
+
1454
+ Local<String> str = args[1 ]->ToString (env->context ()).ToLocalChecked ();
1455
+
1456
+ size_t offset = 0 ;
1457
+ size_t max_length = 0 ;
1458
+
1459
+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[2 ], 0 , &offset));
1460
+ THROW_AND_RETURN_IF_OOB (
1461
+ ParseArrayIndex (env, args[3 ], ts_obj_length - offset, &max_length));
1462
+
1463
+ max_length = std::min (ts_obj_length - offset, max_length);
1464
+
1465
+ if (max_length == 0 ) return args.GetReturnValue ().Set (0 );
1466
+
1467
+ uint32_t written = StringBytes::Write (
1468
+ env->isolate (), ts_obj_data + offset, max_length, str, encoding);
1469
+ args.GetReturnValue ().Set (written);
1470
+ }
1471
+
1472
+ uint32_t FastWriteString (Local<Value> receiver,
1473
+ const v8::FastApiTypedArray<uint8_t >& dst,
1474
+ const v8::FastOneByteString& src,
1475
+ uint32_t offset,
1476
+ uint32_t max_length) {
1477
+ uint8_t * dst_data;
1478
+ CHECK (dst.getStorageIfAligned (&dst_data));
1479
+ CHECK (offset <= dst.length ());
1480
+ CHECK (dst.length () - offset <= std::numeric_limits<uint32_t >::max ());
1481
+
1482
+ max_length = std::min<uint32_t >(dst.length () - offset, max_length);
1483
+
1484
+ memcpy (dst_data, src.data , max_length);
1485
+
1486
+ return max_length;
1487
+ }
1488
+
1489
+ static v8::CFunction fast_write_string (v8::CFunction::Make(FastWriteString));
1490
+
1445
1491
void Initialize (Local<Object> target,
1446
1492
Local<Value> unused,
1447
1493
Local<Context> context,
@@ -1502,13 +1548,26 @@ void Initialize(Local<Object> target,
1502
1548
SetMethodNoSideEffect (context, target, " ucs2Slice" , StringSlice<UCS2>);
1503
1549
SetMethodNoSideEffect (context, target, " utf8Slice" , StringSlice<UTF8>);
1504
1550
1505
- SetMethod (context, target, " asciiWrite" , StringWrite<ASCII>);
1506
1551
SetMethod (context, target, " base64Write" , StringWrite<BASE64>);
1507
1552
SetMethod (context, target, " base64urlWrite" , StringWrite<BASE64URL>);
1508
- SetMethod (context, target, " latin1Write" , StringWrite<LATIN1>);
1509
1553
SetMethod (context, target, " hexWrite" , StringWrite<HEX>);
1510
1554
SetMethod (context, target, " ucs2Write" , StringWrite<UCS2>);
1511
- SetMethod (context, target, " utf8Write" , StringWrite<UTF8>);
1555
+
1556
+ SetFastMethod (context,
1557
+ target,
1558
+ " asciiWriteStatic" ,
1559
+ SlowWriteString<ASCII>,
1560
+ &fast_write_string);
1561
+ SetFastMethod (context,
1562
+ target,
1563
+ " latin1WriteStatic" ,
1564
+ SlowWriteString<LATIN1>,
1565
+ &fast_write_string);
1566
+ SetFastMethod (context,
1567
+ target,
1568
+ " utf8WriteStatic" ,
1569
+ SlowWriteString<UTF8>,
1570
+ &fast_write_string);
1512
1571
1513
1572
SetMethod (context, target, " getZeroFillToggle" , GetZeroFillToggle);
1514
1573
}
@@ -1550,6 +1609,11 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
1550
1609
registry->Register (StringSlice<UCS2>);
1551
1610
registry->Register (StringSlice<UTF8>);
1552
1611
1612
+ registry->Register (SlowWriteString<ASCII>);
1613
+ registry->Register (SlowWriteString<LATIN1>);
1614
+ registry->Register (SlowWriteString<UTF8>);
1615
+ registry->Register (fast_write_string.GetTypeInfo ());
1616
+ registry->Register (FastWriteString);
1553
1617
registry->Register (StringWrite<ASCII>);
1554
1618
registry->Register (StringWrite<BASE64>);
1555
1619
registry->Register (StringWrite<BASE64URL>);
0 commit comments