primitives_object_visitor.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import string
  2. from primitives_visitor import PrimitivesVisitor
  3. import urllib
  4. import urllib2
  5. import json
  6. class PrimitivesObjectVisitor(PrimitivesVisitor):
  7. def __init__(self, args):
  8. PrimitivesVisitor.__init__(self, args)
  9. self.username = args[0]
  10. self.obj_file = args[1]
  11. self.real_file = args[2]
  12. self.address = args[3]
  13. self.object_symbols = {}
  14. def flush_data(data):
  15. if data:
  16. urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": self.username}))).read()
  17. return []
  18. with open(self.real_file, 'r') as f:
  19. import hashlib
  20. md5 = hashlib.md5()
  21. md5.update(f.read())
  22. self.hash_file = md5.hexdigest()
  23. # Check if file is already compiled (with same hash) in Modelverse
  24. urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % self.username, "username": "user_manager"}))).read()
  25. flush_data(['3', '"is_defined"', '"%s"' % self.obj_file])
  26. v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
  27. v = json.loads(v)
  28. simple_filename = self.real_file.rsplit("/")[-1]
  29. if v == None:
  30. # Not defined, so recompile
  31. print("[COMPILE] %s" % simple_filename)
  32. else:
  33. # Is defined already, so let's compare hashes
  34. if v != self.hash_file:
  35. print("[COMPILE] %s" % simple_filename)
  36. # Remove in Modelverse and recompile
  37. flush_data(['3', '"remove_obj"', '"%s"' % self.obj_file])
  38. else:
  39. self.visit = lambda i: i
  40. self.dump = lambda: True
  41. print("[CACHED] %s" % simple_filename)
  42. def dump(self):
  43. v = PrimitivesVisitor.dump(self)
  44. data = []
  45. # Set up interface
  46. data.append("3")
  47. # Start uploading the code
  48. data.append('"upload"')
  49. data.append('"%s"' % (self.obj_file))
  50. data.append('"%s"' % (self.hash_file))
  51. data.append('false')
  52. data.append(json.dumps(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. urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": self.username}))).read()
  63. v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
  64. v = json.loads(v)
  65. if v == "DONE":
  66. return True
  67. else:
  68. return False
  69. def visit_definition(self, tree):
  70. for a in tree.get_children("ID"):
  71. name = a.get_tail()[0]
  72. self.object_symbols[name] = True
  73. return PrimitivesVisitor.visit_definition(self, tree)
  74. def visit_vardecl(self, tree):
  75. if len(tree.get_tail()) > 2:
  76. for a in tree.get_children("ID"):
  77. name = a.get_tail()[0]
  78. self.object_symbols.setdefault(name, False)
  79. return PrimitivesVisitor.visit_vardecl(self, tree)
  80. else:
  81. return PrimitivesVisitor.visit_vardecl(self, tree)
  82. def visit_funcdecl(self, tree):
  83. for a in tree.get_children("func_name"):
  84. for b in a.get_children("ID"):
  85. name = b.get_tail()[0]
  86. if tree.get_children("func_body") or tree.get_children("ASSIGN"):
  87. self.object_symbols[name] = True
  88. else:
  89. self.object_symbols.setdefault(name, False)
  90. return PrimitivesVisitor.visit_funcdecl(self, tree)