3131#include " util-inl.h"
3232
3333#include " v8.h"
34+ #include " v8-fast-api-calls.h"
35+ #include " node_debug.h"
3436
3537#include " brotli/decode.h"
3638#include " brotli/encode.h"
@@ -49,6 +51,7 @@ namespace node {
4951
5052using v8::ArrayBuffer;
5153using v8::Context;
54+ using v8::CFunction;
5255using v8::Function;
5356using v8::FunctionCallbackInfo;
5457using v8::FunctionTemplate;
@@ -1657,7 +1660,6 @@ T CallOnSequence(v8::Isolate* isolate, Local<Value> value, F callback) {
16571660 }
16581661}
16591662
1660- // TODO(joyeecheung): use fast API
16611663static void CRC32 (const FunctionCallbackInfo<Value>& args) {
16621664 CHECK (args[0 ]->IsArrayBufferView () || args[0 ]->IsString ());
16631665 CHECK (args[1 ]->IsUint32 ());
@@ -1673,6 +1675,31 @@ static void CRC32(const FunctionCallbackInfo<Value>& args) {
16731675 args.GetReturnValue ().Set (result);
16741676}
16751677
1678+ static uint32_t FastCRC32 (v8::Local<v8::Value> receiver,
1679+ v8::Local<v8::Value> data,
1680+ uint32_t value,
1681+ // NOLINTNEXTLINE(runtime/references)
1682+ v8::FastApiCallbackOptions& options) {
1683+ TRACK_V8_FAST_API_CALL (" zlib.crc32" );
1684+ v8::HandleScope handle_scope (options.isolate );
1685+ CHECK (data->IsArrayBufferView () || data->IsString ());
1686+ if (data->IsArrayBufferView ()) {
1687+ SPREAD_BUFFER_ARG (data, buf);
1688+ return static_cast <uint32_t >(
1689+ crc32 (value,
1690+ reinterpret_cast <const Bytef*>(buf_data),
1691+ buf_length));
1692+ }
1693+ v8::Local<v8::String> s = data.As <v8::String>();
1694+ Utf8Value utf8 (options.isolate , s);
1695+ return static_cast <uint32_t >(
1696+ crc32 (value,
1697+ reinterpret_cast <const Bytef*>(utf8.out ()),
1698+ utf8.length ()));
1699+ }
1700+
1701+ static CFunction fast_crc32_ (CFunction::Make(FastCRC32));
1702+
16761703void Initialize (Local<Object> target,
16771704 Local<Value> unused,
16781705 Local<Context> context,
@@ -1685,7 +1712,7 @@ void Initialize(Local<Object> target,
16851712 MakeClass<ZstdCompressStream>::Make (env, target, " ZstdCompress" );
16861713 MakeClass<ZstdDecompressStream>::Make (env, target, " ZstdDecompress" );
16871714
1688- SetMethod (context, target, " crc32" , CRC32);
1715+ SetFastMethodNoSideEffect (context, target, " crc32" , CRC32, &fast_crc32_ );
16891716 target->Set (env->context (),
16901717 FIXED_ONE_BYTE_STRING (env->isolate (), " ZLIB_VERSION" ),
16911718 FIXED_ONE_BYTE_STRING (env->isolate (), ZLIB_VERSION)).Check ();
@@ -1698,6 +1725,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
16981725 MakeClass<ZstdCompressStream>::Make (registry);
16991726 MakeClass<ZstdDecompressStream>::Make (registry);
17001727 registry->Register (CRC32);
1728+ registry->Register (fast_crc32_);
17011729}
17021730
17031731} // anonymous namespace
0 commit comments