From 5771b0975a1c13a97e3b71e87b3a929dce1fa81a Mon Sep 17 00:00:00 2001 From: "titzer@chromium.org" Date: Mon, 20 Jan 2014 19:00:11 +0000 Subject: [PATCH] Fix representation requirement in HReturn. BUG= R=verwaest@chromium.org Review URL: https://codereview.chromium.org/143523002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18697 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen-instructions.cc | 4 ++++ src/hydrogen-instructions.h | 2 ++ test/mjsunit/regress-333594.js | 42 ++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 test/mjsunit/regress-333594.js diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc index 9d52643449..062b5ae7ac 100644 --- a/src/hydrogen-instructions.cc +++ b/src/hydrogen-instructions.cc @@ -2531,6 +2531,7 @@ HConstant::HConstant(Handle handle, Representation r) has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); double_value_ = n; has_double_value_ = true; + // TODO(titzer): if this heap number is new space, tenure a new one. } else { is_internalized_string_ = handle->IsInternalizedString(); } @@ -2729,6 +2730,9 @@ void HConstant::PrintDataTo(StringStream* stream) { } else { handle(Isolate::Current())->ShortPrint(stream); } + if (!is_not_in_new_space_) { + stream->Add("[new space] "); + } } diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h index f7cbbee51a..fe701aeca6 100644 --- a/src/hydrogen-instructions.h +++ b/src/hydrogen-instructions.h @@ -1581,6 +1581,8 @@ class HReturn V8_FINAL : public HTemplateControlInstruction<0, 3> { DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*); virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { + // TODO(titzer): require an Int32 input for faster returns. + if (index == 2) return Representation::Smi(); return Representation::Tagged(); } diff --git a/test/mjsunit/regress-333594.js b/test/mjsunit/regress-333594.js new file mode 100644 index 0000000000..6f6dbaafcd --- /dev/null +++ b/test/mjsunit/regress-333594.js @@ -0,0 +1,42 @@ +// 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: --allow-natives-syntax + +var a = { x: 1.1 }; +a.x = 0; +var G = a.x; +var o = { x: {} }; + +function func() { + return {x: G}; +} + +func(); +func(); +%OptimizeFunctionOnNextCall(func); +assertEquals(0, func().x);