From 167436311a08a65dea28dda079a137893821c9c7 Mon Sep 17 00:00:00 2001 From: Jeff Hao Date: Wed, 8 May 2013 10:59:04 -0700 Subject: Improve interpreter to interpreter invokes. The interpreter constructs a shadow frame instead of arg array to make interpreter to interpreter transitions faster. This adds a pointer to an entry for the interpreter to each method. Change-Id: If48911d3aa3470847b8548a9e92090b829f4f254 --- src/invoke_arg_array_builder.h | 58 +++--------------------------------------- 1 file changed, 4 insertions(+), 54 deletions(-) (limited to 'src/invoke_arg_array_builder.h') diff --git a/src/invoke_arg_array_builder.h b/src/invoke_arg_array_builder.h index a6e99a52d9..b57d60a70f 100644 --- a/src/invoke_arg_array_builder.h +++ b/src/invoke_arg_array_builder.h @@ -162,60 +162,10 @@ class ArgArray { } } - void BuildArgArray(const ShadowFrame& shadow_frame, mirror::Object* receiver, uint32_t range_start) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - // Set receiver if non-null (method is not static) - if (receiver != NULL) { - Append(reinterpret_cast(receiver)); - } - for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++reg_offset) { - switch (shorty_[i]) { - case 'Z': - case 'B': - case 'C': - case 'S': - case 'I': - case 'F': - Append(shadow_frame.GetVReg(range_start + reg_offset)); - break; - case 'L': - Append(reinterpret_cast(shadow_frame.GetVRegReference(range_start + reg_offset))); - break; - case 'D': - case 'J': - AppendWide(shadow_frame.GetVRegLong(range_start + reg_offset)); - reg_offset++; - break; - } - } - } - - void BuildArgArray(const ShadowFrame& shadow_frame, mirror::Object* receiver, const uint32_t* arg_regs) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - // Set receiver if non-null (method is not static) - if (receiver != NULL) { - Append(reinterpret_cast(receiver)); - } - for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++reg_offset) { - switch (shorty_[i]) { - case 'Z': - case 'B': - case 'C': - case 'S': - case 'I': - case 'F': - Append(shadow_frame.GetVReg(arg_regs[reg_offset])); - break; - case 'L': - Append(reinterpret_cast(shadow_frame.GetVRegReference(arg_regs[reg_offset]))); - break; - case 'D': - case 'J': - AppendWide(shadow_frame.GetVRegLong(arg_regs[reg_offset])); - reg_offset++; - break; - } - } + void BuildArgArray(ShadowFrame* shadow_frame, uint32_t arg_offset) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + arg_array_ = shadow_frame->GetVRegArgs(arg_offset); + num_bytes_ = (shadow_frame->NumberOfVRegs() - arg_offset) * 4; } private: -- cgit v1.2.3-59-g8ed1b