X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=f26c9513e000ca18cc3203fc0e67155b3111398c;hb=2ad60776b5d39f919e589a6ee51f1d4a0d40b649;hp=7da9b61ce94f0558220d745007e8a8f53688abf7;hpb=f34b0f1f6a54eda1ad328576e48d92b96ad160ac;p=dsw-obn.git diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index 7da9b61..f26c951 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -1060,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) @@ -1098,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); } @@ -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; + } +}