@@ -49,7 +49,6 @@ using v8::Context;
49
49
using v8::Function;
50
50
using v8::FunctionCallbackInfo;
51
51
using v8::FunctionTemplate;
52
- using v8::Global;
53
52
using v8::HandleScope;
54
53
using v8::Int32;
55
54
using v8::Integer;
@@ -107,8 +106,8 @@ enum node_zlib_mode {
107
106
BROTLI_ENCODE
108
107
};
109
108
110
- # define GZIP_HEADER_ID1 0x1f
111
- # define GZIP_HEADER_ID2 0x8b
109
+ constexpr uint8_t GZIP_HEADER_ID1 = 0x1f ;
110
+ constexpr uint8_t GZIP_HEADER_ID2 = 0x8b ;
112
111
113
112
struct CompressionError {
114
113
CompressionError (const char * message, const char * code, int err)
@@ -127,14 +126,14 @@ struct CompressionError {
127
126
inline bool IsError () const { return code != nullptr ; }
128
127
};
129
128
130
- class ZlibContext : public MemoryRetainer {
129
+ class ZlibContext final : public MemoryRetainer {
131
130
public:
132
131
ZlibContext () = default ;
133
132
134
133
// Streaming-related, should be available for all compression libraries:
135
134
void Close ();
136
135
void DoThreadPoolWork ();
137
- void SetBuffers (char * in, uint32_t in_len, char * out, uint32_t out_len);
136
+ void SetBuffers (const char * in, uint32_t in_len, char * out, uint32_t out_len);
138
137
void SetFlush (int flush);
139
138
void GetAfterWriteOffsets (uint32_t * avail_in, uint32_t * avail_out) const ;
140
139
CompressionError GetErrorInfo () const ;
@@ -183,7 +182,7 @@ class BrotliContext : public MemoryRetainer {
183
182
public:
184
183
BrotliContext () = default ;
185
184
186
- void SetBuffers (char * in, uint32_t in_len, char * out, uint32_t out_len);
185
+ void SetBuffers (const char * in, uint32_t in_len, char * out, uint32_t out_len);
187
186
void SetFlush (int flush);
188
187
void GetAfterWriteOffsets (uint32_t * avail_in, uint32_t * avail_out) const ;
189
188
inline void SetMode (node_zlib_mode mode) { mode_ = mode; }
@@ -193,7 +192,7 @@ class BrotliContext : public MemoryRetainer {
193
192
194
193
protected:
195
194
node_zlib_mode mode_ = NONE;
196
- uint8_t * next_in_ = nullptr ;
195
+ const uint8_t * next_in_ = nullptr ;
197
196
uint8_t * next_out_ = nullptr ;
198
197
size_t avail_in_ = 0 ;
199
198
size_t avail_out_ = 0 ;
@@ -251,6 +250,12 @@ class BrotliDecoderContext final : public BrotliContext {
251
250
template <typename CompressionContext>
252
251
class CompressionStream : public AsyncWrap , public ThreadPoolWork {
253
252
public:
253
+ enum InternalFields {
254
+ kCompressionStreamBaseField = AsyncWrap::kInternalFieldCount ,
255
+ kWriteJSCallback ,
256
+ kInternalFieldCount
257
+ };
258
+
254
259
CompressionStream (Environment* env, Local<Object> wrap)
255
260
: AsyncWrap(env, wrap, AsyncWrap::PROVIDER_ZLIB),
256
261
ThreadPoolWork (env),
@@ -259,7 +264,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
259
264
}
260
265
261
266
~CompressionStream () override {
262
- CHECK_EQ ( false , write_in_progress_ && " write in progress " );
267
+ CHECK (! write_in_progress_);
263
268
Close ();
264
269
CHECK_EQ (zlib_memory_, 0 );
265
270
CHECK_EQ (unreported_allocations_, 0 );
@@ -295,7 +300,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
295
300
CHECK_EQ (args.Length (), 7 );
296
301
297
302
uint32_t in_off, in_len, out_off, out_len, flush;
298
- char * in;
303
+ const char * in;
299
304
char * out;
300
305
301
306
CHECK_EQ (false , args[0 ]->IsUndefined () && " must provide flush value" );
@@ -340,7 +345,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
340
345
341
346
template <bool async>
342
347
void Write (uint32_t flush,
343
- char * in, uint32_t in_len,
348
+ const char * in, uint32_t in_len,
344
349
char * out, uint32_t out_len) {
345
350
AllocScope alloc_scope (this );
346
351
@@ -394,6 +399,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
394
399
395
400
// v8 land!
396
401
void AfterThreadPoolWork (int status) override {
402
+ DCHECK (init_done_);
397
403
AllocScope alloc_scope (this );
398
404
auto on_scope_leave = OnScopeLeave ([&]() { Unref (); });
399
405
@@ -416,9 +422,8 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
416
422
UpdateWriteResult ();
417
423
418
424
// call the write() cb
419
- Local<Function> cb = PersistentToLocal::Default (env->isolate (),
420
- write_js_callback_);
421
- MakeCallback (cb, 0 , nullptr );
425
+ Local<Value> cb = object ()->GetInternalField (kWriteJSCallback );
426
+ MakeCallback (cb.As <Function>(), 0 , nullptr );
422
427
423
428
if (pending_close_)
424
429
Close ();
@@ -431,7 +436,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
431
436
CHECK_EQ (env->context (), env->isolate ()->GetCurrentContext ());
432
437
433
438
HandleScope scope (env->isolate ());
434
- Local<Value> args[3 ] = {
439
+ Local<Value> args[] = {
435
440
OneByteString (env->isolate (), err.message ),
436
441
Integer::New (env->isolate (), err.err ),
437
442
OneByteString (env->isolate (), err.code )
@@ -465,7 +470,7 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
465
470
466
471
void InitStream (uint32_t * write_result, Local<Function> write_js_callback) {
467
472
write_result_ = write_result;
468
- write_js_callback_. Reset ( AsyncWrap::env ( )->isolate () , write_js_callback);
473
+ object ( )->SetInternalField ( kWriteJSCallback , write_js_callback);
469
474
init_done_ = true ;
470
475
}
471
476
@@ -540,14 +545,13 @@ class CompressionStream : public AsyncWrap, public ThreadPoolWork {
540
545
bool closed_ = false ;
541
546
unsigned int refs_ = 0 ;
542
547
uint32_t * write_result_ = nullptr ;
543
- Global<Function> write_js_callback_;
544
548
std::atomic<ssize_t > unreported_allocations_{0 };
545
549
size_t zlib_memory_ = 0 ;
546
550
547
551
CompressionContext ctx_;
548
552
};
549
553
550
- class ZlibStream : public CompressionStream <ZlibContext> {
554
+ class ZlibStream final : public CompressionStream<ZlibContext> {
551
555
public:
552
556
ZlibStream (Environment* env, Local<Object> wrap, node_zlib_mode mode)
553
557
: CompressionStream(env, wrap) {
@@ -646,7 +650,8 @@ class ZlibStream : public CompressionStream<ZlibContext> {
646
650
};
647
651
648
652
template <typename CompressionContext>
649
- class BrotliCompressionStream : public CompressionStream <CompressionContext> {
653
+ class BrotliCompressionStream final :
654
+ public CompressionStream<CompressionContext> {
650
655
public:
651
656
BrotliCompressionStream (Environment* env,
652
657
Local<Object> wrap,
@@ -857,10 +862,10 @@ void ZlibContext::DoThreadPoolWork() {
857
862
}
858
863
859
864
860
- void ZlibContext::SetBuffers (char * in, uint32_t in_len,
865
+ void ZlibContext::SetBuffers (const char * in, uint32_t in_len,
861
866
char * out, uint32_t out_len) {
862
867
strm_.avail_in = in_len;
863
- strm_.next_in = reinterpret_cast <Bytef*>(in);
868
+ strm_.next_in = const_cast <Bytef*>( reinterpret_cast <const Bytef*>(in) );
864
869
strm_.avail_out = out_len;
865
870
strm_.next_out = reinterpret_cast <Bytef*>(out);
866
871
}
@@ -1093,9 +1098,9 @@ CompressionError ZlibContext::SetParams(int level, int strategy) {
1093
1098
}
1094
1099
1095
1100
1096
- void BrotliContext::SetBuffers (char * in, uint32_t in_len,
1101
+ void BrotliContext::SetBuffers (const char * in, uint32_t in_len,
1097
1102
char * out, uint32_t out_len) {
1098
- next_in_ = reinterpret_cast <uint8_t *>(in);
1103
+ next_in_ = reinterpret_cast <const uint8_t *>(in);
1099
1104
next_out_ = reinterpret_cast <uint8_t *>(out);
1100
1105
avail_in_ = in_len;
1101
1106
avail_out_ = out_len;
0 commit comments