|
|
@@ -2,6 +2,7 @@
|
|
|
<relationships>
|
|
|
<association name="parent" class="MvKController" min="1" max="1"/>
|
|
|
</relationships>
|
|
|
+
|
|
|
<constructor>
|
|
|
<parameter name="taskname"/>
|
|
|
<parameter name="mvk" />
|
|
|
@@ -27,21 +28,37 @@
|
|
|
self.big_step_info = None
|
|
|
self.line_step_info = None
|
|
|
self.step_into_info = None
|
|
|
+
|
|
|
+ self.breakpoints = []
|
|
|
+ self.triggered_bp = -1
|
|
|
+
|
|
|
+ self.queue = []
|
|
|
+ self.polling_source = None
|
|
|
]]>
|
|
|
</body>
|
|
|
</constructor>
|
|
|
|
|
|
+ <method name="enqueue">
|
|
|
+ <parameter name="parameters" />
|
|
|
+ <body>
|
|
|
+ <![CDATA[
|
|
|
+ self.queue.append(parameters)
|
|
|
+ ]]>
|
|
|
+ </body>
|
|
|
+ </method>
|
|
|
+
|
|
|
<method name="extract_line_info">
|
|
|
<body>
|
|
|
<![CDATA[
|
|
|
if self.mvk.debug_info[self.taskname][-1] != 'None':
|
|
|
splitted = self.mvk.debug_info[self.taskname][-1].split(':')
|
|
|
self.curr_file = ":".join(splitted[0:-2])[1:]
|
|
|
- self.curr_line = splitted[-2]
|
|
|
+ self.curr_line = int(splitted[-2])
|
|
|
splitted_chars = splitted[-1].split("-")
|
|
|
self.curr_begin_char = splitted_chars[0]
|
|
|
self.curr_end_char = splitted_chars[1]
|
|
|
- print 'curr_line = %s %s %s %s' % (self.curr_file, self.curr_line, self.curr_begin_char, self.curr_end_char)
|
|
|
+ # print 'curr_line = %s %s %s %s' % (self.curr_file, self.curr_line, self.curr_begin_char, self.curr_end_char)
|
|
|
+ print (self.curr_file, self.curr_line)
|
|
|
]]>
|
|
|
</body>
|
|
|
</method>
|
|
|
@@ -49,6 +66,7 @@
|
|
|
<method name="add_source_code">
|
|
|
<parameter name="stack" />
|
|
|
<body>
|
|
|
+ <![CDATA[
|
|
|
ret_value = []
|
|
|
for line in stack:
|
|
|
splitted = line.split(':')
|
|
|
@@ -61,6 +79,28 @@
|
|
|
except IOError:
|
|
|
ret_value.append((line, ""))
|
|
|
return ret_value
|
|
|
+ ]]>
|
|
|
+ </body>
|
|
|
+ </method>
|
|
|
+
|
|
|
+ <method name="breakpoint_triggers">
|
|
|
+ <body>
|
|
|
+ <![CDATA[
|
|
|
+ # Now that it includes breakpoints, results are to be interpretted as follows:
|
|
|
+ # -1 --> continue simulation
|
|
|
+ # other --> breakpoint triggered
|
|
|
+ for bp in self.breakpoints:
|
|
|
+ if not bp.enabled:
|
|
|
+ continue
|
|
|
+ if self.curr_file == bp.file_name and self.curr_line == bp.line_number:
|
|
|
+ self.triggered_bp = bp.id
|
|
|
+ if bp.disable_on_trigger:
|
|
|
+ bp.enabled = False
|
|
|
+ return bp.id
|
|
|
+ else:
|
|
|
+ continue
|
|
|
+ return -1
|
|
|
+ ]]>
|
|
|
</body>
|
|
|
</method>
|
|
|
|
|
|
@@ -191,6 +231,18 @@
|
|
|
<transition after="1.0" target="../try_execute"/>
|
|
|
</state>
|
|
|
</state>
|
|
|
+
|
|
|
+ <state id="polling_listener" initial="listening">
|
|
|
+ <state id="listening">
|
|
|
+ <transition target="." event="poll_messages">
|
|
|
+ <parameter name="source" />
|
|
|
+ <parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.polling_source = source
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
|
|
|
<history id="running_normal_history" type="deep" />
|
|
|
</parallel>
|
|
|
@@ -198,16 +250,22 @@
|
|
|
<transition target="../running_debug" event="attach_debugger">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'state': 'debugger_attached', 'result': 'success'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'state': 'debugger_attached', 'result': 'success'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
|
|
|
<transition target="running/running_normal_history" event="detach_debugger">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
</state>
|
|
|
@@ -344,36 +402,51 @@
|
|
|
<transition target="execution_state_history" event="pause">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<transition target="execution_state_history" event="resume">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<transition target="execution_state_history" event="big_step">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<transition target="execution_state_history" event="line_step">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<transition target="execution_state_history" event="step_into">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<history id="execution_state_history" type="deep" />
|
|
|
@@ -383,42 +456,45 @@
|
|
|
<transition event="pause" target="../../paused">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
+ <transition cond="self.breakpoint_triggers() != -1" target="../../paused">
|
|
|
+ <script>
|
|
|
+ print 'breakpoint %s triggers!' % self.triggered_bp
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'breakpoint triggered', 'state': 'paused', 'triggered_bp': self.triggered_bp, 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
</state>
|
|
|
<state id="big_step">
|
|
|
<transition event="big_step_done" target="../../paused">
|
|
|
- <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.big_step_source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname]), 'instruction': self.mvk.inst_v['value']})"/>
|
|
|
- </raise>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname]), 'instruction': self.mvk.inst_v['value']})
|
|
|
+ </script>
|
|
|
</transition>
|
|
|
</state>
|
|
|
<state id="small_step">
|
|
|
<transition event="small_step_done" target="../../paused">
|
|
|
- <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.small_step_source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname]), 'instruction': self.mvk.inst_v['value'], 'phase': self.mvk.phase_v})"/>
|
|
|
- </raise>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname]), 'instruction': self.mvk.inst_v['value'], 'phase': self.mvk.phase_v})
|
|
|
+ </script>
|
|
|
</transition>
|
|
|
</state>
|
|
|
<state id="step_into">
|
|
|
<transition event="step_into_done" target="../../paused">
|
|
|
- <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.step_into_info['source']">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})"/>
|
|
|
- </raise>
|
|
|
<script>
|
|
|
- self.step_into_info = None
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
|
|
|
</script>
|
|
|
</transition>
|
|
|
</state>
|
|
|
<state id="line_step">
|
|
|
<transition event="line_step_done" target="../../paused">
|
|
|
- <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.line_step_info['source']">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})"/>
|
|
|
- </raise>
|
|
|
<script>
|
|
|
- self.line_step_info = None
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
|
|
|
</script>
|
|
|
</transition>
|
|
|
</state>
|
|
|
@@ -427,43 +503,50 @@
|
|
|
<transition target="../running/continuous" event="resume">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'running'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'state': 'running'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<transition target="../running/big_step" event="big_step">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
- <script>
|
|
|
- self.big_step_source = source
|
|
|
- </script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
</transition>
|
|
|
<transition target="../running/small_step" event="small_step">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
- <script>
|
|
|
- self.small_step_source = source
|
|
|
- </script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
</transition>
|
|
|
<transition target="../running/step_into" event="step_into">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
<script>
|
|
|
- self.step_into_info = {'source': source,
|
|
|
- 'stack_len': len(self.mvk.debug_info[self.taskname]),
|
|
|
+ self.step_into_info = {'stack_len': len(self.mvk.debug_info[self.taskname]),
|
|
|
'file': self.curr_file,
|
|
|
'line': self.curr_line}
|
|
|
</script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
</transition>
|
|
|
<transition target="../running/line_step" event="line_step">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
<script>
|
|
|
- self.line_step_info = {'source': source,
|
|
|
- 'stack_len': len(self.mvk.debug_info[self.taskname]),
|
|
|
+ self.line_step_info = {'stack_len': len(self.mvk.debug_info[self.taskname]),
|
|
|
'file': self.curr_file,
|
|
|
'line': self.curr_line}
|
|
|
</script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
</transition>
|
|
|
</state>
|
|
|
<state id="stopped" />
|
|
|
@@ -493,16 +576,22 @@
|
|
|
<parameter name="returnvalue"/>
|
|
|
<parameter name="success"/>
|
|
|
<parameter name="request_id"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'success', 'symbols': returnvalue})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.symbol_source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'success', 'symbols': returnvalue})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
<transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../listening">
|
|
|
<parameter name="returnvalue"/>
|
|
|
<parameter name="success"/>
|
|
|
<parameter name="request_id"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'failure'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.symbol_source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'failure'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
</state>
|
|
|
@@ -541,7 +630,7 @@
|
|
|
</state>
|
|
|
</state>
|
|
|
|
|
|
- <state id="get_output_queue">
|
|
|
+ <state id="get_output_queue" initial="waiting">
|
|
|
<state id="waiting">
|
|
|
<transition event="get_output" target=".">
|
|
|
<parameter name="source"/>
|
|
|
@@ -593,6 +682,89 @@
|
|
|
<transition after="1.0" target="../try_execute"/>
|
|
|
</state>
|
|
|
</state>
|
|
|
+
|
|
|
+ <state id="breakpoint_manager" initial="listening">
|
|
|
+ <state id="listening">
|
|
|
+ <transition event="add_breakpoint" target=".">
|
|
|
+ <parameter name="source"/>
|
|
|
+ <parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ if not 'file_name' in args or args['file_name'] is None:
|
|
|
+ args['file_name'] = self.curr_file
|
|
|
+ if not 'line_number' in args or args['line_number'] is None:
|
|
|
+ args['line_number'] = self.curr_line
|
|
|
+ self.breakpoints.append(Breakpoint(args['breakpoint_id'], args['file_name'], args['line_number'], args['enabled'], args['disable_on_trigger']))
|
|
|
+ print 'adding breakpoint %s' % args
|
|
|
+ self.breakpoint_source = source
|
|
|
+ self.enqueue({'task': self.taskname, 'id': args['breakpoint_id'], 'result': 'breakpoint added'})
|
|
|
+ </script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ <transition event="del_breakpoint" target=".">
|
|
|
+ <parameter name="source"/>
|
|
|
+ <parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.breakpoints = [breakpoint for breakpoint in self.breakpoints if breakpoint.id != args['del_breakpoint_id']]
|
|
|
+ self.enqueue({'task': self.taskname, 'id': args['breakpoint_id'], 'result': 'breakpoint deleted'})
|
|
|
+ </script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ <transition event="toggle_breakpoint" target=".">
|
|
|
+ <parameter name="source"/>
|
|
|
+ <parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ for breakpoint in self.breakpoints:
|
|
|
+ if breakpoint.id == args['breakpoint_id']:
|
|
|
+ breakpoint.enabled = args['enabled']
|
|
|
+ break
|
|
|
+ self.enqueue({'task': self.taskname, 'id': args['breakpoint_id'], 'result': 'breakpoint toggled'})
|
|
|
+ </script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ <transition event="list_breakpoints" target=".">
|
|
|
+ <parameter name="source"/>
|
|
|
+ <parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'breakpoints listed', 'breakpoints': [bp.id for bp in self.breakpoints]})
|
|
|
+ </script>
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="polling_listener" initial="listening">
|
|
|
+ <state id="listening">
|
|
|
+ <transition target="." event="poll_messages">
|
|
|
+ <parameter name="source" />
|
|
|
+ <parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.polling_source = source
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="polling_sender" initial="sending">
|
|
|
+ <state id="sending">
|
|
|
+ <transition target="." cond="self.queue and (self.polling_source is not None)">
|
|
|
+ <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.polling_source">
|
|
|
+ <parameter expr="json.dumps(self.queue)"/>
|
|
|
+ </raise>
|
|
|
+ <script>
|
|
|
+ self.polling_source = None
|
|
|
+ self.queue = []
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
|
|
|
<history id="running_debug_history" type="deep" />
|
|
|
</parallel>
|
|
|
@@ -600,16 +772,22 @@
|
|
|
<transition target="../running_normal" event="detach_debugger">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'state': 'debugger_detached', 'result': 'success'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'state': 'debugger_detached', 'result': 'success'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
|
|
|
<transition target="running/running_debug_history" event="attach_debugger">
|
|
|
<parameter name="source"/>
|
|
|
<parameter name="args"/>
|
|
|
+ <script>
|
|
|
+ self.enqueue({'task': self.taskname, 'result': 'not allowed'})
|
|
|
+ </script>
|
|
|
<raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
|
|
|
- <parameter expr="json.dumps({'task': self.taskname, 'result': 'not allowed'})"/>
|
|
|
+ <parameter expr="json.dumps(True)"/>
|
|
|
</raise>
|
|
|
</transition>
|
|
|
</state>
|