index 88de2e2292119fbe5c8a4b090caee7c1051bc526..277940ce17b58fb18f46ee630aa162c2a250c62a 100644 (file)
return new_string("V");
break;
case OBERON_TYPE_INTEGER:
return new_string("V");
break;
case OBERON_TYPE_INTEGER:
+ case OBERON_TYPE_SET:
switch(type -> size)
{
case 1:
switch(type -> size)
{
case 1:
desc = jvm_get_descriptor(type -> base);
return new_string("[%s", desc);
break;
desc = jvm_get_descriptor(type -> base);
return new_string("[%s", desc);
break;
+ case OBERON_TYPE_STRING:
+ switch(type -> size)
+ {
+ case 1:
+ return new_string("[B");
+ break;
+ case 2:
+ return new_string("[C");
+ break;
+ case 4:
+ return new_string("[I");
+ break;
+ case 8:
+ return new_string("[J");
+ break;
+ default:
+ gen_error("jvm_get_descriptor: unsupported string size %i", type -> size);
+ break;
+ }
+ break;
default:
gen_error("jvm_get_descriptor: unsupported type class %i", type -> class);
break;
default:
gen_error("jvm_get_descriptor: unsupported type class %i", type -> class);
break;
case OBERON_TYPE_BOOLEAN:
case OBERON_TYPE_INTEGER:
case OBERON_TYPE_CHAR:
case OBERON_TYPE_BOOLEAN:
case OBERON_TYPE_INTEGER:
case OBERON_TYPE_CHAR:
+ case OBERON_TYPE_SET:
return (size <= 4) ? ('i') : ('l');
break;
case OBERON_TYPE_PROCEDURE:
case OBERON_TYPE_ARRAY:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
return (size <= 4) ? ('i') : ('l');
break;
case OBERON_TYPE_PROCEDURE:
case OBERON_TYPE_ARRAY:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
+ case OBERON_TYPE_STRING:
return 'a';
break;
case OBERON_TYPE_REAL:
return (size <= 4) ? ('f') : ('d');
break;
default:
return 'a';
break;
case OBERON_TYPE_REAL:
return (size <= 4) ? ('f') : ('d');
break;
default:
- gen_error("jvm_get_prefix: wat");
+ gen_error("jvm_get_prefix: wat %i", type -> class);
return '!';
break;
}
return '!';
break;
}
return 'b';
break;
case OBERON_TYPE_INTEGER:
return 'b';
break;
case OBERON_TYPE_INTEGER:
+ case OBERON_TYPE_SET:
switch(size)
{
case 1:
switch(size)
{
case 1:
case OBERON_TYPE_ARRAY:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
case OBERON_TYPE_ARRAY:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
+ case OBERON_TYPE_STRING:
return 'a';
break;
case OBERON_TYPE_REAL:
return 'a';
break;
case OBERON_TYPE_REAL:
for(int i = 0; i < num; i++)
{
desc = jvm_get_descriptor(arg -> type);
for(int i = 0; i < num; i++)
{
desc = jvm_get_descriptor(arg -> type);
- signature = new_string("%s%s", signature, desc);
+ if(arg -> class == OBERON_CLASS_VAR_PARAM)
+ {
+ signature = new_string("%s[%sI", signature, desc);
+ }
+ else
+ {
+ signature = new_string("%s%s", signature, desc);
+ }
arg = arg -> next;
}
arg = arg -> next;
}
jvm_cell_size_for_type(oberon_type_t * type)
{
if(type -> class == OBERON_TYPE_INTEGER
jvm_cell_size_for_type(oberon_type_t * type)
{
if(type -> class == OBERON_TYPE_INTEGER
- || type -> class == OBERON_TYPE_REAL)
+ || type -> class == OBERON_TYPE_REAL
+ || type -> class == OBERON_TYPE_CHAR
+ || type -> class == OBERON_TYPE_SET)
{
if(type -> size > 4)
{
return 2;
}
}
{
if(type -> size > 4)
{
return 2;
}
}
+ else if(type -> class == OBERON_TYPE_VOID)
+ {
+ return 0;
+ }
return 1;
}
return 1;
}