diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index a61a45682ff40e6f6607368c672492ea3ca62b20..7cf25698a2160d6a142cef576896e446ca3ef639 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -4568,14 +4568,25 @@ parser_display_internal(tree file_descriptor, } else { - refer_fill_source(refer); - - gg_call(VOID, - "__gg__display", - 3, - gg_get_address_of(refer.refer_decl_node), - file_descriptor, - advance ? integer_one_node : integer_zero_node ); + if( refer_is_clean(refer) ) + { + gg_call(VOID, + "__gg__display_clean", + 3, + gg_get_address_of(refer.field->var_decl_node), + file_descriptor, + advance ? integer_one_node : integer_zero_node ); + } + else + { + refer_fill_source(refer); + gg_call(VOID, + "__gg__display", + 3, + gg_get_address_of(refer.refer_decl_node), + file_descriptor, + advance ? integer_one_node : integer_zero_node ); + } } cursor_at_sol = advance; } diff --git a/libgcobol/libgcobol.cc b/libgcobol/libgcobol.cc index 59dff38e09f3d05c64684e8303d6fc59285d70ca..c4d7d523acc36873965feef7d5343f31a699f56c 100644 --- a/libgcobol/libgcobol.cc +++ b/libgcobol/libgcobol.cc @@ -6838,31 +6838,24 @@ __gg__string( size_t integers[], return overflow; } -extern "C" +static void -__gg__display( cblc_refer_t *var, - int file_descriptor, - int advance ) +display_both(cblc_field_t *field, + unsigned char *qual_data, + size_t qual_size, + int flags, + int file_descriptor, + int advance ) { static size_t display_string_size = MINIMUM_ALLOCATION_SIZE; static char *display_string = (char *)MALLOC(display_string_size); - // if( var->qual_data ) - // { - format_for_display_internal(&display_string, - &display_string_size, - var->field, - var->qual_data, - var->qual_size, - !!(var->flags & REFER_T_ADDRESS_OF) ); - // } - // else - // { - // // This can happen during TRACE1=2 with LOCAL=STORAGE - // char achmsg[] = "<NULL>"; - // strcpy(display_string, achmsg); - // display_string_size = strlen(display_string); - // } + format_for_display_internal(&display_string, + &display_string_size, + field, + qual_data, + qual_size, + !!(flags & REFER_T_ADDRESS_OF) ); // Let's honor the locale of the system, as best we can: static size_t converted_size = MINIMUM_ALLOCATION_SIZE; @@ -6875,7 +6868,7 @@ __gg__display( cblc_refer_t *var, strlen(converted)); if(ss == -1) { - fprintf(stderr, "__gg__display() %s %p\n", var->field->name, var->qual_data); + fprintf(stderr, "__gg__display() %s %p\n", field->name, qual_data); fprintf(stderr, "__gg__display() %zd\n", converted_size); fprintf(stderr, "__gg__display() "); for(size_t i=0; i<converted_size; i++) @@ -6895,6 +6888,34 @@ __gg__display( cblc_refer_t *var, } } +extern "C" +void +__gg__display(cblc_refer_t *var, + int file_descriptor, + int advance ) + { + display_both( var->field, + var->qual_data, + var->qual_size, + var->flags, + file_descriptor, + advance); + } + +extern "C" +void +__gg__display_clean(cblc_field_t *field, + int file_descriptor, + int advance ) + { + display_both( field, + field->data, + field->capacity, + 0, + file_descriptor, + advance); + } + extern "C" void __gg__display_string( int file_descriptor,