diff options
Diffstat (limited to 'libcpp/directives.c')
-rw-r--r-- | libcpp/directives.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/libcpp/directives.c b/libcpp/directives.c index 5a6a342bea5..16873dadecf 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -26,14 +26,6 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "mkdeps.h" #include "obstack.h" -/* Chained list of answers to an assertion. */ -struct answer -{ - struct answer *next; - unsigned int count; - cpp_token first[1]; -}; - /* Stack of conditionals currently in progress (including both successful and failing conditionals). */ struct if_stack @@ -1727,6 +1719,8 @@ do_assert (cpp_reader *pfile) node = parse_assertion (pfile, &new_answer, T_ASSERT); if (node) { + size_t answer_size; + /* Place the new answer in the answer list. First check there is not a duplicate. */ new_answer->next = 0; @@ -1741,11 +1735,20 @@ do_assert (cpp_reader *pfile) new_answer->next = node->value.answers; } + answer_size = sizeof (struct answer) + ((new_answer->count - 1) + * sizeof (cpp_token)); + /* Commit or allocate storage for the object. */ + if (pfile->hash_table->alloc_subobject) + { + struct answer *temp_answer = new_answer; + new_answer = pfile->hash_table->alloc_subobject (answer_size); + memcpy (new_answer, temp_answer, answer_size); + } + else + BUFF_FRONT (pfile->a_buff) += answer_size; + node->type = NT_ASSERTION; node->value.answers = new_answer; - BUFF_FRONT (pfile->a_buff) += (sizeof (struct answer) - + (new_answer->count - 1) - * sizeof (cpp_token)); check_eol (pfile); } } |