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,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;
|
||||||
|
@ -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") \
|
||||||
|
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