From 4899116d4b24b50fa23ac1de9befd35d37c3bd29 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Thu, 6 Sep 2012 15:58:09 +0200 Subject: [PATCH] v8: upgrade to 3.11.10.22 --- deps/v8/build/common.gypi | 11 +- deps/v8/src/accessors.cc | 3 + deps/v8/src/ic.cc | 11 +- deps/v8/src/v8natives.js | 4 +- deps/v8/src/version.cc | 2 +- deps/v8/src/x64/code-stubs-x64.cc | 12 +- deps/v8/test/cctest/test-api.cc | 195 +++++++++++++++++++++++-- deps/v8/test/mjsunit/new-function.js | 34 +++++ deps/v8/test/mjsunit/regress/regress-145201.js | 107 ++++++++++++++ deps/v8/tools/gyp/v8.gyp | 3 - 10 files changed, 345 insertions(+), 37 deletions(-) create mode 100644 deps/v8/test/mjsunit/new-function.js create mode 100644 deps/v8/test/mjsunit/regress/regress-145201.js diff --git a/deps/v8/build/common.gypi b/deps/v8/build/common.gypi index 1609197..7f084b8 100644 --- a/deps/v8/build/common.gypi +++ b/deps/v8/build/common.gypi @@ -239,6 +239,7 @@ 'WIN32', ], 'msvs_configuration_attributes': { + 'OutputDirectory': '<(DEPTH)\\build\\$(ConfigurationName)', 'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)', 'CharacterSet': '1', }, @@ -270,7 +271,7 @@ 'target_conditions': [ ['_toolset=="host"', { 'variables': { - 'm32flag': ' /dev/null 2>&1) && echo "-m32" || true)', + 'm32flag': ' /dev/null 2>&1) && echo -n "-m32" || true)', }, 'cflags': [ '<(m32flag)' ], 'ldflags': [ '<(m32flag)' ], @@ -280,7 +281,7 @@ }], ['_toolset=="target"', { 'variables': { - 'm32flag': ' /dev/null 2>&1) && echo "-m32" || true)', + 'm32flag': ' /dev/null 2>&1) && echo -n "-m32" || true)', }, 'cflags': [ '<(m32flag)' ], 'ldflags': [ '<(m32flag)' ], @@ -323,7 +324,7 @@ }, 'conditions': [ ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd"', { - 'cflags': [ '-Wno-unused-parameter', + 'cflags': [ '-Wall', '<(werror)', '-W', '-Wno-unused-parameter', '-Wnon-virtual-dtor', '-Woverloaded-virtual' ], }], ], @@ -332,6 +333,10 @@ 'conditions': [ ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" \ or OS=="android"', { + 'cflags!': [ + '-O2', + '-Os', + ], 'cflags': [ '-fdata-sections', '-ffunction-sections', diff --git a/deps/v8/src/accessors.cc b/deps/v8/src/accessors.cc index 8048738..8aabad0 100644 --- a/deps/v8/src/accessors.cc +++ b/deps/v8/src/accessors.cc @@ -755,6 +755,9 @@ MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) { caller = potential_caller; potential_caller = it.next(); } + if (!caller->shared()->native() && potential_caller != NULL) { + caller = potential_caller; + } // If caller is bound, return null. This is compatible with JSC, and // allows us to make bound functions use the strict function map // and its associated throwing caller and arguments. diff --git a/deps/v8/src/ic.cc b/deps/v8/src/ic.cc index 0ad0670..d169993 100644 --- a/deps/v8/src/ic.cc +++ b/deps/v8/src/ic.cc @@ -992,7 +992,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup, if (callback->IsAccessorInfo()) { Handle info = Handle::cast(callback); if (v8::ToCData
(info->getter()) == 0) return; - if (!receiver->HasFastProperties()) return; + if (!holder->HasFastProperties()) return; if (!info->IsCompatibleReceiver(*receiver)) return; code = isolate()->stub_cache()->ComputeLoadCallback( name, receiver, holder, info); @@ -1000,7 +1000,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup, Handle getter(Handle::cast(callback)->getter()); if (!getter->IsJSFunction()) return; if (holder->IsGlobalObject()) return; - if (!receiver->HasFastProperties()) return; + if (!holder->HasFastProperties()) return; code = isolate()->stub_cache()->ComputeLoadViaGetter( name, receiver, holder, Handle::cast(getter)); } else { @@ -1269,7 +1269,7 @@ void KeyedLoadIC::UpdateCaches(LookupResult* lookup, Handle callback = Handle::cast(callback_object); if (v8::ToCData
(callback->getter()) == 0) return; - if (!receiver->HasFastProperties()) return; + if (!holder->HasFastProperties()) return; if (!callback->IsCompatibleReceiver(*receiver)) return; code = isolate()->stub_cache()->ComputeKeyedLoadCallback( name, receiver, holder, callback); @@ -1487,9 +1487,10 @@ void StoreIC::UpdateCaches(LookupResult* lookup, case CALLBACKS: { Handle callback(lookup->GetCallbackObject()); if (callback->IsAccessorInfo()) { + ASSERT(*holder == *receiver); // LookupForWrite checks this. Handle info = Handle::cast(callback); if (v8::ToCData
(info->setter()) == 0) return; - if (!receiver->HasFastProperties()) return; + if (!holder->HasFastProperties()) return; ASSERT(info->IsCompatibleReceiver(*receiver)); code = isolate()->stub_cache()->ComputeStoreCallback( name, receiver, info, strict_mode); @@ -1497,7 +1498,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup, Handle setter(Handle::cast(callback)->setter()); if (!setter->IsJSFunction()) return; if (holder->IsGlobalObject()) return; - if (!receiver->HasFastProperties()) return; + if (!holder->HasFastProperties()) return; code = isolate()->stub_cache()->ComputeStoreViaSetter( name, receiver, Handle::cast(setter), strict_mode); } else { diff --git a/deps/v8/src/v8natives.js b/deps/v8/src/v8natives.js index 86f07a1..e2e6429 100644 --- a/deps/v8/src/v8natives.js +++ b/deps/v8/src/v8natives.js @@ -1654,7 +1654,9 @@ function NewFunction(arg1) { // length == 1 // The call to SetNewFunctionAttributes will ensure the prototype // property of the resulting function is enumerable (ECMA262, 15.3.5.2). - var f = %CompileString(source)(); + var global_receiver = %GlobalReceiver(global); + var f = %_CallFunction(global_receiver, %CompileString(source)); + %FunctionMarkNameShouldPrintAsAnonymous(f); return %SetNewFunctionAttributes(f); } diff --git a/deps/v8/src/version.cc b/deps/v8/src/version.cc index 2da80cc..102b645 100644 --- a/deps/v8/src/version.cc +++ b/deps/v8/src/version.cc @@ -35,7 +35,7 @@ #define MAJOR_VERSION 3 #define MINOR_VERSION 11 #define BUILD_NUMBER 10 -#define PATCH_LEVEL 19 +#define PATCH_LEVEL 22 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) #define IS_CANDIDATE_VERSION 0 diff --git a/deps/v8/src/x64/code-stubs-x64.cc b/deps/v8/src/x64/code-stubs-x64.cc index 61d6c87..17b5ce9 100644 --- a/deps/v8/src/x64/code-stubs-x64.cc +++ b/deps/v8/src/x64/code-stubs-x64.cc @@ -999,8 +999,8 @@ void BinaryOpStub::GenerateSmiCode( SmiCodeGenerateHeapNumberResults allow_heapnumber_results) { // Arguments to BinaryOpStub are in rdx and rax. - Register left = rdx; - Register right = rax; + const Register left = rdx; + const Register right = rax; // We only generate heapnumber answers for overflowing calculations // for the four basic arithmetic operations and logical right shift by 0. @@ -1042,20 +1042,16 @@ void BinaryOpStub::GenerateSmiCode( case Token::DIV: // SmiDiv will not accept left in rdx or right in rax. - left = rcx; - right = rbx; __ movq(rbx, rax); __ movq(rcx, rdx); - __ SmiDiv(rax, left, right, &use_fp_on_smis); + __ SmiDiv(rax, rcx, rbx, &use_fp_on_smis); break; case Token::MOD: // SmiMod will not accept left in rdx or right in rax. - left = rcx; - right = rbx; __ movq(rbx, rax); __ movq(rcx, rdx); - __ SmiMod(rax, left, right, &use_fp_on_smis); + __ SmiMod(rax, rcx, rbx, &use_fp_on_smis); break; case Token::BIT_OR: { diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 233cbab..df81059 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -14567,6 +14567,8 @@ THREADED_TEST(FunctionGetScriptId) { static v8::Handle GetterWhichReturns42(Local name, const AccessorInfo& info) { + CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); + CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); return v8_num(42); } @@ -14574,10 +14576,32 @@ static v8::Handle GetterWhichReturns42(Local name, static void SetterWhichSetsYOnThisTo23(Local name, Local value, const AccessorInfo& info) { + CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); + CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); info.This()->Set(v8_str("y"), v8_num(23)); } +Handle FooGetInterceptor(Local name, + const AccessorInfo& info) { + CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); + CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); + if (!name->Equals(v8_str("foo"))) return Handle(); + return v8_num(42); +} + + +Handle FooSetInterceptor(Local name, + Local value, + const AccessorInfo& info) { + CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); + CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); + if (!name->Equals(v8_str("foo"))) return Handle(); + info.This()->Set(v8_str("y"), v8_num(23)); + return v8_num(23); +} + + TEST(SetterOnConstructorPrototype) { v8::HandleScope scope; Local templ = ObjectTemplate::New(); @@ -16813,8 +16837,65 @@ TEST(TryFinallyMessage) { } +static void Helper137002(bool do_store, + bool polymorphic, + bool remove_accessor, + bool interceptor) { + LocalContext context; + Local templ = ObjectTemplate::New(); + if (interceptor) { + templ->SetNamedPropertyHandler(FooGetInterceptor, FooSetInterceptor); + } else { + templ->SetAccessor(v8_str("foo"), + GetterWhichReturns42, + SetterWhichSetsYOnThisTo23); + } + context->Global()->Set(v8_str("obj"), templ->NewInstance()); + + // Turn monomorphic on slow object with native accessor, then turn + // polymorphic, finally optimize to create negative lookup and fail. + CompileRun(do_store ? + "function f(x) { x.foo = void 0; }" : + "function f(x) { return x.foo; }"); + CompileRun("obj.y = void 0;"); + if (!interceptor) { + CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);"); + } + CompileRun("obj.__proto__ = null;" + "f(obj); f(obj); f(obj);"); + if (polymorphic) { + CompileRun("f({});"); + } + CompileRun("obj.y = void 0;" + "%OptimizeFunctionOnNextCall(f);"); + if (remove_accessor) { + CompileRun("delete obj.foo;"); + } + CompileRun("var result = f(obj);"); + if (do_store) { + CompileRun("result = obj.y;"); + } + if (remove_accessor && !interceptor) { + CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); + } else { + CHECK_EQ(do_store ? 23 : 42, + context->Global()->Get(v8_str("result"))->Int32Value()); + } +} + + THREADED_TEST(Regress137002a) { i::FLAG_allow_natives_syntax = true; + i::FLAG_compilation_cache = false; + v8::HandleScope scope; + for (int i = 0; i < 16; i++) { + Helper137002(i & 8, i & 4, i & 2, i & 1); + } +} + + +THREADED_TEST(Regress137002b) { + i::FLAG_allow_natives_syntax = true; v8::HandleScope scope; LocalContext context; Local templ = ObjectTemplate::New(); @@ -16823,19 +16904,65 @@ THREADED_TEST(Regress137002a) { SetterWhichSetsYOnThisTo23); context->Global()->Set(v8_str("obj"), templ->NewInstance()); - // Turn monomorphic on slow object with native accessor, then turn - // polymorphic, finally optimize to create negative lookup and fail. - CompileRun("function f(x) { return x.foo; }" - "%OptimizeObjectForAddingMultipleProperties(obj, 1);" + // Turn monomorphic on slow object with native accessor, then just + // delete the property and fail. + CompileRun("function load(x) { return x.foo; }" + "function store(x) { x.foo = void 0; }" + "function keyed_load(x, key) { return x[key]; }" + // Second version of function has a different source (add void 0) + // so that it does not share code with the first version. This + // ensures that the ICs are monomorphic. + "function load2(x) { void 0; return x.foo; }" + "function store2(x) { void 0; x.foo = void 0; }" + "function keyed_load2(x, key) { void 0; return x[key]; }" + + "obj.y = void 0;" "obj.__proto__ = null;" - "f(obj); f(obj); f({});" - "%OptimizeFunctionOnNextCall(f);" - "var result = f(obj);"); - CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); -} - + "var subobj = {};" + "subobj.y = void 0;" + "subobj.__proto__ = obj;" + "%OptimizeObjectForAddingMultipleProperties(obj, 1);" -THREADED_TEST(Regress137002b) { + // Make the ICs monomorphic. + "load(obj); load(obj);" + "load2(subobj); load2(subobj);" + "store(obj); store(obj);" + "store2(subobj); store2(subobj);" + "keyed_load(obj, 'foo'); keyed_load(obj, 'foo');" + "keyed_load2(subobj, 'foo'); keyed_load2(subobj, 'foo');" + + // Actually test the shiny new ICs and better not crash. This + // serves as a regression test for issue 142088 as well. + "load(obj);" + "load2(subobj);" + "store(obj);" + "store2(subobj);" + "keyed_load(obj, 'foo');" + "keyed_load2(subobj, 'foo');" + + // Delete the accessor. It better not be called any more now. + "delete obj.foo;" + "obj.y = void 0;" + "subobj.y = void 0;" + + "var load_result = load(obj);" + "var load_result2 = load2(subobj);" + "var keyed_load_result = keyed_load(obj, 'foo');" + "var keyed_load_result2 = keyed_load2(subobj, 'foo');" + "store(obj);" + "store2(subobj);" + "var y_from_obj = obj.y;" + "var y_from_subobj = subobj.y;"); + CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined()); +} + + +THREADED_TEST(Regress142088) { i::FLAG_allow_natives_syntax = true; v8::HandleScope scope; LocalContext context; @@ -16847,10 +16974,46 @@ THREADED_TEST(Regress137002b) { // Turn monomorphic on slow object with native accessor, then just // delete the property and fail. - CompileRun("function f(x) { return x.foo; }" - "%OptimizeObjectForAddingMultipleProperties(obj, 1);" + CompileRun("function load(x) { return x.foo; }" + "function store(x) { x.foo = void 0; }" + "function keyed_load(x, key) { return x[key]; }" + // Second version of function has a different source (add void 0) + // so that it does not share code with the first version. This + // ensures that the ICs are monomorphic. + "function load2(x) { void 0; return x.foo; }" + "function store2(x) { void 0; x.foo = void 0; }" + "function keyed_load2(x, key) { void 0; return x[key]; }" + "obj.__proto__ = null;" - "f(obj); f(obj); delete obj.foo;" - "var result = f(obj);"); - CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); + "var subobj = {};" + "subobj.__proto__ = obj;" + "%OptimizeObjectForAddingMultipleProperties(obj, 1);" + + // Make the ICs monomorphic. + "load(obj); load(obj);" + "load2(subobj); load2(subobj);" + "store(obj);" + "store2(subobj);" + "keyed_load(obj, 'foo'); keyed_load(obj, 'foo');" + "keyed_load2(subobj, 'foo'); keyed_load2(subobj, 'foo');" + + // Delete the accessor. It better not be called any more now. + "delete obj.foo;" + "obj.y = void 0;" + "subobj.y = void 0;" + + "var load_result = load(obj);" + "var load_result2 = load2(subobj);" + "var keyed_load_result = keyed_load(obj, 'foo');" + "var keyed_load_result2 = keyed_load2(subobj, 'foo');" + "store(obj);" + "store2(subobj);" + "var y_from_obj = obj.y;" + "var y_from_subobj = subobj.y;"); + CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined()); + CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined()); } diff --git a/deps/v8/test/mjsunit/new-function.js b/deps/v8/test/mjsunit/new-function.js new file mode 100644 index 0000000..9e8cc27 --- /dev/null +++ b/deps/v8/test/mjsunit/new-function.js @@ -0,0 +1,34 @@ +// 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. + +var x; +try { + Function("}), x = this, (function() {"); +} catch(e) { + print("Caught " + e); +} +assertTrue(x == "[object global]"); diff --git a/deps/v8/test/mjsunit/regress/regress-145201.js b/deps/v8/test/mjsunit/regress/regress-145201.js new file mode 100644 index 0000000..7fe7bce --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-145201.js @@ -0,0 +1,107 @@ +// 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. + +// Fix some corner cases in skipping native methods using caller. +var net = []; + + +var x = 0; + +function collect () { + function item(operator) { + binary(operator, 1, false); + binary(operator, 1, true); + binary(operator, '{}', false); + binary(operator, '{}', true); + binary(operator, '"x"', false); + binary(operator, '"x"', true); + unary(operator, ""); + } + + function unary(op, after) { + // Capture: + try { + eval(op + " custom " + after); + } catch(e) { + } + } + + function binary(op, other_side, inverted) { + // Capture: + try { + if (inverted) { + eval("custom " + op + " " + other_side); + } else { + eval(other_side + " " + op + " custom"); + } + } catch(e) { + } + } + + function catcher() { + var caller = catcher.caller; + if (/native/i.test(caller) || /ADD/.test(caller)) { + net[caller] = 0; + } + } + + var custom = Object.create(null, { + toString: { value: catcher }, + length: { get: catcher } + }); + + item('^'); + item('~'); + item('<<'); + item('<'); + item('=='); + item('>>>'); + item('>>'); + item('|'); + item('-'); + item('*'); + item('&'); + item('%'); + item('+'); + item('in'); + item('instanceof'); + unary('{}[', ']'); + unary('delete {}[', ']'); + unary('(function() {}).apply(null, ', ')'); +} + +collect(); +collect(); +collect(); + +var keys = 0; +for (var key in net) { + print(key); + keys++; +} + +assertTrue(keys == 0); diff --git a/deps/v8/tools/gyp/v8.gyp b/deps/v8/tools/gyp/v8.gyp index f742cc6..ea82d31 100644 --- a/deps/v8/tools/gyp/v8.gyp +++ b/deps/v8/tools/gyp/v8.gyp @@ -721,9 +721,6 @@ '../../src/win32-math.h', ], 'msvs_disabled_warnings': [4351, 4355, 4800], - 'direct_dependent_settings': { - 'msvs_disabled_warnings': [4351, 4355, 4800], - }, 'link_settings': { 'libraries': [ '-lwinmm.lib', '-lws2_32.lib' ], }, -- 2.7.4