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:
parent
1ee6c0e30b
commit
ee3a66b273
@ -172,7 +172,9 @@ void ICCompareStub::AddToSpecialCache(Handle<Code> new_object) {
|
||||
Isolate* isolate = new_object->GetIsolate();
|
||||
Factory* factory = isolate->factory();
|
||||
return Map::UpdateCodeCache(known_map_,
|
||||
factory->compare_ic_symbol(),
|
||||
strict() ?
|
||||
factory->strict_compare_ic_symbol() :
|
||||
factory->compare_ic_symbol(),
|
||||
new_object);
|
||||
}
|
||||
|
||||
@ -183,10 +185,16 @@ bool ICCompareStub::FindCodeInSpecialCache(Code** code_out) {
|
||||
Code::Flags flags = Code::ComputeFlags(
|
||||
static_cast<Code::Kind>(GetCodeKind()),
|
||||
UNINITIALIZED);
|
||||
ASSERT(op_ == Token::EQ || op_ == Token::EQ_STRICT);
|
||||
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()) {
|
||||
*code_out = Code::cast(*probe);
|
||||
ASSERT(op_ == (*code_out)->compare_operation() + Token::EQ);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -240,7 +240,8 @@ namespace internal {
|
||||
V(use_strict, "use strict") \
|
||||
V(dot_symbol, ".") \
|
||||
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(minus_infinity_symbol, "-Infinity") \
|
||||
V(hidden_stack_trace_symbol, "v8::hidden_stack_trace") \
|
||||
|
36
test/mjsunit/regress/regress-2291.js
Normal file
36
test/mjsunit/regress/regress-2291.js
Normal 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.
|
Loading…
Reference in New Issue
Block a user