mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
6655646: dynamic languages need dynamically linked call sites
Invokedynamic instruction (JSR 292 RI) Reviewed-by: twisti, never
This commit is contained in:
parent
fd05c28901
commit
34c1d72421
65 changed files with 1457 additions and 264 deletions
|
@ -217,6 +217,73 @@ class AbstractInterpreter: AllStatic {
|
|||
stackElementSize()) + tag_offset_in_bytes();
|
||||
}
|
||||
|
||||
// access to stacked values according to type:
|
||||
static oop* oop_addr_in_slot(intptr_t* slot_addr) {
|
||||
return (oop*) slot_addr;
|
||||
}
|
||||
static jint* int_addr_in_slot(intptr_t* slot_addr) {
|
||||
if ((int) sizeof(jint) < wordSize && !Bytes::is_Java_byte_ordering_different())
|
||||
// big-endian LP64
|
||||
return (jint*)(slot_addr + 1) - 1;
|
||||
else
|
||||
return (jint*) slot_addr;
|
||||
}
|
||||
static jlong long_in_slot(intptr_t* slot_addr) {
|
||||
if (sizeof(intptr_t) >= sizeof(jlong)) {
|
||||
return *(jlong*) slot_addr;
|
||||
} else if (!TaggedStackInterpreter) {
|
||||
return Bytes::get_native_u8((address)slot_addr);
|
||||
} else {
|
||||
assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
|
||||
// assemble the long in memory order (not arithmetic order)
|
||||
union { jlong j; jint i[2]; } u;
|
||||
u.i[0] = (jint) slot_addr[0*stackElementSize()];
|
||||
u.i[1] = (jint) slot_addr[1*stackElementSize()];
|
||||
return u.j;
|
||||
}
|
||||
}
|
||||
static void set_long_in_slot(intptr_t* slot_addr, jlong value) {
|
||||
if (sizeof(intptr_t) >= sizeof(jlong)) {
|
||||
*(jlong*) slot_addr = value;
|
||||
} else if (!TaggedStackInterpreter) {
|
||||
Bytes::put_native_u8((address)slot_addr, value);
|
||||
} else {
|
||||
assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
|
||||
// assemble the long in memory order (not arithmetic order)
|
||||
union { jlong j; jint i[2]; } u;
|
||||
u.j = value;
|
||||
slot_addr[0*stackElementSize()] = (intptr_t) u.i[0];
|
||||
slot_addr[1*stackElementSize()] = (intptr_t) u.i[1];
|
||||
}
|
||||
}
|
||||
static void get_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
|
||||
switch (type) {
|
||||
case T_BOOLEAN: value->z = *int_addr_in_slot(slot_addr); break;
|
||||
case T_CHAR: value->c = *int_addr_in_slot(slot_addr); break;
|
||||
case T_BYTE: value->b = *int_addr_in_slot(slot_addr); break;
|
||||
case T_SHORT: value->s = *int_addr_in_slot(slot_addr); break;
|
||||
case T_INT: value->i = *int_addr_in_slot(slot_addr); break;
|
||||
case T_LONG: value->j = long_in_slot(slot_addr); break;
|
||||
case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break;
|
||||
case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break;
|
||||
case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break;
|
||||
default: ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
|
||||
switch (type) {
|
||||
case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break;
|
||||
case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break;
|
||||
case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break;
|
||||
case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break;
|
||||
case T_INT: *int_addr_in_slot(slot_addr) = value->i; break;
|
||||
case T_LONG: set_long_in_slot(slot_addr, value->j); break;
|
||||
case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break;
|
||||
case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break;
|
||||
case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break;
|
||||
default: ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue