Kaynağa Gözat

tracing the stack

Simon Van Mierlo 8 yıl önce
ebeveyn
işleme
79f8078842

+ 6 - 2
kernel/modelverse_kernel/main.py

@@ -19,7 +19,7 @@ class ModelverseKernel(object):
         self.generators = {}
         self.allow_compiled = True
         #self.allow_compiled = False
-        self.debug_info = defaultdict(lambda : "(no debug information found)")
+        self.debug_info = defaultdict(lambda: ["None"])
 
     def execute_yields(self, username, operation, params, reply):
         try:
@@ -60,7 +60,7 @@ class ModelverseKernel(object):
                                    ("RV", [self.inst]),
                                   ]
             if self.new_debug is not None:
-                self.debug_info[username], = yield [("RV", [self.new_debug])]
+                self.debug_info[username][-1], = yield [("RV", [self.new_debug])]
 
             if self.phase_v == "finish":
                 gen = self.helper_init(user_root)
@@ -148,6 +148,7 @@ class ModelverseKernel(object):
                                ("DE", [lnk]),
                                ("DN", [user_frame]),
                               ]
+        self.debug_info[self.username].pop()
 
     ########################################
     ### Execute input and output methods ###
@@ -530,6 +531,7 @@ class ModelverseKernel(object):
         value, =            yield [("RD", [inst, "value"])]
 
         if value is None:
+            self.debug_info[self.username].pop()
             prev_frame, =   yield [("RD", [user_frame, "prev"])]
             if prev_frame is None:
                 _, =            yield [("DN", [user_root])]
@@ -557,6 +559,7 @@ class ModelverseKernel(object):
                                   ]
 
     def return_eval(self, user_root):
+        self.debug_info[self.username].pop()
         user_frame, =       yield [("RD", [user_root, "frame"])]
         prev_frame, =       yield [("RD", [user_frame, "prev"])]
         returnvalue, old_returnvalue_link = \
@@ -665,6 +668,7 @@ class ModelverseKernel(object):
                                   ]
 
     def call_call(self, user_root):
+        self.debug_info[self.username].append("None")
         user_frame, =       yield [("RD", [user_root, "frame"])]
         inst, =             yield [("RD", [user_frame, "IP"])]
         param, =            yield [("RD", [inst, "last_param"])]

+ 13 - 3
kernel/mvk_server/classes/executor.xml

@@ -6,7 +6,7 @@
         <body>
             <![CDATA[
             self.mvs = ModelverseState("../../bootstrap/bootstrap.m.gz")
-            self.request_queue = [("", "", "load_primitives", [], None)]
+            self.request_queue = [("", "", "load_primitives", [], None, False)]
             self.mvs.GC = True
             self.mvk = ModelverseKernel(self.mvs.read_root()[0])
             self.first = True
@@ -70,7 +70,17 @@
                         <parameter name="params"/>
                         <parameter name="request_id"/>
                         <script>
-                            self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id))
+                            self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id, True))
+                        </script>
+                    </transition>
+                    <transition event="execute_debug" target=".">
+                        <parameter name="returnpath"/>
+                        <parameter name="username"/>
+                        <parameter name="operation"/>
+                        <parameter name="params"/>
+                        <parameter name="request_id"/>
+                        <script>
+                            self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id, False))
                         </script>
                     </transition>
                 </state>
@@ -88,7 +98,7 @@
                             self.mvk.success = True
                             self.first = True
 
-                            self.returnpath, username, operation, params, self.request_id = self.request_queue.pop(0)
+                            self.returnpath, username, operation, params, self.request_id, self.mvk.allow_compiled = self.request_queue.pop(0)
                             reply = None
                             commands = []
                             while 1:

+ 1 - 1
kernel/mvk_server/classes/user_statechart.xml

@@ -68,7 +68,7 @@
                         <parameter name="source"/>
                         <parameter name="args"/>
                         <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
-                            <parameter expr="json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info})"/>
+                            <parameter expr="json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info[self.username]})"/>
                         </raise>
                     </transition>
                 </state>

+ 17 - 5
kernel/mvk_server/server.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Fri Feb 10 10:24:39 2017
+Date:   Fri Feb 10 11:29:04 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
@@ -1317,7 +1317,7 @@ class UserStatechart(RuntimeClassBase):
     def _running_execution_executing_0_exec(self, parameters):
         source = parameters[0]
         args = parameters[1]
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info})])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent/to_mvi/' + source, Event("HTTP_input", None, [json.dumps({'user': self.username, 'state': 'paused', 'info': self.mvk.debug_info[self.username]})])]))
     
     def _init_0_exec(self, parameters):
         returnpath = parameters[0]
@@ -1423,7 +1423,7 @@ class Executor(RuntimeClassBase):
     
     def user_defined_constructor(self):
         self.mvs = ModelverseState("../../bootstrap/bootstrap.m.gz")
-        self.request_queue = [("", "", "load_primitives", [], None)]
+        self.request_queue = [("", "", "load_primitives", [], None, False)]
         self.mvs.GC = True
         self.mvk = ModelverseKernel(self.mvs.read_root()[0])
         self.first = True
@@ -1516,6 +1516,10 @@ class Executor(RuntimeClassBase):
         _init_queue_queue_0.setAction(self._init_queue_queue_0_exec)
         _init_queue_queue_0.setTrigger(Event("execute", None))
         self.states["/init/queue/queue"].addTransition(_init_queue_queue_0)
+        _init_queue_queue_1 = Transition(self, self.states["/init/queue/queue"], [self.states["/init/queue/queue"]])
+        _init_queue_queue_1.setAction(self._init_queue_queue_1_exec)
+        _init_queue_queue_1.setTrigger(Event("execute_debug", None))
+        self.states["/init/queue/queue"].addTransition(_init_queue_queue_1)
         
         # transition /init/execute/idle
         _init_execute_idle_0 = Transition(self, self.states["/init/execute/idle"], [self.states["/init/execute/execution"]])
@@ -1539,7 +1543,7 @@ class Executor(RuntimeClassBase):
         self.mvk.success = True
         self.first = True
         
-        self.returnpath, username, operation, params, self.request_id = self.request_queue.pop(0)
+        self.returnpath, username, operation, params, self.request_id, self.mvk.allow_compiled = self.request_queue.pop(0)
         reply = None
         commands = []
         while 1:
@@ -1564,7 +1568,15 @@ class Executor(RuntimeClassBase):
         operation = parameters[2]
         params = parameters[3]
         request_id = parameters[4]
-        self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id))
+        self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id, True))
+    
+    def _init_queue_queue_1_exec(self, parameters):
+        returnpath = parameters[0]
+        username = parameters[1]
+        operation = parameters[2]
+        params = parameters[3]
+        request_id = parameters[4]
+        self.request_queue.append((("/" + returnpath) if returnpath is not None else None, username, operation, params, request_id, False))
     
     def _init_execute_idle_0_guard(self, parameters):
         return self.request_queue

+ 1 - 1
scripts/debug_prompt.py

@@ -42,4 +42,4 @@ while 1:
         local_print("Received quit: breaking connection to Modelverse immediately!")
         break
 
-    print (urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": action, "username": username}))).read())
+    print json.loads(urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": action, "username": username}))).read())