|
@@ -2,6 +2,7 @@ from constructors_visitor import ConstructorsVisitor
|
|
|
|
|
|
import urllib
|
|
|
import urllib2
|
|
|
+import json
|
|
|
|
|
|
timeout = 100
|
|
|
|
|
@@ -23,13 +24,16 @@ class ConstructorsObjectVisitor(ConstructorsVisitor):
|
|
|
self.hash_file = md5.hexdigest()
|
|
|
|
|
|
# Check if file is already compiled (with same hash) in Modelverse
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % self.username, "username": "user_manager"}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '3', "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"is_defined"', "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % self.obj_file, "username": self.username}))).read()
|
|
|
+ urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "value": '"%s"' % self.username, "username": "user_manager"}))).read()
|
|
|
+
|
|
|
+ def flush_data(data):
|
|
|
+ if data:
|
|
|
+ urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": self.username})), timeout=timeout).read()
|
|
|
+ return []
|
|
|
+
|
|
|
+ flush_data(['3', '"is_defined"', '"%s"' % self.obj_file])
|
|
|
|
|
|
v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
|
|
|
- v = v.split("=", 2)[2]
|
|
|
simple_filename = self.real_file.rsplit("/")[-1]
|
|
|
if v == "None":
|
|
|
# Not defined, so recompile
|
|
@@ -40,9 +44,7 @@ class ConstructorsObjectVisitor(ConstructorsVisitor):
|
|
|
print("[COMPILE] %s" % simple_filename)
|
|
|
|
|
|
# Remove in Modelverse and recompile
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '3', "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"remove_obj"', "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % self.obj_file, "username": self.username}))).read()
|
|
|
+ flush_data(['3', '"remove_obj"', '"%s"' % self.obj_file])
|
|
|
else:
|
|
|
self.visit = lambda i: i
|
|
|
self.dump = lambda: True
|
|
@@ -51,53 +53,30 @@ class ConstructorsObjectVisitor(ConstructorsVisitor):
|
|
|
def dump(self):
|
|
|
v = ConstructorsVisitor.dump(self)
|
|
|
|
|
|
- import json
|
|
|
- # Set up interface
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '3', "username": self.username}))).read()
|
|
|
-
|
|
|
- # Start uploading the code
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"upload"', "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % self.obj_file, "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % self.hash_file, "username": self.username}))).read()
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": 'true', "username": self.username}))).read() # Use new interface
|
|
|
|
|
|
def flush_data(data):
|
|
|
if data:
|
|
|
urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": self.username})), timeout=timeout).read()
|
|
|
return []
|
|
|
|
|
|
- var_list = {}
|
|
|
- data = []
|
|
|
- for p in v:
|
|
|
- if isinstance(p, int):
|
|
|
- if p not in var_list:
|
|
|
- data = flush_data(data)
|
|
|
- val = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username})), timeout=timeout).read()
|
|
|
- val = val.split("=", 2)[1].split("&", 1)[0]
|
|
|
- var_list[p] = val
|
|
|
- continue
|
|
|
- else:
|
|
|
- val = var_list[p]
|
|
|
- t = "R"
|
|
|
- else:
|
|
|
- val = p
|
|
|
- t = "V"
|
|
|
- data.append([t, val])
|
|
|
- data = flush_data(data)
|
|
|
+ # Set up interface
|
|
|
+ flush_data(['3', '"upload"', '"%s"' % self.obj_file, '"%s"' % self.hash_file, 'true'])
|
|
|
+ flush_data(v)
|
|
|
|
|
|
# Upload symbol table
|
|
|
data = []
|
|
|
for e, v in self.object_symbols.iteritems():
|
|
|
- data.append(["V", "true"])
|
|
|
- data.append(["V", '"%s"' % e])
|
|
|
- data.append(["V", "true" if v else "false"])
|
|
|
+ data.append("true")
|
|
|
+ data.append('"%s"' % e)
|
|
|
+ data.append("true" if v else "false")
|
|
|
+
|
|
|
urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": self.username}))).read()
|
|
|
|
|
|
# Finish the symbol table
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": 'false', "username": self.username}))).read()
|
|
|
+ urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "value": 'false', "username": self.username}))).read()
|
|
|
|
|
|
# Wait for kernel to signal that it finished
|
|
|
- urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '2', "username": self.username}))).read()
|
|
|
+ urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "value": '2', "username": self.username}))).read()
|
|
|
v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
|
|
|
v = v.split("=", 2)[2]
|
|
|
if v == "DONE":
|