diff lwasm/pseudo.c @ 221:271c0ef9ea60

Fixed segfault in import/extern pseudo op
author lost
date Sat, 09 May 2009 16:32:47 +0000
parents bae1e3ecdce1
children 058f18119025
line wrap: on
line diff
--- a/lwasm/pseudo.c	Sat May 09 16:21:54 2009 +0000
+++ b/lwasm/pseudo.c	Sat May 09 16:32:47 2009 +0000
@@ -1031,7 +1031,38 @@
 		return;
 	}
 	
-	lwasm_register_symbol(as, l, l -> sym, 0, SYMBOL_EXTERN);
+	if (l -> sym)
+	{
+		lwasm_register_symbol(as, l, l -> sym, 0, SYMBOL_EXTERN);
+		return;
+	}
+	
+	while (**p)
+	{
+		char *sym2, *sym3;
+		for (sym2 = *p; **p && !isspace(**p) && **p != ','; (*p)++)
+			/* do nothing */ ;
+
+		if (l -> sym)
+			lwasm_free(l -> sym);
+
+		sym3 = lwasm_alloc(*p - sym2 + 1);
+		memcpy(sym3, sym2, *p - sym2);
+		sym3[*p - sym2] = '\0';
+			
+		l -> sym = sym3;
+		debug_message(2, "import symbol: '%s'", sym3);
+		lwasm_register_symbol(as, l, l -> sym, 0, SYMBOL_EXTERN);
+		if (**p && (**p != ','))
+		{
+			register_error(as, l, 1, "Bad import list");
+			return;
+		}
+		if (**p == ',')
+			(*p)++;
+	}
+	if (!(l -> sym))
+		register_error(as, l, 1, "Bad import list");
 }
 
 OPFUNC(pseudo_export)