diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6acdc49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/v8-3.0.0.1.tar.gz +/v8-3.5.1.tar.bz2 +/v8-3.3.10.tar.bz2 +/v8-3.8.9-20120127svn10526.tar.bz2 +/v8-3.7.12.tar.bz2 +/v8-3.10.8.tar.bz2 +/v8-3.13.7.5.tar.bz2 +/v8-3.14.5.7.tar.bz2 +/v8-3.14.5.8.tar.bz2 +/v8-3.14.5.10.tar.bz2 diff --git a/dead.package b/dead.package deleted file mode 100644 index d6ea8a4..0000000 --- a/dead.package +++ /dev/null @@ -1 +0,0 @@ -extremely difficult to maintain, nothing uses it diff --git a/sources b/sources new file mode 100644 index 0000000..0ed3ff1 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +d4e3a038ad387fd7b75d40a89e231ef7 v8-3.14.5.10.tar.bz2 diff --git a/v8-2.5.9-ccflags.patch b/v8-2.5.9-ccflags.patch new file mode 100644 index 0000000..91c8a5b --- /dev/null +++ b/v8-2.5.9-ccflags.patch @@ -0,0 +1,55 @@ +From 9342a28b524c1679d6d664ed09b8db326ddbeb3e Mon Sep 17 00:00:00 2001 +From: Lubomir Rintel +Date: Sat, 4 Dec 2010 13:58:10 +0100 +Subject: [PATCH] Let environment variables override what would scons construct + +So that we can have control over CCFLAGS we use. +--- + SConstruct | 19 +++++++++++++++++-- + 1 files changed, 17 insertions(+), 2 deletions(-) + +Index: v8-3.5.1/SConstruct +=================================================================== +--- v8-3.5.1.orig/SConstruct ++++ v8-3.5.1/SConstruct +@@ -1190,6 +1190,13 @@ class BuildContext(object): + self.build_snapshot = (options['snapshot'] == 'on') + self.flags = None + ++ def OverrideFlags(self, initial, overrides): ++ result = initial.copy() ++ for key in initial.keys(): ++ if overrides.has_key(key): ++ result[key] = overrides[key]; ++ return result ++ + def AddRelevantFlags(self, initial, flags): + result = initial.copy() + toolchain = self.options['toolchain'] +@@ -1306,15 +1313,23 @@ def BuildSpecific(env, mode, env_overrid + except KeyError: + pass + +- library_flags = context.AddRelevantFlags(user_environ, LIBRARY_FLAGS) ++ library_flags = context.AddRelevantFlags({}, LIBRARY_FLAGS) + v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS) + mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FLAGS) + dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS) + cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS) +- sample_flags = context.AddRelevantFlags(user_environ, SAMPLE_FLAGS) +- preparser_flags = context.AddRelevantFlags(user_environ, PREPARSER_FLAGS) ++ sample_flags = context.AddRelevantFlags({}, SAMPLE_FLAGS) ++ preparser_flags = context.AddRelevantFlags({}, PREPARSER_FLAGS) + d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS) + ++ library_flags = context.OverrideFlags(library_flags, user_environ) ++ v8_flags = context.OverrideFlags(v8_flags, user_environ) ++ mksnapshot_flags = context.OverrideFlags(mksnapshot_flags, user_environ) ++ dtoa_flags = context.OverrideFlags(dtoa_flags, user_environ) ++ cctest_flags = context.OverrideFlags(cctest_flags, user_environ) ++ sample_flags = context.OverrideFlags(sample_flags, user_environ) ++ d8_flags = context.OverrideFlags(d8_flags, user_environ) ++ + context.flags = { + 'v8': v8_flags, + 'mksnapshot': mksnapshot_flags, diff --git a/v8-2.5.9-shebangs.patch b/v8-2.5.9-shebangs.patch new file mode 100644 index 0000000..a454d8a --- /dev/null +++ b/v8-2.5.9-shebangs.patch @@ -0,0 +1,35 @@ +From 503755a1addc229e917f837e212403e03e7bf243 Mon Sep 17 00:00:00 2001 +From: Lubomir Rintel +Date: Fri, 10 Dec 2010 16:13:42 +0100 +Subject: [PATCH] Drop shebang where they are useless + +jsmin.py is not an executable script and it infuriates rpmlint. +js2c.py is being called from a wrapper in %{_bindir} +--- + tools/js2c.py | 2 -- + tools/jsmin.py | 2 -- + 2 files changed, 0 insertions(+), 4 deletions(-) + +diff --git a/tools/js2c.py b/tools/js2c.py +index 2da132f..c0e014d 100755 +--- a/tools/js2c.py ++++ b/tools/js2c.py +@@ -1,5 +1,3 @@ +-#!/usr/bin/env python +-# + # Copyright 2006-2008 the V8 project authors. All rights reserved. + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are +diff --git a/tools/jsmin.py b/tools/jsmin.py +index 646bf14..e2bb608 100644 +--- a/tools/jsmin.py ++++ b/tools/jsmin.py +@@ -1,5 +1,3 @@ +-#!/usr/bin/python2.4 +- + # Copyright 2009 the V8 project authors. All rights reserved. + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are +-- +1.7.3.1 + diff --git a/v8-3.14.5.10-CVE-2013-2882.patch b/v8-3.14.5.10-CVE-2013-2882.patch new file mode 100644 index 0000000..b14dbb5 --- /dev/null +++ b/v8-3.14.5.10-CVE-2013-2882.patch @@ -0,0 +1,55 @@ +From 18e43f925d5d502b7531f40e4a1becba56089303 Mon Sep 17 00:00:00 2001 +From: "mstarzinger@chromium.org" +Date: Mon, 15 Jul 2013 11:41:41 +0000 +Subject: [PATCH] Use internal array as API function cache. + +R=yangguo@chromium.org +BUG=chromium:260106 +TEST=cctest/test-api/Regress260106 + +Review URL: https://codereview.chromium.org/19159003 + +git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@15665 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 +--- + src/apinatives.js | 2 +- + test/cctest/test-api.cc | 11 +++++++++++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +diff --git a/src/apinatives.js b/src/apinatives.js +index 79b41dd..adefab6 100644 +--- a/src/apinatives.js ++++ b/src/apinatives.js +@@ -37,7 +37,7 @@ function CreateDate(time) { + } + + +-var kApiFunctionCache = {}; ++var kApiFunctionCache = new InternalArray(); + var functionCache = kApiFunctionCache; + + +diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc +index 728a8f7..bcd28bd 100644 +--- a/test/cctest/test-api.cc ++++ b/test/cctest/test-api.cc +@@ -17707,6 +17707,17 @@ THREADED_TEST(Regress157124) { + } + + ++THREADED_TEST(Regress260106) { ++ LocalContext context; ++ v8::HandleScope scope(context->GetIsolate()); ++ Local templ = FunctionTemplate::New(DummyCallHandler); ++ CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;"); ++ Local function = templ->GetFunction(); ++ CHECK(!function.IsEmpty()); ++ CHECK(function->IsFunction()); ++} ++ ++ + #ifndef WIN32 + class ThreadInterruptTest { + public: +-- +1.8.3.1 + diff --git a/v8-3.14.5.10-CVE-2013-6640.patch b/v8-3.14.5.10-CVE-2013-6640.patch new file mode 100644 index 0000000..1a2a420 --- /dev/null +++ b/v8-3.14.5.10-CVE-2013-6640.patch @@ -0,0 +1,316 @@ +From 520f94a1da96b0f1fd3d0e0c0b82e4d7c1e7d58f Mon Sep 17 00:00:00 2001 +From: "T.C. Hollingsworth" +Date: Fri, 13 Dec 2013 00:45:27 -0700 +Subject: [PATCH] Limit size of dehoistable array indices + +backported from upstream r17801 +--- + src/elements-kind.cc | 30 ++++++++++++++++ + src/elements-kind.h | 2 ++ + src/hydrogen-instructions.h | 9 +++++ + src/hydrogen.cc | 2 +- + src/lithium.cc | 30 ---------------- + src/lithium.h | 3 -- + test/mjsunit/regress/regress-crbug-319835.js | 51 ++++++++++++++++++++++++++++ + test/mjsunit/regress/regress-crbug-319860.js | 47 +++++++++++++++++++++++++ + 8 files changed, 140 insertions(+), 34 deletions(-) + create mode 100644 test/mjsunit/regress/regress-crbug-319835.js + create mode 100644 test/mjsunit/regress/regress-crbug-319860.js + +diff --git a/src/elements-kind.cc b/src/elements-kind.cc +index 655a23b..c93a602 100644 +--- a/src/elements-kind.cc ++++ b/src/elements-kind.cc +@@ -35,6 +35,36 @@ namespace v8 { + namespace internal { + + ++int ElementsKindToShiftSize(ElementsKind elements_kind) { ++ switch (elements_kind) { ++ case EXTERNAL_BYTE_ELEMENTS: ++ case EXTERNAL_PIXEL_ELEMENTS: ++ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: ++ return 0; ++ case EXTERNAL_SHORT_ELEMENTS: ++ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: ++ return 1; ++ case EXTERNAL_INT_ELEMENTS: ++ case EXTERNAL_UNSIGNED_INT_ELEMENTS: ++ case EXTERNAL_FLOAT_ELEMENTS: ++ return 2; ++ case EXTERNAL_DOUBLE_ELEMENTS: ++ case FAST_DOUBLE_ELEMENTS: ++ case FAST_HOLEY_DOUBLE_ELEMENTS: ++ return 3; ++ case FAST_SMI_ELEMENTS: ++ case FAST_ELEMENTS: ++ case FAST_HOLEY_SMI_ELEMENTS: ++ case FAST_HOLEY_ELEMENTS: ++ case DICTIONARY_ELEMENTS: ++ case NON_STRICT_ARGUMENTS_ELEMENTS: ++ return kPointerSizeLog2; ++ } ++ UNREACHABLE(); ++ return 0; ++} ++ ++ + void PrintElementsKind(FILE* out, ElementsKind kind) { + ElementsAccessor* accessor = ElementsAccessor::ForKind(kind); + PrintF(out, "%s", accessor->name()); +diff --git a/src/elements-kind.h b/src/elements-kind.h +index 3be7711..c5d9df8 100644 +--- a/src/elements-kind.h ++++ b/src/elements-kind.h +@@ -77,6 +77,8 @@ const int kElementsKindCount = LAST_ELEMENTS_KIND - FIRST_ELEMENTS_KIND + 1; + const int kFastElementsKindCount = LAST_FAST_ELEMENTS_KIND - + FIRST_FAST_ELEMENTS_KIND + 1; + ++int ElementsKindToShiftSize(ElementsKind elements_kind); ++ + void PrintElementsKind(FILE* out, ElementsKind kind); + + ElementsKind GetInitialFastElementsKind(); +diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h +index 015212d..a1e5b97 100644 +--- a/src/hydrogen-instructions.h ++++ b/src/hydrogen-instructions.h +@@ -4240,6 +4240,7 @@ class ArrayInstructionInterface { + virtual HValue* GetKey() = 0; + virtual void SetKey(HValue* key) = 0; + virtual void SetIndexOffset(uint32_t index_offset) = 0; ++ virtual int MaxIndexOffsetBits() = 0; + virtual bool IsDehoisted() = 0; + virtual void SetDehoisted(bool is_dehoisted) = 0; + virtual ~ArrayInstructionInterface() { }; +@@ -4274,6 +4275,7 @@ class HLoadKeyedFastElement + void SetIndexOffset(uint32_t index_offset) { + bit_field_ = IndexOffsetField::update(bit_field_, index_offset); + } ++ int MaxIndexOffsetBits() { return 25; } + HValue* GetKey() { return key(); } + void SetKey(HValue* key) { SetOperandAt(1, key); } + bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } +@@ -4343,6 +4345,7 @@ class HLoadKeyedFastDoubleElement + HValue* dependency() { return OperandAt(2); } + uint32_t index_offset() { return index_offset_; } + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } ++ int MaxIndexOffsetBits() { return 25; } + HValue* GetKey() { return key(); } + void SetKey(HValue* key) { SetOperandAt(1, key); } + bool IsDehoisted() { return is_dehoisted_; } +@@ -4420,6 +4423,7 @@ class HLoadKeyedSpecializedArrayElement + ElementsKind elements_kind() const { return elements_kind_; } + uint32_t index_offset() { return index_offset_; } + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } ++ int MaxIndexOffsetBits() { return 25; } + HValue* GetKey() { return key(); } + void SetKey(HValue* key) { SetOperandAt(1, key); } + bool IsDehoisted() { return is_dehoisted_; } +@@ -4595,6 +4599,7 @@ class HStoreKeyedFastElement + } + uint32_t index_offset() { return index_offset_; } + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } ++ int MaxIndexOffsetBits() { return 25; } + HValue* GetKey() { return key(); } + void SetKey(HValue* key) { SetOperandAt(1, key); } + bool IsDehoisted() { return is_dehoisted_; } +@@ -4648,6 +4653,7 @@ class HStoreKeyedFastDoubleElement + HValue* value() { return OperandAt(2); } + uint32_t index_offset() { return index_offset_; } + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } ++ int MaxIndexOffsetBits() { return 25; } + HValue* GetKey() { return key(); } + void SetKey(HValue* key) { SetOperandAt(1, key); } + bool IsDehoisted() { return is_dehoisted_; } +@@ -4706,6 +4712,9 @@ class HStoreKeyedSpecializedArrayElement + ElementsKind elements_kind() const { return elements_kind_; } + uint32_t index_offset() { return index_offset_; } + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } ++ int MaxIndexOffsetBits() { ++ return 31 - ElementsKindToShiftSize(elements_kind_); ++ } + HValue* GetKey() { return key(); } + void SetKey(HValue* key) { SetOperandAt(1, key); } + bool IsDehoisted() { return is_dehoisted_; } +diff --git a/src/hydrogen.cc b/src/hydrogen.cc +index 8393e51..e3f79ee 100644 +--- a/src/hydrogen.cc ++++ b/src/hydrogen.cc +@@ -3737,7 +3737,7 @@ static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) { + int32_t value = constant->Integer32Value() * sign; + // We limit offset values to 30 bits because we want to avoid the risk of + // overflows when the offset is added to the object header size. +- if (value >= 1 << 30 || value < 0) return; ++ if (value >= 1 << array_operation->MaxIndexOffsetBits() || value < 0) return; + array_operation->SetKey(subexpression); + if (index->HasNoUses()) { + index->DeleteAndReplaceWith(NULL); +diff --git a/src/lithium.cc b/src/lithium.cc +index eb2198d..1232bf1 100644 +--- a/src/lithium.cc ++++ b/src/lithium.cc +@@ -227,36 +227,6 @@ void LPointerMap::PrintTo(StringStream* stream) { + } + + +-int ElementsKindToShiftSize(ElementsKind elements_kind) { +- switch (elements_kind) { +- case EXTERNAL_BYTE_ELEMENTS: +- case EXTERNAL_PIXEL_ELEMENTS: +- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: +- return 0; +- case EXTERNAL_SHORT_ELEMENTS: +- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: +- return 1; +- case EXTERNAL_INT_ELEMENTS: +- case EXTERNAL_UNSIGNED_INT_ELEMENTS: +- case EXTERNAL_FLOAT_ELEMENTS: +- return 2; +- case EXTERNAL_DOUBLE_ELEMENTS: +- case FAST_DOUBLE_ELEMENTS: +- case FAST_HOLEY_DOUBLE_ELEMENTS: +- return 3; +- case FAST_SMI_ELEMENTS: +- case FAST_ELEMENTS: +- case FAST_HOLEY_SMI_ELEMENTS: +- case FAST_HOLEY_ELEMENTS: +- case DICTIONARY_ELEMENTS: +- case NON_STRICT_ARGUMENTS_ELEMENTS: +- return kPointerSizeLog2; +- } +- UNREACHABLE(); +- return 0; +-} +- +- + LLabel* LChunk::GetLabel(int block_id) const { + HBasicBlock* block = graph_->blocks()->at(block_id); + int first_instruction = block->first_instruction_index(); +diff --git a/src/lithium.h b/src/lithium.h +index 089926e..a29d9d0 100644 +--- a/src/lithium.h ++++ b/src/lithium.h +@@ -704,9 +704,6 @@ class LChunk: public ZoneObject { + }; + + +-int ElementsKindToShiftSize(ElementsKind elements_kind); +- +- + } } // namespace v8::internal + + #endif // V8_LITHIUM_H_ +diff --git a/test/mjsunit/regress/regress-crbug-319835.js b/test/mjsunit/regress/regress-crbug-319835.js +new file mode 100644 +index 0000000..48f871f +--- /dev/null ++++ b/test/mjsunit/regress/regress-crbug-319835.js +@@ -0,0 +1,51 @@ ++// Copyright 2013 the V8 project authors. All rights reserved. ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following ++// disclaimer in the documentation and/or other materials provided ++// with the distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived ++// from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++// Flags: --allow-natives-syntax ++ ++try {} catch(e) {} // No need to optimize the top level. ++ ++var size = 0x20000; ++var a = new Float64Array(size); ++var training = new Float64Array(10); ++function store(a, index) { ++ var offset = 0x20000000; ++ for (var i = 0; i < 1; i++) { ++ a[index + offset] = 0xcc; ++ } ++} ++ ++store(training, -0x20000000); ++store(training, -0x20000000 + 1); ++store(training, -0x20000000); ++store(training, -0x20000000 + 1); ++%OptimizeFunctionOnNextCall(store); ++ ++// Segfault maybe? ++for (var i = -0x20000000; i < -0x20000000 + size; i++) { ++ store(a, i); ++} +diff --git a/test/mjsunit/regress/regress-crbug-319860.js b/test/mjsunit/regress/regress-crbug-319860.js +new file mode 100644 +index 0000000..b81fb85 +--- /dev/null ++++ b/test/mjsunit/regress/regress-crbug-319860.js +@@ -0,0 +1,47 @@ ++// Copyright 2013 the V8 project authors. All rights reserved. ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following ++// disclaimer in the documentation and/or other materials provided ++// with the distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived ++// from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++// Flags: --allow-natives-syntax ++ ++function read(a, index) { ++ var offset = 0x2000000; ++ var result; ++ for (var i = 0; i < 1; i++) { ++ result = a[index + offset]; ++ } ++ return result; ++} ++ ++var a = new Int8Array(0x2000001); ++read(a, 0); ++read(a, 0); ++%OptimizeFunctionOnNextCall(read); ++ ++// Segfault maybe? ++for (var i = 0; i > -1000000; --i) { ++ read(a, i); ++} +-- +1.8.4.2 + diff --git a/v8-3.14.5.10-CVE-2013-6650.patch b/v8-3.14.5.10-CVE-2013-6650.patch new file mode 100644 index 0000000..d44811f --- /dev/null +++ b/v8-3.14.5.10-CVE-2013-6650.patch @@ -0,0 +1,80 @@ +From 3928813f014d3cdaed83fefc3a454078272f114b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hr=C4=8Dka?= +Date: Tue, 18 Feb 2014 00:23:04 +0100 +Subject: [PATCH] Backport Fix for CVE-2013-6650 Original patch + https://code.google.com/p/v8/source/detail?r=18483 + +Resolve: rhbz#1059070 +--- + src/store-buffer.cc | 2 +- + test/mjsunit/regress/regress-331444.js | 45 ++++++++++++++++++++++++++++++++++ + 2 files changed, 46 insertions(+), 1 deletion(-) + create mode 100644 test/mjsunit/regress/regress-331444.js + +diff --git a/src/store-buffer.cc b/src/store-buffer.cc +index 66488ae..b9055f8 100644 +--- a/src/store-buffer.cc ++++ b/src/store-buffer.cc +@@ -242,7 +242,7 @@ void StoreBuffer::ExemptPopularPages(int prime_sample_step, int threshold) { + containing_chunk = MemoryChunk::FromAnyPointerAddress(addr); + } + int old_counter = containing_chunk->store_buffer_counter(); +- if (old_counter == threshold) { ++ if (old_counter >= threshold) { + containing_chunk->set_scan_on_scavenge(true); + created_new_scan_on_scavenge_pages = true; + } +diff --git a/test/mjsunit/regress/regress-331444.js b/test/mjsunit/regress/regress-331444.js +new file mode 100644 +index 0000000..3df0a08 +--- /dev/null ++++ b/test/mjsunit/regress/regress-331444.js +@@ -0,0 +1,45 @@ ++// Copyright 2014 the V8 project authors. All rights reserved. ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following ++// disclaimer in the documentation and/or other materials provided ++// with the distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived ++// from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++// Flags: --expose-gc ++ ++ ++function boom() { ++ var args = []; ++ for (var i = 0; i < 125000; i++) ++ args.push(i); ++ return Array.apply(Array, args); ++} ++var array = boom(); ++function fib(n) { ++ var f0 = 0, f1 = 1; ++ for (; n > 0; n = n - 1) { ++ f0 + f1; ++ f0 = array; ++ } ++} ++fib(12); +-- +1.8.3.1 + diff --git a/v8-3.14.5.10-CVE-2013-6668-segfault.patch b/v8-3.14.5.10-CVE-2013-6668-segfault.patch new file mode 100644 index 0000000..8e3d600 --- /dev/null +++ b/v8-3.14.5.10-CVE-2013-6668-segfault.patch @@ -0,0 +1,60 @@ +From 3122e0eae64c5ab494b29d0a9cadef902d93f1f9 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny +Date: Fri, 22 Aug 2014 03:59:35 +0400 +Subject: [PATCH] deps: fix up v8 after fd80a3 + +fd80a31e0697d6317ce8c2d289575399f4e06d21 has introduced a segfault +during redundant boundary check elimination (#8208). + +The problem consists of two parts: + + 1. Abscense of instruction iterator in + `EliminateRedundantBoundsChecks`. It was present in recent v8, but + wasn't considered important at the time of backport. However, since + the function is changing instructions order in block, it is + important to not rely at `i->next()` at the end of the loop. + 2. Too strict ASSERT in `MoveIndexIfNecessary`. It is essentially a + backport of a45c96ab from v8's upstream. See + https://github.com/v8/v8/commit/a45c96ab for details. + +fix #8208 +--- + src/hydrogen.cc | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/src/hydrogen.cc b/src/hydrogen.cc +index 50d8e49..18a6b60 100644 +--- a/src/hydrogen.cc ++++ b/src/hydrogen.cc +@@ -3546,7 +3546,11 @@ class BoundsCheckBbData: public ZoneObject { + void MoveIndexIfNecessary(HValue* index_raw, + HBoundsCheck* insert_before, + HInstruction* end_of_scan_range) { +- ASSERT(index_raw->IsAdd() || index_raw->IsSub()); ++ if (!index_raw->IsAdd() && !index_raw->IsSub()) { ++ // index_raw can be HAdd(index_base, offset), HSub(index_base, offset), ++ // or index_base directly. In the latter case, no need to move anything. ++ return; ++ } + HBinaryOperation* index = + HArithmeticBinaryOperation::cast(index_raw); + HValue* left_input = index->left(); +@@ -3581,7 +3585,6 @@ class BoundsCheckBbData: public ZoneObject { + HBoundsCheck* tighter_check) { + ASSERT(original_check->length() == tighter_check->length()); + MoveIndexIfNecessary(tighter_check->index(), original_check, tighter_check); +- original_check->ReplaceAllUsesWith(original_check->index()); + original_check->SetOperandAt(0, tighter_check->index()); + } + }; +@@ -3624,7 +3627,9 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, + BoundsCheckTable* table) { + BoundsCheckBbData* bb_data_list = NULL; + +- for (HInstruction* i = bb->first(); i != NULL; i = i->next()) { ++ HInstruction* next; ++ for (HInstruction* i = bb->first(); i != NULL; i = next) { ++ next = i->next(); + if (!i->IsBoundsCheck()) continue; + + HBoundsCheck* check = HBoundsCheck::cast(i); diff --git a/v8-3.14.5.10-CVE-2013-6668.patch b/v8-3.14.5.10-CVE-2013-6668.patch new file mode 100644 index 0000000..fe5cb6d --- /dev/null +++ b/v8-3.14.5.10-CVE-2013-6668.patch @@ -0,0 +1,186 @@ +From fd80a31e0697d6317ce8c2d289575399f4e06d21 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny +Date: Thu, 14 Aug 2014 19:29:28 +0400 +Subject: [PATCH] deps: backport 5f836c from v8 upstream + +Original commit message: + + Fix Hydrogen bounds check elimination + + When combining bounds checks, they must all be moved before the first load/store + that they are guarding. + + BUG=chromium:344186 + LOG=y + R=svenpanne@chromium.org + + Review URL: https://codereview.chromium.org/172093002 + + git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@19475 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 + +fix #8070 +--- + src/hydrogen.cc | 106 +++++++++++++++++++++++------------------------- + 1 file changed, 50 insertions(+), 56 deletions(-) + +diff --git a/src/hydrogen.cc b/src/hydrogen.cc +index e3f79ee..50d8e49 100644 +--- a/src/hydrogen.cc ++++ b/src/hydrogen.cc +@@ -3487,13 +3487,7 @@ class BoundsCheckBbData: public ZoneObject { + keep_new_check = true; + upper_check_ = new_check; + } else { +- BuildOffsetAdd(upper_check_, +- &added_upper_index_, +- &added_upper_offset_, +- Key()->IndexBase(), +- new_check->index()->representation(), +- new_offset); +- upper_check_->SetOperandAt(0, added_upper_index_); ++ TightenCheck(upper_check_, new_check); + } + } else if (new_offset < lower_offset_) { + lower_offset_ = new_offset; +@@ -3501,28 +3495,27 @@ class BoundsCheckBbData: public ZoneObject { + keep_new_check = true; + lower_check_ = new_check; + } else { +- BuildOffsetAdd(lower_check_, +- &added_lower_index_, +- &added_lower_offset_, +- Key()->IndexBase(), +- new_check->index()->representation(), +- new_offset); +- lower_check_->SetOperandAt(0, added_lower_index_); ++ TightenCheck(lower_check_, new_check); + } + } else { +- ASSERT(false); ++ // Should never have called CoverCheck() in this case. ++ UNREACHABLE(); + } + + if (!keep_new_check) { + new_check->DeleteAndReplaceWith(NULL); ++ } else { ++ HBoundsCheck* first_check = new_check == lower_check_ ? upper_check_ ++ : lower_check_; ++ // The length is guaranteed to be live at first_check. ++ ASSERT(new_check->length() == first_check->length()); ++ HInstruction* old_position = new_check->next(); ++ new_check->Unlink(); ++ new_check->InsertAfter(first_check); ++ MoveIndexIfNecessary(new_check->index(), new_check, old_position); + } + } + +- void RemoveZeroOperations() { +- RemoveZeroAdd(&added_lower_index_, &added_lower_offset_); +- RemoveZeroAdd(&added_upper_index_, &added_upper_offset_); +- } +- + BoundsCheckBbData(BoundsCheckKey* key, + int32_t lower_offset, + int32_t upper_offset, +@@ -3537,10 +3530,6 @@ class BoundsCheckBbData: public ZoneObject { + basic_block_(bb), + lower_check_(lower_check), + upper_check_(upper_check), +- added_lower_index_(NULL), +- added_lower_offset_(NULL), +- added_upper_index_(NULL), +- added_upper_offset_(NULL), + next_in_bb_(next_in_bb), + father_in_dt_(father_in_dt) { } + +@@ -3551,44 +3540,50 @@ class BoundsCheckBbData: public ZoneObject { + HBasicBlock* basic_block_; + HBoundsCheck* lower_check_; + HBoundsCheck* upper_check_; +- HAdd* added_lower_index_; +- HConstant* added_lower_offset_; +- HAdd* added_upper_index_; +- HConstant* added_upper_offset_; + BoundsCheckBbData* next_in_bb_; + BoundsCheckBbData* father_in_dt_; + +- void BuildOffsetAdd(HBoundsCheck* check, +- HAdd** add, +- HConstant** constant, +- HValue* original_value, +- Representation representation, +- int32_t new_offset) { +- HConstant* new_constant = new(BasicBlock()->zone()) +- HConstant(new_offset, Representation::Integer32()); +- if (*add == NULL) { +- new_constant->InsertBefore(check); +- // Because of the bounds checks elimination algorithm, the index is always +- // an HAdd or an HSub here, so we can safely cast to an HBinaryOperation. +- HValue* context = HBinaryOperation::cast(check->index())->context(); +- *add = new(BasicBlock()->zone()) HAdd(context, +- original_value, +- new_constant); +- (*add)->AssumeRepresentation(representation); +- (*add)->InsertBefore(check); +- } else { +- new_constant->InsertBefore(*add); +- (*constant)->DeleteAndReplaceWith(new_constant); ++ void MoveIndexIfNecessary(HValue* index_raw, ++ HBoundsCheck* insert_before, ++ HInstruction* end_of_scan_range) { ++ ASSERT(index_raw->IsAdd() || index_raw->IsSub()); ++ HBinaryOperation* index = ++ HArithmeticBinaryOperation::cast(index_raw); ++ HValue* left_input = index->left(); ++ HValue* right_input = index->right(); ++ bool must_move_index = false; ++ bool must_move_left_input = false; ++ bool must_move_right_input = false; ++ for (HInstruction* cursor = end_of_scan_range; cursor != insert_before;) { ++ if (cursor == left_input) must_move_left_input = true; ++ if (cursor == right_input) must_move_right_input = true; ++ if (cursor == index) must_move_index = true; ++ if (cursor->previous() == NULL) { ++ cursor = cursor->block()->dominator()->end(); ++ } else { ++ cursor = cursor->previous(); ++ } + } +- *constant = new_constant; +- } + +- void RemoveZeroAdd(HAdd** add, HConstant** constant) { +- if (*add != NULL && (*constant)->Integer32Value() == 0) { +- (*add)->DeleteAndReplaceWith((*add)->left()); +- (*constant)->DeleteAndReplaceWith(NULL); ++ // The BCE algorithm only selects mergeable bounds checks that share ++ // the same "index_base", so we'll only ever have to move constants. ++ if (must_move_left_input) { ++ HConstant::cast(left_input)->Unlink(); ++ HConstant::cast(left_input)->InsertBefore(index); ++ } ++ if (must_move_right_input) { ++ HConstant::cast(right_input)->Unlink(); ++ HConstant::cast(right_input)->InsertBefore(index); + } + } ++ ++ void TightenCheck(HBoundsCheck* original_check, ++ HBoundsCheck* tighter_check) { ++ ASSERT(original_check->length() == tighter_check->length()); ++ MoveIndexIfNecessary(tighter_check->index(), original_check, tighter_check); ++ original_check->ReplaceAllUsesWith(original_check->index()); ++ original_check->SetOperandAt(0, tighter_check->index()); ++ } + }; + + +@@ -3683,7 +3678,6 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb, + for (BoundsCheckBbData* data = bb_data_list; + data != NULL; + data = data->NextInBasicBlock()) { +- data->RemoveZeroOperations(); + if (data->FatherInDominatorTree()) { + table->Insert(data->Key(), data->FatherInDominatorTree(), zone()); + } else { diff --git a/v8-3.14.5.10-CVE-2014-1704-1.patch b/v8-3.14.5.10-CVE-2014-1704-1.patch new file mode 100644 index 0000000..2df5230 --- /dev/null +++ b/v8-3.14.5.10-CVE-2014-1704-1.patch @@ -0,0 +1,77 @@ +From bf973073d98660edf35e01e6984029e46eb85368 Mon Sep 17 00:00:00 2001 +From: "dslomov@chromium.org" + +Date: Mon, 13 Jan 2014 13:00:09 +0000 +Subject: [PATCH] Use unsigned integer arithmetic in Zone::NewExpand. + + BUG=328202 + R=jkummerow@chromium.org + LOG=N + + Review URL: https://codereview.chromium.org/108783005 + + git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@18564 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 +--- + src/zone.cc | 29 +++++++++++++++++++---------- + 1 file changed, 19 insertions(+), 10 deletions(-) + +diff --git a/src/zone.cc b/src/zone.cc +index 51b8113..c12978f 100644 +--- a/src/zone.cc ++++ b/src/zone.cc +@@ -175,25 +175,31 @@ Address Zone::NewExpand(int size) { + // except that we employ a maximum segment size when we delete. This + // is to avoid excessive malloc() and free() overhead. + Segment* head = segment_head_; +- int old_size = (head == NULL) ? 0 : head->size(); +- static const int kSegmentOverhead = sizeof(Segment) + kAlignment; +- int new_size_no_overhead = size + (old_size << 1); +- int new_size = kSegmentOverhead + new_size_no_overhead; ++ const size_t old_size = (head == NULL) ? 0 : head->size(); ++ static const size_t kSegmentOverhead = sizeof(Segment) + kAlignment; ++ const size_t new_size_no_overhead = size + (old_size << 1); ++ size_t new_size = kSegmentOverhead + new_size_no_overhead; ++ const size_t min_new_size = kSegmentOverhead + static_cast(size); + // Guard against integer overflow. +- if (new_size_no_overhead < size || new_size < kSegmentOverhead) { ++ if (new_size_no_overhead < static_cast(size) || ++ new_size < static_cast(kSegmentOverhead)) { + V8::FatalProcessOutOfMemory("Zone"); + return NULL; + } +- if (new_size < kMinimumSegmentSize) { ++ if (new_size < static_cast(kMinimumSegmentSize)) { + new_size = kMinimumSegmentSize; +- } else if (new_size > kMaximumSegmentSize) { ++ } else if (new_size > static_cast(kMaximumSegmentSize)) { + // Limit the size of new segments to avoid growing the segment size + // exponentially, thus putting pressure on contiguous virtual address space. + // All the while making sure to allocate a segment large enough to hold the + // requested size. +- new_size = Max(kSegmentOverhead + size, kMaximumSegmentSize); ++ new_size = Max(min_new_size, static_cast(kMaximumSegmentSize)); + } +- Segment* segment = NewSegment(new_size); ++ if (new_size > INT_MAX) { ++ V8::FatalProcessOutOfMemory("Zone"); ++ return NULL; ++ } ++ Segment* segment = NewSegment(static_cast(new_size)); + if (segment == NULL) { + V8::FatalProcessOutOfMemory("Zone"); + return NULL; +@@ -203,7 +209,10 @@ Address Zone::NewExpand(int size) { + Address result = RoundUp(segment->start(), kAlignment); + position_ = result + size; + // Check for address overflow. +- if (position_ < result) { ++ // (Should not happen since the segment is guaranteed to accomodate ++ // size bytes + header and alignment padding) ++ if (reinterpret_cast(position_) ++ < reinterpret_cast(result)) { + V8::FatalProcessOutOfMemory("Zone"); + return NULL; + } +-- +1.8.5.3 + diff --git a/v8-3.14.5.10-abort-uncaught-exception.patch b/v8-3.14.5.10-abort-uncaught-exception.patch new file mode 100644 index 0000000..b2f2a08 --- /dev/null +++ b/v8-3.14.5.10-abort-uncaught-exception.patch @@ -0,0 +1,139 @@ +From fbff7054a47551387a99244e2cf0631f30406798 Mon Sep 17 00:00:00 2001 +From: Trevor Norris +Date: Tue, 18 Nov 2014 16:37:54 -0800 +Subject: [PATCH] v8: add api for aborting on uncaught exception + +Add v8::Isolate::SetAbortOnUncaughtException() so the user can be +notified when an uncaught exception has bubbled. + +PR-URL: https://github.com/joyent/node/pull/8666 +Reviewed-by: Trevor Norris +--- + include/v8.h | 11 +++++++++++ + src/api.cc | 5 +++++ + src/isolate.cc | 33 +++++++++++++++++++++++---------- + src/isolate.h | 5 +++++ + 4 files changed, 44 insertions(+), 10 deletions(-) + +diff --git a/include/v8.h b/include/v8.h +index 71a0d01..e229ed9 100644 +--- a/include/v8.h ++++ b/include/v8.h +@@ -2842,6 +2842,17 @@ class V8EXPORT Isolate { + static Isolate* GetCurrent(); + + /** ++ * Custom callback used by embedders to help V8 determine if it should abort ++ * when it throws and no internal handler can catch the exception. ++ * If FLAG_abort_on_uncaught_exception is true, then V8 will abort if either: ++ * - no custom callback is set. ++ * - the custom callback set returns true. ++ * Otherwise it won't abort. ++ */ ++ typedef bool (*abort_on_uncaught_exception_t)(); ++ void SetAbortOnUncaughtException(abort_on_uncaught_exception_t callback); ++ ++ /** + * Methods below this point require holding a lock (using Locker) in + * a multi-threaded environment. + */ +diff --git a/src/api.cc b/src/api.cc +index 96d564f..4b1aa67 100644 +--- a/src/api.cc ++++ b/src/api.cc +@@ -5550,6 +5550,11 @@ void Isolate::Enter() { + isolate->Enter(); + } + ++void Isolate::SetAbortOnUncaughtException( ++ abort_on_uncaught_exception_t callback) { ++ i::Isolate* isolate = reinterpret_cast(this); ++ isolate->SetAbortOnUncaughtException(callback); ++} + + void Isolate::Exit() { + i::Isolate* isolate = reinterpret_cast(this); +diff --git a/src/isolate.cc b/src/isolate.cc +index 5a5293e..0b38616 100644 +--- a/src/isolate.cc ++++ b/src/isolate.cc +@@ -1152,18 +1152,26 @@ void Isolate::DoThrow(Object* exception, MessageLocation* location) { + thread_local_top()->pending_message_end_pos_ = location->end_pos(); + } + +- // If the abort-on-uncaught-exception flag is specified, abort on any +- // exception not caught by JavaScript, even when an external handler is +- // present. This flag is intended for use by JavaScript developers, so +- // print a user-friendly stack trace (not an internal one). ++ // If the abort-on-uncaught-exception flag is specified, and if the ++ // exception is not caught by JavaScript (even when an external handler is ++ // present). + if (fatal_exception_depth == 0 && + FLAG_abort_on_uncaught_exception && + (report_exception || can_be_caught_externally)) { +- fatal_exception_depth++; +- fprintf(stderr, "%s\n\nFROM\n", +- *MessageHandler::GetLocalizedMessage(message_obj)); +- PrintCurrentStackTrace(stderr); +- OS::Abort(); ++ // If the embedder didn't specify a custom uncaught exception callback, ++ // or if the custom callback determined that V8 should abort, then ++ // abort ++ bool should_abort = !abort_on_uncaught_exception_callback_ || ++ abort_on_uncaught_exception_callback_(); ++ if (should_abort) { ++ fatal_exception_depth++; ++ // This flag is intended for use by JavaScript developers, so ++ // print a user-friendly stack trace (not an internal one). ++ fprintf(stderr, "%s\n\nFROM\n", ++ *MessageHandler::GetLocalizedMessage(message_obj)); ++ PrintCurrentStackTrace(stderr); ++ OS::Abort(); ++ } + } + } else if (location != NULL && !location->script().is_null()) { + // We are bootstrapping and caught an error where the location is set +@@ -1339,6 +1347,10 @@ void Isolate::SetCaptureStackTraceForUncaughtExceptions( + stack_trace_for_uncaught_exceptions_options_ = options; + } + ++void Isolate::SetAbortOnUncaughtException( ++ v8::Isolate::abort_on_uncaught_exception_t callback) { ++ abort_on_uncaught_exception_callback_ = callback; ++} + + bool Isolate::is_out_of_memory() { + if (has_pending_exception()) { +@@ -1534,7 +1546,8 @@ Isolate::Isolate() + date_cache_(NULL), + context_exit_happened_(false), + deferred_handles_head_(NULL), +- optimizing_compiler_thread_(this) { ++ optimizing_compiler_thread_(this), ++ abort_on_uncaught_exception_callback_(NULL) { + TRACE_ISOLATE(constructor); + + memset(isolate_addresses_, 0, +diff --git a/src/isolate.h b/src/isolate.h +index 2769ca7..8719aa1 100644 +--- a/src/isolate.h ++++ b/src/isolate.h +@@ -692,6 +692,9 @@ class Isolate { + int frame_limit, + StackTrace::StackTraceOptions options); + ++ typedef bool (*abort_on_uncaught_exception_t)(); ++ void SetAbortOnUncaughtException(abort_on_uncaught_exception_t callback); ++ + // Tells whether the current context has experienced an out of memory + // exception. + bool is_out_of_memory(); +@@ -1292,6 +1295,8 @@ class Isolate { + DeferredHandles* deferred_handles_head_; + OptimizingCompilerThread optimizing_compiler_thread_; + ++ abort_on_uncaught_exception_t abort_on_uncaught_exception_callback_; ++ + friend class ExecutionAccess; + friend class HandleScopeImplementer; + friend class IsolateInitializer; diff --git a/v8-3.14.5.10-busy-loop.patch b/v8-3.14.5.10-busy-loop.patch new file mode 100644 index 0000000..fcc906c --- /dev/null +++ b/v8-3.14.5.10-busy-loop.patch @@ -0,0 +1,137 @@ +From 6ebd85e10535dfaa9181842fe73834e51d4d3e6c Mon Sep 17 00:00:00 2001 +From: Ben Noordhuis +Date: Thu, 27 Nov 2014 07:15:54 +0100 +Subject: [PATCH] v8: don't busy loop in cpu profiler thread + +Reduce the overhead of the CPU profiler by replacing sched_yield() with +nanosleep() in V8's tick event processor thread. The former only yields +the CPU when there is another process scheduled on the same CPU. + +Before this commit, the thread would effectively busy loop and consume +100% CPU time. By forcing a one nanosecond sleep period rounded up to +the task scheduler's granularity (about 50 us on Linux), CPU usage for +the processor thread now hovers around 10-20% for a busy application. + +PR-URL: https://github.com/joyent/node/pull/8789 +Ref: https://github.com/strongloop/strong-agent/issues/3 +Reviewed-by: Trevor Norris +--- + src/platform-freebsd.cc | 5 ----- + src/platform-linux.cc | 5 ----- + src/platform-macos.cc | 5 ----- + src/platform-openbsd.cc | 5 ----- + src/platform-posix.cc | 6 ++++++ + src/platform-solaris.cc | 5 ----- + tools/gyp/v8.gyp | 2 +- + 7 files changed, 7 insertions(+), 26 deletions(-) + +diff --git a/src/platform-freebsd.cc b/src/platform-freebsd.cc +index 511759c..5c90c6b 100644 +--- a/src/platform-freebsd.cc ++++ b/src/platform-freebsd.cc +@@ -539,11 +539,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) { + } + + +-void Thread::YieldCPU() { +- sched_yield(); +-} +- +- + class FreeBSDMutex : public Mutex { + public: + FreeBSDMutex() { +diff --git a/src/platform-linux.cc b/src/platform-linux.cc +index beb2cce..3d6b304 100644 +--- a/src/platform-linux.cc ++++ b/src/platform-linux.cc +@@ -812,11 +812,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) { + } + + +-void Thread::YieldCPU() { +- sched_yield(); +-} +- +- + class LinuxMutex : public Mutex { + public: + LinuxMutex() { +diff --git a/src/platform-macos.cc b/src/platform-macos.cc +index a216f6e..e54e3e4 100644 +--- a/src/platform-macos.cc ++++ b/src/platform-macos.cc +@@ -640,11 +640,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) { + } + + +-void Thread::YieldCPU() { +- sched_yield(); +-} +- +- + class MacOSMutex : public Mutex { + public: + MacOSMutex() { +diff --git a/src/platform-openbsd.cc b/src/platform-openbsd.cc +index 408d4dc..72167de 100644 +--- a/src/platform-openbsd.cc ++++ b/src/platform-openbsd.cc +@@ -593,11 +593,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) { + } + + +-void Thread::YieldCPU() { +- sched_yield(); +-} +- +- + class OpenBSDMutex : public Mutex { + public: + OpenBSDMutex() { +diff --git a/src/platform-posix.cc b/src/platform-posix.cc +index 5c3529d..8aecd56 100644 +--- a/src/platform-posix.cc ++++ b/src/platform-posix.cc +@@ -392,6 +392,12 @@ void OS::StrNCpy(Vector dest, const char* src, size_t n) { + } + + ++void Thread::YieldCPU() { ++ const timespec delay = { 0, 1 }; ++ nanosleep(&delay, NULL); ++} ++ ++ + // ---------------------------------------------------------------------------- + // POSIX socket support. + // +diff --git a/src/platform-solaris.cc b/src/platform-solaris.cc +index 07718fe..4e95ecc 100644 +--- a/src/platform-solaris.cc ++++ b/src/platform-solaris.cc +@@ -527,11 +527,6 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) { + } + + +-void Thread::YieldCPU() { +- sched_yield(); +-} +- +- + class SolarisMutex : public Mutex { + public: + SolarisMutex() { +diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp +index 71cf366..c304925 100644 +--- a/tools/gyp/v8.gyp ++++ b/tools/gyp/v8.gyp +@@ -715,7 +715,7 @@ + ['OS=="solaris"', { + 'link_settings': { + 'libraries': [ +- '-lsocket -lnsl', ++ '-lsocket -lnsl -lrt', + ]}, + 'sources': [ + '../../src/platform-solaris.cc', diff --git a/v8-3.14.5.10-enumeration.patch b/v8-3.14.5.10-enumeration.patch new file mode 100644 index 0000000..4dea2a5 --- /dev/null +++ b/v8-3.14.5.10-enumeration.patch @@ -0,0 +1,30 @@ +From 196184d332ba2d2defc56ad0b37653659a7d3ec0 Mon Sep 17 00:00:00 2001 +From: "svenpanne@chromium.org" +Date: Fri, 9 Nov 2012 11:30:05 +0000 +Subject: [PATCH] v8: backport codereview.chromium.org/11362182 + +Keep the number of descriptors below +DescriptorArray::kMaxNumberOfDescriptors even for accessors + +Review URL: https://codereview.chromium.org/11362182 +--- + src/objects.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/objects.cc b/src/objects.cc +--- a/src/objects.cc ++++ b/src/objects.cc +@@ -4453,7 +4453,9 @@ MaybeObject* JSObject::DefinePropertyAccessor(String* name, + // to do a lookup, which seems to be a bit of overkill. + Heap* heap = GetHeap(); + bool only_attribute_changes = getter->IsNull() && setter->IsNull(); +- if (HasFastProperties() && !only_attribute_changes) { ++ if (HasFastProperties() && !only_attribute_changes && ++ (map()->NumberOfOwnDescriptors() < ++ DescriptorArray::kMaxNumberOfDescriptors)) { + MaybeObject* getterOk = heap->undefined_value(); + if (!getter->IsNull()) { + getterOk = DefineFastAccessor(name, ACCESSOR_GETTER, getter, attributes); +-- +1.8.5.1 + diff --git a/v8-3.14.5.10-interrupts-stack-overflow.patch b/v8-3.14.5.10-interrupts-stack-overflow.patch new file mode 100644 index 0000000..049b4df --- /dev/null +++ b/v8-3.14.5.10-interrupts-stack-overflow.patch @@ -0,0 +1,31 @@ +From 530af9cb8e700e7596b3ec812bad123c9fa06356 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny +Date: Wed, 30 Jul 2014 15:33:52 -0700 +Subject: [PATCH] v8: Interrupts must not mask stack overflow. + +Backport of https://codereview.chromium.org/339883002 +--- + src/isolate.h | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/src/isolate.h b/src/isolate.h +index b90191d..2769ca7 100644 +--- a/src/isolate.h ++++ b/src/isolate.h +@@ -1392,14 +1392,9 @@ class StackLimitCheck BASE_EMBEDDED { + public: + explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { } + +- bool HasOverflowed() const { ++ inline bool HasOverflowed() const { + StackGuard* stack_guard = isolate_->stack_guard(); +- // Stack has overflowed in C++ code only if stack pointer exceeds the C++ +- // stack guard and the limits are not set to interrupt values. +- // TODO(214): Stack overflows are ignored if a interrupt is pending. This +- // code should probably always use the initial C++ limit. +- return (reinterpret_cast(this) < stack_guard->climit()) && +- stack_guard->IsStackOverflow(); ++ return reinterpret_cast(this) < stack_guard->real_climit(); + } + private: + Isolate* isolate_; diff --git a/v8-3.14.5.10-mem-corruption-stack-overflow.patch b/v8-3.14.5.10-mem-corruption-stack-overflow.patch new file mode 100644 index 0000000..452464b --- /dev/null +++ b/v8-3.14.5.10-mem-corruption-stack-overflow.patch @@ -0,0 +1,33 @@ +From 530af9cb8e700e7596b3ec812bad123c9fa06356 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny +Date: Wed, 30 Jul 2014 15:33:52 -0700 +Subject: [PATCH] v8: Interrupts must not mask stack overflow. + +Backport of https://codereview.chromium.org/339883002 +--- + src/isolate.h | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/src/isolate.h b/src/isolate.h +index b90191d..2769ca7 100644 +--- a/src/isolate.h ++++ b/src/isolate.h +@@ -1392,14 +1392,9 @@ class StackLimitCheck BASE_EMBEDDED { + public: + explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { } + +- bool HasOverflowed() const { ++ inline bool HasOverflowed() const { + StackGuard* stack_guard = isolate_->stack_guard(); +- // Stack has overflowed in C++ code only if stack pointer exceeds the C++ +- // stack guard and the limits are not set to interrupt values. +- // TODO(214): Stack overflows are ignored if a interrupt is pending. This +- // code should probably always use the initial C++ limit. +- return (reinterpret_cast(this) < stack_guard->climit()) && +- stack_guard->IsStackOverflow(); ++ return reinterpret_cast(this) < stack_guard->real_climit(); + } + private: + Isolate* isolate_; +-- +2.0.3 diff --git a/v8-3.14.5.10-profiler-log.patch b/v8-3.14.5.10-profiler-log.patch new file mode 100644 index 0000000..2530e54 --- /dev/null +++ b/v8-3.14.5.10-profiler-log.patch @@ -0,0 +1,43 @@ +From 431eb172f97434a3b0868a610bc14d8ff7d9efd9 Mon Sep 17 00:00:00 2001 +From: Ben Noordhuis +Date: Fri, 16 Jan 2015 13:44:42 +0100 +Subject: [PATCH] deps: log V8 version in profiler log file + +Patch from issue 800293002 authored by ben@strongloop.com + +Review URL: https://codereview.chromium.org/806143002 + +PR-URL: https://github.com/joyent/node/pull/9043 +Reviewed-by: Trevor Norris +Reviewed-By: Timothy J Fontaine +--- + src/log-utils.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/log-utils.cc b/src/log-utils.cc +index 5e607da..622cc51 100644 +--- a/src/log-utils.cc ++++ b/src/log-utils.cc +@@ -29,6 +29,7 @@ + + #include "log-utils.h" + #include "string-stream.h" ++#include "version.h" + + namespace v8 { + namespace internal { +@@ -136,6 +137,14 @@ void Log::Initialize() { + } + } + } ++ ++ if (output_handle_ != NULL) { ++ LogMessageBuilder msg(logger_); ++ msg.Append("v8-version,%d,%d,%d,%d,%d\n", Version::GetMajor(), ++ Version::GetMinor(), Version::GetBuild(), Version::GetPatch(), ++ Version::IsCandidate()); ++ msg.WriteToLogFile(); ++ } + } + + diff --git a/v8-3.14.5.10-system-valgrind.patch b/v8-3.14.5.10-system-valgrind.patch new file mode 100644 index 0000000..1e5b0cb --- /dev/null +++ b/v8-3.14.5.10-system-valgrind.patch @@ -0,0 +1,44 @@ +diff -up v8-3.14.5.10/src/ia32/cpu-ia32.cc.system-valgrind v8-3.14.5.10/src/ia32/cpu-ia32.cc +--- v8-3.14.5.10/src/ia32/cpu-ia32.cc.system-valgrind 2012-01-16 06:42:08.000000000 -0500 ++++ v8-3.14.5.10/src/ia32/cpu-ia32.cc 2014-12-02 15:15:07.819525430 -0500 +@@ -28,7 +28,7 @@ + // CPU specific code for ia32 independent of OS goes here. + + #ifdef __GNUC__ +-#include "third_party/valgrind/valgrind.h" ++#include + #endif + + #include "v8.h" +@@ -67,8 +67,7 @@ void CPU::FlushICache(void* start, size_ + // solution is to run valgrind with --smc-check=all, but this comes at a big + // performance cost. We can notify valgrind to invalidate its cache. + #ifdef VALGRIND_DISCARD_TRANSLATIONS +- unsigned res = VALGRIND_DISCARD_TRANSLATIONS(start, size); +- USE(res); ++ VALGRIND_DISCARD_TRANSLATIONS(start, size); + #endif + } + +diff -up v8-3.14.5.10/src/x64/cpu-x64.cc.system-valgrind v8-3.14.5.10/src/x64/cpu-x64.cc +--- v8-3.14.5.10/src/x64/cpu-x64.cc.system-valgrind 2012-02-23 03:45:21.000000000 -0500 ++++ v8-3.14.5.10/src/x64/cpu-x64.cc 2014-12-02 15:14:51.289621074 -0500 +@@ -28,7 +28,7 @@ + // CPU specific code for x64 independent of OS goes here. + + #if defined(__GNUC__) && !defined(__MINGW64__) +-#include "third_party/valgrind/valgrind.h" ++#include + #endif + + #include "v8.h" +@@ -67,8 +67,7 @@ void CPU::FlushICache(void* start, size_ + // solution is to run valgrind with --smc-check=all, but this comes at a big + // performance cost. We can notify valgrind to invalidate its cache. + #ifdef VALGRIND_DISCARD_TRANSLATIONS +- unsigned res = VALGRIND_DISCARD_TRANSLATIONS(start, size); +- USE(res); ++ VALGRIND_DISCARD_TRANSLATIONS(start, size); + #endif + } + diff --git a/v8-3.14.5.10-unhandled-ReferenceError.patch b/v8-3.14.5.10-unhandled-ReferenceError.patch new file mode 100644 index 0000000..7762fa8 --- /dev/null +++ b/v8-3.14.5.10-unhandled-ReferenceError.patch @@ -0,0 +1,37 @@ +From 0ff51c6e063e3eea9e4d9ea68edc82d935626fc7 Mon Sep 17 00:00:00 2001 +From: Julien Gilli +Date: Fri, 28 Nov 2014 15:33:35 -0800 +Subject: [PATCH] deps: backport 2ad2237 from v8 upstream + +Original commit message: + +Fix Unhandled ReferenceError in debug-debugger.js + +This fixes following exception in Sky on attempt to set a breakpoint +"Unhandled: Uncaught ReferenceError: break_point is not defined" +I think this happens in Sky but not in Chrome because Sky scripts are executed in strict mode. + +BUG=None +LOG=N +R=yangguo@chromium.org + +Review URL: https://codereview.chromium.org/741683002 + +Cr-Commit-Position: refs/heads/master@{#25415} +--- + src/debug-debugger.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/debug-debugger.js b/src/debug-debugger.js +index dfad902..a27961f 100644 +--- a/src/debug-debugger.js ++++ b/src/debug-debugger.js +@@ -442,7 +442,7 @@ ScriptBreakPoint.prototype.set = function (script) { + if (position === null) return; + + // Create a break point object and set the break point. +- break_point = MakeBreakPoint(position, this); ++ var break_point = MakeBreakPoint(position, this); + break_point.setIgnoreCount(this.ignoreCount()); + var actual_position = %SetScriptBreakPoint(script, position, break_point); + if (IS_UNDEFINED(actual_position)) { diff --git a/v8-3.14.5.10-unused-local-typedefs.patch b/v8-3.14.5.10-unused-local-typedefs.patch new file mode 100644 index 0000000..c168875 --- /dev/null +++ b/v8-3.14.5.10-unused-local-typedefs.patch @@ -0,0 +1,39 @@ +From 53b4accb6e5747b156be91a2b90f42607e33a7cc Mon Sep 17 00:00:00 2001 +From: Timothy J Fontaine +Date: Mon, 4 Aug 2014 13:43:50 -0700 +Subject: [PATCH] v8: Fix compliation with GCC 4.8 + +Supresses a very loud warning from GCC 4.8 about unused typedefs + +Original url https://codereview.chromium.org/69413002 +--- + src/checks.h | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/checks.h b/src/checks.h +index d0a0c2b..4396ada 100644 +--- a/src/checks.h ++++ b/src/checks.h +@@ -230,6 +230,13 @@ inline void CheckNonEqualsHelper(const char* file, + #define CHECK_LE(a, b) CHECK((a) <= (b)) + + ++#if defined(__clang__) || defined(__GNUC__) ++# define V8_UNUSED __attribute__((unused)) ++#else ++# define V8_UNUSED ++#endif ++ ++ + // This is inspired by the static assertion facility in boost. This + // is pretty magical. If it causes you trouble on a platform you may + // find a fix in the boost code. +@@ -248,7 +255,7 @@ template class StaticAssertionHelper { }; + #define STATIC_CHECK(test) \ + typedef \ + StaticAssertionHelper((test))>)> \ +- SEMI_STATIC_JOIN(__StaticAssertTypedef__, __LINE__) ++ SEMI_STATIC_JOIN(__StaticAssertTypedef__, __LINE__) V8_UNUSED + + + extern bool FLAG_enable_slow_asserts; diff --git a/v8-3.14.5.10-use-clock_gettime.patch b/v8-3.14.5.10-use-clock_gettime.patch new file mode 100644 index 0000000..cb25591 --- /dev/null +++ b/v8-3.14.5.10-use-clock_gettime.patch @@ -0,0 +1,122 @@ +From f9ced08de30c37838756e8227bd091f80ad9cafa Mon Sep 17 00:00:00 2001 +From: Ben Noordhuis +Date: Thu, 24 Apr 2014 04:27:40 +0200 +Subject: [PATCH] deps: make v8 use CLOCK_REALTIME_COARSE + +Date.now() indirectly calls gettimeofday() on Linux and that's a system +call that is extremely expensive on virtualized systems when the host +operating system has to emulate access to the hardware clock. + +Case in point: output from `perf record -c 10000 -e cycles:u -g -i` +for a benchmark/http_simple bytes/8 benchmark with a light load of +50 concurrent clients: + + 53.69% node node [.] v8::internal::OS::TimeCurrentMillis() + | + --- v8::internal::OS::TimeCurrentMillis() + | + |--99.77%-- v8::internal::Runtime_DateCurrentTime(v8::internal::Arguments, v8::internal::Isolate*) + | 0x23587880618e + +That's right - over half of user time spent inside the V8 function that +calls gettimeofday(). + +Notably, nearly all system time gets attributed to acpi_pm_read(), the +kernel function that reads the ACPI power management timer: + + 32.49% node [kernel.kallsyms] [k] acpi_pm_read + | + --- acpi_pm_read + | + |--98.40%-- __getnstimeofday + | getnstimeofday + | | + | |--71.61%-- do_gettimeofday + | | sys_gettimeofday + | | system_call_fastpath + | | 0x7fffbbaf6dbc + | | | + | | |--98.72%-- v8::internal::OS::TimeCurrentMillis() + +The cost of the gettimeofday() system call is normally measured in +nanoseconds but we were seeing 100 us averages and spikes >= 1000 us. +The numbers were so bad, my initial hunch was that the node process was +continuously getting rescheduled inside the system call... + +v8::internal::OS::TimeCurrentMillis()'s most frequent caller is +v8::internal::Runtime_DateCurrentTime(), the V8 run-time function +that's behind Date.now(). The timeout handling logic in lib/http.js +and lib/net.js calls into lib/timers.js and that module will happily +call Date.now() hundreds or even thousands of times per second. +If you saw exports._unrefActive() show up in --prof output a lot, +now you know why. + +That's why this commit makes V8 switch over to clock_gettime() on Linux. +In particular, it checks if CLOCK_REALTIME_COARSE is available and has +a resolution <= 1 ms because in that case the clock_gettime() call can +be fully serviced from the vDSO. + +It speeds up the aforementioned benchmark by about 100% on the affected +systems and should go a long way toward addressing the latency issues +that StrongLoop customers have been reporting. + +This patch will be upstreamed as a CR against V8 3.26. I'm sending it +as a pull request for v0.10 first because that's what our users are +running and because the delta between 3.26 and 3.14 is too big to +reasonably back-port the patch. I'll open a pull request for the +master branch once the CR lands upstream. + +Signed-off-by: Trevor Norris +Signed-off-by: Fedor Indutny +--- + src/platform-posix.cc | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +diff --git a/src/platform-posix.cc b/src/platform-posix.cc +index ad74eba..3c86868 100644 +--- a/src/platform-posix.cc ++++ b/src/platform-posix.cc +@@ -188,19 +188,37 @@ int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { + + + double OS::TimeCurrentMillis() { +- struct timeval tv; +- if (gettimeofday(&tv, NULL) < 0) return 0.0; +- return (static_cast(tv.tv_sec) * 1000) + +- (static_cast(tv.tv_usec) / 1000); ++ return static_cast(Ticks()) / 1000; + } + + + int64_t OS::Ticks() { ++#if defined(__linux__) ++ static clockid_t clock_id = static_cast(-1); ++ struct timespec spec; ++ if (clock_id == static_cast(-1)) { ++ // CLOCK_REALTIME_COARSE may not be defined by the system headers but ++ // might still be supported by the kernel so use the clock id directly. ++ // Only use CLOCK_REALTIME_COARSE when its granularity <= 1 ms. ++ const clockid_t clock_realtime_coarse = 5; ++ if (clock_getres(clock_realtime_coarse, &spec) == 0 && ++ spec.tv_nsec <= 1000 * 1000) { ++ clock_id = clock_realtime_coarse; ++ } else { ++ clock_id = CLOCK_REALTIME; ++ } ++ } ++ if (clock_gettime(clock_id, &spec) != 0) { ++ return 0; // Not really possible. ++ } ++ return static_cast(spec.tv_sec) * 1000000 + (spec.tv_nsec / 1000); ++#else + // gettimeofday has microsecond resolution. + struct timeval tv; + if (gettimeofday(&tv, NULL) < 0) + return 0; + return (static_cast(tv.tv_sec) * 1000000) + tv.tv_usec; ++#endif + } + + +-- +1.9.1 diff --git a/v8-3.14.5.10-x64-MathMinMax.patch b/v8-3.14.5.10-x64-MathMinMax.patch new file mode 100644 index 0000000..e7b167d --- /dev/null +++ b/v8-3.14.5.10-x64-MathMinMax.patch @@ -0,0 +1,105 @@ +From 3530fa9cd09f8db8101c4649cab03bcdf760c434 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny +Date: Fri, 21 Dec 2012 17:52:00 +0000 +Subject: [PATCH] deps: backport 4ed5fde4f from v8 upstream + +Original commit message: + + Fix x64 MathMinMax for negative untagged int32 arguments. + + An untagged int32 has zeros in the upper half even if it is negative. + Using cmpq to compare such numbers will incorrectly ignore the sign. + + BUG=164442 + R=mvstanton@chromium.org + + Review URL: https://chromiumcodereview.appspot.com/11665007 + + git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@13273 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 + +Signed-off-by: Fedor Indutny +--- + src/x64/lithium-codegen-x64.cc | 6 ++-- + test/mjsunit/regress/regress-164442.js | 45 ++++++++++++++++++++++++++ + 2 files changed, 48 insertions(+), 3 deletions(-) + create mode 100644 test/mjsunit/regress/regress-164442.js + +diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc +index b461e62..ff01f44 100644 +--- a/src/x64/lithium-codegen-x64.cc ++++ b/src/x64/lithium-codegen-x64.cc +@@ -1457,17 +1457,17 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) { + if (right->IsConstantOperand()) { + Immediate right_imm = + Immediate(ToInteger32(LConstantOperand::cast(right))); +- __ cmpq(left_reg, right_imm); ++ __ cmpl(left_reg, right_imm); + __ j(condition, &return_left, Label::kNear); + __ movq(left_reg, right_imm); + } else if (right->IsRegister()) { + Register right_reg = ToRegister(right); +- __ cmpq(left_reg, right_reg); ++ __ cmpl(left_reg, right_reg); + __ j(condition, &return_left, Label::kNear); + __ movq(left_reg, right_reg); + } else { + Operand right_op = ToOperand(right); +- __ cmpq(left_reg, right_op); ++ __ cmpl(left_reg, right_op); + __ j(condition, &return_left, Label::kNear); + __ movq(left_reg, right_op); + } +diff --git a/test/mjsunit/regress/regress-164442.js b/test/mjsunit/regress/regress-164442.js +new file mode 100644 +index 0000000..1160d87 +--- /dev/null ++++ b/test/mjsunit/regress/regress-164442.js +@@ -0,0 +1,45 @@ ++// Copyright 2012 the V8 project authors. All rights reserved. ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following ++// disclaimer in the documentation and/or other materials provided ++// with the distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived ++// from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++// Flags: --allow-natives-syntax ++ ++// Should not take a very long time (n^2 algorithms are bad) ++ ++ ++function ensureNotNegative(x) { ++ return Math.max(0, x | 0); ++} ++ ++ ++ensureNotNegative(1); ++ensureNotNegative(2); ++ ++%OptimizeFunctionOnNextCall(ensureNotNegative); ++ ++var r = ensureNotNegative(-1); ++ ++assertEquals(0, r); +-- +2.0.3 + diff --git a/v8-3.14.5.10-x64-compare-stubs.patch b/v8-3.14.5.10-x64-compare-stubs.patch new file mode 100644 index 0000000..bf7c542 --- /dev/null +++ b/v8-3.14.5.10-x64-compare-stubs.patch @@ -0,0 +1,116 @@ +From a960d1707a0038bfa5546c669b5b63c35bdb75c5 Mon Sep 17 00:00:00 2001 +From: Fedor Indutny +Date: Fri, 2 May 2014 22:44:45 +0400 +Subject: [PATCH] deps: backport 23f2736a from v8 upstream + +Original text: + + Fix corner case in x64 compare stubs. + + BUG=v8:2416 + + Review URL: https://codereview.chromium.org/11413087 + +fix #7528 +--- + src/x64/code-stubs-x64.cc | 2 +- + test/mjsunit/regress/regress-2416.js | 75 ++++++++++++++++++++++++++++ + 2 files changed, 76 insertions(+), 1 deletion(-) + create mode 100644 test/mjsunit/regress/regress-2416.js + +diff --git a/src/x64/code-stubs-x64.cc b/deps/v8/src/x64/code-stubs-x64.cc +index f0f9c5d..9ad0167 100644 +--- a/src/x64/code-stubs-x64.cc ++++ b/src/x64/code-stubs-x64.cc +@@ -5580,7 +5580,7 @@ void ICCompareStub::GenerateSmis(MacroAssembler* masm) { + __ subq(rdx, rax); + __ j(no_overflow, &done, Label::kNear); + // Correct sign of result in case of overflow. +- __ SmiNot(rdx, rdx); ++ __ not_(rdx); + __ bind(&done); + __ movq(rax, rdx); + } +diff --git a/test/mjsunit/regress/regress-2416.js b/deps/v8/test/mjsunit/regress/regress-2416.js +new file mode 100644 +index 0000000..02afeb9 +--- /dev/null ++++ b/test/mjsunit/regress/regress-2416.js +@@ -0,0 +1,75 @@ ++// Copyright 2012 the V8 project authors. All rights reserved. ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following ++// disclaimer in the documentation and/or other materials provided ++// with the distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived ++// from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++assertFalse(2147483647 < -2147483648) ++assertFalse(2147483647 <= -2147483648) ++assertFalse(2147483647 == -2147483648) ++assertTrue(2147483647 >= -2147483648) ++assertTrue(2147483647 > -2147483648) ++ ++assertTrue(-2147483648 < 2147483647) ++assertTrue(-2147483648 <= 2147483647) ++assertFalse(-2147483648 == 2147483647) ++assertFalse(-2147483648 >= 2147483647) ++assertFalse(-2147483648 > 2147483647) ++ ++assertFalse(2147483647 < 2147483647) ++assertTrue(2147483647 <= 2147483647) ++assertTrue(2147483647 == 2147483647) ++assertTrue(2147483647 >= 2147483647) ++assertFalse(2147483647 > 2147483647) ++ ++assertFalse(-2147483648 < -2147483648) ++assertTrue(-2147483648 <= -2147483648) ++assertTrue(-2147483648 == -2147483648) ++assertTrue(-2147483648 >= -2147483648) ++assertFalse(-2147483648 > -2147483648) ++ ++ ++assertFalse(1073741823 < -1073741824) ++assertFalse(1073741823 <= -1073741824) ++assertFalse(1073741823 == -1073741824) ++assertTrue(1073741823 >= -1073741824) ++assertTrue(1073741823 > -1073741824) ++ ++assertTrue(-1073741824 < 1073741823) ++assertTrue(-1073741824 <= 1073741823) ++assertFalse(-1073741824 == 1073741823) ++assertFalse(-1073741824 >= 1073741823) ++assertFalse(-1073741824 > 1073741823) ++ ++assertFalse(1073741823 < 1073741823) ++assertTrue(1073741823 <= 1073741823) ++assertTrue(1073741823 == 1073741823) ++assertTrue(1073741823 >= 1073741823) ++assertFalse(1073741823 > 1073741823) ++ ++assertFalse(-1073741824 < -1073741824) ++assertTrue(-1073741824 <= -1073741824) ++assertTrue(-1073741824 == -1073741824) ++assertTrue(-1073741824 >= -1073741824) ++assertFalse(-1073741824 > -1073741824) +-- +1.9.3 diff --git a/v8-3.14.5.8-CVE-2013-2634.patch b/v8-3.14.5.8-CVE-2013-2634.patch new file mode 100644 index 0000000..6fdafce --- /dev/null +++ b/v8-3.14.5.8-CVE-2013-2634.patch @@ -0,0 +1,134 @@ +From 5b1d2144ebd47ea768ca5b3cfcda830433c88efe Mon Sep 17 00:00:00 2001 +From: "T.C. Hollingsworth" +Date: Thu, 21 Mar 2013 17:34:19 -0700 +Subject: [PATCH] backport fix for CVE-2013-2632 from SVN r13964 + +--- + src/objects-inl.h | 3 ++- + src/objects.h | 7 +++++-- + src/parser.cc | 4 ++-- + src/parser.h | 5 ----- + src/stub-cache.cc | 8 ++++---- + 5 files changed, 13 insertions(+), 14 deletions(-) + +diff --git a/src/objects-inl.h b/src/objects-inl.h +index ea5a93f..4834fa6 100644 +--- a/src/objects-inl.h ++++ b/src/objects-inl.h +@@ -3500,8 +3500,9 @@ Code::Flags Code::ComputeFlags(Kind kind, + kind == CALL_IC || + kind == STORE_IC || + kind == KEYED_STORE_IC); ++ ASSERT(argc <= Code::kMaxArguments); + // Compute the bit mask. +- int bits = KindField::encode(kind) ++ unsigned int bits = KindField::encode(kind) + | ICStateField::encode(ic_state) + | TypeField::encode(type) + | ExtraICStateField::encode(extra_ic_state) +diff --git a/src/objects.h b/src/objects.h +index 755dd42..47d7757 100644 +--- a/src/objects.h ++++ b/src/objects.h +@@ -4180,8 +4180,8 @@ class Code: public HeapObject { + // FLAGS_MIN_VALUE and FLAGS_MAX_VALUE are specified to ensure that + // enumeration type has correct value range (see Issue 830 for more details). + enum Flags { +- FLAGS_MIN_VALUE = kMinInt, +- FLAGS_MAX_VALUE = kMaxInt ++ FLAGS_MIN_VALUE = 0, ++ FLAGS_MAX_VALUE = kMaxUInt32 + }; + + #define CODE_KIND_LIST(V) \ +@@ -4644,6 +4644,9 @@ class Code: public HeapObject { + // Signed field cannot be encoded using the BitField class. + static const int kArgumentsCountShift = 14; + static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1); ++ static const int kArgumentsBits = ++ PlatformSmiTagging::kSmiValueSize - Code::kArgumentsCountShift + 1; ++ static const int kMaxArguments = (1 << kArgumentsBits) - 1; + + // This constant should be encodable in an ARM instruction. + static const int kFlagsNotUsedInLookup = +diff --git a/src/parser.cc b/src/parser.cc +index 03e4b03..6da414a 100644 +--- a/src/parser.cc ++++ b/src/parser.cc +@@ -4243,7 +4243,7 @@ ZoneList* Parser::ParseArguments(bool* ok) { + while (!done) { + Expression* argument = ParseAssignmentExpression(true, CHECK_OK); + result->Add(argument, zone()); +- if (result->length() > kMaxNumFunctionParameters) { ++ if (result->length() > Code::kMaxArguments) { + ReportMessageAt(scanner().location(), "too_many_arguments", + Vector::empty()); + *ok = false; +@@ -4420,7 +4420,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle function_name, + + top_scope_->DeclareParameter(param_name, VAR); + num_parameters++; +- if (num_parameters > kMaxNumFunctionParameters) { ++ if (num_parameters > Code::kMaxArguments) { + ReportMessageAt(scanner().location(), "too_many_parameters", + Vector::empty()); + *ok = false; +diff --git a/src/parser.h b/src/parser.h +index 93fd1b8..e36a9b3 100644 +--- a/src/parser.h ++++ b/src/parser.h +@@ -449,11 +449,6 @@ class Parser { + Vector > args); + + private: +- // Limit on number of function parameters is chosen arbitrarily. +- // Code::Flags uses only the low 17 bits of num-parameters to +- // construct a hashable id, so if more than 2^17 are allowed, this +- // should be checked. +- static const int kMaxNumFunctionParameters = 32766; + static const int kMaxNumFunctionLocals = 131071; // 2^17-1 + + enum Mode { +diff --git a/src/stub-cache.cc b/src/stub-cache.cc +index 4119147..8490c7e 100644 +--- a/src/stub-cache.cc ++++ b/src/stub-cache.cc +@@ -617,7 +617,7 @@ Handle StubCache::ComputeCallConstant(int argc, + Handle code = + compiler.CompileCallConstant(object, holder, function, name, check); + code->set_check_type(check); +- ASSERT_EQ(flags, code->flags()); ++ ASSERT(flags == code->flags()); + PROFILE(isolate_, + CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); + GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); +@@ -655,7 +655,7 @@ Handle StubCache::ComputeCallField(int argc, + Handle code = + compiler.CompileCallField(Handle::cast(object), + holder, index, name); +- ASSERT_EQ(flags, code->flags()); ++ ASSERT(flags == code->flags()); + PROFILE(isolate_, + CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); + GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); +@@ -692,7 +692,7 @@ Handle StubCache::ComputeCallInterceptor(int argc, + Handle code = + compiler.CompileCallInterceptor(Handle::cast(object), + holder, name); +- ASSERT_EQ(flags, code->flags()); ++ ASSERT(flags == code->flags()); + PROFILE(isolate(), + CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); + GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); +@@ -721,7 +721,7 @@ Handle StubCache::ComputeCallGlobal(int argc, + CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); + Handle code = + compiler.CompileCallGlobal(receiver, holder, cell, function, name); +- ASSERT_EQ(flags, code->flags()); ++ ASSERT(flags == code->flags()); + PROFILE(isolate(), + CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); + GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); +-- +1.8.1.4 + diff --git a/v8-3.3.10-enable-experimental.patch b/v8-3.3.10-enable-experimental.patch new file mode 100644 index 0000000..1b14815 --- /dev/null +++ b/v8-3.3.10-enable-experimental.patch @@ -0,0 +1,59 @@ +diff -up v8-3.3.10/src/SConscript.experimental v8-3.3.10/src/SConscript +--- v8-3.3.10/src/SConscript.experimental 2011-08-10 11:55:38.000000000 -0400 ++++ v8-3.3.10/src/SConscript 2011-08-10 12:07:47.975380113 -0400 +@@ -133,6 +133,12 @@ SOURCES = { + zone.cc + extensions/gc-extension.cc + extensions/externalize-string-extension.cc ++ extensions/experimental/break-iterator.cc ++ extensions/experimental/collator.cc ++ extensions/experimental/i18n-extension.cc ++ extensions/experimental/i18n-locale.cc ++ extensions/experimental/i18n-utils.cc ++ extensions/experimental/language-matcher.cc + """), + 'arch:arm': Split(""" + arm/builtins-arm.cc +@@ -301,6 +307,10 @@ proxy.js + '''.split() + + ++I18N_LIBRARY_FILES = ''' ++extensions/experimental/i18n.js ++'''.split() ++ + def Abort(message): + print message + sys.exit(1) +@@ -328,6 +338,13 @@ def ConfigureObjectFiles(): + ['libraries.cc'], library_files, **BuildJS2CEnv('CORE')) + libraries_obj = context.ConfigureObject(env, libraries_src, CPPPATH=['.']) + ++ # Combine the experimental I18N JavaScript library files into a C++ file ++ # and compile it. ++ i18n_library_files = [ s for s in I18N_LIBRARY_FILES ] ++ i18n_library_files.append('macros.py') ++ i18n_libraries_src = env.JS2C(['i18n-libraries.cc'], i18n_library_files, TYPE='I18N') ++ i18n_libraries_obj = context.ConfigureObject(env, i18n_libraries_src, CPPPATH=['.']) ++ + # Combine the experimental JavaScript library files into a C++ file + # and compile it. + experimental_library_files = [ s for s in EXPERIMENTAL_LIBRARY_FILES ] +@@ -351,7 +368,7 @@ def ConfigureObjectFiles(): + mksnapshot_env = env.Copy() + mksnapshot_env.Replace(**context.flags['mksnapshot']) + mksnapshot_src = 'mksnapshot.cc' +- mksnapshot = mksnapshot_env.Program('mksnapshot', [mksnapshot_src, libraries_obj, experimental_libraries_obj, non_snapshot_files, empty_snapshot_obj], PDB='mksnapshot.exe.pdb') ++ mksnapshot = mksnapshot_env.Program('mksnapshot', [mksnapshot_src, libraries_obj, i18n_libraries_obj, experimental_libraries_obj, non_snapshot_files, empty_snapshot_obj], PDB='mksnapshot.exe.pdb') + if context.use_snapshot: + if context.build_snapshot: + snapshot_cc = env.Snapshot('snapshot.cc', mksnapshot, LOGFILE=File('snapshot.log').abspath) +@@ -360,7 +377,7 @@ def ConfigureObjectFiles(): + snapshot_obj = context.ConfigureObject(env, snapshot_cc, CPPPATH=['.']) + else: + snapshot_obj = empty_snapshot_obj +- library_objs = [non_snapshot_files, libraries_obj, experimental_libraries_obj, snapshot_obj] ++ library_objs = [non_snapshot_files, libraries_obj, i18n_libraries_obj, experimental_libraries_obj, snapshot_obj] + return (library_objs, d8_objs, [mksnapshot], preparser_objs) + + diff --git a/v8-3.3.10-language-matcher-fix.patch b/v8-3.3.10-language-matcher-fix.patch new file mode 100644 index 0000000..85500c1 --- /dev/null +++ b/v8-3.3.10-language-matcher-fix.patch @@ -0,0 +1,24 @@ +diff -up v8-3.3.10/src/extensions/experimental/language-matcher.cc.fix v8-3.3.10/src/extensions/experimental/language-matcher.cc +--- v8-3.3.10/src/extensions/experimental/language-matcher.cc.fix 2011-08-10 12:12:39.257368098 -0400 ++++ v8-3.3.10/src/extensions/experimental/language-matcher.cc 2011-08-10 12:12:47.150362828 -0400 +@@ -42,7 +42,7 @@ namespace internal { + const unsigned int LanguageMatcher::kLanguageWeight = 75; + const unsigned int LanguageMatcher::kScriptWeight = 20; + const unsigned int LanguageMatcher::kRegionWeight = 5; +-const unsigned int LanguageMatcher::kThreshold = 50; ++const int LanguageMatcher::kThreshold = 50; + const unsigned int LanguageMatcher::kPositionBonus = 1; + const char* const LanguageMatcher::kDefaultLocale = "root"; + +diff -up v8-3.3.10/src/extensions/experimental/language-matcher.h.fix v8-3.3.10/src/extensions/experimental/language-matcher.h +--- v8-3.3.10/src/extensions/experimental/language-matcher.h.fix 2011-08-10 12:13:15.147621253 -0400 ++++ v8-3.3.10/src/extensions/experimental/language-matcher.h 2011-08-10 12:13:24.311742395 -0400 +@@ -76,7 +76,7 @@ class LanguageMatcher { + static const unsigned int kRegionWeight; + + // LocaleID match score has to be over this number to accept the match. +- static const unsigned int kThreshold; ++ static const int kThreshold; + + // For breaking ties in priority queue. + static const unsigned int kPositionBonus; diff --git a/v8-3.4.14-CVE-2014-3152.patch b/v8-3.4.14-CVE-2014-3152.patch new file mode 100644 index 0000000..a399c79 --- /dev/null +++ b/v8-3.4.14-CVE-2014-3152.patch @@ -0,0 +1,13 @@ +diff -up v8-3.14.5.10/src/arm/lithium-codegen-arm.cc.cve20143152 v8-3.14.5.10/src/arm/lithium-codegen-arm.cc +--- v8-3.14.5.10/src/arm/lithium-codegen-arm.cc.cve20143152 2015-04-23 14:51:20.095648219 -0400 ++++ v8-3.14.5.10/src/arm/lithium-codegen-arm.cc 2015-04-23 14:53:28.834149299 -0400 +@@ -3034,7 +3034,8 @@ MemOperand LCodeGen::PrepareKeyedOperand + return MemOperand(base, scratch0(), LSL, shift_size); + } else { + ASSERT_EQ(-1, shift_size); +- return MemOperand(base, scratch0(), LSR, 1); ++ // key can be negative, so using ASR here. ++ return MemOperand(base, scratch0(), ASR, 1); + } + } + diff --git a/v8-3.4.14-enable-experimental.patch b/v8-3.4.14-enable-experimental.patch new file mode 100644 index 0000000..9a7b805 --- /dev/null +++ b/v8-3.4.14-enable-experimental.patch @@ -0,0 +1,61 @@ +diff -up v8-3.4.14-20110721svn8716/src/SConscript.experimental v8-3.4.14-20110721svn8716/src/SConscript +--- v8-3.4.14-20110721svn8716/src/SConscript.experimental 2011-07-21 11:02:27.000000000 -0400 ++++ v8-3.4.14-20110721svn8716/src/SConscript 2011-07-21 13:13:52.678543506 -0400 +@@ -134,6 +134,14 @@ SOURCES = { + zone.cc + extensions/gc-extension.cc + extensions/externalize-string-extension.cc ++ extensions/experimental/break-iterator.cc ++ extensions/experimental/collator.cc ++ extensions/experimental/datetime-format.cc ++ extensions/experimental/i18n-extension.cc ++ extensions/experimental/i18n-locale.cc ++ extensions/experimental/i18n-utils.cc ++ extensions/experimental/language-matcher.cc ++ extensions/experimental/number-format.cc + """), + 'arch:arm': Split(""" + arm/builtins-arm.cc +@@ -310,6 +318,10 @@ proxy.js + '''.split() + + ++I18N_LIBRARY_FILES = ''' ++extensions/experimental/i18n.js ++'''.split() ++ + def Abort(message): + print message + sys.exit(1) +@@ -348,6 +360,13 @@ def ConfigureObjectFiles(): + ['libraries.cc'], library_files, **BuildJS2CEnv('CORE')) + libraries_obj = context.ConfigureObject(env, libraries_src, CPPPATH=['.']) + ++ # Combine the experimental I18N JavaScript library files into a C++ file ++ # and compile it. ++ i18n_library_files = [ s for s in I18N_LIBRARY_FILES ] ++ i18n_library_files.append('macros.py') ++ i18n_libraries_src = env.JS2C(['i18n-libraries.cc'], i18n_library_files, **BuildJS2CEnv('I18N')) ++ i18n_libraries_obj = context.ConfigureObject(env, i18n_libraries_src, CPPPATH=['.']) ++ + # Combine the experimental JavaScript library files into a C++ file + # and compile it. + experimental_library_files = [ s for s in EXPERIMENTAL_LIBRARY_FILES ] +@@ -373,7 +392,7 @@ def ConfigureObjectFiles(): + mksnapshot_env = env.Copy() + mksnapshot_env.Replace(**context.flags['mksnapshot']) + mksnapshot_src = 'mksnapshot.cc' +- mksnapshot = mksnapshot_env.Program('mksnapshot', [mksnapshot_src, libraries_obj, experimental_libraries_obj, non_snapshot_files, empty_snapshot_obj], PDB='mksnapshot.exe.pdb') ++ mksnapshot = mksnapshot_env.Program('mksnapshot', [mksnapshot_src, libraries_obj, i18n_libraries_obj, experimental_libraries_obj, non_snapshot_files, empty_snapshot_obj], PDB='mksnapshot.exe.pdb') + if context.use_snapshot: + if context.build_snapshot: + snapshot_cc = env.Snapshot('snapshot.cc', mksnapshot, LOGFILE=File('snapshot.log').abspath) +@@ -382,7 +401,7 @@ def ConfigureObjectFiles(): + snapshot_obj = context.ConfigureObject(env, snapshot_cc, CPPPATH=['.']) + else: + snapshot_obj = empty_snapshot_obj +- library_objs = [non_snapshot_files, libraries_obj, experimental_libraries_obj, snapshot_obj] ++ library_objs = [non_snapshot_files, libraries_obj, i18n_libraries_obj, experimental_libraries_obj, snapshot_obj] + return (library_objs, d8_objs, [mksnapshot], preparser_objs) + + diff --git a/v8-3.4.14-fix-experimental-compile.patch b/v8-3.4.14-fix-experimental-compile.patch new file mode 100644 index 0000000..5a85fd9 --- /dev/null +++ b/v8-3.4.14-fix-experimental-compile.patch @@ -0,0 +1,243 @@ +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.cc.BAD 2011-07-21 12:36:38.117525896 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.cc 2011-07-21 12:36:44.663541775 -0400 +@@ -25,7 +25,7 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/break-iterator.h" ++#include "extensions/experimental/break-iterator.h" + + #include + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.h.BAD 2011-07-21 12:37:39.989539464 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/break-iterator.h 2011-07-21 12:37:47.271546557 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_BREAK_ITERATOR_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_BREAK_ITERATOR_H_ + +-#include "include/v8.h" ++#include "v8.h" + + #include "unicode/uversion.h" + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.cc.BAD 2011-07-21 12:38:32.892541085 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.cc 2011-07-21 12:38:42.536540200 -0400 +@@ -25,7 +25,7 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/collator.h" ++#include "extensions/experimental/collator.h" + + #include "unicode/coll.h" + #include "unicode/locid.h" +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.h.BAD 2011-07-21 12:40:38.695553065 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/collator.h 2011-07-21 12:40:46.604287238 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_COLLATOR_H + #define V8_EXTENSIONS_EXPERIMENTAL_COLLATOR_H_ + +-#include "include/v8.h" ++#include "v8.h" + + #include "unicode/uversion.h" + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.cc.BAD 2011-07-21 12:42:32.070546811 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.cc 2011-07-21 12:42:43.429540019 -0400 +@@ -25,11 +25,11 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/datetime-format.h" ++#include "extensions/experimental/datetime-format.h" + + #include + +-#include "src/extensions/experimental/i18n-utils.h" ++#include "extensions/experimental/i18n-utils.h" + #include "unicode/dtfmtsym.h" + #include "unicode/dtptngen.h" + #include "unicode/locid.h" +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.h.BAD 2011-07-21 12:40:53.229295468 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/datetime-format.h 2011-07-21 12:41:00.279541337 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_DATETIME_FORMAT_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_DATETIME_FORMAT_H_ + +-#include "include/v8.h" ++#include "v8.h" + + #include "unicode/uversion.h" + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.cc.BAD 2011-07-21 12:42:51.682535397 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.cc 2011-07-21 12:43:10.905542088 -0400 +@@ -25,14 +25,14 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/i18n-extension.h" ++#include "extensions/experimental/i18n-extension.h" + +-#include "src/extensions/experimental/break-iterator.h" +-#include "src/extensions/experimental/collator.h" +-#include "src/extensions/experimental/datetime-format.h" +-#include "src/extensions/experimental/i18n-locale.h" +-#include "src/extensions/experimental/i18n-natives.h" +-#include "src/extensions/experimental/number-format.h" ++#include "extensions/experimental/break-iterator.h" ++#include "extensions/experimental/collator.h" ++#include "extensions/experimental/datetime-format.h" ++#include "extensions/experimental/i18n-locale.h" ++#include "extensions/experimental/i18n-natives.h" ++#include "extensions/experimental/number-format.h" + + namespace v8 { + namespace internal { +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.h.BAD 2011-07-21 12:41:13.170538335 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-extension.h 2011-07-21 12:41:20.023540712 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_I18N_EXTENSION_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_I18N_EXTENSION_H_ + +-#include "include/v8.h" ++#include "v8.h" + + namespace v8 { + namespace internal { +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.cc.BAD 2011-07-21 12:43:18.896539148 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.cc 2011-07-21 12:43:32.626538677 -0400 +@@ -25,10 +25,10 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/i18n-locale.h" ++#include "extensions/experimental/i18n-locale.h" + +-#include "src/extensions/experimental/i18n-utils.h" +-#include "src/extensions/experimental/language-matcher.h" ++#include "extensions/experimental/i18n-utils.h" ++#include "extensions/experimental/language-matcher.h" + #include "unicode/locid.h" + #include "unicode/uloc.h" + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.h.BAD 2011-07-21 12:41:28.401292703 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-locale.h 2011-07-21 12:41:34.887302839 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_I18N_LOCALE_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_I18N_LOCALE_H_ + +-#include "include/v8.h" ++#include "v8.h" + + namespace v8 { + namespace internal { +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.cc.BAD 2011-07-21 12:43:40.641540032 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.cc 2011-07-21 12:43:47.258552856 -0400 +@@ -25,7 +25,7 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/i18n-utils.h" ++#include "extensions/experimental/i18n-utils.h" + + #include + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.h.BAD 2011-07-21 12:41:47.436545325 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-utils.h 2011-07-21 12:41:53.749539656 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_I18N_UTILS_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_I18N_UTILS_H_ + +-#include "include/v8.h" ++#include "v8.h" + + #include "unicode/uversion.h" + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.cc.BAD 2011-07-21 12:43:55.484291257 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.cc 2011-07-21 12:47:31.316288453 -0400 +@@ -28,11 +28,11 @@ + // TODO(cira): Remove LanguageMatcher from v8 when ICU implements + // language matching API. + +-#include "src/extensions/experimental/language-matcher.h" ++#include "extensions/experimental/language-matcher.h" + + #include + +-#include "src/extensions/experimental/i18n-utils.h" ++#include "extensions/experimental/i18n-utils.h" + #include "unicode/datefmt.h" // For getAvailableLocales + #include "unicode/locid.h" + #include "unicode/uloc.h" +@@ -43,7 +43,7 @@ namespace internal { + const unsigned int LanguageMatcher::kLanguageWeight = 75; + const unsigned int LanguageMatcher::kScriptWeight = 20; + const unsigned int LanguageMatcher::kRegionWeight = 5; +-const unsigned int LanguageMatcher::kThreshold = 50; ++const int LanguageMatcher::kThreshold = 50; + const unsigned int LanguageMatcher::kPositionBonus = 1; + const char* const LanguageMatcher::kDefaultLocale = "root"; + +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.h.BAD 2011-07-21 12:42:00.374537754 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/language-matcher.h 2011-07-21 12:47:59.556286069 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_LANGUAGE_MATCHER_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_LANGUAGE_MATCHER_H_ + +-#include "include/v8.h" ++#include "v8.h" + + #include "unicode/uloc.h" + +@@ -76,7 +76,7 @@ class LanguageMatcher { + static const unsigned int kRegionWeight; + + // LocaleID match score has to be over this number to accept the match. +- static const unsigned int kThreshold; ++ static const int kThreshold; + + // For breaking ties in priority queue. + static const unsigned int kPositionBonus; +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.cc.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.cc +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.cc.BAD 2011-07-21 12:44:13.227297121 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.cc 2011-07-21 12:44:23.119292346 -0400 +@@ -25,11 +25,11 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-#include "src/extensions/experimental/number-format.h" ++#include "extensions/experimental/number-format.h" + + #include + +-#include "src/extensions/experimental/i18n-utils.h" ++#include "extensions/experimental/i18n-utils.h" + #include "unicode/dcfmtsym.h" + #include "unicode/decimfmt.h" + #include "unicode/locid.h" +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.h.BAD v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.h +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.h.BAD 2011-07-21 12:42:15.678549139 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/number-format.h 2011-07-21 12:42:22.940543222 -0400 +@@ -28,7 +28,7 @@ + #ifndef V8_EXTENSIONS_EXPERIMENTAL_NUMBER_FORMAT_H_ + #define V8_EXTENSIONS_EXPERIMENTAL_NUMBER_FORMAT_H_ + +-#include "include/v8.h" ++#include "v8.h" + + #include "unicode/uversion.h" + diff --git a/v8-3.4.14-i18n-js2c.patch b/v8-3.4.14-i18n-js2c.patch new file mode 100644 index 0000000..4665fff --- /dev/null +++ b/v8-3.4.14-i18n-js2c.patch @@ -0,0 +1,40 @@ +diff -up v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-js2c.py.i18n-js2c v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-js2c.py +--- v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-js2c.py.i18n-js2c 2011-07-21 14:39:22.402295140 -0400 ++++ v8-3.4.14-20110721svn8716/src/extensions/experimental/i18n-js2c.py 2011-07-21 14:39:28.328285018 -0400 +@@ -85,7 +85,7 @@ HEADER_TEMPLATE = """\ + // want to make changes to this file you should either change the + // javascript source files or the i18n-js2c.py script. + +-#include "src/extensions/experimental/i18n-natives.h" ++#include "extensions/experimental/i18n-natives.h" + + namespace v8 { + namespace internal { +diff -up v8-3.4.14-20110721svn8716/src/SConscript.i18n-js2c v8-3.4.14-20110721svn8716/src/SConscript +--- v8-3.4.14-20110721svn8716/src/SConscript.i18n-js2c 2011-07-21 14:38:49.828400947 -0400 ++++ v8-3.4.14-20110721svn8716/src/SConscript 2011-07-21 14:38:49.869408897 -0400 +@@ -318,10 +318,6 @@ proxy.js + '''.split() + + +-I18N_LIBRARY_FILES = ''' +-extensions/experimental/i18n.js +-'''.split() +- + def Abort(message): + print message + sys.exit(1) +@@ -360,11 +356,8 @@ def ConfigureObjectFiles(): + ['libraries.cc'], library_files, **BuildJS2CEnv('CORE')) + libraries_obj = context.ConfigureObject(env, libraries_src, CPPPATH=['.']) + +- # Combine the experimental I18N JavaScript library files into a C++ file +- # and compile it. +- i18n_library_files = [ s for s in I18N_LIBRARY_FILES ] +- i18n_library_files.append('macros.py') +- i18n_libraries_src = env.JS2C(['i18n-libraries.cc'], i18n_library_files, **BuildJS2CEnv('I18N')) ++ # Compile the experimental I18N JavaScript C++ file we generated outside. ++ i18n_libraries_src = 'i18n-libraries.cc' + i18n_libraries_obj = context.ConfigureObject(env, i18n_libraries_src, CPPPATH=['.']) + + # Combine the experimental JavaScript library files into a C++ file diff --git a/v8-3.5.1-versioned-v8.patch b/v8-3.5.1-versioned-v8.patch new file mode 100644 index 0000000..25417ee --- /dev/null +++ b/v8-3.5.1-versioned-v8.patch @@ -0,0 +1,14 @@ +Index: v8-3.5.1/SConstruct +=================================================================== +--- v8-3.5.1.orig/SConstruct ++++ v8-3.5.1/SConstruct +@@ -1350,6 +1350,9 @@ def BuildSpecific(env, mode, env_overrid + # When building shared object with SONAME version the library name. + library_name += '-' + version + ++ # Fedora patch: link d8 against versioned v8 ++ d8_flags['LIBS'][d8_flags['LIBS'].index('v8')] += '-' + version ++ print "BuildSpecific: d8_flags = %s" % d8_flags + # Generate library SONAME if required by the build. + if context.options['soname'] == 'on': + soname = GetSpecificSONAME() diff --git a/v8-daily-tarball.sh b/v8-daily-tarball.sh new file mode 100644 index 0000000..ea4a7b6 --- /dev/null +++ b/v8-daily-tarball.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# This script checks out v8 source from svn. + +LOCALDIR=`pwd` +TODAYSDATE=`date +%Y%m%d` +USAGE="Usage: v8-daily-tarball.sh [-hrv]" +VERBOSE=false + +while getopts "hv" opt; do + case $opt in + h ) printf "$USAGE\n" + printf "\nAvailable command line options:\n" + printf "%b\t-h\t\tthis help\n" + printf "%b\t-v\t\tverbose output\n\n" + exit 1 ;; + v ) VERBOSE=true + printf "[VERBOSE]: Enabled\n" ;; + \? ) printf "$USAGE\n" + exit 1 ;; + esac +done + +# If the directory is there, just nuke it and continue. +if [ -d v8-$TODAYSDATE ]; then + if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Conflicting directory found, removing v8-$TODAYSDATE/\n" + fi + rm -rf v8-$TODAYSDATE/ + if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Removed conflicting directory: v8-$TODAYSDATE/\n" + fi +fi + +printf "Checking out the source tree. This will take some time.\n" + +if [ "$VERBOSE" = "true" ]; then + svn checkout http://v8.googlecode.com/svn/trunk/ v8-$TODAYSDATE +else + svn --quiet checkout http://v8.googlecode.com/svn/trunk v8-$TODAYSDATE +fi + +# Determine SVN rev and Version of v8 +cd v8-$TODAYSDATE/ +SVNREV=`svnversion` +V8_VERSION=`head -n1 ChangeLog |cut -f2 -d: |sed 's| Version ||g'` +cd .. + +printf "V8 ($V8_VERSION) svn$SVNREV [$TODAYSDATE] checked out\n" + +FULLVER=`echo ${V8_VERSION}-${TODAYSDATE}svn${SVNREV}` + +# Get rid of .svn bits to save space +if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Removing unnecessary .svn bits\n" +fi +find v8-$TODAYSDATE -depth -name .svn -type d -exec rm -rf {} \; + +# Now, lets look for the final target directory, without svnrev. +if [ -d v8-$FULLVER ]; then + if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Removing conflicting directory: v8-$FULLVER/\n" + fi + rm -rf v8-$FULLVER/ + if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Removed conflicting directory: v8-$FULLVER/\n" + fi +fi + +# At this point, we know the v8 target directory does not exist, time to rename the checkout +if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Renaming checkout directory from: v8-$TODAYSDATE/ to: v8-$FULLVER/\n" +fi +mv v8-$TODAYSDATE/ v8-$FULLVER/ + +# Now, lets look for the tarball. +if [ -f v8-$FULLVER.tar.bz2 ]; then + if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Found existing tarball matching v8-$FULLVER.tar.bz2, removing.\n" + fi + rm -f v8-$FULLVER.tar.bz2 + if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Removed conflicting file: v8-$FULLVER.tar.bz2\n" + fi +fi + +if [ "$VERBOSE" = "true" ]; then + printf "[VERBOSE]: Creating tarball: v8-$FULLVER.tar.bz2\n" +fi +tar cfj v8-$FULLVER.tar.bz2 v8-$FULLVER + +# All done. +printf "Daily v8 source processed and ready: v8-$FULLVER.tar.bz2\n" +exit 0 diff --git a/v8-js2c b/v8-js2c new file mode 100644 index 0000000..6d76060 --- /dev/null +++ b/v8-js2c @@ -0,0 +1,4 @@ +#!/usr/bin/python + +import js2c +js2c.main () diff --git a/v8.spec b/v8.spec new file mode 100644 index 0000000..eb77fb1 --- /dev/null +++ b/v8.spec @@ -0,0 +1,698 @@ +# Hi Googlers! If you're looking in here for patches, nifty. +# You (and everyone else) are welcome to use any of my Chromium spec files and +# patches under the terms of the GPLv2 or later. +# You (and everyone else) are welcome to use any of my V8-specific spec files +# and patches under the terms of the BSD license. +# You (and everyone else) may NOT use my spec files or patches under any other +# terms. +# I hate to be a party-pooper here, but I really don't want to help Google +# make a proprietary browser. There are enough of those already. +# All copyrightable work in these spec files and patches is Copyright 2011 +# Tom Callaway + +# For the 1.2 branch, we use 0s here +# For 1.3+, we use the three digit versions +# Hey, now there are four digits. What do they mean? Popsicle. +%global somajor 3 +%global sominor 14 +%global sobuild 5 +%global sotiny 10 +%global sover %{somajor}.%{sominor}.%{sobuild} + +# %%global svnver 20110721svn8716 + +Name: v8 +Version: %{somajor}.%{sominor}.%{sobuild}.%{sotiny} +Release: 18%{?dist} +Epoch: 1 +Summary: JavaScript Engine +Group: System Environment/Libraries +License: BSD +URL: http://code.google.com/p/v8 +Source0: http://commondatastorage.googleapis.com/chromium-browser-official/v8-%{version}.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +ExclusiveArch: %{ix86} x86_64 %{arm} +BuildRequires: scons, readline-devel, libicu-devel +BuildRequires: valgrind-devel + +#backport fix for CVE-2013-2634 (RHBZ#924495) +Patch1: v8-3.14.5.8-CVE-2013-2634.patch + +#backport fix for CVE-2013-2882 (RHBZ#991116) +Patch2: v8-3.14.5.10-CVE-2013-2882.patch + +#backport fix for CVE-2013-6640 (RHBZ#1039889) +Patch3: v8-3.14.5.10-CVE-2013-6640.patch + +#backport fix for enumeration for objects with lots of properties +# https://codereview.chromium.org/11362182 +Patch4: v8-3.14.5.10-enumeration.patch + +#backport fix for CVE-2013-6640 (RHBZ#1059070) +Patch5: v8-3.14.5.10-CVE-2013-6650.patch + +#backport only applicable fix for CVE-2014-1704 (RHBZ#1077136) +#the other two patches don't affect this version of v8 +Patch6: v8-3.14.5.10-CVE-2014-1704-1.patch + +# use clock_gettime() instead of gettimeofday(), which increases performance +# dramatically on virtual machines +# https://github.com/joyent/node/commit/f9ced08de30c37838756e8227bd091f80ad9cafa +# see above link or head of patch for complete rationale +Patch7: v8-3.14.5.10-use-clock_gettime.patch + +# fix corner case in x64 compare stubs +# fixes bug resulting in an incorrect result when comparing certain integers +# (e.g. 2147483647 > -2147483648 is false instead of true) +# https://code.google.com/p/v8/issues/detail?id=2416 +# https://github.com/joyent/node/issues/7528 +Patch8: v8-3.14.5.10-x64-compare-stubs.patch + +# backport security fix for memory corruption/stack overflow (RHBZ#1125464) +# https://groups.google.com/d/msg/nodejs/-siJEObdp10/2xcqqmTHiEMJ +# https://github.com/joyent/node/commit/530af9cb8e700e7596b3ec812bad123c9fa06356 +Patch9: v8-3.14.5.10-mem-corruption-stack-overflow.patch + +# backport bugfix for x64 MathMinMax: +# Fix x64 MathMinMax for negative untagged int32 arguments. +# An untagged int32 has zeros in the upper half even if it is negative. +# Using cmpq to compare such numbers will incorrectly ignore the sign. +# https://github.com/joyent/node/commit/3530fa9cd09f8db8101c4649cab03bcdf760c434 +Patch10: v8-3.14.5.10-x64-MathMinMax.patch + +# backport bugfix that eliminates unused-local-typedefs warning +# https://github.com/joyent/node/commit/53b4accb6e5747b156be91a2b90f42607e33a7cc +Patch11: v8-3.14.5.10-unused-local-typedefs.patch + +# backport security fix: Fix Hydrogen bounds check elimination +# resolves CVE-2013-6668 (RHBZ#1086120) +# https://github.com/joyent/node/commit/fd80a31e0697d6317ce8c2d289575399f4e06d21 +Patch12: v8-3.14.5.10-CVE-2013-6668.patch + +# backport fix to segfault caused by the above patch +# https://github.com/joyent/node/commit/3122e0eae64c5ab494b29d0a9cadef902d93f1f9 +Patch13: v8-3.14.5.10-CVE-2013-6668-segfault.patch + +# Use system valgrind header +# https://bugzilla.redhat.com/show_bug.cgi?id=1141483 +Patch14: v8-3.14.5.10-system-valgrind.patch + +# Fix issues with abort on uncaught exception +# https://github.com/joyent/node/pull/8666 +# https://github.com/joyent/node/issues/8631 +# https://github.com/joyent/node/issues/8630 +Patch15: v8-3.14.5.10-abort-uncaught-exception.patch + +# Fix unhandled ReferenceError in debug-debugger.js +# https://github.com/joyent/node/commit/0ff51c6e063e3eea9e4d9ea68edc82d935626fc7 +# https://codereview.chromium.org/741683002 +Patch16: v8-3.14.5.10-unhandled-ReferenceError.patch + +# Don't busy loop in CPU profiler thread +# https://github.com/joyent/node/pull/8789 +Patch17: v8-3.14.5.10-busy-loop.patch + +# Log V8 version in profiler log file +# (needed for compatibility with profiler tools) +# https://github.com/joyent/node/pull/9043 +# https://codereview.chromium.org/806143002 +Patch18: v8-3.14.5.10-profiler-log.patch + +# Fix CVE in ARM code +# https://bugzilla.redhat.com/show_bug.cgi?id=1101057 +# https://codereview.chromium.org/219473002 +Patch19: v8-3.4.14-CVE-2014-3152.patch + +%description +V8 is Google's open source JavaScript engine. V8 is written in C++ and is used +in Google Chrome, the open source browser from Google. V8 implements ECMAScript +as specified in ECMA-262, 3rd edition. + +%package devel +Group: Development/Libraries +Summary: Development headers and libraries for v8 +Requires: %{name} = %{epoch}:%{version}-%{release} + +%description devel +Development headers and libraries for v8. + +%prep +%setup -q -n %{name}-%{version} +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 -b .system-valgrind +%patch15 -p1 -b .abort-uncaught-exception +%patch16 -p1 -b .unhandled-ReferenceError +%patch17 -p1 -b .busy-loop +%patch18 -p1 -b .profiler-log +%patch19 -p1 -b .cve20143152 + +# Do not need this lying about. +rm -rf src/third_party/valgrind + +#Patch7 needs -lrt on glibc < 2.17 (RHEL <= 6) +%if (0%{?rhel} > 6 || 0%{?fedora} > 18) +%global lrt %{nil} +%else +%global lrt -lrt +%endif + +# -fno-strict-aliasing is needed with gcc 4.4 to get past some ugly code +PARSED_OPT_FLAGS=`echo \'$RPM_OPT_FLAGS %{lrt} -fPIC -fno-strict-aliasing -Wno-unused-parameter -Wno-error=strict-overflow -Wno-unused-but-set-variable\'| sed "s/ /',/g" | sed "s/',/', '/g"` +sed -i "s|'-O3',|$PARSED_OPT_FLAGS,|g" SConstruct + +# clear spurious executable bits +find . \( -name \*.cc -o -name \*.h -o -name \*.py \) -a -executable \ + |while read FILE ; do + echo $FILE + chmod -x $FILE + done + +%build +mkdir -p obj/release/ +export GCC_VERSION="44" + +# SCons is going away, but for now build with +# I_know_I_should_build_with_GYP=yes +scons library=shared snapshots=on \ +%ifarch x86_64 +arch=x64 \ +%endif +%ifarch armv7hl armv7hnl +armeabi=hard \ +%endif +%ifarch armv5tel armv6l armv7l +armeabi=soft \ +%endif +visibility=default \ +env=CCFLAGS:"-fPIC" \ +I_know_I_should_build_with_GYP=yes + +%if 0%{?fedora} >= 16 +export ICU_LINK_FLAGS=`pkg-config --libs-only-l icu-i18n` +%else +export ICU_LINK_FLAGS=`pkg-config --libs-only-l icu` +%endif + +# When will people learn to create versioned shared libraries by default? +# first, lets get rid of the old .so file +rm -rf libv8.so libv8preparser.so +# Now, lets make it right. +g++ $RPM_OPT_FLAGS -fPIC -o libv8preparser.so.%{sover} -shared -Wl,-soname,libv8preparser.so.%{somajor} \ + obj/release/allocation.os \ + obj/release/bignum.os \ + obj/release/bignum-dtoa.os \ + obj/release/cached-powers.os \ + obj/release/diy-fp.os \ + obj/release/dtoa.os \ + obj/release/fast-dtoa.os \ + obj/release/fixed-dtoa.os \ + obj/release/preparse-data.os \ + obj/release/preparser-api.os \ + obj/release/preparser.os \ + obj/release/scanner.os \ + obj/release/strtod.os \ + obj/release/token.os \ + obj/release/unicode.os \ + obj/release/utils.os + +# "obj/release/preparser-api.os" should not be included in the libv8.so file. +export RELEASE_BUILD_OBJS=`echo obj/release/*.os | sed 's|obj/release/preparser-api.os||g'` + +%ifarch %{arm} +g++ $RPM_OPT_FLAGS -fPIC -o libv8.so.%{sover} -shared -Wl,-soname,libv8.so.%{somajor} $RELEASE_BUILD_OBJS obj/release/extensions/*.os obj/release/arm/*.os $ICU_LINK_FLAGS +%endif +%ifarch %{ix86} +g++ $RPM_OPT_FLAGS -fPIC -o libv8.so.%{sover} -shared -Wl,-soname,libv8.so.%{somajor} $RELEASE_BUILD_OBJS obj/release/extensions/*.os obj/release/ia32/*.os $ICU_LINK_FLAGS +%endif +%ifarch x86_64 +g++ $RPM_OPT_FLAGS -fPIC -o libv8.so.%{sover} -shared -Wl,-soname,libv8.so.%{somajor} $RELEASE_BUILD_OBJS obj/release/extensions/*.os obj/release/x64/*.os $ICU_LINK_FLAGS +%endif + +# We need to do this so d8 can link against it. +ln -sf libv8.so.%{sover} libv8.so +ln -sf libv8preparser.so.%{sover} libv8preparser.so + +# This will fail to link d8 because it doesn't use the icu libs. +# Don't build d8 shared. Stupid Google. Hate. +# SCons is going away, but for now build with +# I_know_I_should_build_with_GYP=yes +scons d8 \ +I_know_I_should_build_with_GYP=yes \ +%ifarch x86_64 +arch=x64 \ +%endif +%ifarch armv7hl armv7hnl +armeabi=hard \ +%endif +%ifarch armv5tel armv6l armv7l +armeabi=soft \ +%endif +snapshots=on console=readline visibility=default || : +# library=shared snapshots=on console=readline visibility=default || : + +# Sigh. I f*****g hate scons. +# But gyp is worse. +# rm -rf d8 + +# g++ $RPM_OPT_FLAGS -o d8 obj/release/d8.os -lreadline -lpthread -L. -lv8 $ICU_LINK_FLAGS + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}%{_includedir} +mkdir -p %{buildroot}%{_libdir} +install -p include/*.h %{buildroot}%{_includedir} +install -p libv8.so.%{sover} %{buildroot}%{_libdir} +install -p libv8preparser.so.%{sover} %{buildroot}%{_libdir} +mkdir -p %{buildroot}%{_bindir} +install -p -m0755 d8 %{buildroot}%{_bindir} + +pushd %{buildroot}%{_libdir} +ln -sf libv8.so.%{sover} libv8.so +ln -sf libv8.so.%{sover} libv8.so.%{somajor} +ln -sf libv8.so.%{sover} libv8.so.%{somajor}.%{sominor} +ln -sf libv8preparser.so.%{sover} libv8preparser.so +ln -sf libv8preparser.so.%{sover} libv8preparser.so.%{somajor} +ln -sf libv8preparser.so.%{sover} libv8preparser.so.%{somajor}.%{sominor} +popd + +chmod -x %{buildroot}%{_includedir}/v8*.h + +mkdir -p %{buildroot}%{_includedir}/v8/extensions/ +install -p src/extensions/*.h %{buildroot}%{_includedir}/v8/extensions/ + +chmod -x %{buildroot}%{_includedir}/v8/extensions/*.h + +# install Python JS minifier scripts for nodejs +install -d %{buildroot}%{python_sitelib} +sed -i 's|/usr/bin/python2.4|/usr/bin/env python|g' tools/jsmin.py +sed -i 's|/usr/bin/python2.4|/usr/bin/env python|g' tools/js2c.py +install -p -m0744 tools/jsmin.py %{buildroot}%{python_sitelib}/ +install -p -m0744 tools/js2c.py %{buildroot}%{python_sitelib}/ +chmod -R -x %{buildroot}%{python_sitelib}/*.py* + +%clean +rm -rf %{buildroot} + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root,-) +%doc AUTHORS ChangeLog LICENSE +%{_bindir}/d8 +%{_libdir}/*.so.* + +%files devel +%defattr(-,root,root,-) +%{_includedir}/*.h +%dir %{_includedir}/v8/ +%{_includedir}/v8/extensions/ +%{_libdir}/*.so +%{python_sitelib}/j*.py* + +%changelog +* Thu Apr 23 2015 Tom Callaway - 1:3.14.5.10-18 +- backport security fix for ARM - CVE-2014-3152 + +* Thu Feb 19 2015 T.C. Hollingsworth - 1:3.14.5.10-17 +- backports for nodejs 0.10.36 + +* Mon Jan 26 2015 David Tardon - 1:3.14.5.10-16 +- rebuild for ICU 54.1 + +* Tue Dec 2 2014 Tom Callaway - 1:3.14.5.10-15 +- use system valgrind header (bz1141483) + +* Wed Sep 17 2014 T.C. Hollingsworth - 1:3.14.5.10-14 +- backport bugfix that eliminates unused-local-typedefs warning +- backport security fix: Fix Hydrogen bounds check elimination (CVE-2013-6668; RHBZ#1086120) +- backport fix to segfault caused by the above patch + +* Tue Aug 26 2014 David Tardon - 1:3.14.5.10-13 +- rebuild for ICU 53.1 + +* Mon Aug 18 2014 Fedora Release Engineering - 1:3.14.5.10-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Thu Jul 31 2014 T.C. Hollingsworth - 1:3.14.5.10-11 +- backport security fix for memory corruption and stack overflow (RHBZ#1125464) + https://groups.google.com/d/msg/nodejs/-siJEObdp10/2xcqqmTHiEMJ +- backport bug fix for x64 MathMinMax for negative untagged int32 arguments. + https://github.com/joyent/node/commit/3530fa9cd09f8db8101c4649cab03bcdf760c434 + +* Thu Jun 19 2014 T.C. Hollingsworth - 1:3.14.5.10-10 +- fix corner case in integer comparisons (v8 bug#2416; nodejs bug#7528) + +* Sun Jun 08 2014 Fedora Release Engineering - 1:3.14.5.10-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat May 03 2014 T.C. Hollingsworth - 1:3.14.5.10-8 +- use clock_gettime() instead of gettimeofday(), which increases V8 performance + dramatically on virtual machines + +* Tue Mar 18 2014 T.C. Hollingsworth - 1:3.14.5.10-7 +- backport fix for unsigned integer arithmetic (RHBZ#1077136; CVE-2014-1704) + +* Mon Feb 24 2014 Tomas Hrcka - 1:3.14.5.10-6 +- Backport fix for incorrect handling of popular pages (RHBZ#1059070; CVE-2013-6640) + +* Fri Feb 14 2014 T.C. Hollingsworth - 1:3.14.5.10-5 +- rebuild for icu-52 + +* Mon Jan 27 2014 T.C. Hollingsworth - 1:3.14.5.10-4 +- backport fix for enumeration for objects with lots of properties + +* Fri Dec 13 2013 T.C. Hollingsworth - 1:3.14.5.10-3 +- backport fix for out-of-bounds read DoS (RHBZ#1039889; CVE-2013-6640) + +* Fri Aug 02 2013 T.C. Hollingsworth - 1:3.14.5.10-2 +- backport fix for remote DoS or unspecified other impact via type confusion + (RHBZ#991116; CVE-2013-2882) + +* Wed May 29 2013 T.C. Hollingsworth - 1:3.14.5.10-1 +- new upstream release 3.14.5.10 + +* Mon May 06 2013 Stanislav Ochotnicky - 1:3.14.5.8-2 +- Fix ownership of include directory (#958729) + +* Fri Mar 22 2013 T.C. Hollingsworth - 1:3.14.5.8-1 +- new upstream release 3.14.5.8 +- backport security fix for remote DoS via crafted javascript (RHBZ#924495; CVE-2013-2632) + +* Mon Mar 11 2013 Stephen Gallagher - 1:3.14.5.7-3 +- Update to v8 3.14.5.7 for Node.js 0.10.0 + +* Sat Jan 26 2013 T.C. Hollingsworth - 1:3.13.7.5-2 +- rebuild for icu-50 +- ignore new GCC 4.8 warning + +* Tue Dec 4 2012 Tom Callaway - 1:3.13.7.5-1 +- update to 3.13.7.5 (needed for chromium 23) +- Resolves multiple security issues (CVE-2012-5120, CVE-2012-5128) +- d8 is now using a static libv8, resolves bz 881973) + +* Sun Jul 22 2012 Fedora Release Engineering - 1:3.10.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Fri Jul 6 2012 Tom Callaway 1:3.10.8-1 +- update to 3.10.8 (chromium 20) + +* Tue Jun 12 2012 Tom Callaway 1:3.9.24-1 +- update to 3.9.24 (chromium 19) + +* Mon Apr 23 2012 Thomas Spura 1:3.7.12.6 +- rebuild for icu-49 + +* Fri Mar 30 2012 Dennis Gilmore 1:3.7.12-5 +- make sure the right arm abi is used in the second call of scons + +* Thu Mar 29 2012 Dennis Gilmore 1:3.7.12-4 +- use correct arm macros +- use the correct abis for hard and soft float + +* Tue Mar 20 2012 Tom Callaway 3.7.12-3 +- merge changes from Fedora spec file, sync, add epoch + +* Fri Feb 17 2012 Tom Callaway 3.7.12-2 +- add -Wno-error=strict-overflow for gcc 4.7 (hack, hack, hack) + +* Mon Feb 13 2012 Tom Callaway 3.7.12-1 +- update to 3.7.12 + +* Thu Nov 3 2011 Tom Callaway 3.5.10-1 +- update to 3.5.10 + +* Mon Sep 26 2011 Tom Callaway 3.4.14-2 +- final 3.4.14 tag +- include JavaScript minifier scripts in -devel + +* Fri Jun 10 2011 Tom Callaway 3.2.10-1 +- tag 3.2.10 + +* Thu Apr 28 2011 Tom Callaway 3.1.8-1 +- "stable" v8 match for "stable" chromium (tag 3.1.8) + +* Tue Feb 22 2011 Tom Callaway 3.1.5-1.20110222svn6902 +- update to 3.1.5 +- enable experimental i18n icu stuff for chromium + +* Tue Jan 11 2011 Tom Callaway 3.0.7-1.20110111svn6276 +- update to 3.0.7 + +* Tue Dec 14 2010 Tom "spot" Callaway 3.0.0-2.20101209svn5957 +- fix sloppy code where NULL is used + +* Thu Dec 9 2010 Tom "spot" Callaway 3.0.0-1.20101209svn5957 +- update to 3.0.0 + +* Fri Oct 22 2010 Tom "spot" Callaway 2.5.1-1.20101022svn5692 +- update to 2.5.1 +- fix another fwrite with no return checking case + +* Thu Oct 14 2010 Tom "spot" Callaway 2.5.0-1.20101014svn5625 +- update to 2.5.0 + +* Mon Oct 4 2010 Tom "spot" Callaway 2.4.8-1.20101004svn5585 +- update to 2.4.8 + +* Tue Sep 14 2010 Tom "spot" Callaway 2.4.3-1.20100914svn5450 +- update to 2.4.3 + +* Tue Aug 31 2010 Tom "spot" Callaway 2.3.11-1.20100831svn5385 +- update to svn5385 + +* Fri Aug 27 2010 Tom "spot" Callaway 2.3.11-1.20100827svn5365 +- update to 2.3.11, svn5365 + +* Tue Aug 24 2010 Tom "spot" Callaway 2.3.10-1.20100824svn5332 +- update to 2.3.10, svn5332 + +* Thu Aug 18 2010 Tom "spot" Callaway 2.3.9-1.20100819svn5308 +- update to 2.3.9, svn5308 + +* Thu Aug 11 2010 Tom "spot" Callaway 2.3.7-1.20100812svn5251 +- update to svn5251 + +* Wed Aug 11 2010 Tom "spot" Callaway 2.3.7-1.20100811svn5248 +- update to 2.3.7, svn5248 + +* Mon Aug 10 2010 Tom "spot" Callaway 2.3.6-1.20100809svn5217 +- update to 2.3.6, svn5217 + +* Fri Aug 6 2010 Tom "spot" Callaway 2.3.5-1.20100806svn5198 +- update to 2.3.5, svn5198 + +* Mon Jul 26 2010 Tom "spot" Callaway 2.3.3-1.20100726svn5134 +- update to 2.3.3, svn5134 + +* Fri Jul 16 2010 Tom "spot" Callaway 2.3.0-1.20100716svn5088 +- update to 2.3.0, svn5088 + +* Tue Jul 6 2010 Tom "spot" Callaway 2.2.22-1.20100706svn5023 +- update to 2.2.22, svn5023 + +* Fri Jul 2 2010 Tom "spot" Callaway 2.2.21-1.20100702svn5010 +- update to svn5010 + +* Wed Jun 30 2010 Tom "spot" Callaway 2.2.21-1.20100630svn4993 +- update to 2.2.21, svn4993 +- include checkout script + +* Thu Jun 3 2010 Tom "spot" Callaway 2.2.14-1.20100603svn4792 +- update to 2.2.14, svn4792 + +* Tue Jun 1 2010 Tom "spot" Callaway 2.2.13-1.20100601svn4772 +- update to 2.2.13, svn4772 + +* Thu May 27 2010 Tom "spot" Callaway 2.2.12-1.20100527svn4747 +- update to 2.2.12, svn4747 + +* Tue May 25 2010 Tom "spot" Callaway 2.2.11-1.20100525svn4718 +- update to 2.2.11, svn4718 + +* Thu May 20 2010 Tom "spot" Callaway 2.2.10-1.20100520svn4684 +- update to svn4684 + +* Mon May 17 2010 Tom "spot" Callaway 2.2.10-1.20100517svn4664 +- update to 2.2.10, svn4664 + +* Thu May 13 2010 Tom "spot" Callaway 2.2.9-1.20100513svn4653 +- update to svn4653 + +* Mon May 10 2010 Tom "spot" Callaway 2.2.9-1.20100510svn4636 +- update to 2.2.9, svn4636 + +* Tue May 4 2010 Tom "spot" Callaway 2.2.7-1.20100504svn4581 +- update to 2.2.7, svn4581 + +* Mon Apr 19 2010 Tom "spot" Callaway 2.2.3-1.20100419svn4440 +- update to 2.2.3, svn4440 + +* Tue Apr 13 2010 Tom "spot" Callaway 2.2.2-1.20100413svn4397 +- update to 2.2.2, svn4397 + +* Thu Apr 8 2010 Tom "spot" Callaway 2.2.1-1.20100408svn4359 +- update to 2.2.1, svn4359 + +* Mon Mar 29 2010 Tom "spot" Callaway 2.2.0-1.20100329svn4309 +- update to 2.2.0, svn4309 + +* Thu Mar 25 2010 Tom "spot" Callaway 2.1.8-1.20100325svn4273 +- update to 2.1.8, svn4273 + +* Mon Mar 22 2010 Tom "spot" Callaway 2.1.5-1.20100322svn4204 +- update to 2.1.5, svn4204 + +* Mon Mar 15 2010 Tom "spot" Callaway 2.1.4-1.20100315svn4129 +- update to 2.1.4, svn4129 + +* Wed Mar 10 2010 Tom "spot" Callaway 2.1.0-1.20100310svn4088 +- update to 2.1.3, svn4088 + +* Thu Feb 18 2010 Tom "spot" Callaway 2.1.0-1.20100218svn3902 +- update to 2.1.0, svn3902 + +* Fri Jan 22 2010 Tom "spot" Callaway 2.0.6-1.20100122svn3681 +- update to 2.0.6, svn3681 + +* Tue Dec 29 2009 Tom "spot" Callaway 2.0.5-1.20091229svn3528 +- svn3528 + +* Mon Dec 21 2009 Tom "spot" Callaway 2.0.5-1.20091221svn3511 +- update to 2.0.5, svn3511 + +* Wed Dec 9 2009 Tom "spot" Callaway 2.0.3-1.20091209svn3443 +- update to 2.0.3, svn3443 + +* Tue Nov 24 2009 Tom "spot" Callaway 2.0.2-1.20091124svn3353 +- update to 2.0.2, svn3353 + +* Wed Nov 18 2009 Tom "spot" Callaway 2.0.0-1.20091118svn3334 +- update to 2.0.0, svn3334 + +* Tue Oct 27 2009 Tom "spot" Callaway 1.3.16-1.20091027svn3152 +- update to 1.3.16, svn3152 + +* Tue Oct 13 2009 Tom "spot" Callaway 1.3.15-1.20091013svn3058 +- update to svn3058 + +* Thu Oct 8 2009 Tom "spot" Callaway 1.3.15-1.20091008svn3036 +- update to 1.3.15, svn3036 + +* Tue Sep 29 2009 Tom "spot" Callaway 1.3.13-1.20090929svn2985 +- update to svn2985 +- drop unused parameter patch, figured out how to work around it with optflag mangling +- have I mentioned lately that scons is garbage? + +* Mon Sep 28 2009 Tom "spot" Callaway 1.3.13-1.20090928svn2980 +- update to 1.3.13, svn2980 + +* Wed Sep 16 2009 Tom "spot" Callaway 1.3.11-1.20090916svn2903 +- update to 1.3.11, svn2903 + +* Wed Sep 9 2009 Tom "spot" Callaway 1.3.9-1.20090909svn2862 +- update to 1.3.9, svn2862 + +* Thu Aug 27 2009 Tom "spot" Callaway 1.3.8-1.20090827svn2777 +- update to 1.3.8, svn2777 + +* Mon Aug 24 2009 Tom "spot" Callaway 1.3.6-1.20090824svn2747 +- update to 1.3.6, svn2747 + +* Tue Aug 18 2009 Tom "spot" Callaway 1.3.4-1.20090818svn2708 +- update to svn2708, build and package d8 + +* Fri Aug 14 2009 Tom "spot" Callaway 1.3.4-1.20090814svn2692 +- update to 1.3.4, svn2692 + +* Wed Aug 12 2009 Tom "spot" Callaway 1.3.3-1.20090812svn2669 +- update to 1.3.3, svn2669 + +* Mon Aug 10 2009 Tom "spot" Callaway 1.3.2-1.20090810svn2658 +- update to svn2658 + +* Fri Aug 7 2009 Tom "spot" Callaway 1.3.2-1.20090807svn2653 +- update to svn2653 + +* Wed Aug 5 2009 Tom "spot" Callaway 1.3.2-1.20090805svn2628 +- update to 1.3.2, svn2628 + +* Mon Aug 3 2009 Tom "spot" Callaway 1.3.1-1.20090803svn2607 +- update to svn2607 + +* Fri Jul 31 2009 Tom "spot" Callaway 1.3.1-1.20090731svn2602 +- update to svn2602 + +* Thu Jul 30 2009 Tom "spot" Callaway 1.3.1-1.20090730svn2592 +- update to 1.3.1, svn 2592 + +* Mon Jul 27 2009 Tom "spot" Callaway 1.3.0-1.20090727svn2543 +- update to 1.3.0, svn 2543 + +* Fri Jul 24 2009 Tom "spot" Callaway 1.2.14-1.20090724svn2534 +- update to svn2534 + +* Mon Jul 20 2009 Tom "spot" Callaway 1.2.14-1.20090720svn2510 +- update to svn2510 + +* Thu Jul 16 2009 Tom "spot" Callaway 1.2.14-1.20090716svn2488 +- update to svn2488 + +* Wed Jul 15 2009 Tom "spot" Callaway 1.2.14-1.20090715svn2477 +- update to 1.2.14, svn2477 + +* Mon Jul 13 2009 Tom "spot" Callaway 1.2.13-1.20090713svn2434 +- update to svn2434 + +* Sat Jul 11 2009 Tom "spot" Callaway 1.2.13-1.20090711svn2430 +- update to 1.2.13, svn2430 + +* Wed Jul 8 2009 Tom "spot" Callaway 1.2.12-1.20090708svn2391 +- update to 1.2.12, svn2391 + +* Sat Jul 4 2009 Tom "spot" Callaway 1.2.11-1.20090704svn2356 +- update to 1.2.11, svn2356 + +* Fri Jun 26 2009 Tom "spot" Callaway 1.2.9-1.20090626svn2284 +- update to svn2284 + +* Wed Jun 24 2009 Tom "spot" Callaway 1.2.9-1.20090624svn2262 +- update to 1.2.9, svn2262 + +* Thu Jun 18 2009 Tom "spot" Callaway 1.2.7-2.20090618svn2219 +- fix unused-parameter patch + +* Thu Jun 18 2009 Tom "spot" Callaway 1.2.7-1.20090618svn2219 +- update to 1.2.8, svn2219 + +* Mon Jun 8 2009 Tom "spot" Callaway 1.2.7-2.20090608svn2123 +- fix gcc44 compile for Fedora 11 + +* Mon Jun 8 2009 Tom "spot" Callaway 1.2.7-1.20090608svn2123 +- update to 1.2.7, svn2123 + +* Thu May 28 2009 Tom "spot" Callaway 1.2.5-1.20090528svn2072 +- update to newer svn checkout + +* Sun Feb 22 2009 Tom "spot" Callaway 1.0.1-1.20090222svn1332 +- update to newer svn checkout + +* Sun Sep 14 2008 Tom "spot" Callaway 0.2-2.20080914svn300 +- make a versioned shared library properly + +* Sun Sep 14 2008 Tom "spot" Callaway 0.2-1.20080914svn300 +- Initial package for Fedora +