task_statechart.xml 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  1. <class name="UserStatechart">
  2. <relationships>
  3. <association name="parent" class="MvKController" min="1" max="1"/>
  4. </relationships>
  5. <constructor>
  6. <parameter name="taskname"/>
  7. <parameter name="mvk" />
  8. <body>
  9. <![CDATA[
  10. self.taskname = taskname
  11. self.mvk = mvk
  12. self.output_queue = []
  13. self.source_execution = None
  14. self.request_id = 0
  15. self.outstanding_execution = None
  16. self.outstanding_input = {}
  17. self.outstanding_output = None
  18. self.curr_file = None
  19. self.curr_line = None
  20. self.curr_begin_char = None
  21. self.curr_end_char = None
  22. self.curr_phase_v = None
  23. self.big_step_info = None
  24. self.line_step_info = None
  25. self.step_into_info = None
  26. self.breakpoints = []
  27. self.triggered_bp = -1
  28. self.queue = []
  29. self.polling_source = None
  30. ]]>
  31. </body>
  32. </constructor>
  33. <method name="enqueue">
  34. <parameter name="parameters" />
  35. <body>
  36. <![CDATA[
  37. self.queue.append(parameters)
  38. ]]>
  39. </body>
  40. </method>
  41. <method name="extract_line_info">
  42. <body>
  43. <![CDATA[
  44. if self.mvk.debug_info[self.taskname][-1] != 'None':
  45. splitted = self.mvk.debug_info[self.taskname][-1].split(':')
  46. self.curr_file = ":".join(splitted[0:-2])[1:]
  47. self.curr_line = int(splitted[-2])
  48. splitted_chars = splitted[-1].split("-")
  49. self.curr_begin_char = splitted_chars[0]
  50. self.curr_end_char = splitted_chars[1]
  51. # print 'curr_line = %s %s %s %s' % (self.curr_file, self.curr_line, self.curr_begin_char, self.curr_end_char)
  52. print (self.curr_file, self.curr_line)
  53. ]]>
  54. </body>
  55. </method>
  56. <method name="add_source_code">
  57. <parameter name="stack" />
  58. <body>
  59. <![CDATA[
  60. ret_value = []
  61. for line in stack:
  62. splitted = line.split(':')
  63. filename = ":".join(splitted[0:-2])[1:]
  64. file_line = int(splitted[-2]) - 1
  65. try:
  66. with open(filename, 'r') as f:
  67. lines = f.readlines()
  68. ret_value.append((line, lines[file_line].strip()))
  69. except IOError:
  70. ret_value.append((line, ""))
  71. return ret_value
  72. ]]>
  73. </body>
  74. </method>
  75. <method name="breakpoint_triggers">
  76. <body>
  77. <![CDATA[
  78. # Now that it includes breakpoints, results are to be interpretted as follows:
  79. # -1 --> continue simulation
  80. # other --> breakpoint triggered
  81. for bp in self.breakpoints:
  82. if not bp.enabled:
  83. continue
  84. if self.curr_file == bp.file_name and self.curr_line == bp.line_number:
  85. self.triggered_bp = bp.id
  86. if bp.disable_on_trigger:
  87. bp.enabled = False
  88. return bp.id
  89. else:
  90. continue
  91. return -1
  92. ]]>
  93. </body>
  94. </method>
  95. <scxml initial="init" priority="source_child">
  96. <state id="init">
  97. <transition event="set_returnpath" target="../running_normal">
  98. <parameter name="returnpath"/>
  99. <script>
  100. self.returnpath = returnpath
  101. </script>
  102. </transition>
  103. </state>
  104. <state id="running_normal">
  105. <onentry>
  106. <script>
  107. self.mvk.allow_compiled = True
  108. </script>
  109. </onentry>
  110. <parallel id="running">
  111. <state id="execution" initial="executing">
  112. <state id="executing" initial="executing">
  113. <state id="executing">
  114. <onentry>
  115. <raise event="execute" scope="narrow" target="'parent/executor'">
  116. <parameter expr="self.returnpath"/>
  117. <parameter expr="self.taskname"/>
  118. <parameter expr="'execute_rule'"/>
  119. <parameter expr="[]"/>
  120. <parameter expr="self.request_id"/>
  121. </raise>
  122. <script>
  123. self.outstanding_execution = self.request_id
  124. self.request_id += 1
  125. </script>
  126. </onentry>
  127. <transition event="executed" cond="success and self.outstanding_execution == request_id" target=".">
  128. <parameter name="returnvalue"/>
  129. <parameter name="success"/>
  130. <parameter name="request_id"/>
  131. </transition>
  132. <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../timeout">
  133. <parameter name="returnvalue"/>
  134. <parameter name="success"/>
  135. <parameter name="request_id"/>
  136. </transition>
  137. </state>
  138. <state id="timeout">
  139. <transition after="1.0" target="../executing"/>
  140. <transition event="set_input_done" target="../executing"/>
  141. </state>
  142. </state>
  143. </state>
  144. <state id="set_input" initial="fetch">
  145. <state id="fetch">
  146. <transition event="set_input" target=".">
  147. <parameter name="source"/>
  148. <parameter name="args"/>
  149. <raise event="execute" scope="narrow" target="'parent/executor'">
  150. <parameter expr="self.returnpath"/>
  151. <parameter expr="self.taskname"/>
  152. <parameter expr="'set_input'"/>
  153. <parameter expr="args"/>
  154. <parameter expr="self.request_id"/>
  155. </raise>
  156. <script>
  157. if source is not None:
  158. self.outstanding_input[self.request_id] = source
  159. self.request_id += 1
  160. </script>
  161. </transition>
  162. <transition event="executed" cond="request_id in self.outstanding_input" target=".">
  163. <parameter name="returnvalue"/>
  164. <parameter name="success"/>
  165. <parameter name="request_id"/>
  166. <script>
  167. source = self.outstanding_input.pop(request_id)
  168. </script>
  169. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  170. <parameter expr="json.dumps(returnvalue)"/>
  171. </raise>
  172. <raise event="set_input_done"/>
  173. </transition>
  174. </state>
  175. </state>
  176. <state id="get_output_queue">
  177. <state id="waiting">
  178. <transition event="get_output" target=".">
  179. <parameter name="source"/>
  180. <parameter name="args"/>
  181. <script>
  182. self.output_queue.append(source)
  183. </script>
  184. </transition>
  185. </state>
  186. </state>
  187. <state id="get_output" initial="try_execute">
  188. <state id="try_execute">
  189. <transition cond="self.outstanding_output is None and self.output_queue" target=".">
  190. <raise event="execute" scope="narrow" target="'parent/executor'">
  191. <parameter expr="self.returnpath"/>
  192. <parameter expr="self.taskname"/>
  193. <parameter expr="'get_output'"/>
  194. <parameter expr="[]"/>
  195. <parameter expr="self.request_id"/>
  196. </raise>
  197. <script>
  198. self.outstanding_output = self.request_id
  199. self.request_id += 1
  200. </script>
  201. </transition>
  202. <transition event="executed" cond="success and request_id == self.outstanding_output" target=".">
  203. <parameter name="returnvalue"/>
  204. <parameter name="success"/>
  205. <parameter name="request_id"/>
  206. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.output_queue.pop(0)">
  207. <parameter expr="json.dumps(returnvalue)"/>
  208. </raise>
  209. <script>
  210. self.outstanding_output = None
  211. </script>
  212. </transition>
  213. <transition event="executed" cond="not success and request_id == self.outstanding_output" target="../waiting">
  214. <parameter name="returnvalue"/>
  215. <parameter name="success"/>
  216. <parameter name="request_id"/>
  217. <script>
  218. self.outstanding_output = None
  219. </script>
  220. </transition>
  221. </state>
  222. <state id="waiting">
  223. <transition after="1.0" target="../try_execute"/>
  224. </state>
  225. </state>
  226. <state id="polling_listener" initial="listening">
  227. <state id="listening">
  228. <transition target="." event="poll_messages">
  229. <parameter name="source" />
  230. <parameter name="args"/>
  231. <script>
  232. self.polling_source = source
  233. </script>
  234. </transition>
  235. </state>
  236. </state>
  237. <history id="running_normal_history" type="deep" />
  238. </parallel>
  239. <transition target="../running_debug" event="attach_debugger">
  240. <parameter name="source"/>
  241. <parameter name="args"/>
  242. <script>
  243. self.enqueue({'task': self.taskname, 'state': 'debugger_attached', 'result': 'success'})
  244. </script>
  245. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  246. <parameter expr="json.dumps(True)"/>
  247. </raise>
  248. </transition>
  249. <transition target="running/running_normal_history" event="detach_debugger">
  250. <parameter name="source"/>
  251. <parameter name="args"/>
  252. <script>
  253. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  254. </script>
  255. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  256. <parameter expr="json.dumps(True)"/>
  257. </raise>
  258. </transition>
  259. </state>
  260. <state id="running_debug" initial="reading_debug_info">
  261. <onentry>
  262. <script>
  263. self.mvk.allow_compiled = False
  264. </script>
  265. </onentry>
  266. <state id="reading_debug_info">
  267. <onentry>
  268. <raise event="execute" scope="narrow" target="'parent/executor'">
  269. <parameter expr="self.returnpath"/>
  270. <parameter expr="self.taskname"/>
  271. <parameter expr="'read_debug_info'"/>
  272. <parameter expr="[]"/>
  273. <parameter expr="self.request_id"/>
  274. </raise>
  275. <script>
  276. self.outstanding_execution = self.request_id
  277. self.request_id += 1
  278. </script>
  279. </onentry>
  280. <transition event="executed" cond="success and self.outstanding_execution == request_id" target="../running">
  281. <parameter name="returnvalue"/>
  282. <parameter name="success"/>
  283. <parameter name="request_id"/>
  284. <script>
  285. self.extract_line_info()
  286. </script>
  287. </transition>
  288. <transition event="executed" cond="not success and self.outstanding_execution == request_id" target=".">
  289. <parameter name="returnvalue"/>
  290. <parameter name="success"/>
  291. <parameter name="request_id"/>
  292. </transition>
  293. </state>
  294. <parallel id="running">
  295. <state id="execution_flow" initial="check_termination">
  296. <state id="check_termination">
  297. <transition cond="INSTATE('../../execution_state/running')" target="../stepping" />
  298. </state>
  299. <state id="stepping">
  300. <onentry>
  301. <raise event="execute_debug" scope="narrow" target="'parent/executor'">
  302. <parameter expr="self.returnpath"/>
  303. <parameter expr="self.taskname"/>
  304. <parameter expr="'execute_rule'"/>
  305. <parameter expr="[]"/>
  306. <parameter expr="self.request_id"/>
  307. </raise>
  308. <script>
  309. self.outstanding_execution = self.request_id
  310. self.request_id += 1
  311. </script>
  312. </onentry>
  313. <transition event="executed" cond="success and self.outstanding_execution == request_id" target="../reading_debug_info">
  314. <parameter name="returnvalue"/>
  315. <parameter name="success"/>
  316. <parameter name="request_id"/>
  317. </transition>
  318. <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../timeout">
  319. <parameter name="returnvalue"/>
  320. <parameter name="success"/>
  321. <parameter name="request_id"/>
  322. </transition>
  323. </state>
  324. <state id="reading_debug_info" initial="reading">
  325. <state id="reading">
  326. <onentry>
  327. <raise event="execute" scope="narrow" target="'parent/executor'">
  328. <parameter expr="self.returnpath"/>
  329. <parameter expr="self.taskname"/>
  330. <parameter expr="'read_debug_info'"/>
  331. <parameter expr="[]"/>
  332. <parameter expr="self.request_id"/>
  333. </raise>
  334. <script>
  335. self.outstanding_execution = self.request_id
  336. self.request_id += 1
  337. </script>
  338. </onentry>
  339. <transition event="executed" cond="success and self.outstanding_execution == request_id" target="../checking_line_step">
  340. <parameter name="returnvalue"/>
  341. <parameter name="success"/>
  342. <parameter name="request_id"/>
  343. <script>
  344. if returnvalue:
  345. if 'debug_info' in returnvalue:
  346. self.mvk.debug_info[self.taskname] = returnvalue['debug_info']
  347. self.extract_line_info()
  348. if 'phase_v' in returnvalue:
  349. self.curr_phase_v = returnvalue['phase_v']
  350. </script>
  351. </transition>
  352. <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../timeout">
  353. <parameter name="returnvalue"/>
  354. <parameter name="success"/>
  355. <parameter name="request_id"/>
  356. </transition>
  357. </state>
  358. <state id="checking_line_step">
  359. <transition target="../checking_step_into" cond="self.line_step_info and (len(self.mvk.debug_info[self.taskname]) &lt; self.line_step_info['stack_len'] or (len(self.mvk.debug_info[self.taskname]) == self.line_step_info['stack_len'] and (self.curr_file != self.line_step_info['file'] or self.curr_line != self.line_step_info['line'])))">
  360. <raise event="line_step_done" />
  361. </transition>
  362. <transition target="../checking_step_into" cond="not self.line_step_info or len(self.mvk.debug_info[self.taskname]) > self.line_step_info['stack_len'] or (self.curr_file == self.line_step_info['file'] and self.curr_line == self.line_step_info['line'])" />
  363. </state>
  364. <state id="checking_step_into">
  365. <transition target="../checking_big_step" cond="self.step_into_info and (self.curr_file != self.step_into_info['file'] or self.curr_line != self.step_into_info['line'])">
  366. <raise event="step_into_done" />
  367. </transition>
  368. <transition target="../checking_big_step" cond="not self.step_into_info or (self.curr_file == self.step_into_info['file'] and self.curr_line == self.step_into_info['line'])" />
  369. </state>
  370. <state id="checking_big_step">
  371. <transition target="../checking_small_step" cond="self.curr_phase_v == 'finish'">
  372. <raise event="big_step_done" />
  373. </transition>
  374. <transition target="../checking_small_step" cond="self.curr_phase_v != 'finish'" />
  375. </state>
  376. <state id="checking_small_step">
  377. <onentry>
  378. <raise event="small_step_done" />
  379. </onentry>
  380. <transition target="../../check_termination" after="self.sccd_yield()" />
  381. </state>
  382. <state id="timeout">
  383. <transition after="1.0" target=".."/>
  384. <transition event="set_input_done" target=".."/>
  385. </state>
  386. </state>
  387. <state id="timeout">
  388. <transition after="1.0" target="../check_termination"/>
  389. <transition event="set_input_done" target="../check_termination"/>
  390. </state>
  391. </state>
  392. <state id="execution_state" initial="running">
  393. <transition target="execution_state_history" event="pause">
  394. <parameter name="source"/>
  395. <parameter name="args"/>
  396. <script>
  397. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  398. </script>
  399. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  400. <parameter expr="json.dumps(True)"/>
  401. </raise>
  402. </transition>
  403. <transition target="execution_state_history" event="resume">
  404. <parameter name="source"/>
  405. <parameter name="args"/>
  406. <script>
  407. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  408. </script>
  409. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  410. <parameter expr="json.dumps(True)"/>
  411. </raise>
  412. </transition>
  413. <transition target="execution_state_history" event="big_step">
  414. <parameter name="source"/>
  415. <parameter name="args"/>
  416. <script>
  417. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  418. </script>
  419. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  420. <parameter expr="json.dumps(True)"/>
  421. </raise>
  422. </transition>
  423. <transition target="execution_state_history" event="line_step">
  424. <parameter name="source"/>
  425. <parameter name="args"/>
  426. <script>
  427. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  428. </script>
  429. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  430. <parameter expr="json.dumps(True)"/>
  431. </raise>
  432. </transition>
  433. <transition target="execution_state_history" event="step_into">
  434. <parameter name="source"/>
  435. <parameter name="args"/>
  436. <script>
  437. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  438. </script>
  439. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  440. <parameter expr="json.dumps(True)"/>
  441. </raise>
  442. </transition>
  443. <history id="execution_state_history" type="deep" />
  444. <state id="running" initial="continuous">
  445. <state id="continuous">
  446. <transition event="termination_condition" target="../../stopped" />
  447. <transition event="pause" target="../../paused">
  448. <parameter name="source"/>
  449. <parameter name="args"/>
  450. <script>
  451. self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
  452. </script>
  453. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  454. <parameter expr="json.dumps(True)"/>
  455. </raise>
  456. </transition>
  457. <transition cond="self.breakpoint_triggers() != -1" target="../../paused">
  458. <script>
  459. print 'breakpoint %s triggers!' % self.triggered_bp
  460. 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])})
  461. </script>
  462. </transition>
  463. </state>
  464. <state id="big_step">
  465. <transition event="big_step_done" target="../../paused">
  466. <script>
  467. 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']})
  468. </script>
  469. </transition>
  470. </state>
  471. <state id="small_step">
  472. <transition event="small_step_done" target="../../paused">
  473. <script>
  474. 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})
  475. </script>
  476. </transition>
  477. </state>
  478. <state id="step_into">
  479. <transition event="step_into_done" target="../../paused">
  480. <script>
  481. self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
  482. </script>
  483. </transition>
  484. </state>
  485. <state id="line_step">
  486. <transition event="line_step_done" target="../../paused">
  487. <script>
  488. self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'paused', 'stack': self.add_source_code(self.mvk.debug_info[self.taskname])})
  489. </script>
  490. </transition>
  491. </state>
  492. </state>
  493. <state id="paused">
  494. <transition target="../running/continuous" event="resume">
  495. <parameter name="source"/>
  496. <parameter name="args"/>
  497. <script>
  498. self.enqueue({'task': self.taskname, 'result': 'success', 'state': 'running'})
  499. </script>
  500. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  501. <parameter expr="json.dumps(True)"/>
  502. </raise>
  503. </transition>
  504. <transition target="../running/big_step" event="big_step">
  505. <parameter name="source"/>
  506. <parameter name="args"/>
  507. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  508. <parameter expr="json.dumps(True)"/>
  509. </raise>
  510. </transition>
  511. <transition target="../running/small_step" event="small_step">
  512. <parameter name="source"/>
  513. <parameter name="args"/>
  514. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  515. <parameter expr="json.dumps(True)"/>
  516. </raise>
  517. </transition>
  518. <transition target="../running/step_into" event="step_into">
  519. <parameter name="source"/>
  520. <parameter name="args"/>
  521. <script>
  522. self.step_into_info = {'stack_len': len(self.mvk.debug_info[self.taskname]),
  523. 'file': self.curr_file,
  524. 'line': self.curr_line}
  525. </script>
  526. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  527. <parameter expr="json.dumps(True)"/>
  528. </raise>
  529. </transition>
  530. <transition target="../running/line_step" event="line_step">
  531. <parameter name="source"/>
  532. <parameter name="args"/>
  533. <script>
  534. self.line_step_info = {'stack_len': len(self.mvk.debug_info[self.taskname]),
  535. 'file': self.curr_file,
  536. 'line': self.curr_line}
  537. </script>
  538. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  539. <parameter expr="json.dumps(True)"/>
  540. </raise>
  541. </transition>
  542. </state>
  543. <state id="stopped" />
  544. </state>
  545. <state id="state_manipulation" initial="listening">
  546. <state id="listening">
  547. <transition event="read_symbols" target="../reading_symbols">
  548. <parameter name="source"/>
  549. <parameter name="args"/>
  550. <raise event="execute" scope="narrow" target="'parent/executor'">
  551. <parameter expr="self.returnpath"/>
  552. <parameter expr="self.taskname"/>
  553. <parameter expr="'read_symbols'"/>
  554. <parameter expr="[]"/>
  555. <parameter expr="self.request_id"/>
  556. </raise>
  557. <script>
  558. self.outstanding_execution = self.request_id
  559. self.request_id += 1
  560. self.symbol_source = source
  561. </script>
  562. </transition>
  563. </state>
  564. <state id="reading_symbols">
  565. <transition event="executed" cond="success and self.outstanding_execution == request_id" target="../listening">
  566. <parameter name="returnvalue"/>
  567. <parameter name="success"/>
  568. <parameter name="request_id"/>
  569. <script>
  570. self.enqueue({'task': self.taskname, 'result': 'success', 'symbols': returnvalue})
  571. </script>
  572. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.symbol_source">
  573. <parameter expr="json.dumps(True)"/>
  574. </raise>
  575. </transition>
  576. <transition event="executed" cond="not success and self.outstanding_execution == request_id" target="../listening">
  577. <parameter name="returnvalue"/>
  578. <parameter name="success"/>
  579. <parameter name="request_id"/>
  580. <script>
  581. self.enqueue({'task': self.taskname, 'result': 'failure'})
  582. </script>
  583. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.symbol_source">
  584. <parameter expr="json.dumps(True)"/>
  585. </raise>
  586. </transition>
  587. </state>
  588. </state>
  589. <state id="set_input" initial="fetch">
  590. <state id="fetch">
  591. <transition event="set_input" target=".">
  592. <parameter name="source"/>
  593. <parameter name="args"/>
  594. <raise event="execute" scope="narrow" target="'parent/executor'">
  595. <parameter expr="self.returnpath"/>
  596. <parameter expr="self.taskname"/>
  597. <parameter expr="'set_input'"/>
  598. <parameter expr="args"/>
  599. <parameter expr="self.request_id"/>
  600. </raise>
  601. <script>
  602. if source is not None:
  603. self.outstanding_input[self.request_id] = source
  604. self.request_id += 1
  605. </script>
  606. </transition>
  607. <transition event="executed" cond="request_id in self.outstanding_input" target=".">
  608. <parameter name="returnvalue"/>
  609. <parameter name="success"/>
  610. <parameter name="request_id"/>
  611. <script>
  612. source = self.outstanding_input.pop(request_id)
  613. </script>
  614. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  615. <parameter expr="json.dumps(returnvalue)"/>
  616. </raise>
  617. <raise event="set_input_done"/>
  618. </transition>
  619. </state>
  620. </state>
  621. <state id="get_output_queue" initial="waiting">
  622. <state id="waiting">
  623. <transition event="get_output" target=".">
  624. <parameter name="source"/>
  625. <parameter name="args"/>
  626. <script>
  627. self.output_queue.append(source)
  628. </script>
  629. </transition>
  630. </state>
  631. </state>
  632. <state id="get_output" initial="try_execute">
  633. <state id="try_execute">
  634. <transition cond="self.outstanding_output is None and self.output_queue" target=".">
  635. <raise event="execute" scope="narrow" target="'parent/executor'">
  636. <parameter expr="self.returnpath"/>
  637. <parameter expr="self.taskname"/>
  638. <parameter expr="'get_output'"/>
  639. <parameter expr="[]"/>
  640. <parameter expr="self.request_id"/>
  641. </raise>
  642. <script>
  643. self.outstanding_output = self.request_id
  644. self.request_id += 1
  645. </script>
  646. </transition>
  647. <transition event="executed" cond="success and request_id == self.outstanding_output" target=".">
  648. <parameter name="returnvalue"/>
  649. <parameter name="success"/>
  650. <parameter name="request_id"/>
  651. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.output_queue.pop(0)">
  652. <parameter expr="json.dumps(returnvalue)"/>
  653. </raise>
  654. <script>
  655. self.outstanding_output = None
  656. </script>
  657. </transition>
  658. <transition event="executed" cond="not success and request_id == self.outstanding_output" target="../waiting">
  659. <parameter name="returnvalue"/>
  660. <parameter name="success"/>
  661. <parameter name="request_id"/>
  662. <script>
  663. self.outstanding_output = None
  664. </script>
  665. </transition>
  666. </state>
  667. <state id="waiting">
  668. <transition after="1.0" target="../try_execute"/>
  669. </state>
  670. </state>
  671. <state id="breakpoint_manager" initial="listening">
  672. <state id="listening">
  673. <transition event="add_breakpoint" target=".">
  674. <parameter name="source"/>
  675. <parameter name="args"/>
  676. <script>
  677. if not 'file_name' in args or args['file_name'] is None:
  678. args['file_name'] = self.curr_file
  679. if not 'line_number' in args or args['line_number'] is None:
  680. args['line_number'] = self.curr_line
  681. self.breakpoints.append(Breakpoint(args['breakpoint_id'], args['file_name'], args['line_number'], args['enabled'], args['disable_on_trigger']))
  682. print 'adding breakpoint %s' % args
  683. self.breakpoint_source = source
  684. self.enqueue({'task': self.taskname, 'id': args['breakpoint_id'], 'result': 'breakpoint added'})
  685. </script>
  686. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  687. <parameter expr="json.dumps(True)"/>
  688. </raise>
  689. </transition>
  690. <transition event="del_breakpoint" target=".">
  691. <parameter name="source"/>
  692. <parameter name="args"/>
  693. <script>
  694. self.breakpoints = [breakpoint for breakpoint in self.breakpoints if breakpoint.id != args['del_breakpoint_id']]
  695. self.enqueue({'task': self.taskname, 'id': args['breakpoint_id'], 'result': 'breakpoint deleted'})
  696. </script>
  697. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  698. <parameter expr="json.dumps(True)"/>
  699. </raise>
  700. </transition>
  701. <transition event="toggle_breakpoint" target=".">
  702. <parameter name="source"/>
  703. <parameter name="args"/>
  704. <script>
  705. for breakpoint in self.breakpoints:
  706. if breakpoint.id == args['breakpoint_id']:
  707. breakpoint.enabled = args['enabled']
  708. break
  709. self.enqueue({'task': self.taskname, 'id': args['breakpoint_id'], 'result': 'breakpoint toggled'})
  710. </script>
  711. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  712. <parameter expr="json.dumps(True)"/>
  713. </raise>
  714. </transition>
  715. <transition event="list_breakpoints" target=".">
  716. <parameter name="source"/>
  717. <parameter name="args"/>
  718. <script>
  719. self.enqueue({'task': self.taskname, 'result': 'breakpoints listed', 'breakpoints': [bp.id for bp in self.breakpoints]})
  720. </script>
  721. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  722. <parameter expr="json.dumps(True)"/>
  723. </raise>
  724. </transition>
  725. </state>
  726. </state>
  727. <state id="polling_listener" initial="listening">
  728. <state id="listening">
  729. <transition target="." event="poll_messages">
  730. <parameter name="source" />
  731. <parameter name="args"/>
  732. <script>
  733. self.polling_source = source
  734. </script>
  735. </transition>
  736. </state>
  737. </state>
  738. <state id="polling_sender" initial="sending">
  739. <state id="sending">
  740. <transition target="." cond="self.queue and (self.polling_source is not None)">
  741. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + self.polling_source">
  742. <parameter expr="json.dumps(self.queue)"/>
  743. </raise>
  744. <script>
  745. self.polling_source = None
  746. self.queue = []
  747. </script>
  748. </transition>
  749. </state>
  750. </state>
  751. <history id="running_debug_history" type="deep" />
  752. </parallel>
  753. <transition target="../running_normal" event="detach_debugger">
  754. <parameter name="source"/>
  755. <parameter name="args"/>
  756. <script>
  757. self.enqueue({'task': self.taskname, 'state': 'debugger_detached', 'result': 'success'})
  758. </script>
  759. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  760. <parameter expr="json.dumps(True)"/>
  761. </raise>
  762. </transition>
  763. <transition target="running/running_debug_history" event="attach_debugger">
  764. <parameter name="source"/>
  765. <parameter name="args"/>
  766. <script>
  767. self.enqueue({'task': self.taskname, 'result': 'not allowed'})
  768. </script>
  769. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/' + source">
  770. <parameter expr="json.dumps(True)"/>
  771. </raise>
  772. </transition>
  773. </state>
  774. </scxml>
  775. </class>