primitives_object_visitor.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import string
  2. from primitives_visitor import PrimitivesVisitor
  3. from cached_exception import CachedException
  4. import urllib
  5. import urllib2
  6. import json
  7. class PrimitivesObjectVisitor(PrimitivesVisitor):
  8. def __init__(self, args):
  9. PrimitivesVisitor.__init__(self, args)
  10. self.taskname = args[0]
  11. self.obj_file = args[1]
  12. self.real_file = args[2]
  13. self.address = args[3]
  14. self.object_symbols = {}
  15. with open(self.real_file, 'r') as f:
  16. import hashlib
  17. md5 = hashlib.md5()
  18. md5.update(f.read())
  19. self.hash_file = md5.hexdigest()
  20. # Create task
  21. urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "value": '"%s"' % self.taskname, "taskname": "task_manager"}))).read()
  22. simple_filename = self.real_file.rsplit("/")[-1]
  23. print("[COMPILE] %s" % simple_filename)
  24. def dump(self):
  25. v = PrimitivesVisitor.dump(self)
  26. data = []
  27. # Set up interface
  28. data = [3, "upload", self.obj_file, self.hash_file, False]
  29. # Start uploading the code
  30. data.append(v)
  31. # Upload symbol table
  32. for e, v in self.object_symbols.iteritems():
  33. data.extend([True, e, v])
  34. # Finish the symbol table
  35. data.append(False)
  36. # Wait for kernel to signal that it finished
  37. data.append(2)
  38. urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "taskname": self.taskname}))).read()
  39. v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "taskname": self.taskname}))).read()
  40. v = json.loads(v)
  41. if v == "DONE":
  42. return True
  43. else:
  44. return False
  45. def visit_definition(self, tree):
  46. for a in tree.get_children("ID"):
  47. name = a.get_tail()[0]
  48. self.object_symbols[name] = True
  49. return PrimitivesVisitor.visit_definition(self, tree)
  50. def visit_vardecl(self, tree):
  51. if len(tree.get_tail()) > 2:
  52. for a in tree.get_children("ID"):
  53. name = a.get_tail()[0]
  54. self.object_symbols.setdefault(name, False)
  55. return PrimitivesVisitor.visit_vardecl(self, tree)
  56. else:
  57. return PrimitivesVisitor.visit_vardecl(self, tree)
  58. def visit_funcdecl(self, tree):
  59. for a in tree.get_children("func_name"):
  60. for b in a.get_children("ID"):
  61. name = b.get_tail()[0]
  62. if tree.get_children("func_body") or tree.get_children("ASSIGN"):
  63. self.object_symbols[name] = True
  64. else:
  65. self.object_symbols.setdefault(name, False)
  66. return PrimitivesVisitor.visit_funcdecl(self, tree)