diff options
author | 2013-08-12 08:53:04 -0700 | |
---|---|---|
committer | 2013-08-13 10:09:48 -0700 | |
commit | 08bf1967611965b65ffd5de1aa603b60e7b2d6a8 (patch) | |
tree | a9272c3a767cee878fdad81207bd8037f08dd830 /runtime/invoke_arg_array_builder.h | |
parent | 73a79074c06d8b0a8c14946438c59c3821d88fe7 (diff) |
Work on SMALL_ART and PORTABLE working at the same time.
Change-Id: Iddedf63b6f9d908717a4d30f963e9b81a9604d49
Diffstat (limited to 'runtime/invoke_arg_array_builder.h')
-rw-r--r-- | runtime/invoke_arg_array_builder.h | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/runtime/invoke_arg_array_builder.h b/runtime/invoke_arg_array_builder.h index c1d8249fd3..084d005e96 100644 --- a/runtime/invoke_arg_array_builder.h +++ b/runtime/invoke_arg_array_builder.h @@ -17,6 +17,7 @@ #ifndef ART_RUNTIME_INVOKE_ARG_ARRAY_BUILDER_H_ #define ART_RUNTIME_INVOKE_ARG_ARRAY_BUILDER_H_ +#include "mirror/abstract_method.h" #include "mirror/object.h" #include "scoped_thread_state_change.h" @@ -162,10 +163,35 @@ class ArgArray { } } - 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; + + void BuildArgArrayFromFrame(ShadowFrame* shadow_frame, uint32_t arg_offset) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + // Set receiver if non-null (method is not static) + size_t cur_arg = arg_offset; + if (!shadow_frame->GetMethod()->IsStatic()) { + Append(shadow_frame->GetVReg(cur_arg)); + cur_arg++; + } + for (size_t i = 1; i < shorty_len_; ++i) { + switch (shorty_[i]) { + case 'Z': + case 'B': + case 'C': + case 'S': + case 'I': + case 'F': + case 'L': + Append(shadow_frame->GetVReg(cur_arg)); + cur_arg++; + break; + case 'D': + case 'J': + AppendWide(shadow_frame->GetVRegLong(cur_arg)); + cur_arg++; + cur_arg++; + break; + } + } } private: |