Forráskód Böngészése

Fixed the check_symbols as a pre-compiled function

Yentl Van Tendeloo 9 éve
szülő
commit
0b9d58e6d3

+ 12 - 15
bootstrap/compilation_manager.alc

@@ -11,11 +11,11 @@ Element function compilation_manager():
 
 	mv_root = read_root()
 
-	if (dict_in(mv_root["__hierarchy"], "models")):
-		root = mv_root["__hierarchy"]["models"]
+	if (dict_in(mv_root["__hierarchy"], "objects")):
+		root = mv_root["__hierarchy"]["objects"]
 	else:
 		root = create_node()
-		dict_add(mv_root["__hierarchy"], "models", root)
+		dict_add(mv_root["__hierarchy"], "objects", root)
 
 	operation = input()
 	if (operation == "upload"):
@@ -62,7 +62,7 @@ Element function compilation_manager():
 		log("Failed to understand command")
 	return operation
 
-Boolean function check_symbols(root : Element, main_function : String, objs : Element):
+String function check_symbols(root : Element, main_function : String, objs : Element):
 	Element symbols
 	String obj
 	Element keys
@@ -88,8 +88,7 @@ Boolean function check_symbols(root : Element, main_function : String, objs : El
 					dict_add(symbols, key, True)
 				elif (symbols[key]):
 					// Already in dictionary, and it was already defined
-					log("ERROR: multiple definition of symbol " + key)
-					return False
+					return "ERROR: multiple definition of symbol " + key
 				else:
 					// Already in dictionary, but only used
 					dict_delete(symbols, key)
@@ -105,20 +104,21 @@ Boolean function check_symbols(root : Element, main_function : String, objs : El
 		key = set_pop(keys)
 		if (bool_not(symbols[key])):
 			if (bool_not(bool_or(key == "output", key == "input"))):
-				log("ERROR: undefined symbol " + key)
-				return False
+				return "ERROR: undefined symbol " + key
 
-	return True
+	return "OK"
 
 Void function link_and_load(root : Element, main_function : String, objs : Element):
 	String obj
 	Element func
 	Element main_f
+	String result
 
-	if (check_symbols(root, main_function, objs)):
-		// Symbols verified OK, start execution
-		output(True)
+	result = check_symbols(root, main_function, objs)
+	output(result)
 
+	if (result == "OK"):
+		// Symbols verified OK, start execution
 		// Call all initializers in turn
 		while (0 < list_len(objs)):
 			obj = set_pop(objs)
@@ -128,7 +128,4 @@ Void function link_and_load(root : Element, main_function : String, objs : Eleme
 		// Resolve the main function, which should now be in (global) scope, and execute it
 		main_f = resolve(main_function)
 		main_f()
-	else:
-		// Symbol verification failed, so don't execute
-		output(False)
 	return

+ 2 - 1
interface/HUTN/hutn_compiler/linker.py

@@ -25,7 +25,8 @@ def link(address, username, objects):
 
     data = flush_data(address, data, username)
     v = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": username}))).read()
-    if "False" in v:
+    if "OK" not in v:
+        print(v)
         raise Exception("Linking error")
 
 if __name__ == "__main__":

+ 45 - 0
kernel/modelverse_kernel/compiled.py

@@ -398,3 +398,48 @@ def selectPossibleOutgoing(a, b, c, **remainder):
             yield [("CE", [result, limit_set_names[i]])]
 
     raise PrimitiveFinished(result)
+
+def check_symbols(a, b, c, **remainder):
+    symbols = {}
+    function_name = yield [("RV", [b])]
+    symbols[function_name] = False
+    object_links = yield [("RO", [c])]
+    set_elements = yield [("RE", [i]) for i in object_links]
+    set_elements = [set_elements] if len(object_links) == 1 else set_elements
+    set_elements = [i[1] for i in set_elements]
+    set_values = yield [("RV", [i]) for i in set_elements]
+    set_values = [set_values] if len(set_elements) == 1 else set_values
+    set_elements = yield [("RD", [a, i]) for i in set_values]
+    set_elements = [set_elements] if len(set_values) == 1 else set_elements
+    symbols_set = yield [("RD", [i, "symbols"]) for i in set_elements]
+    symbols_set = [symbols_set] if len(set_elements) == 1 else symbols_set
+    all_keys = yield [("RDK", [i]) for i in symbols_set]
+    all_keys = [all_keys] if len(symbols_set) == 1 else all_keys
+    for i, s in zip(all_keys, symbols_set):
+        # For each object we have found
+        keys = yield [("RV", [j]) for j in i]
+        keys = [keys] if len(i) == 1 else keys
+        values = yield [("RD", [s, j]) for j in keys]
+        values = [values] if len(keys) == 1 else values
+        values = yield [("RV", [j]) for j in values]
+        values = [values] if len(keys) == 1 else values
+        for key, value in zip(keys, values):
+            k = key
+            v = value
+            if v and symbols.get(k, False):
+                result = yield [("CNV", ["ERROR: multiple definition of symbol " + str(key)])]
+                raise PrimitiveFinished(result)
+            elif v and not symbols.get(k, False):
+                symbols[k] = True
+            elif not v and k not in symbols:
+                symbols[k] = False
+
+    for i, j in symbols.items():
+        if i == "input" or i == "output":
+            continue
+        if not j:
+            result = yield [("CNV", ["ERROR: undefined symbol " + str(i)])]
+            raise PrimitiveFinished(result)
+
+    result = yield [("CNV", ["OK"])]
+    raise PrimitiveFinished(result)