X-Git-Url: http://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=f26c9513e000ca18cc3203fc0e67155b3111398c;hp=26a0b55e829ed8ee735b5e5eecdc9bba3c31c1e4;hb=HEAD;hpb=674b8e806962b40992601aca7f1234103a3aefb0 diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 26a0b55..f26c951 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -9,6 +9,7 @@ #include #include "../../oberon-internals.h" +#include "../../oberon-type-compat.h" #include "../../generator.h" #include "generator-jvm.h" #include "generator-jvm-abi.h" @@ -1059,6 +1060,7 @@ oberon_generate_begin_proc(oberon_context_t * ctx, oberon_object_t * proc) } name = jvm_get_name(proc); + p -> ret_prefix = jvm_get_prefix(proc -> type -> base); jvm_generate_function_header(p, "public static", name, signature); if(proc -> local) @@ -1097,6 +1099,35 @@ oberon_generate_end_proc(oberon_context_t * ctx) p = m -> class -> p; oberon_generate_trap(ctx, -4); + + if(p -> ret_prefix == ' ') + { + jvm_generate(p, 0, 0, "return"); + } + else + { + int sz = jvm_cell_size_for_postfix(p -> ret_prefix); + switch(p -> ret_prefix) + { + case 'a': + jvm_generate(p, 0, 1, "aconst_null"); + break; + case 'l': + jvm_generate_push_int_size(p, 0, 8); + break; + case 'f': + jvm_generate_push_float(p, 0, 4); + break; + case 'd': + jvm_generate_push_float(p, 0, 8); + break; + default: + jvm_generate_push_int(p, 0); + break; + } + jvm_generate(p, sz, 0, "%creturn", p -> ret_prefix); + } + jvm_generate_function_end(p); } @@ -1454,8 +1485,7 @@ jvm_generate_compare_op(gen_proc_t * p, oberon_type_t * t, int op) } else if(prefix == 'a') { - if(t -> class == OBERON_TYPE_STRING - || (t -> class == OBERON_TYPE_POINTER && t -> base -> class == OBERON_TYPE_CHAR)) + if(oberon_is_array_of_char_type(t) || oberon_is_string_type(t)) { jvm_generate(p, 2, 1, "invokestatic SYSTEM/STRCMP([B[B)I"); jvm_generate(p, 1, 0, "if%s L%i", cmpop, label_true); @@ -1958,3 +1988,21 @@ oberon_set_typecheck(oberon_object_t * var, bool enable) var -> gen_var -> forcetype = (enable) ? (var -> type -> gen_type) : (NULL); } +void oberon_set_line(oberon_context_t * ctx, int line) +{ + gen_module_t * m; + gen_proc_t * p; + + m = ctx -> mod -> gen_mod; + if(m != NULL) + { + p = m -> class -> p; + + if(p != NULL) + { + jvm_generate(p, 0, 0, ".line %i", line); + } + + m -> line = line; + } +}