index fac9e0bc0def269786de76b60734d24cceb2fc6e..61088af9bfb6a30b372fe071e85a30b4387d1dc8 100644 (file)
#include <gc.h>
#include <gc.h>
-#include "../../../include/oberon.h"
#include "../../oberon-internals.h"
#include "generator-jvm.h"
#include "generator-jvm-basic.h"
#include "../../oberon-internals.h"
#include "generator-jvm.h"
#include "generator-jvm-basic.h"
switch(type -> class)
{
switch(type -> class)
{
- case OBERON_TYPE_VOID:
+ case OBERON_TYPE_NOTYPE:
return new_string("V");
break;
case OBERON_TYPE_INTEGER:
return new_string("V");
break;
case OBERON_TYPE_INTEGER:
break;
}
break;
break;
}
break;
+ case OBERON_TYPE_SYSTEM_BYTE:
+ return new_string("B");
+ break;
case OBERON_TYPE_REAL:
switch(type -> size)
{
case OBERON_TYPE_REAL:
switch(type -> size)
{
break;
}
break;
break;
}
break;
+ case OBERON_TYPE_SYSTEM_PTR:
+ return new_string("Ljava/lang/Object;");
+ 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_ARRAY:
return new_string("A%s", jvm_get_descriptor_safe(type -> base));
break;
case OBERON_TYPE_ARRAY:
return new_string("A%s", jvm_get_descriptor_safe(type -> base));
break;
+ case OBERON_TYPE_SYSTEM_PTR:
+ return new_string("SYSPTR");
+ break;
default:
return jvm_get_descriptor(type);
break;
default:
return jvm_get_descriptor(type);
break;
case OBERON_TYPE_INTEGER:
case OBERON_TYPE_CHAR:
case OBERON_TYPE_SET:
case OBERON_TYPE_INTEGER:
case OBERON_TYPE_CHAR:
case OBERON_TYPE_SET:
+ case OBERON_TYPE_SYSTEM_BYTE:
return (size <= 4) ? ('i') : ('l');
break;
case OBERON_TYPE_PROCEDURE:
return (size <= 4) ? ('i') : ('l');
break;
case OBERON_TYPE_PROCEDURE:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
case OBERON_TYPE_STRING:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
case OBERON_TYPE_STRING:
+ case OBERON_TYPE_NIL:
+ case OBERON_TYPE_SYSTEM_PTR:
return 'a';
break;
case OBERON_TYPE_REAL:
return 'a';
break;
case OBERON_TYPE_REAL:
break;
}
break;
break;
}
break;
+ case OBERON_TYPE_SYSTEM_BYTE:
+ return 'b';
+ break;
case OBERON_TYPE_CHAR:
switch(size)
{
case OBERON_TYPE_CHAR:
switch(size)
{
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
case OBERON_TYPE_STRING:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
case OBERON_TYPE_STRING:
+ case OBERON_TYPE_NIL:
+ case OBERON_TYPE_SYSTEM_PTR:
return 'a';
break;
case OBERON_TYPE_REAL:
return 'a';
break;
case OBERON_TYPE_REAL:
name = new_string("SYSTEM$PROCEDURE");
char * desc;
name = new_string("SYSTEM$PROCEDURE");
char * desc;
+ char * spec;
desc = jvm_get_descriptor_safe(type -> base);
name = new_string("%s$%s", name, desc);
int num = type -> num_decl;
oberon_object_t * arg = type -> decl;
desc = jvm_get_descriptor_safe(type -> base);
name = new_string("%s$%s", name, desc);
int num = type -> num_decl;
oberon_object_t * arg = type -> decl;
+
for(int i = 0; i < num; i++)
{
for(int i = 0; i < num; i++)
{
+ spec = "";
+ if(arg -> class == OBERON_CLASS_VAR_PARAM)
+ {
+ spec = "VAR";
+ }
desc = jvm_get_descriptor_safe(arg -> type);
desc = jvm_get_descriptor_safe(arg -> type);
- name = new_string("%s%s", name, desc);
+ name = new_string("%s%s%s", name, spec, desc);
arg = arg -> next;
}
arg = arg -> next;
}
rec_id = type -> gen_type -> rec_id;
name = new_string("%s$RECORD%i", type -> module -> name, rec_id);
break;
rec_id = type -> gen_type -> rec_id;
name = new_string("%s$RECORD%i", type -> module -> name, rec_id);
break;
+ case OBERON_TYPE_SYSTEM_PTR:
+ name = new_string("java/lang/Object");
+ break;
default:
gen_error("jvm_get_class_full_name: unk type class %i", type -> class);
break;
default:
gen_error("jvm_get_class_full_name: unk type class %i", type -> class);
break;
return 2;
}
}
return 2;
}
}
- else if(type -> class == OBERON_TYPE_VOID)
+ else if(type -> class == OBERON_TYPE_NOTYPE)
{
return 0;
}
{
return 0;
}
case 'd':
return 2;
default:
case 'd':
return 2;
default:
- gen_error("jvm_cell_size_for_postfix: unk postfix %c", postfix);
+ gen_error("jvm_cell_size_for_postfix: unk postfix %c (%i)", postfix, postfix);
}
return -666;
}
return -666;