Skip to content

Commit f3ff14e

Browse files
committed
fixup: fast call
1 parent ce07761 commit f3ff14e

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

lib/buffer.js

+4-10
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const {
5858
byteLengthUtf8,
5959
compare: _compare,
6060
compareOffset,
61-
copyArrayBuffer,
61+
copy: _copy,
6262
createFromString,
6363
fill: bindingFill,
6464
isAscii: bindingIsAscii,
@@ -204,7 +204,7 @@ function toInteger(n, defaultVal) {
204204
return defaultVal;
205205
}
206206

207-
function _copy(source, target, targetStart, sourceStart, sourceEnd) {
207+
function copyImpl(source, target, targetStart, sourceStart, sourceEnd) {
208208
if (!isUint8Array(source))
209209
throw new ERR_INVALID_ARG_TYPE('source', ['Buffer', 'Uint8Array'], source);
210210
if (!isUint8Array(target))
@@ -253,13 +253,7 @@ function _copyActual(source, target, targetStart, sourceStart, sourceEnd) {
253253
return 0;
254254

255255
if (sourceStart !== 0 || sourceEnd < source.length) {
256-
copyArrayBuffer(
257-
target.buffer,
258-
target.byteOffset + targetStart,
259-
source.buffer,
260-
source.byteOffset + sourceStart,
261-
nb,
262-
);
256+
_copy(source, target, targetStart, sourceStart, sourceEnd);
263257
} else {
264258
TypedArrayPrototypeSet(target, source, targetStart);
265259
}
@@ -816,7 +810,7 @@ ObjectDefineProperty(Buffer.prototype, 'offset', {
816810

817811
Buffer.prototype.copy =
818812
function copy(target, targetStart, sourceStart, sourceEnd) {
819-
return _copy(this, target, targetStart, sourceStart, sourceEnd);
813+
return copyImpl(this, target, targetStart, sourceStart, sourceEnd);
820814
};
821815

822816
// No need to verify that "buf.length <= MAX_UINT32" since it's a read-only

src/node_buffer.cc

+32-2
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ void StringSlice(const FunctionCallbackInfo<Value>& args) {
569569
}
570570

571571
// bytesCopied = copy(buffer, target[, targetStart][, sourceStart][, sourceEnd])
572-
void Copy(const FunctionCallbackInfo<Value> &args) {
572+
void SlowCopy(const FunctionCallbackInfo<Value> &args) {
573573
Environment* env = Environment::GetCurrent(args);
574574

575575
THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
@@ -606,6 +606,34 @@ void Copy(const FunctionCallbackInfo<Value> &args) {
606606
args.GetReturnValue().Set(to_copy);
607607
}
608608

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));
609637

610638
void Fill(const FunctionCallbackInfo<Value>& args) {
611639
Environment* env = Environment::GetCurrent(args);
@@ -1275,7 +1303,7 @@ void Initialize(Local<Object> target,
12751303
"byteLengthUtf8",
12761304
SlowByteLengthUtf8,
12771305
&fast_byte_length_utf8);
1278-
SetMethod(context, target, "copy", Copy);
1306+
SetFastMethod(context, target, "copy", SlowCopy, &fast_copy);
12791307
SetMethodNoSideEffect(context, target, "compare", Compare);
12801308
SetMethodNoSideEffect(context, target, "compareOffset", CompareOffset);
12811309
SetMethod(context, target, "fill", Fill);
@@ -1335,6 +1363,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
13351363
registry->Register(fast_byte_length_utf8.GetTypeInfo());
13361364
registry->Register(FastByteLengthUtf8);
13371365
registry->Register(Copy);
1366+
registry->Register(FastCopy);
1367+
registry->Register(fast_copy.GetTypeInfo());
13381368
registry->Register(Compare);
13391369
registry->Register(CompareOffset);
13401370
registry->Register(Fill);

0 commit comments

Comments
 (0)