Skip to content

Commit

Permalink
2004-07-12 Bryce McKinlay <mckinlay@redhat.com>
Browse files Browse the repository at this point in the history
	PR libgcj/15713
	* include/jvm.h (_Jv_value): New union type.
	* gcj/field.h (_Jv_Field): Add new _addr union field variants
	* interperet.cc (run): Use _Jv_value union type and *_addr _Jv_Field
	union members.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84596 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
bryce committed Jul 13, 2004
1 parent 634f6ce commit f577d6c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 36 deletions.
8 changes: 8 additions & 0 deletions libjava/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2004-07-12 Bryce McKinlay <mckinlay@redhat.com>

PR libgcj/15713
* include/jvm.h (_Jv_value): New union type.
* gcj/field.h (_Jv_Field): Add new _addr union field variants
* interperet.cc (run): Use _Jv_value union type and *_addr _Jv_Field
union members.

2004-07-12 Scott Gilbertson <scottg@mantatest.com>

* gnu/awt/xlib/XCanvasPeer.java (createImage): Implement.
Expand Down
11 changes: 10 additions & 1 deletion libjava/gcj/field.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,16 @@ struct _Jv_Field

union {
jint boffset; /* offset in bytes for instance field */
void* addr; /* address of static field */
char* addr; /* address of static field */

jobject* object_addr; /* address of static object field... etc */
jbyte* byte_addr;
jshort* short_addr;
jchar* char_addr;
jint* int_addr;
jlong* long_addr;
jfloat* float_addr;
jdouble* double_addr;
} u;

#ifdef __cplusplus
Expand Down
12 changes: 12 additions & 0 deletions libjava/include/jvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,18 @@ union _Jv_word2
jdouble d;
};

union _Jv_value
{
jbyte byte_value;
jshort short_value;
jchar char_value;
jint int_value;
jlong long_value;
jfloat float_value;
jdouble double_value;
jobject object_value;
};

// An instance of this type is used to represent a single frame in a
// backtrace. If the interpreter has been built, we also include
// information about the interpreted method.
Expand Down
62 changes: 27 additions & 35 deletions libjava/interpret.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1156,7 +1156,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
ffi_cif *cif = &rmeth->cif;
ffi_raw *raw = (ffi_raw*) sp;

jdouble rvalue;
_Jv_value rvalue;

#if FFI_NATIVE_RAW_API
/* We assume that this is only implemented if it's correct */
Expand All @@ -1172,11 +1172,11 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
* so those are checked before the switch */
if (rtype == FFI_TYPE_POINTER)
{
PUSHA (*(jobject*)&rvalue);
PUSHA (rvalue.object_value);
}
else if (rtype == FFI_TYPE_SINT32)
{
PUSHI (*(jint*)&rvalue);
PUSHI (rvalue.int_value);
}
else if (rtype == FFI_TYPE_VOID)
{
Expand All @@ -1187,36 +1187,27 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
switch (rtype)
{
case FFI_TYPE_SINT8:
{
jbyte value = (*(jint*)&rvalue) & 0xff;
PUSHI (value);
}
PUSHI (rvalue.byte_value);
break;

case FFI_TYPE_SINT16:
{
jshort value = (*(jint*)&rvalue) & 0xffff;
PUSHI (value);
}
PUSHI (rvalue.short_value);
break;

case FFI_TYPE_UINT16:
{
jint value = (*(jint*)&rvalue) & 0xffff;
PUSHI (value);
}
PUSHI (rvalue.char_value);
break;

case FFI_TYPE_FLOAT:
PUSHF (*(jfloat*)&rvalue);
PUSHF (rvalue.float_value);
break;

case FFI_TYPE_DOUBLE:
PUSHD (rvalue);
PUSHD (rvalue.double_value);
break;

case FFI_TYPE_SINT64:
PUSHL (*(jlong*)&rvalue);
PUSHL (rvalue.long_value);
break;

default:
Expand Down Expand Up @@ -2408,37 +2399,37 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
switch (type->size_in_bytes)
{
case 1:
PUSHI (*(jbyte*) (field->u.addr));
PUSHI (*field->u.byte_addr);
newinsn = AMPAMP (getstatic_resolved_1);
break;

case 2:
if (type == JvPrimClass (char))
{
PUSHI(*(jchar*) (field->u.addr));
PUSHI (*field->u.char_addr);
newinsn = AMPAMP (getstatic_resolved_char);
}
else
{
PUSHI(*(jshort*) (field->u.addr));
PUSHI (*field->u.short_addr);
newinsn = AMPAMP (getstatic_resolved_short);
}
break;

case 4:
PUSHI(*(jint*) (field->u.addr));
PUSHI(*field->u.int_addr);
newinsn = AMPAMP (getstatic_resolved_4);
break;

case 8:
PUSHL(*(jlong*) (field->u.addr));
PUSHL(*field->u.long_addr);
newinsn = AMPAMP (getstatic_resolved_8);
break;
}
}
else
{
PUSHA(*(jobject*) (field->u.addr));
PUSHA(*field->u.object_addr);
newinsn = AMPAMP (getstatic_resolved_obj);
}

Expand Down Expand Up @@ -2494,42 +2485,43 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
NULLCHECK(obj);

void *newinsn = NULL;
_Jv_value *val = (_Jv_value *) ((char *)obj + field_offset);
if (type->isPrimitive ())
{
switch (type->size_in_bytes)
{
case 1:
PUSHI (*(jbyte*) ((char*)obj + field_offset));
PUSHI (val->byte_value);
newinsn = AMPAMP (getfield_resolved_1);
break;

case 2:
if (type == JvPrimClass (char))
{
PUSHI (*(jchar*) ((char*)obj + field_offset));
PUSHI (val->char_value);
newinsn = AMPAMP (getfield_resolved_char);
}
else
{
PUSHI (*(jshort*) ((char*)obj + field_offset));
PUSHI (val->short_value);
newinsn = AMPAMP (getfield_resolved_short);
}
break;

case 4:
PUSHI (*(jint*) ((char*)obj + field_offset));
PUSHI (val->int_value);
newinsn = AMPAMP (getfield_resolved_4);
break;

case 8:
PUSHL(*(jlong*) ((char*)obj + field_offset));
PUSHL (val->long_value);
newinsn = AMPAMP (getfield_resolved_8);
break;
}
}
else
{
PUSHA(*(jobject*) ((char*)obj + field_offset));
PUSHA (val->object_value);
newinsn = AMPAMP (getfield_resolved_obj);
}

Expand Down Expand Up @@ -2611,31 +2603,31 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
case 1:
{
jint value = POPI();
*(jbyte*) (field->u.addr) = value;
*field->u.byte_addr = value;
newinsn = AMPAMP (putstatic_resolved_1);
break;
}

case 2:
{
jint value = POPI();
*(jchar*) (field->u.addr) = value;
*field->u.char_addr = value;
newinsn = AMPAMP (putstatic_resolved_2);
break;
}

case 4:
{
jint value = POPI();
*(jint*) (field->u.addr) = value;
*field->u.int_addr = value;
newinsn = AMPAMP (putstatic_resolved_4);
break;
}

case 8:
{
jlong value = POPL();
*(jlong*) (field->u.addr) = value;
*field->u.long_addr = value;
newinsn = AMPAMP (putstatic_resolved_8);
break;
}
Expand All @@ -2644,7 +2636,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
else
{
jobject value = POPA();
*(jobject*) (field->u.addr) = value;
*field->u.object_addr = value;
newinsn = AMPAMP (putstatic_resolved_obj);
}

Expand Down

0 comments on commit f577d6c

Please sign in to comment.