Fix bug in compare IC. BUG=2291

Review URL: https://chromiumcodereview.appspot.com/10830334

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12313 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
erik.corry@gmail.com 2012-08-15 15:08:42 +00:00
parent 1ee6c0e30b
commit ee3a66b273
3 changed files with 48 additions and 3 deletions

View File

@ -172,6 +172,8 @@ void ICCompareStub::AddToSpecialCache(Handle<Code> new_object) {
Isolate* isolate = new_object->GetIsolate(); Isolate* isolate = new_object->GetIsolate();
Factory* factory = isolate->factory(); Factory* factory = isolate->factory();
return Map::UpdateCodeCache(known_map_, return Map::UpdateCodeCache(known_map_,
strict() ?
factory->strict_compare_ic_symbol() :
factory->compare_ic_symbol(), factory->compare_ic_symbol(),
new_object); new_object);
} }
@ -183,10 +185,16 @@ bool ICCompareStub::FindCodeInSpecialCache(Code** code_out) {
Code::Flags flags = Code::ComputeFlags( Code::Flags flags = Code::ComputeFlags(
static_cast<Code::Kind>(GetCodeKind()), static_cast<Code::Kind>(GetCodeKind()),
UNINITIALIZED); UNINITIALIZED);
ASSERT(op_ == Token::EQ || op_ == Token::EQ_STRICT);
Handle<Object> probe( Handle<Object> probe(
known_map_->FindInCodeCache(*factory->compare_ic_symbol(), flags)); known_map_->FindInCodeCache(
strict() ?
*factory->strict_compare_ic_symbol() :
*factory->compare_ic_symbol(),
flags));
if (probe->IsCode()) { if (probe->IsCode()) {
*code_out = Code::cast(*probe); *code_out = Code::cast(*probe);
ASSERT(op_ == (*code_out)->compare_operation() + Token::EQ);
return true; return true;
} }
return false; return false;

View File

@ -240,7 +240,8 @@ namespace internal {
V(use_strict, "use strict") \ V(use_strict, "use strict") \
V(dot_symbol, ".") \ V(dot_symbol, ".") \
V(anonymous_function_symbol, "(anonymous function)") \ V(anonymous_function_symbol, "(anonymous function)") \
V(compare_ic_symbol, ".compare_ic") \ V(compare_ic_symbol, "==") \
V(strict_compare_ic_symbol, "===") \
V(infinity_symbol, "Infinity") \ V(infinity_symbol, "Infinity") \
V(minus_infinity_symbol, "-Infinity") \ V(minus_infinity_symbol, "-Infinity") \
V(hidden_stack_trace_symbol, "v8::hidden_stack_trace") \ V(hidden_stack_trace_symbol, "v8::hidden_stack_trace") \

View File

@ -0,0 +1,36 @@
// 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.
function StrictCompare(x) { return x === Object(x); }
var obj = new Object();
var obj2 = new Object();
obj == obj; // Populate IC cache with non-strict comparison.
StrictCompare(obj); // Set IC in StrictCompare from IC cache.
assertFalse(StrictCompare('foo')); // Use == stub for === operation.