fix handling of 64-bit arguments to Method.invoke on 32-bit architectures

The previous code failed to account for alignment padding in the
Double and Long classes.
This commit is contained in:
Joel Dice 2011-09-12 20:26:32 -06:00
parent 8a30efc52f
commit be01e5b687
4 changed files with 37 additions and 5 deletions

View File

@ -8033,8 +8033,7 @@ class ArgumentList {
case 'J':
case 'D':
addLong(cast<int64_t>(objectArrayBody(t, arguments, index++),
BytesPerWord));
addLong(cast<int64_t>(objectArrayBody(t, arguments, index++), 8));
break;
default:

View File

@ -2772,8 +2772,7 @@ pushArguments(Thread* t, object this_, const char* spec, object a)
case 'J':
case 'D':
pushLong(t, cast<int64_t>(objectArrayBody(t, a, index++),
BytesPerWord));
pushLong(t, cast<int64_t>(objectArrayBody(t, a, index++), 8));
break;
default:

View File

@ -83,7 +83,25 @@ public class Floats {
}
}
public static void main(String[] args) {
public static class Rectangle {
public double x;
public double y;
public double width;
public double height;
public void setX(double x) {
this.x = x;
}
}
public static void main(String[] args) throws Exception {
expect(new Double(42.0) == 42.0);
{ Rectangle r = new Rectangle();
Rectangle.class.getMethod("setX", double.class).invoke(r, 42.0);
expect(r.x == 42.0);
}
{ double input[] = new double[8];
double left[] = new double[8];
double right[] = new double[8];

View File

@ -65,9 +65,25 @@ public class Longs {
return x >>> 32;
}
public static class Rectangle {
public long x;
public long y;
public long width;
public long height;
public void setX(long x) {
this.x = x;
}
}
public static void main(String[] args) throws Exception {
expect(volatileLong == getConstant());
{ Rectangle r = new Rectangle();
Rectangle.class.getMethod("setX", long.class).invoke(r, 42L);
expect(r.x == 42L);
}
{ long a = 0x1FFFFFFFFL;
long b = -1;
expect(a != b);