30
30
#include " threadpoolwork-inl.h"
31
31
#include " util-inl.h"
32
32
33
+ #include " node_debug.h"
34
+ #include " v8-fast-api-calls.h"
33
35
#include " v8.h"
34
36
35
37
#include " brotli/decode.h"
48
50
namespace node {
49
51
50
52
using v8::ArrayBuffer;
53
+ using v8::CFunction;
51
54
using v8::Context;
52
55
using v8::Function;
53
56
using v8::FunctionCallbackInfo;
@@ -1657,22 +1660,35 @@ T CallOnSequence(v8::Isolate* isolate, Local<Value> value, F callback) {
1657
1660
}
1658
1661
}
1659
1662
1660
- // TODO(joyeecheung): use fast API
1663
+ static inline uint32_t CRC32Impl (Isolate* isolate,
1664
+ Local<Value> data,
1665
+ uint32_t value) {
1666
+ return CallOnSequence<uint32_t >(
1667
+ isolate, data, [&](const char * ptr, size_t size) -> uint32_t {
1668
+ return static_cast <uint32_t >(
1669
+ crc32 (value, reinterpret_cast <const Bytef*>(ptr), size));
1670
+ });
1671
+ }
1672
+
1661
1673
static void CRC32 (const FunctionCallbackInfo<Value>& args) {
1662
1674
CHECK (args[0 ]->IsArrayBufferView () || args[0 ]->IsString ());
1663
1675
CHECK (args[1 ]->IsUint32 ());
1664
1676
uint32_t value = args[1 ].As <v8::Uint32>()->Value ();
1677
+ args.GetReturnValue ().Set (CRC32Impl (args.GetIsolate (), args[0 ], value));
1678
+ }
1665
1679
1666
- uint32_t result = CallOnSequence< uint32_t >(
1667
- args. GetIsolate () ,
1668
- args[ 0 ] ,
1669
- [&]( const char * data, size_t size) -> uint32_t {
1670
- return crc32 (value, reinterpret_cast < const Bytef*>(data), size);
1671
- } );
1672
-
1673
- args. GetReturnValue (). Set (result );
1680
+ static uint32_t FastCRC32 (v8::Local<v8::Value> receiver,
1681
+ v8::Local<v8::Value> data ,
1682
+ uint32_t value ,
1683
+ // NOLINTNEXTLINE(runtime/references)
1684
+ v8::FastApiCallbackOptions& options) {
1685
+ TRACK_V8_FAST_API_CALL ( " zlib.crc32 " );
1686
+ v8::HandleScope handle_scope (options. isolate );
1687
+ return CRC32Impl (options. isolate , data, value );
1674
1688
}
1675
1689
1690
+ static CFunction fast_crc32_ (CFunction::Make(FastCRC32));
1691
+
1676
1692
void Initialize (Local<Object> target,
1677
1693
Local<Value> unused,
1678
1694
Local<Context> context,
@@ -1685,7 +1701,7 @@ void Initialize(Local<Object> target,
1685
1701
MakeClass<ZstdCompressStream>::Make (env, target, " ZstdCompress" );
1686
1702
MakeClass<ZstdDecompressStream>::Make (env, target, " ZstdDecompress" );
1687
1703
1688
- SetMethod (context, target, " crc32" , CRC32);
1704
+ SetFastMethodNoSideEffect (context, target, " crc32" , CRC32, &fast_crc32_ );
1689
1705
target->Set (env->context (),
1690
1706
FIXED_ONE_BYTE_STRING (env->isolate (), " ZLIB_VERSION" ),
1691
1707
FIXED_ONE_BYTE_STRING (env->isolate (), ZLIB_VERSION)).Check ();
@@ -1698,6 +1714,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
1698
1714
MakeClass<ZstdCompressStream>::Make (registry);
1699
1715
MakeClass<ZstdDecompressStream>::Make (registry);
1700
1716
registry->Register (CRC32);
1717
+ registry->Register (fast_crc32_);
1701
1718
}
1702
1719
1703
1720
} // anonymous namespace
0 commit comments