diff options
author | 2013-05-08 10:59:04 -0700 | |
---|---|---|
committer | 2013-05-10 17:16:00 -0700 | |
commit | 167436311a08a65dea28dda079a137893821c9c7 (patch) | |
tree | 4754f47306a0ffa0ad97635015d9596b427dd425 /src/invoke_arg_array_builder.h | |
parent | c44f68fb6a6d55c0df28dd05b93d8906ec20bd08 (diff) |
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
Diffstat (limited to 'src/invoke_arg_array_builder.h')
-rw-r--r-- | src/invoke_arg_array_builder.h | 58 |
1 files changed, 4 insertions, 54 deletions
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<int32_t>(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<int32_t>(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<int32_t>(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<int32_t>(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: |