123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- from constructors_visitor import ConstructorsVisitor
- import urllib
- import urllib2
- timeout = 100
- class ConstructorsObjectVisitor(ConstructorsVisitor):
- def __init__(self, args):
- ConstructorsVisitor.__init__(self, args)
- self.username = args[0]
- self.obj_file = args[1]
- self.real_file = args[2]
- self.address = args[3]
- self.object_symbols = {}
- with open(self.real_file, 'r') as f:
- import hashlib
- md5 = hashlib.md5()
- md5.update(f.read())
- self.hash_file = md5.hexdigest()
- data = ['"%s"' % self.username,
- '3',
- '"is_defined"',
- '"%s"' % self.obj_file,
- 1,
- ]
- v = send_to_mv(self.address, data)[1]
- simple_filename = self.real_file.rsplit("/")[-1]
- if v == "None":
- # Not defined, so recompile
- print("[COMPILE] %s" % simple_filename)
- else:
- # Is defined already, so let's compare hashes
- if v != self.hash_file:
- print("[COMPILE] %s" % simple_filename)
- # Remove in Modelverse and recompile
- data = ['3',
- '"remove_obj"',
- '"%s"' % self.obj_file
- ]
- send_to_mv(self.address, data)
- else:
- self.visit = lambda i: i
- self.dump = lambda: True
- print("[CACHED] %s" % simple_filename)
- def dump(self):
- v = ConstructorsVisitor.dump(self)
- import json
- # Set up interface
- data = ['3',
- '"upload"',
- '"%s"' % self.obj_file,
- '"%s"' % self.hash_file,
- 'true',
- ] + v
- # Upload symbol table
- for e, v in self.object_symbols.iteritems():
- data.append('true')
- data.append('"%s"' % e)
- data.append('true' if v else 'false')
- # Finish the symbol table
- data.append('false')
- # Wait for kernel to signal that it finished
- data.append('2')
- #TODO move this actual sending elsewhere
- send_to_mv(self.address, data)
- v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
- v = v.split("=", 2)[2]
- if v == "DONE":
- return True
- else:
- return False
- def visit_definition(self, tree):
- for a in tree.get_children("ID"):
- name = a.get_tail()[0]
- self.object_symbols[name] = True
- return ConstructorsVisitor.visit_definition(self, tree)
- def visit_vardecl(self, tree):
- if len(tree.get_tail()) > 2:
- for a in tree.get_children("ID"):
- name = a.get_tail()[0]
- self.object_symbols.setdefault(name, False)
- return ConstructorsVisitor.visit_vardecl(self, tree)
- else:
- return ConstructorsVisitor.visit_vardecl(self, tree)
- def visit_funcdecl(self, tree):
- for a in tree.get_children("func_name"):
- for b in a.get_children("ID"):
- name = b.get_tail()[0]
- if tree.get_children("func_body") or tree.get_children("ASSIGN"):
- self.object_symbols[name] = True
- else:
- self.object_symbols.setdefault(name, False)
- return ConstructorsVisitor.visit_funcdecl(self, tree)
|