|
@@ -8,44 +8,43 @@ def flush_data(address, data, username):
|
|
|
urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": username})), timeout=10).read()
|
|
|
return []
|
|
|
|
|
|
-def link(address, username, objects, fast):
|
|
|
+def link(address, username, objects):
|
|
|
# Read out all symbol tables that are to be linked
|
|
|
definers = {}
|
|
|
users = {}
|
|
|
data = []
|
|
|
|
|
|
- if not fast:
|
|
|
- definers["main"] = None
|
|
|
- for obj in objects:
|
|
|
- data.append(("V", '3'))
|
|
|
- data.append(("V", '"read_symbols"'))
|
|
|
- data.append(("V", '"%s"' % obj))
|
|
|
-
|
|
|
- data = flush_data(address, data, username)
|
|
|
-
|
|
|
- for obj in objects:
|
|
|
- print("[SYMB] %s" % (obj))
|
|
|
- v = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": username}))).read()
|
|
|
- lst = v.rsplit("=", 1)[1]
|
|
|
- lst = lst.split("\n")
|
|
|
- for e in lst:
|
|
|
- if len(e) > 1:
|
|
|
- name, defined = e.rsplit(":", 1)
|
|
|
- if defined == "1":
|
|
|
- if definers.get(name, None):
|
|
|
- raise Exception("Double definition for symbol %s\nDefined in %s\nDefined in %s" % (name, definers[name], obj))
|
|
|
- definers[name] = obj
|
|
|
- else:
|
|
|
- users.setdefault(name, []).append(obj)
|
|
|
- if name not in definers:
|
|
|
- definers[name] = None
|
|
|
-
|
|
|
- # Check for undefined symbols with this linking set
|
|
|
- for symbol in definers:
|
|
|
- if definers[symbol] is None:
|
|
|
- if symbol not in ["input", "output"]:
|
|
|
- # Some symbols are built-ins which only look like functions
|
|
|
- raise Exception("Undefined symbol %s.\nUsed by modules:\n\t%s" % (symbol, "\n\t".join(users[symbol])))
|
|
|
+ definers["main"] = None
|
|
|
+ for obj in objects:
|
|
|
+ data.append(("V", '3'))
|
|
|
+ data.append(("V", '"read_symbols"'))
|
|
|
+ data.append(("V", '"%s"' % obj))
|
|
|
+
|
|
|
+ data = flush_data(address, data, username)
|
|
|
+
|
|
|
+ for obj in objects:
|
|
|
+ print("[SYMB] %s" % (obj))
|
|
|
+ v = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": username}))).read()
|
|
|
+ lst = v.rsplit("=", 1)[1]
|
|
|
+ lst = lst.split("\n")
|
|
|
+ for e in lst:
|
|
|
+ if len(e) > 1:
|
|
|
+ name, defined = e.rsplit(":", 1)
|
|
|
+ if defined == "1":
|
|
|
+ if definers.get(name, None):
|
|
|
+ raise Exception("Double definition for symbol %s\nDefined in %s\nDefined in %s" % (name, definers[name], obj))
|
|
|
+ definers[name] = obj
|
|
|
+ else:
|
|
|
+ users.setdefault(name, []).append(obj)
|
|
|
+ if name not in definers:
|
|
|
+ definers[name] = None
|
|
|
+
|
|
|
+ # Check for undefined symbols with this linking set
|
|
|
+ for symbol in definers:
|
|
|
+ if definers[symbol] is None:
|
|
|
+ if symbol not in ["input", "output"]:
|
|
|
+ # Some symbols are built-ins which only look like functions
|
|
|
+ raise Exception("Undefined symbol %s.\nUsed by modules:\n\t%s" % (symbol, "\n\t".join(users[symbol])))
|
|
|
|
|
|
# Ok, we know that all symbols can be defined with this set of files, now link their initializers together
|
|
|
initializers = []
|
|
@@ -106,13 +105,8 @@ if __name__ == "__main__":
|
|
|
address = sys.argv[1]
|
|
|
username = sys.argv[2]
|
|
|
objects = set(sys.argv[3:])
|
|
|
- if "--fast" in objects:
|
|
|
- objects.remove("--fast")
|
|
|
- fast = True
|
|
|
- else:
|
|
|
- fast = False
|
|
|
|
|
|
if objects:
|
|
|
- link(address, username, objects, fast)
|
|
|
+ link(address, username, objects)
|
|
|
else:
|
|
|
print("No files to link defined")
|