constructors_object_visitor.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from constructors_visitor import ConstructorsVisitor
  2. import urllib
  3. import urllib2
  4. timeout = 100
  5. class ConstructorsObjectVisitor(ConstructorsVisitor):
  6. def __init__(self, args):
  7. ConstructorsVisitor.__init__(self, args)
  8. self.username = args[0]
  9. self.obj_file = args[1]
  10. self.real_file = args[2]
  11. self.address = args[3]
  12. self.object_symbols = {}
  13. with open(self.real_file, 'r') as f:
  14. import hashlib
  15. md5 = hashlib.md5()
  16. md5.update(f.read())
  17. self.hash_file = md5.hexdigest()
  18. data = ['"%s"' % self.username,
  19. '3',
  20. '"is_defined"',
  21. '"%s"' % self.obj_file,
  22. 1,
  23. ]
  24. v = send_to_mv(self.address, data)[1]
  25. simple_filename = self.real_file.rsplit("/")[-1]
  26. if v == "None":
  27. # Not defined, so recompile
  28. print("[COMPILE] %s" % simple_filename)
  29. else:
  30. # Is defined already, so let's compare hashes
  31. if v != self.hash_file:
  32. print("[COMPILE] %s" % simple_filename)
  33. # Remove in Modelverse and recompile
  34. data = ['3',
  35. '"remove_obj"',
  36. '"%s"' % self.obj_file
  37. ]
  38. send_to_mv(self.address, data)
  39. else:
  40. self.visit = lambda i: i
  41. self.dump = lambda: True
  42. print("[CACHED] %s" % simple_filename)
  43. def dump(self):
  44. v = ConstructorsVisitor.dump(self)
  45. import json
  46. # Set up interface
  47. data = ['3',
  48. '"upload"',
  49. '"%s"' % self.obj_file,
  50. '"%s"' % self.hash_file,
  51. 'true',
  52. ] + v
  53. # Upload symbol table
  54. for e, v in self.object_symbols.iteritems():
  55. data.append('true')
  56. data.append('"%s"' % e)
  57. data.append('true' if v else 'false')
  58. # Finish the symbol table
  59. data.append('false')
  60. # Wait for kernel to signal that it finished
  61. data.append('2')
  62. #TODO move this actual sending elsewhere
  63. send_to_mv(self.address, data)
  64. v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
  65. v = v.split("=", 2)[2]
  66. if v == "DONE":
  67. return True
  68. else:
  69. return False
  70. def visit_definition(self, tree):
  71. for a in tree.get_children("ID"):
  72. name = a.get_tail()[0]
  73. self.object_symbols[name] = True
  74. return ConstructorsVisitor.visit_definition(self, tree)
  75. def visit_vardecl(self, tree):
  76. if len(tree.get_tail()) > 2:
  77. for a in tree.get_children("ID"):
  78. name = a.get_tail()[0]
  79. self.object_symbols.setdefault(name, False)
  80. return ConstructorsVisitor.visit_vardecl(self, tree)
  81. else:
  82. return ConstructorsVisitor.visit_vardecl(self, tree)
  83. def visit_funcdecl(self, tree):
  84. for a in tree.get_children("func_name"):
  85. for b in a.get_children("ID"):
  86. name = b.get_tail()[0]
  87. if tree.get_children("func_body") or tree.get_children("ASSIGN"):
  88. self.object_symbols[name] = True
  89. else:
  90. self.object_symbols.setdefault(name, False)
  91. return ConstructorsVisitor.visit_funcdecl(self, tree)