changeset 199:188037f0397c

Allow export to import undefined symbols
author lost
date Sun, 22 Mar 2009 18:32:13 +0000
parents 6ddc861a07d4
children 3f9d299d2477
files lwasm/pseudo.c
diffstat 1 files changed, 39 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/lwasm/pseudo.c	Sun Mar 22 18:26:59 2009 +0000
+++ b/lwasm/pseudo.c	Sun Mar 22 18:32:13 2009 +0000
@@ -1093,49 +1093,52 @@
 	
 		lwasm_register_symbol(as, l, l -> sym, 0, SYMBOL_EXTERN);
 	}
-	if (!se)
-	{
-		register_error(as, l, 2, "Exported symbols must be fully defined within a section");
-		return;
-	}
-	if (se -> sect == NULL)
+	else
 	{
-		register_error(as, l, 2, "Only non-local symbols within a section can be exported");
-		return;
-	}
+	if (!se)
+		{
+			register_error(as, l, 2, "Exported symbols must be fully defined within a section");
+			return;
+		}
+		if (se -> sect == NULL)
+		{
+			register_error(as, l, 2, "Only non-local symbols within a section can be exported");
+			return;
+		}
 
-	if (se -> flags & SYMBOL_SET)
-	{
-		register_error(as, l, 2, "You cannot export symbols defined with SET");
-		return;
-	}
+		if (se -> flags & SYMBOL_SET)
+		{
+			register_error(as, l, 2, "You cannot export symbols defined with SET");
+			return;
+		}
 
-	// if the symbol is not already a simple value, re-evaluate it
-	// and see if it becomes simple
+		// if the symbol is not already a simple value, re-evaluate it
+		// and see if it becomes simple
 	
 
-	if (se -> flags & SYMBOL_COMPLEX)
-	{
-		register_error(as, l, 2, "Exported symbols must be fully resolved on pass 2");
-		return;
-	}
+		if (se -> flags & SYMBOL_COMPLEX)
+		{
+			register_error(as, l, 2, "Exported symbols must be fully resolved on pass 2");
+			return;
+		}
 
-	// search for existing export
-	for (ex = se -> sect -> exports; ex; ex = ex -> next)
-		if (!strcmp(l -> sym, ex -> sym))
-			break;
-	if (ex)
-	{
-		register_error(as, l, 2, "Symbol %s already exported", l -> sym);
-		return;
+		// search for existing export
+		for (ex = se -> sect -> exports; ex; ex = ex -> next)
+			if (!strcmp(l -> sym, ex -> sym))
+				break;
+		if (ex)
+		{
+			register_error(as, l, 2, "Symbol %s already exported", l -> sym);
+			return;
+		}
+
+		// add an external reference
+		ex = lwasm_alloc(sizeof(export_list_t));
+		ex -> next = se -> sect -> exports;
+		se -> sect -> exports = ex;
+		ex -> offset = se -> value;
+		ex -> sym = lwasm_strdup(se -> sym);
 	}
-
-	// add an external reference
-	ex = lwasm_alloc(sizeof(export_list_t));
-	ex -> next = se -> sect -> exports;
-	se -> sect -> exports = ex;
-	ex -> offset = se -> value;
-	ex -> sym = lwasm_strdup(se -> sym);
 	if (after == 1)
 	{
 		if (**p == ',')