@@ -569,7 +569,7 @@ void StringSlice(const FunctionCallbackInfo<Value>& args) {
569
569
}
570
570
571
571
// bytesCopied = copy(buffer, target[, targetStart][, sourceStart][, sourceEnd])
572
- void Copy (const FunctionCallbackInfo<Value> &args) {
572
+ void SlowCopy (const FunctionCallbackInfo<Value> &args) {
573
573
Environment* env = Environment::GetCurrent (args);
574
574
575
575
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
@@ -606,6 +606,34 @@ void Copy(const FunctionCallbackInfo<Value> &args) {
606
606
args.GetReturnValue ().Set (to_copy);
607
607
}
608
608
609
+ uint32_t FastCopy (Local<Value> receiver,
610
+ const v8::FastApiArrayBufferView& source,
611
+ v8::FastApiArrayBufferView& target,
612
+ uint32_t target_start,
613
+ uint32_t source_start,
614
+ uint32_t source_end,
615
+ v8::FastApiCallbackOptions& options) {
616
+ // Copy 0 bytes; we're done
617
+ if (target_start >= target.byte_length || source_start >= source_end)
618
+ return 0 ;
619
+
620
+ assert (source_start <= source_end);
621
+
622
+ if (source_end - source_start > target.byte_length - target_start)
623
+ source_end = source_start + target.byte_length - target_start;
624
+
625
+ uint32_t to_copy = std::min<size_t >(
626
+ std::min<size_t >(source_end - source_start, target.byte_length - target_start),
627
+ source.byte_length - source_start);
628
+
629
+ memmove (reinterpret_cast <char *>(target.data ) + target_start,
630
+ reinterpret_cast <char *>(source.data ) + source_start, to_copy);
631
+
632
+ return to_copy;
633
+ }
634
+
635
+ static v8::CFunction fast_copy (
636
+ v8::CFunction::Make (FastCopy));
609
637
610
638
void Fill (const FunctionCallbackInfo<Value>& args) {
611
639
Environment* env = Environment::GetCurrent (args);
@@ -1275,7 +1303,7 @@ void Initialize(Local<Object> target,
1275
1303
" byteLengthUtf8" ,
1276
1304
SlowByteLengthUtf8,
1277
1305
&fast_byte_length_utf8);
1278
- SetMethod (context, target, " copy" , Copy );
1306
+ SetFastMethod (context, target, " copy" , SlowCopy, &fast_copy );
1279
1307
SetMethodNoSideEffect (context, target, " compare" , Compare);
1280
1308
SetMethodNoSideEffect (context, target, " compareOffset" , CompareOffset);
1281
1309
SetMethod (context, target, " fill" , Fill);
@@ -1335,6 +1363,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
1335
1363
registry->Register (fast_byte_length_utf8.GetTypeInfo ());
1336
1364
registry->Register (FastByteLengthUtf8);
1337
1365
registry->Register (Copy);
1366
+ registry->Register (FastCopy);
1367
+ registry->Register (fast_copy.GetTypeInfo ());
1338
1368
registry->Register (Compare);
1339
1369
registry->Register (CompareOffset);
1340
1370
registry->Register (Fill);
0 commit comments