index 865ffdd4177f7625fb1f5fdef57b2f3ba6c0cb39..855a61722c677d750a8bd84ea2fe27a1652e2723 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:
+ case OBERON_TYPE_SET:
switch(type -> size)
{
case 1:
switch(type -> size)
{
case 1:
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_CHAR:
+ 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 char size %i", type -> size);
+ break;
+ }
+ break;
case OBERON_TYPE_BOOLEAN:
return new_string("Z");
break;
case OBERON_TYPE_BOOLEAN:
return new_string("Z");
break;
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;
+ 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;
return NULL;
}
return NULL;
}
+char *
+jvm_get_descriptor_safe(oberon_type_t * type)
+{
+ switch(type -> class)
+ {
+ case OBERON_TYPE_POINTER:
+ return new_string("PTR%s", jvm_get_descriptor_safe(type -> base));
+ break;
+ case OBERON_TYPE_PROCEDURE:
+ case OBERON_TYPE_RECORD:
+ return jvm_get_class_full_name(type);
+ 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;
+ }
+
+ return NULL;
+}
+
char
jvm_get_prefix(oberon_type_t * type)
{
char
jvm_get_prefix(oberon_type_t * type)
{
{
case OBERON_TYPE_BOOLEAN:
case OBERON_TYPE_INTEGER:
{
case OBERON_TYPE_BOOLEAN:
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:
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:
+ case OBERON_TYPE_NIL:
+ case OBERON_TYPE_SYSTEM_PTR:
return 'a';
break;
case OBERON_TYPE_REAL:
return (size <= 4) ? ('f') : ('d');
break;
return 'a';
break;
case OBERON_TYPE_REAL:
return (size <= 4) ? ('f') : ('d');
break;
+ default:
+ gen_error("jvm_get_prefix: wat %i", type -> class);
+ return '!';
+ break;
}
}
-
- gen_error("jvm_get_prefix: wat");
- return '!';
}
char
}
char
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:
break;
}
break;
break;
}
break;
+ case OBERON_TYPE_SYSTEM_BYTE:
+ return 'b';
+ break;
+ case OBERON_TYPE_CHAR:
+ switch(size)
+ {
+ case 1:
+ return 'b';
+ break;
+ case 2:
+ return 'c';
+ break;
+ case 4:
+ return 'i';
+ break;
+ case 8:
+ return 'l';
+ break;
+ default:
+ gen_error("jvm_get_postfix: char wat");
+ break;
+ }
+ break;
case OBERON_TYPE_PROCEDURE:
case OBERON_TYPE_ARRAY:
case OBERON_TYPE_RECORD:
case OBERON_TYPE_POINTER:
case OBERON_TYPE_PROCEDURE:
case OBERON_TYPE_ARRAY:
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:
return '!';
}
return '!';
}
+char *
+jvm_get_name(oberon_object_t * x)
+{
+ switch(x -> class)
+ {
+ case OBERON_CLASS_VAR:
+ case OBERON_CLASS_VAR_PARAM:
+ case OBERON_CLASS_PARAM:
+ case OBERON_CLASS_FIELD:
+ return new_string(x -> name);
+ case OBERON_CLASS_PROC:
+ if(x -> parent)
+ {
+ return new_string("%s$%s", jvm_get_name(x -> parent), x -> name);
+ }
+ else
+ {
+ return new_string(x -> name);
+ }
+ default:
+ gen_error("jvm_get_name: wat");
+ }
+
+ return NULL;
+}
+
char *
jvm_get_field_full_name(oberon_object_t * x)
{
char *
jvm_get_field_full_name(oberon_object_t * x)
{
+ char * parent;
switch(x -> class)
{
case OBERON_CLASS_VAR:
switch(x -> class)
{
case OBERON_CLASS_VAR:
+ return new_string("%s/%s", x -> module -> name, jvm_get_name(x));
case OBERON_CLASS_PROC:
case OBERON_CLASS_PROC:
- return new_string("%s/%s", x -> module -> name, x -> name);
- case OBERON_CLASS_FIELD:;
- char * rec_name = jvm_get_class_full_name(x -> parent_type);
- return new_string("%s/%s", rec_name, x -> name);
+ return new_string("%s/%s", x -> module -> name, jvm_get_name(x));
+ case OBERON_CLASS_FIELD:
+ parent = jvm_get_class_full_name(x -> parent_type);
+ return new_string("%s/%s", parent, jvm_get_name(x));
case OBERON_CLASS_MODULE:
return new_string(x -> module -> name);
default:
case OBERON_CLASS_MODULE:
return new_string(x -> module -> name);
default:
switch(type -> class)
{
switch(type -> class)
{
+ case OBERON_TYPE_POINTER:
+ name = jvm_get_class_full_name(type -> base);
+ break;
case OBERON_TYPE_PROCEDURE:
name = new_string("SYSTEM$PROCEDURE");
char * desc;
case OBERON_TYPE_PROCEDURE:
name = new_string("SYSTEM$PROCEDURE");
char * desc;
- desc = jvm_get_descriptor(type -> base);
+ 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;
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++)
{
- desc = jvm_get_descriptor(arg -> type);
+ desc = jvm_get_descriptor_safe(arg -> type);
name = new_string("%s%s", name, desc);
arg = arg -> next;
}
name = new_string("%s%s", name, desc);
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 name;
}
return name;
}
-char *
-jvm_get_procedure_signature(oberon_type_t * proc)
-{
- char * signature;
- char * desc;
-
- signature = new_string("(");
-
- int num = proc -> num_decl;
- oberon_object_t * arg = proc -> decl;
- for(int i = 0; i < num; i++)
- {
- desc = jvm_get_descriptor(arg -> type);
- signature = new_string("%s%s", signature, desc);
- arg = arg -> next;
- }
-
- desc = jvm_get_descriptor(proc -> base);
- signature = new_string("%s)%s", signature, desc);
-
- return signature;
-}
-
int
jvm_cell_size_for_type(oberon_type_t * type)
{
if(type -> class == OBERON_TYPE_INTEGER
int
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_NOTYPE)
+ {
+ return 0;
+ }
return 1;
}
return 1;
}
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;