diff --git a/deps/zlib/zlib.gyp b/deps/zlib/zlib.gyp index fac801c7cbf362..cf0b090d9ef0c4 100644 --- a/deps/zlib/zlib.gyp +++ b/deps/zlib/zlib.gyp @@ -13,14 +13,6 @@ 'target_name': 'zlib', 'type': 'static_library', 'sources': [ - 'contrib/minizip/ioapi.c', - 'contrib/minizip/ioapi.h', - 'contrib/minizip/iowin32.c', - 'contrib/minizip/iowin32.h', - 'contrib/minizip/unzip.c', - 'contrib/minizip/unzip.h', - 'contrib/minizip/zip.c', - 'contrib/minizip/zip.h', 'adler32.c', 'compress.c', 'crc32.c', @@ -50,8 +42,6 @@ ], 'include_dirs': [ '.', - # For contrib/minizip - './contrib/minizip', ], 'direct_dependent_settings': { 'include_dirs': [ @@ -60,11 +50,8 @@ }, 'conditions': [ ['OS!="win"', { - 'product_name': 'chrome_zlib', 'cflags!': [ '-ansi' ], - 'sources!': [ - 'contrib/minizip/iowin32.c' - ], + 'defines': [ 'Z_HAVE_UNISTD_H' ], }], ['OS=="mac" or OS=="ios" or OS=="freebsd" or OS=="android"', { # Mac, Android and the BSDs don't have fopen64, ftello64, or @@ -90,14 +77,6 @@ 'defines': [ 'USE_SYSTEM_ZLIB', ], - 'sources': [ - 'contrib/minizip/ioapi.c', - 'contrib/minizip/ioapi.h', - 'contrib/minizip/unzip.c', - 'contrib/minizip/unzip.h', - 'contrib/minizip/zip.c', - 'contrib/minizip/zip.h', - ], 'link_settings': { 'libraries': [ '-lz', diff --git a/lib/zlib.js b/lib/zlib.js index 724f9a37b6895e..7c0e47f614cb50 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -582,7 +582,7 @@ Zlib.prototype._processChunk = function(chunk, flushFlag, cb) { self._buffer = new Buffer(self._chunkSize); } - if (availOutAfter === 0 || availInAfter > 0) { + if (availOutAfter === 0) { // Not actually done. Need to reprocess. // Also, update the availInBefore to the availInAfter value, // so that if we have to hit it a third (fourth, etc.) time, @@ -590,13 +590,6 @@ Zlib.prototype._processChunk = function(chunk, flushFlag, cb) { inOff += (availInBefore - availInAfter); availInBefore = availInAfter; - if (availOutAfter !== 0) { - // There is still some data available for reading. - // This is usually a concatenated stream, so, reset and restart. - self.reset(); - self._offset = 0; - } - if (!async) return true; diff --git a/src/node.cc b/src/node.cc index 9ffaab895a16bd..e390058567d33f 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3355,6 +3355,14 @@ void Init(int* argc, DispatchDebugMessagesAsyncCallback); uv_unref(reinterpret_cast(&dispatch_debug_messages_async)); + // TODO(bnoordhuis) V8 3.32 is unshipping Harmony classes for the moment. + // We're currently at 3.31, disable classes for feature parity. Remove + // again when we upgrade. + V8::SetFlagsFromString("--noharmony_classes", + sizeof("--noharmony_classes") - 1); + V8::SetFlagsFromString("--noharmony_object_literals", + sizeof("--noharmony_object_literals") - 1); + #if defined(NODE_V8_OPTIONS) // Should come before the call to V8::SetFlagsFromCommandLine() // so the user can disable a flag --foo at run-time by passing diff --git a/src/node_zlib.cc b/src/node_zlib.cc index f59e60015a4915..81fab800aabc03 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -63,11 +63,6 @@ enum node_zlib_mode { UNZIP }; -enum node_zlib_error { - kNoError, - kFailed, - kWritePending -}; void InitZlib(v8::Handle target); @@ -208,7 +203,7 @@ class ZCtx : public AsyncWrap { if (!async) { // sync version Process(work_req); - if (CheckError(ctx) == kNoError) + if (CheckError(ctx)) AfterSync(ctx, args); return; } @@ -292,7 +287,7 @@ class ZCtx : public AsyncWrap { } - static node_zlib_error CheckError(ZCtx* ctx) { + static bool CheckError(ZCtx* ctx) { // Acceptable error states depend on the type of zlib stream. switch (ctx->err_) { case Z_OK: @@ -305,18 +300,14 @@ class ZCtx : public AsyncWrap { ZCtx::Error(ctx, "Missing dictionary"); else ZCtx::Error(ctx, "Bad dictionary"); - return kFailed; + return false; default: // something else. - if (ctx->strm_.total_out == 0) { - ZCtx::Error(ctx, "Zlib error"); - return kFailed; - } else { - return kWritePending; - } + ZCtx::Error(ctx, "Zlib error"); + return false; } - return kNoError; + return true; } @@ -330,8 +321,7 @@ class ZCtx : public AsyncWrap { HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); - node_zlib_error error = CheckError(ctx); - if (error == kFailed) + if (!CheckError(ctx)) return; Local avail_out = Integer::New(env->isolate(), @@ -345,11 +335,6 @@ class ZCtx : public AsyncWrap { Local args[2] = { avail_in, avail_out }; ctx->MakeCallback(env->callback_string(), ARRAY_SIZE(args), args); - if (error == kWritePending) { - ZCtx::Error(ctx, "Zlib error"); - return; - } - ctx->Unref(); if (ctx->pending_close_) ctx->Close(); @@ -554,12 +539,10 @@ class ZCtx : public AsyncWrap { switch (ctx->mode_) { case DEFLATE: case DEFLATERAW: - case GZIP: ctx->err_ = deflateReset(&ctx->strm_); break; case INFLATE: case INFLATERAW: - case GUNZIP: ctx->err_ = inflateReset(&ctx->strm_); break; default: diff --git a/test/parallel/test-v8-features.js b/test/parallel/test-v8-features.js new file mode 100644 index 00000000000000..aac9de4a29c2fc --- /dev/null +++ b/test/parallel/test-v8-features.js @@ -0,0 +1,31 @@ +var common = require('../common'); +var assert = require('assert'); +var spawnSync = require('child_process').spawnSync; +var v8 = require('v8'); + +// --harmony_classes implies --harmony_scoping; ensure that scoping still works +// when classes are disabled. +assert.throws(function() { eval('"use strict"; class C {}'); }, SyntaxError); +eval('"use strict"; let x = 42'); // Should not throw. +eval('"use strict"; const y = 42'); // Should not throw. + +v8.setFlagsFromString('--harmony_classes'); +eval('"use strict"; class C {}'); // Should not throw. +eval('"use strict"; let x = 42'); // Should not throw. +eval('"use strict"; const y = 42'); // Should not throw. + +// Verify that the --harmony_classes flag unlocks classes again. +var args = ['--harmony_classes', '--use_strict', '-p', 'class C {}']; +var cp = spawnSync(process.execPath, args); +assert.equal(cp.status, 0); +assert.equal(cp.stdout.toString('utf8').trim(), '[Function: C]'); + +// Now do the same for --harmony_object_literals. +assert.throws(function() { eval('({ f() {} })'); }, SyntaxError); +v8.setFlagsFromString('--harmony_object_literals'); +eval('({ f() {} })'); + +var args = ['--harmony_object_literals', '-p', '({ f() {} })']; +var cp = spawnSync(process.execPath, args); +assert.equal(cp.status, 0); +assert.equal(cp.stdout.toString('utf8').trim(), '{ f: [Function: f] }'); diff --git a/test/parallel/test-zlib-from-multiple-gzip-with-garbage.js b/test/parallel/test-zlib-from-multiple-gzip-with-garbage.js deleted file mode 100644 index f6a0185e0119d6..00000000000000 --- a/test/parallel/test-zlib-from-multiple-gzip-with-garbage.js +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// test unzipping a file that was created by concatenating multiple gzip -// streams. - -var common = require('../common'); -var assert = require('assert'); -var zlib = require('zlib'); - -var util = require('util'); - -var gzipBuffer = new Buffer(128); -var gzipOffset = 0; - -var stream1 = '123\n'; -var stream2 = '456\n'; -var stream3 = '789\n'; - -function gzipAppend(data) { - data.copy(gzipBuffer, gzipOffset); - gzipOffset += data.length; -} - -function writeGzipStream(text, cb) { - var gzip = zlib.createGzip(); - gzip.on('data', gzipAppend); - gzip.write(text, function() { - gzip.flush(function() { - gzip.end(function() { - cb(); - }); - }); - }); -} - -function writeGarbageStream(text, cb) { - gzipAppend(new Buffer(text)); - cb(); -} - -writeGzipStream(stream1, function() { - writeGzipStream(stream2, function() { - writeGarbageStream(stream3, function() { - var gunzip = zlib.createGunzip(); - var gunzippedData = new Buffer(2 * 1024); - var gunzippedOffset = 0; - gunzip.on('data', function (data) { - data.copy(gunzippedData, gunzippedOffset); - gunzippedOffset += data.length; - }); - gunzip.on('error', function() { - assert.equal(gunzippedData.toString('utf8', 0, gunzippedOffset), - stream1 + stream2); - }); - gunzip.on('end', function() { - assert.fail('end event not expected'); - }); - - gunzip.write(gzipBuffer.slice(0, gzipOffset), 'binary', function() { - gunzip.end(); - }); - }); - }); -}); diff --git a/test/parallel/test-zlib-from-multiple-gzip.js b/test/parallel/test-zlib-from-multiple-gzip.js deleted file mode 100644 index 6f4127a4d304c5..00000000000000 --- a/test/parallel/test-zlib-from-multiple-gzip.js +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// test unzipping a file that was created by concatenating multiple gzip -// streams. - -var common = require('../common'); -var assert = require('assert'); -var zlib = require('zlib'); - -var util = require('util'); - -var gzipBuffer = new Buffer(128); -var gzipOffset = 0; - -var stream1 = '123\n'; -var stream2 = '456\n'; -var stream3 = '789\n'; - -function gzipAppend(data) { - data.copy(gzipBuffer, gzipOffset); - gzipOffset += data.length; -} - -function writeGzipStream(text, cb) { - var gzip = zlib.createGzip(); - gzip.on('data', gzipAppend); - gzip.write(text, function() { - gzip.flush(function() { - gzip.end(function() { - cb(); - }); - }); - }); -} - -writeGzipStream(stream1, function() { - writeGzipStream(stream2, function() { - writeGzipStream(stream3, function() { - var gunzip = zlib.createGunzip(); - var gunzippedData = new Buffer(2 * 1024); - var gunzippedOffset = 0; - gunzip.on('data', function (data) { - data.copy(gunzippedData, gunzippedOffset); - gunzippedOffset += data.length; - }); - gunzip.on('end', function() { - assert.equal(gunzippedData.toString('utf8', 0, gunzippedOffset), stream1 + stream2 + stream3); - }); - - gunzip.write(gzipBuffer.slice(0, gzipOffset), 'binary', function() { - gunzip.end(); - }); - }); - }); -}); diff --git a/test/parallel/test-zlib-from-multiple-huge-gzip.js b/test/parallel/test-zlib-from-multiple-huge-gzip.js deleted file mode 100644 index 5533aafeb72f9a..00000000000000 --- a/test/parallel/test-zlib-from-multiple-huge-gzip.js +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// test unzipping a file that was created by concatenating multiple gzip -// streams. - -var common = require('../common'); -var assert = require('assert'); -var zlib = require('zlib'); - -var util = require('util'); - -var HUGE = 64 * 1024; - -var originalBuffer = new Buffer(3 * HUGE); -var originalOffset = 0; - -var gzipBuffer = new Buffer(3 * HUGE); -var gzipOffset = 0; - -function getRandomLetter() { - return (Math.random() * (122 - 97)) + 97; -} - -function generateHugeStream() { - var buffer = new Buffer(HUGE); - for (var i = 0; i < HUGE; i++) - buffer.writeUInt8(getRandomLetter(), i); - - buffer.copy(originalBuffer, originalOffset); - originalOffset += HUGE; - - return buffer; -} - -function gzipAppend(data) { - data.copy(gzipBuffer, gzipOffset); - gzipOffset += data.length; -} - -function writeGzipStream(text, cb) { - var gzip = zlib.createGzip(); - gzip.on('data', gzipAppend); - gzip.write(text, function() { - gzip.flush(function() { - gzip.end(function() { - cb(); - }); - }); - }); -} - -writeGzipStream(generateHugeStream(), function() { - writeGzipStream(generateHugeStream(), function() { - writeGzipStream(generateHugeStream(), function() { - var gunzip = zlib.createGunzip(); - var gunzippedData = new Buffer(3 * HUGE); - var gunzippedOffset = 0; - gunzip.on('data', function (data) { - data.copy(gunzippedData, gunzippedOffset); - gunzippedOffset += data.length; - }); - gunzip.on('end', function() { - var gunzippedStr = gunzippedData.toString('utf8', 0, gunzippedOffset); - var originalStr = originalBuffer.toString('utf8', 0, 3 * HUGE); - - assert.equal(gunzippedStr, originalStr); - }); - - gunzip.write(gzipBuffer.slice(0, gzipOffset), 'binary', function() { - gunzip.end(); - }); - }); - }); -}); diff --git a/tools/test.py b/tools/test.py index 563555ed95a59f..3414425a106385 100755 --- a/tools/test.py +++ b/tools/test.py @@ -71,8 +71,8 @@ def __init__(self, cases, flaky_tests_mode): self.total = len(cases) self.failed = [ ] self.crashed = 0 - self.terminate = False self.lock = threading.Lock() + self.shutdown_event = threading.Event() def PrintFailureHeader(self, test): if test.IsNegative(): @@ -101,17 +101,19 @@ def Run(self, tasks): for thread in threads: # Use a timeout so that signals (ctrl-c) will be processed. thread.join(timeout=10000000) + except (KeyboardInterrupt, SystemExit), e: + self.shutdown_event.set() except Exception, e: # If there's an exception we schedule an interruption for any # remaining threads. - self.terminate = True + self.shutdown_event.set() # ...and then reraise the exception to bail out raise self.Done() return not self.failed def RunSingle(self, parallel, thread_id): - while not self.terminate: + while not self.shutdown_event.is_set(): try: test = self.parallel_queue.get_nowait() except Empty: @@ -131,9 +133,8 @@ def RunSingle(self, parallel, thread_id): output = case.Run() case.duration = (datetime.now() - start) except IOError, e: - assert self.terminate return - if self.terminate: + if self.shutdown_event.is_set(): return self.lock.acquire() if output.UnexpectedOutput():