@@ -74,18 +74,24 @@ def __init__(self, nid, program, cleanup_callback):
7474 self .window = WindowAPI (self ) # TODO: unimplemented
7575
7676 async def prog_wrap ():
77+ err = None
7778 try :
7879 await program (self )
7980 except asyncio .CancelledError :
8081 print ('program {} cancelled' .format (self ._id ))
8182 print_exc ()
83+ err = 'program has been cancelled'
8284 except Exception as e :
8385 print ('program {} crashed: {} {}' .format (self ._id , type (e ), e ))
8486 print_exc ()
87+ err = type (e ).__name__ + ': ' + str (e )
8588 else :
8689 print ('program {} finished' .format (self ._id ))
8790 finally :
88- await self ._cmd .put ({'action' : 'close' })
91+ c = {'action' : 'close' }
92+ if err is not None :
93+ c ['error' ] = err
94+ await self ._cmd .put (c )
8995 cleanup_callback ()
9096
9197 self ._task = asyncio .create_task (prog_wrap ())
@@ -95,17 +101,20 @@ def _new_task_id(self):
95101 self ._task_autoid += 1
96102 return task_id
97103
98- async def _send_cmd (self , lua ):
104+ async def raw_eval (self , lua_code ):
99105 task_id = self ._new_task_id ()
100106 self ._result_locks [task_id ] = asyncio .Event ()
101107 await self ._cmd .put ({
102108 'action' : 'task' ,
103109 'task_id' : task_id ,
104- 'code' : lua ,
110+ 'code' : lua_code ,
105111 })
106112 await self ._result_locks [task_id ].wait ()
107113 del self ._result_locks [task_id ]
108- result = self ._result_values .pop (task_id )
114+ return self ._result_values .pop (task_id )
115+
116+ async def _send_cmd (self , lua ):
117+ result = await self .raw_eval (lua )
109118 print ('{} → {}' .format (lua , result ))
110119 if not result [0 ]:
111120 raise LuaException (* result [1 :])
0 commit comments