summaryrefslogtreecommitdiff
path: root/src/invoke_arg_array_builder.h
diff options
context:
space:
mode:
author Jeff Hao <jeffhao@google.com> 2013-05-08 10:59:04 -0700
committer Jeff Hao <jeffhao@google.com> 2013-05-10 17:16:00 -0700
commit167436311a08a65dea28dda079a137893821c9c7 (patch)
tree4754f47306a0ffa0ad97635015d9596b427dd425 /src/invoke_arg_array_builder.h
parentc44f68fb6a6d55c0df28dd05b93d8906ec20bd08 (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.h58
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: