mirror of
https://github.com/corda/corda.git
synced 2025-05-31 22:50:53 +00:00
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:
parent
8a30efc52f
commit
be01e5b687
@ -8033,8 +8033,7 @@ class ArgumentList {
|
|||||||
|
|
||||||
case 'J':
|
case 'J':
|
||||||
case 'D':
|
case 'D':
|
||||||
addLong(cast<int64_t>(objectArrayBody(t, arguments, index++),
|
addLong(cast<int64_t>(objectArrayBody(t, arguments, index++), 8));
|
||||||
BytesPerWord));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2772,8 +2772,7 @@ pushArguments(Thread* t, object this_, const char* spec, object a)
|
|||||||
|
|
||||||
case 'J':
|
case 'J':
|
||||||
case 'D':
|
case 'D':
|
||||||
pushLong(t, cast<int64_t>(objectArrayBody(t, a, index++),
|
pushLong(t, cast<int64_t>(objectArrayBody(t, a, index++), 8));
|
||||||
BytesPerWord));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -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 input[] = new double[8];
|
||||||
double left[] = new double[8];
|
double left[] = new double[8];
|
||||||
double right[] = new double[8];
|
double right[] = new double[8];
|
||||||
|
@ -65,9 +65,25 @@ public class Longs {
|
|||||||
return x >>> 32;
|
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 {
|
public static void main(String[] args) throws Exception {
|
||||||
expect(volatileLong == getConstant());
|
expect(volatileLong == getConstant());
|
||||||
|
|
||||||
|
{ Rectangle r = new Rectangle();
|
||||||
|
Rectangle.class.getMethod("setX", long.class).invoke(r, 42L);
|
||||||
|
expect(r.x == 42L);
|
||||||
|
}
|
||||||
|
|
||||||
{ long a = 0x1FFFFFFFFL;
|
{ long a = 0x1FFFFFFFFL;
|
||||||
long b = -1;
|
long b = -1;
|
||||||
expect(a != b);
|
expect(a != b);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user