Clean up ArgArray in preparation for portable changes.
Change-Id: I3cf7c4495a4c92f349da6d31d59a9203560bf8bc
diff --git a/src/invoke_arg_array_builder.h b/src/invoke_arg_array_builder.h
index ecd0fb0..b1af6d5 100644
--- a/src/invoke_arg_array_builder.h
+++ b/src/invoke_arg_array_builder.h
@@ -75,197 +75,130 @@
void BuildArgArray(const ScopedObjectAccess& soa, mirror::Object* receiver, va_list ap)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
// Set receiver if non-null (method is not static)
- size_t offset = 0;
if (receiver != NULL) {
- arg_array_[0] = reinterpret_cast<int32_t>(receiver);
- offset++;
+ Append(reinterpret_cast<int32_t>(receiver));
}
- for (size_t i = 1; i < shorty_len_; ++i, ++offset) {
+ for (size_t i = 1; i < shorty_len_; ++i) {
switch (shorty_[i]) {
case 'Z':
- arg_array_[offset] = va_arg(ap, jint);
- break;
case 'B':
- arg_array_[offset] = va_arg(ap, jint);
- break;
case 'C':
- arg_array_[offset] = va_arg(ap, jint);
- break;
case 'S':
- arg_array_[offset] = va_arg(ap, jint);
- break;
case 'I':
- arg_array_[offset] = va_arg(ap, jint);
+ Append(va_arg(ap, jint));
break;
case 'F': {
JValue value;
value.SetF(va_arg(ap, jdouble));
- arg_array_[offset] = value.GetI();
+ Append(value.GetI());
break;
}
case 'L':
- arg_array_[offset] = reinterpret_cast<int32_t>(soa.Decode<mirror::Object*>(va_arg(ap, jobject)));
+ Append(reinterpret_cast<int32_t>(soa.Decode<mirror::Object*>(va_arg(ap, jobject))));
break;
case 'D': {
JValue value;
value.SetD(va_arg(ap, jdouble));
- arg_array_[offset] = value.GetJ();
- arg_array_[offset + 1] = value.GetJ() >> 32;
- offset++;
+ AppendWide(value.GetJ());
break;
}
case 'J': {
- long long l = va_arg(ap, jlong);
- arg_array_[offset] = l;
- arg_array_[offset + 1] = l >> 32;
- offset++;
+ AppendWide(va_arg(ap, jlong));
break;
}
}
}
- num_bytes_ += 4 * offset;
}
void BuildArgArray(const ScopedObjectAccess& soa, mirror::Object* receiver, jvalue* args)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
// Set receiver if non-null (method is not static)
- size_t offset = 0;
if (receiver != NULL) {
- arg_array_[0] = reinterpret_cast<int32_t>(receiver);
- offset++;
+ Append(reinterpret_cast<int32_t>(receiver));
}
- for (size_t i = 1, args_offset = 0; i < shorty_len_; ++i, ++offset, ++args_offset) {
+ for (size_t i = 1, args_offset = 0; i < shorty_len_; ++i, ++args_offset) {
switch (shorty_[i]) {
case 'Z':
- arg_array_[offset] = args[args_offset].z;
+ Append(args[args_offset].z);
break;
case 'B':
- arg_array_[offset] = args[args_offset].b;
+ Append(args[args_offset].b);
break;
case 'C':
- arg_array_[offset] = args[args_offset].c;
+ Append(args[args_offset].c);
break;
case 'S':
- arg_array_[offset] = args[args_offset].s;
+ Append(args[args_offset].s);
break;
case 'I':
- arg_array_[offset] = args[args_offset].i;
- break;
case 'F':
- arg_array_[offset] = args[args_offset].i;
+ Append(args[args_offset].i);
break;
case 'L':
- arg_array_[offset] = reinterpret_cast<int32_t>(soa.Decode<mirror::Object*>(args[args_offset].l));
+ Append(reinterpret_cast<int32_t>(soa.Decode<mirror::Object*>(args[args_offset].l)));
break;
case 'D':
- arg_array_[offset] = args[args_offset].j;
- arg_array_[offset + 1] = args[args_offset].j >> 32;
- offset++;
- break;
case 'J':
- arg_array_[offset] = args[args_offset].j;
- arg_array_[offset + 1] = args[args_offset].j >> 32;
- offset++;
+ AppendWide(args[args_offset].j);
break;
}
}
- num_bytes_ += 4 * offset;
}
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)
- size_t offset = 0;
if (receiver != NULL) {
- arg_array_[0] = reinterpret_cast<int32_t>(receiver);
- offset++;
+ Append(reinterpret_cast<int32_t>(receiver));
}
- for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++offset, ++reg_offset) {
+ for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++reg_offset) {
switch (shorty_[i]) {
case 'Z':
- arg_array_[offset] = shadow_frame.GetVReg(range_start + reg_offset);
- break;
case 'B':
- arg_array_[offset] = shadow_frame.GetVReg(range_start + reg_offset);
- break;
case 'C':
- arg_array_[offset] = shadow_frame.GetVReg(range_start + reg_offset);
- break;
case 'S':
- arg_array_[offset] = shadow_frame.GetVReg(range_start + reg_offset);
- break;
case 'I':
- arg_array_[offset] = shadow_frame.GetVReg(range_start + reg_offset);
- break;
case 'F':
- arg_array_[offset] = shadow_frame.GetVReg(range_start + reg_offset);
+ Append(shadow_frame.GetVReg(range_start + reg_offset));
break;
case 'L':
- arg_array_[offset] = reinterpret_cast<int32_t>(shadow_frame.GetVRegReference(range_start + reg_offset));
+ Append(reinterpret_cast<int32_t>(shadow_frame.GetVRegReference(range_start + reg_offset)));
break;
case 'D':
- arg_array_[offset] = shadow_frame.GetVRegLong(range_start + reg_offset);
- arg_array_[offset + 1] = shadow_frame.GetVRegLong(range_start + reg_offset) >> 32;
- reg_offset++;
- offset++;
- break;
case 'J':
- arg_array_[offset] = shadow_frame.GetVRegLong(range_start + reg_offset);
- arg_array_[offset + 1] = shadow_frame.GetVRegLong(range_start + reg_offset) >> 32;
+ AppendWide(shadow_frame.GetVRegLong(range_start + reg_offset));
reg_offset++;
- offset++;
break;
}
}
- num_bytes_ += 4 * offset;
}
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)
- size_t offset = 0;
if (receiver != NULL) {
- arg_array_[0] = reinterpret_cast<int32_t>(receiver);
- offset++;
+ Append(reinterpret_cast<int32_t>(receiver));
}
- for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++offset, ++reg_offset) {
+ for (size_t i = 1, reg_offset = 0; i < shorty_len_; ++i, ++reg_offset) {
switch (shorty_[i]) {
case 'Z':
- arg_array_[offset] = shadow_frame.GetVReg(arg_regs[reg_offset]);
- break;
case 'B':
- arg_array_[offset] = shadow_frame.GetVReg(arg_regs[reg_offset]);
- break;
case 'C':
- arg_array_[offset] = shadow_frame.GetVReg(arg_regs[reg_offset]);
- break;
case 'S':
- arg_array_[offset] = shadow_frame.GetVReg(arg_regs[reg_offset]);
- break;
case 'I':
- arg_array_[offset] = shadow_frame.GetVReg(arg_regs[reg_offset]);
- break;
case 'F':
- arg_array_[offset] = shadow_frame.GetVReg(arg_regs[reg_offset]);
+ Append(shadow_frame.GetVReg(arg_regs[reg_offset]));
break;
case 'L':
- arg_array_[offset] = reinterpret_cast<int32_t>(shadow_frame.GetVRegReference(arg_regs[reg_offset]));
+ Append(reinterpret_cast<int32_t>(shadow_frame.GetVRegReference(arg_regs[reg_offset])));
break;
case 'D':
- arg_array_[offset] = shadow_frame.GetVRegLong(arg_regs[reg_offset]);
- arg_array_[offset + 1] = shadow_frame.GetVRegLong(arg_regs[reg_offset]) >> 32;
- offset++;
- reg_offset++;
- break;
case 'J':
- arg_array_[offset] = shadow_frame.GetVRegLong(arg_regs[reg_offset]);
- arg_array_[offset + 1] = shadow_frame.GetVRegLong(arg_regs[reg_offset]) >> 32;
- offset++;
+ AppendWide(shadow_frame.GetVRegLong(arg_regs[reg_offset]));
reg_offset++;
break;
}
}
- num_bytes_ += 4 * offset;
}
private: