Revert "* and #pragma pop_macro("macro_name")"

- pop_macro incorrect with initially undefined macro
- horrible implementation (tcc_open_bf)
- crashes eventually (abuse of Sym->prev_tok)

- the (unrelated) asm_label part is the opposite of a fix
  (Despite of its name this variable has nothing to do with
  the built-in assembler)

This reverts commit 0c8447db79.
This commit is contained in:
grischka 2015-04-23 23:26:46 +02:00
parent 059aea5d35
commit 7c27186a83
8 changed files with 2 additions and 68 deletions

1
tcc.h
View File

@ -326,7 +326,6 @@
typedef struct TokenSym {
struct TokenSym *hash_next;
struct Sym *sym_define; /* direct pointer to define */
struct Sym *sym_define_stack; /* direct pointer to a push_macro stack */
struct Sym *sym_label; /* direct pointer to label */
struct Sym *sym_struct; /* direct pointer to structure */
struct Sym *sym_identifier; /* direct pointer to identifier */

View File

@ -305,9 +305,6 @@ static void asm_free_labels(TCCState *st)
}
/* remove label */
table_ident[s->v - TOK_IDENT]->sym_label = NULL;
if (s->asm_label) {
tcc_free(s->asm_label);
}
sym_free(s);
}
st->asm_labels = NULL;

View File

@ -152,6 +152,7 @@ static inline Sym *sym_malloc(void)
ST_INLN void sym_free(Sym *sym)
{
sym->next = sym_free_first;
tcc_free(sym->asm_label);
sym_free_first = sym;
}

32
tccpp.c
View File

@ -222,7 +222,6 @@ static TokenSym *tok_alloc_new(TokenSym **pts, const char *str, int len)
table_ident[i] = ts;
ts->tok = tok_ident++;
ts->sym_define = NULL;
ts->sym_define_stack = NULL;
ts->sym_label = NULL;
ts->sym_struct = NULL;
ts->sym_identifier = NULL;
@ -1447,37 +1446,6 @@ static void pragma_parse(TCCState *s1)
} else {
tcc_warning("#pragma comment(lib) is ignored");
}
} else if ((tok == TOK_push_macro) || (tok == TOK_pop_macro)) {
int push_macro = (tok == TOK_push_macro);
next();
skip('(');
if (tok != TOK_STR) {
expect("\"");
} else {
int len = strlen((char *)tokc.cstr->data);
tcc_open_bf(s1, "<push_pop_macro>", len);
memcpy(file->buffer, tokc.cstr->data, len);
ch = file->buf_ptr[0];
next_nomacro();
if (tok >= TOK_IDENT) {
Sym *s = table_ident[tok - TOK_IDENT]->sym_define;
Sym *ss = table_ident[tok - TOK_IDENT]->sym_define_stack;
if (push_macro) {
if (s) {
s->prev_tok = ss;
table_ident[tok - TOK_IDENT]->sym_define_stack = s;
}
} else {
if (ss) {
table_ident[tok - TOK_IDENT]->sym_define = ss;
table_ident[tok - TOK_IDENT]->sym_define_stack = ss->prev_tok;
}
}
}
tcc_close();
}
next();
skip(')');
} else if (tok == TOK_once) {
add_cached_include(s1, file->filename, TOK_once);
} else {

View File

@ -155,8 +155,6 @@
#endif
DEF(TOK_comment, "comment")
DEF(TOK_lib, "lib")
DEF(TOK_push_macro, "push_macro")
DEF(TOK_pop_macro, "pop_macro")
DEF(TOK_once, "once")
/* builtin functions or variables */

View File

@ -1,23 +0,0 @@
#include <stdio.h>
int main()
{
#define abort "111"
printf("abort = %s\n", abort);
#pragma push_macro("abort")
#undef abort
#define abort "222"
printf("abort = %s\n", abort);
#pragma push_macro("abort")
#undef abort
#define abort "333"
printf("abort = %s\n", abort);
#pragma pop_macro("abort")
printf("abort = %s\n", abort);
#pragma pop_macro("abort")
printf("abort = %s\n", abort);
}

View File

@ -1,5 +0,0 @@
abort = 111
abort = 222
abort = 333
abort = 222
abort = 111

View File

@ -95,8 +95,7 @@ TESTS = \
73_arm64.test \
74_nocode_wanted.test \
75_array_in_struct_init.test \
76_dollars_in_identifiers.test \
77_push_pop_macro.test
76_dollars_in_identifiers.test
# 34_array_assignment.test -- array assignment is not in C standard