summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@gmail.com>2010-08-11 20:31:46 +0400
committerCyrill Gorcunov <gorcunov@gmail.com>2010-08-11 20:31:46 +0400
commitd90693c79c6bef983063f291c286757dd084dd3e (patch)
tree255f1393291b032c34bd24424d6233af3b41bbd9
parent404589e55829c3d9cfd6411ae8f536033e561e80 (diff)
downloadnasm-d90693c79c6bef983063f291c286757dd084dd3e.tar.gz
preproc.c: Context-through single macros expansion is deprecated
For now we inform users about their sources need to be updated and also since _all_ context case are legit for single macros only we split lookup into two phases: 1) Lookup in active context, which is perfectly valid 2) Lookup in external contexts, which will be deprecated soon. If (2) happens we yield warning. A typical testcase is --- %macro one 0 %push %$a: %assign %$b 12 %push mov eax, %$a mov eax, %$b ; hit -- context through %pop %pop %endmacro one --- Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r--preproc.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/preproc.c b/preproc.c
index 186e7244..f04434b9 100644
--- a/preproc.c
+++ b/preproc.c
@@ -1462,24 +1462,42 @@ static Context *get_ctx(const char *name, const char **namep,
if (!all_contexts)
return ctx;
- do {
+ /*
+ * NOTE: In 2.10 we will not need lookup in extarnal
+ * contexts, so this is a gentle way to inform users
+ * about their source code need to be updated
+ */
+
+ /* first round -- check the current context */
+ m = hash_findix(&ctx->localmac, name);
+ while (m) {
+ if (!mstrcmp(m->name, name, m->casesense))
+ return ctx;
+ m = m->next;
+ }
+
+ /* second round - external contexts */
+ while ((ctx = ctx->next)) {
/* Search for this smacro in found context */
m = hash_findix(&ctx->localmac, name);
while (m) {
if (!mstrcmp(m->name, name, m->casesense)) {
- if ((i > 0) && (all_contexts == true)) {
- error(ERR_WARNING, "context-local label expansion"
- " to outer contexts will be deprecated"
- " starting in NASM 2.10, please update your"
- " code accordingly");
- }
+ /* NOTE: obsolete since 2.10 */
+ static int once = 0;
+ if (!once) {
+ error(ERR_WARNING, "context-local macro expansion"
+ " to outer contexts will be deprecated"
+ " starting in NASM 2.10, please update your"
+ " code accordingly");
+ once = 1;
+ }
+ error(ERR_WARNING, "`%s': context through macro expansion", name);
return ctx;
- }
+ }
m = m->next;
}
- ctx = ctx->next;
}
- while (ctx);
+
return NULL;
}