From: kasperl@chromium.org Date: Mon, 6 Oct 2008 06:41:10 +0000 (+0000) Subject: Fix ARMu debug mode failure by handling runtime calls X-Git-Tag: upstream/4.7.83~25258 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4fe70e49b6c3ec184212c99c9cb478508b3b78de;p=platform%2Fupstream%2Fv8.git Fix ARMu debug mode failure by handling runtime calls with the wrong number of arguments on ARM in the same way it's done on IA32. Make sure to remove arguments on both platforms and return the illegal result in register eax or r0. Review URL: http://codereview.chromium.org/6263 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@435 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/macro-assembler-arm.cc b/src/macro-assembler-arm.cc index 5e5b9c9fe..a6c336fe6 100644 --- a/src/macro-assembler-arm.cc +++ b/src/macro-assembler-arm.cc @@ -690,12 +690,24 @@ void MacroAssembler::StubReturn(int argc) { } +void MacroAssembler::IllegalOperation(int num_arguments) { + if (num_arguments > 0) { + add(sp, sp, Operand(num_arguments * kPointerSize)); + } + mov(r0, Operand(Factory::undefined_value())); +} + + void MacroAssembler::CallRuntime(Runtime::Function* f, int num_arguments) { // All parameters are on the stack. r0 has the return value after call. - // Either the expected number of arguments is unknown, or the actual - // number of arguments match the expectation. - ASSERT(f->nargs < 0 || f->nargs == num_arguments); + // If the expected number of arguments of the runtime function is + // constant, we check that the actual number of arguments match the + // expectation. + if (f->nargs >= 0 && f->nargs != num_arguments) { + IllegalOperation(num_arguments); + return; + } Runtime::FunctionId function_id = static_cast(f->stub_id); diff --git a/src/macro-assembler-arm.h b/src/macro-assembler-arm.h index 00d2f194a..7930e4cfc 100644 --- a/src/macro-assembler-arm.h +++ b/src/macro-assembler-arm.h @@ -176,6 +176,14 @@ class MacroAssembler: public Assembler { void CheckAccessGlobal(Register holder_reg, Register scratch, Label* miss); + // --------------------------------------------------------------------------- + // Support functions. + + // Generates code for reporting that an illegal operation has + // occurred. + void IllegalOperation(int num_arguments); + + // --------------------------------------------------------------------------- // Runtime calls diff --git a/src/macro-assembler-ia32.cc b/src/macro-assembler-ia32.cc index dab6778e5..11ffa0138 100644 --- a/src/macro-assembler-ia32.cc +++ b/src/macro-assembler-ia32.cc @@ -601,8 +601,11 @@ void MacroAssembler::StubReturn(int argc) { } -void MacroAssembler::IllegalOperation() { - push(Immediate(Factory::undefined_value())); +void MacroAssembler::IllegalOperation(int num_arguments) { + if (num_arguments > 0) { + add(Operand(esp), Immediate(num_arguments * kPointerSize)); + } + mov(Operand(eax), Immediate(Factory::undefined_value())); } @@ -616,7 +619,7 @@ void MacroAssembler::CallRuntime(Runtime::Function* f, int num_arguments) { // constant, we check that the actual number of arguments match the // expectation. if (f->nargs >= 0 && f->nargs != num_arguments) { - IllegalOperation(); + IllegalOperation(num_arguments); return; } diff --git a/src/macro-assembler-ia32.h b/src/macro-assembler-ia32.h index 9a923e4c8..d644c0f9b 100644 --- a/src/macro-assembler-ia32.h +++ b/src/macro-assembler-ia32.h @@ -180,8 +180,8 @@ class MacroAssembler: public Assembler { Register scratch, Label* then_label); // Generates code for reporting that an illegal operation has - // occurred - void IllegalOperation(); + // occurred. + void IllegalOperation(int num_arguments); // --------------------------------------------------------------------------- // Runtime calls