@@ -74,18 +74,24 @@ def __init__(self, nid, program, cleanup_callback):
74
74
self .window = WindowAPI (self ) # TODO: unimplemented
75
75
76
76
async def prog_wrap ():
77
+ err = None
77
78
try :
78
79
await program (self )
79
80
except asyncio .CancelledError :
80
81
print ('program {} cancelled' .format (self ._id ))
81
82
print_exc ()
83
+ err = 'program has been cancelled'
82
84
except Exception as e :
83
85
print ('program {} crashed: {} {}' .format (self ._id , type (e ), e ))
84
86
print_exc ()
87
+ err = type (e ).__name__ + ': ' + str (e )
85
88
else :
86
89
print ('program {} finished' .format (self ._id ))
87
90
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 )
89
95
cleanup_callback ()
90
96
91
97
self ._task = asyncio .create_task (prog_wrap ())
@@ -95,17 +101,20 @@ def _new_task_id(self):
95
101
self ._task_autoid += 1
96
102
return task_id
97
103
98
- async def _send_cmd (self , lua ):
104
+ async def raw_eval (self , lua_code ):
99
105
task_id = self ._new_task_id ()
100
106
self ._result_locks [task_id ] = asyncio .Event ()
101
107
await self ._cmd .put ({
102
108
'action' : 'task' ,
103
109
'task_id' : task_id ,
104
- 'code' : lua ,
110
+ 'code' : lua_code ,
105
111
})
106
112
await self ._result_locks [task_id ].wait ()
107
113
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 )
109
118
print ('{} → {}' .format (lua , result ))
110
119
if not result [0 ]:
111
120
raise LuaException (* result [1 :])
0 commit comments