Commit 40dd216b authored by ager@chromium.org's avatar ager@chromium.org

Port fix for duplicate AST ID for deoptimization to ARM and x64.

Review URL: http://codereview.chromium.org/6458001

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6690 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 0273e818
...@@ -681,18 +681,24 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -681,18 +681,24 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
} else if (prop != NULL) { } else if (prop != NULL) {
if (function != NULL || mode == Variable::CONST) { if (function != NULL || mode == Variable::CONST) {
// We are declaring a function or constant that rewrites to a // We are declaring a function or constant that rewrites to a
// property. Use (keyed) IC to set the initial value. // property. Use (keyed) IC to set the initial value. We
VisitForStackValue(prop->obj()); // cannot visit the rewrite because it's shared and we risk
// recording duplicate AST IDs for bailouts from optimized code.
ASSERT(prop->obj()->AsVariableProxy() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy()->var());
}
if (function != NULL) { if (function != NULL) {
VisitForStackValue(prop->key()); __ push(r0);
VisitForAccumulatorValue(function); VisitForAccumulatorValue(function);
__ pop(r1); // Key. __ pop(r2);
} else { } else {
VisitForAccumulatorValue(prop->key()); __ mov(r2, r0);
__ mov(r1, result_register()); // Key. __ LoadRoot(r0, Heap::kTheHoleValueRootIndex);
__ LoadRoot(result_register(), Heap::kTheHoleValueRootIndex);
} }
__ pop(r2); // Receiver. ASSERT(prop->key()->AsLiteral() != NULL &&
prop->key()->AsLiteral()->handle()->IsSmi());
__ mov(r1, Operand(prop->key()->AsLiteral()->handle()));
Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
EmitCallIC(ic, RelocInfo::CODE_TARGET); EmitCallIC(ic, RelocInfo::CODE_TARGET);
......
...@@ -711,18 +711,24 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -711,18 +711,24 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
} else if (prop != NULL) { } else if (prop != NULL) {
if (function != NULL || mode == Variable::CONST) { if (function != NULL || mode == Variable::CONST) {
// We are declaring a function or constant that rewrites to a // We are declaring a function or constant that rewrites to a
// property. Use (keyed) IC to set the initial value. // property. Use (keyed) IC to set the initial value. We
VisitForStackValue(prop->obj()); // cannot visit the rewrite because it's shared and we risk
// recording duplicate AST IDs for bailouts from optimized code.
ASSERT(prop->obj()->AsVariableProxy() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy()->var());
}
if (function != NULL) { if (function != NULL) {
VisitForStackValue(prop->key()); __ push(rax);
VisitForAccumulatorValue(function); VisitForAccumulatorValue(function);
__ pop(rcx); __ pop(rdx);
} else { } else {
VisitForAccumulatorValue(prop->key()); __ movq(rdx, rax);
__ movq(rcx, result_register()); __ LoadRoot(rax, Heap::kTheHoleValueRootIndex);
__ LoadRoot(result_register(), Heap::kTheHoleValueRootIndex);
} }
__ pop(rdx); ASSERT(prop->key()->AsLiteral() != NULL &&
prop->key()->AsLiteral()->handle()->IsSmi());
__ Move(rcx, prop->key()->AsLiteral()->handle());
Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
EmitCallIC(ic, RelocInfo::CODE_TARGET); EmitCallIC(ic, RelocInfo::CODE_TARGET);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment