diff --git a/src/ffi/platforms/arm64.cc b/src/ffi/platforms/arm64.cc index df215ecafed3..8ff0f1c959d1 100644 --- a/src/ffi/platforms/arm64.cc +++ b/src/ffi/platforms/arm64.cc @@ -243,6 +243,11 @@ extern "C" bool node_ffi_create_fast_trampoline( if (IsFloatType(args[i])) { fp_count++; } else { + // The buffer helper call clobbers target registers already loaded for + // earlier arguments, so only a leading buffer argument is supported. + if (IsPointerValueType(args[i]) && gp_count != 0) { + return false; + } gp_count++; has_buffer_args = has_buffer_args || IsPointerValueType(args[i]); } diff --git a/src/ffi/platforms/x64.cc b/src/ffi/platforms/x64.cc index d5c15c381574..0167bc7b5aac 100644 --- a/src/ffi/platforms/x64.cc +++ b/src/ffi/platforms/x64.cc @@ -367,6 +367,11 @@ extern "C" bool node_ffi_create_fast_trampoline( if (IsFloatType(args[i])) { fp_count++; } else { + // The buffer helper call clobbers target registers already loaded for + // earlier arguments, so only a leading buffer argument is supported. + if (IsPointerValueType(args[i]) && gp_count != 0) { + return false; + } gp_count++; has_buffer_args = has_buffer_args || IsPointerValueType(args[i]); }