- Fix numeric overflow handling when compiling count operations.
In certain situations the overflow checking corrupted the value being calculated. Review URL: http://codereview.chromium.org/115423 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1978 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
6a350c86bf
commit
b5c6dc35f9
@ -115,6 +115,14 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) {
|
||||
|
||||
JumpTarget::set_compiling_deferred_code(false);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (strlen(FLAG_stop_at) > 0 &&
|
||||
fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
|
||||
frame_->SpillAll();
|
||||
__ int3();
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
HistogramTimerScope codegen_timer(&Counters::code_generation);
|
||||
CodeGenState state(this);
|
||||
@ -128,14 +136,6 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) {
|
||||
allocator_->Initialize();
|
||||
frame_->Enter();
|
||||
|
||||
#ifdef DEBUG
|
||||
if (strlen(FLAG_stop_at) > 0 &&
|
||||
fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
|
||||
frame_->SpillAll();
|
||||
__ int3();
|
||||
}
|
||||
#endif
|
||||
|
||||
// Allocate space for locals and initialize them.
|
||||
frame_->AllocateStackSlots(scope_->num_stack_slots());
|
||||
// Initialize the function return target after the locals are set
|
||||
@ -4878,9 +4878,9 @@ void CodeGenerator::VisitCountOperation(CountOperation* node) {
|
||||
// successfully allocate a temporary byte register.
|
||||
if (tmp.is_valid()) {
|
||||
__ setcc(overflow, tmp.reg());
|
||||
__ or_(Operand(value.reg()), tmp.reg());
|
||||
__ or_(Operand(tmp.reg()), value.reg());
|
||||
__ test(tmp.reg(), Immediate(kSmiTagMask));
|
||||
tmp.Unuse();
|
||||
__ test(value.reg(), Immediate(kSmiTagMask));
|
||||
deferred->enter()->Branch(not_zero, &value, not_taken);
|
||||
} else { // Otherwise we test separately for overflow and smi check.
|
||||
deferred->enter()->Branch(overflow, &value, not_taken);
|
||||
|
Loading…
Reference in New Issue
Block a user