diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index 8640e6bc65d3afd118cdd6394b2560def2e1f97c..84aa35a264a48665f25daa8001ff7b5021aeaa55 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -3111,15 +3111,14 @@ new_literal( uint32_t len, const char initial[], enum cbl_field_attr_t attr ) { } cbl_field_t * -temporaries_t::acquire( cbl_field_type_t type ) { +temporaries_t::reuse( cbl_field_type_t type ) { auto& fields = freed[type]; cbl_field_t *field; if( fields.empty() ) { - field = new_temporary_add(type); + return NULL; } else { auto p = fields.begin(); - parser_symbol_add(*p); field = *p; fields.erase(p); } @@ -3128,6 +3127,18 @@ temporaries_t::acquire( cbl_field_type_t type ) { return field; } +cbl_field_t * +temporaries_t::acquire( cbl_field_type_t type ) { + cbl_field_t *field = reuse(type); + + if( field ) { + parser_symbol_add(field); // notify of reuse + } else { + field = new_temporary_add(type); + } + return field; +} + size_t temporaries_t::keep() { keepers.push(used); @@ -3215,25 +3226,30 @@ new_temporary( enum cbl_field_type_t type, const char *initial ) { cbl_field_t * new_temporary_like( cbl_field_t skel ) { - auto field = new_temporary_impl(skel.type); + auto field = temporaries.reuse(skel.type); + if( ! field ) { + field = new_temporary_impl(skel.type); + temporaries.add(field); + } memcpy(skel.name, field->name, sizeof(field->name)); *field = skel; - temporaries.add(field); return parser_symbol_add2(field); } cbl_field_t * new_temporary_clone( const cbl_field_t *orig) { cbl_field_type_t type = is_literal(orig)? FldAlphanumeric : orig->type; - auto field = new_temporary_impl(type); + auto field = temporaries.reuse(type); + if( ! field ) { + field = new_temporary_impl(type); + temporaries.add(field); + } field->data = orig->data; if( field->type == FldNumericBin5 ) field->type = orig->type; field->attr = temporary_e; - temporaries.add(field); - parser_symbol_add(field); - return field; + return parser_symbol_add2(field); } bool diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h index f2a71639185284ea1c9247b750c66f4248c5661e..1181b0b3baae4eba2a0c9c3a25a51c17b443d376 100644 --- a/gcc/cobol/symbols.h +++ b/gcc/cobol/symbols.h @@ -1244,6 +1244,7 @@ class temporaries_t { public: cbl_field_t * literal( const char value[], uint32_t len, cbl_field_attr_t attr = none_e ); + cbl_field_t * reuse( cbl_field_type_t type ); cbl_field_t * acquire( cbl_field_type_t type ); size_t keep(); void release( size_t kept);