X-Git-Url: http://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Fbackends%2Fjvm%2Fgenerator-jvm.c;h=f111fd16eff755440676a4b6a6e433713cc43b4b;hp=d609ed8de96c216a30ac4ec9bceda90ec230583e;hb=86c0ca1aafd465a3e0d4a9d6b1af661eba483ae1;hpb=ee7fd939ac99201466900fb3983aa90b980da5c3 diff --git a/src/backends/jvm/generator-jvm.c b/src/backends/jvm/generator-jvm.c index d609ed8..f111fd1 100644 --- a/src/backends/jvm/generator-jvm.c +++ b/src/backends/jvm/generator-jvm.c @@ -263,6 +263,24 @@ jvm_generate_push_float(gen_proc_t * p, double f, int size) } } +static void +jvm_generate_push_string(gen_proc_t * p, char * str, int char_size) +{ + assert(char_size == 1); + int len = strlen(str); + + jvm_generate_push_int(p, len + 1); + jvm_generate(p, 1, 1, "newarray byte"); + + for(int i = 0; i < len; i++) + { + jvm_generate(p, 1, 2, "dup"); + jvm_generate_push_int(p, i); + jvm_generate_push_int(p, str[i]); + jvm_generate(p, 3, 0, "bastore"); + } +} + static gen_var_t * oberon_generator_new_var() { @@ -582,7 +600,7 @@ jvm_generate_copy_array(gen_proc_t * p, oberon_type_t * arr) * Входящие параметры заграблены. * Теперь генерируем эквивалентный код: * int i = 0; - * int len = dst.length + * int len = src.length * while(i < len) * { * ... @@ -609,7 +627,7 @@ jvm_generate_copy_array(gen_proc_t * p, oberon_type_t * arr) jvm_generate(p, 0, 1, "iconst_0"); jvm_generate(p, 1, 0, "istore %i", loop[i].index -> reg); - jvm_generate_load(p, arr, dst); + jvm_generate_load(p, arr, src); jvm_generate(p, 1, 1, "arraylength"); jvm_generate(p, 1, 0, "istore %i", loop[i].length -> reg); @@ -866,6 +884,7 @@ oberon_generator_init_type(oberon_context_t * ctx, oberon_type_t * type) case OBERON_TYPE_ARRAY: case OBERON_TYPE_REAL: case OBERON_TYPE_CHAR: + case OBERON_TYPE_STRING: break; case OBERON_TYPE_RECORD: ; @@ -1405,6 +1424,9 @@ push_item(gen_proc_t * p, oberon_item_t * item) case MODE_REAL: jvm_generate_push_float(p, item -> real, item -> result -> size); break; + case MODE_STRING: + jvm_generate_push_string(p, item -> string, item -> result -> size); + break; default: gen_error("push_item: unk mode %i", item -> mode); break;