File tree Expand file tree Collapse file tree 2 files changed +19
-1
lines changed Expand file tree Collapse file tree 2 files changed +19
-1
lines changed Original file line number Diff line number Diff line change 1+ use super :: MultiValue ;
12use std:: error:: Error as StdError ;
23use std:: fmt;
34use std:: io:: Error as IoError ;
@@ -205,6 +206,12 @@ pub enum Error {
205206 /// Underlying error.
206207 cause : Arc < Error > ,
207208 } ,
209+ /// Yield.
210+ ///
211+ /// Not an error.
212+ /// Returning `Err(Yielding(...))` from a Rust callback will yield the value as a Lua value.
213+ /// If it cannot yield, it will raise an error.
214+ Yielding ( MultiValue ) ,
208215}
209216
210217/// A specialized `Result` type used by `mlua`'s API.
@@ -321,6 +328,9 @@ impl fmt::Display for Error {
321328 Error :: WithContext { context, cause } => {
322329 writeln ! ( fmt, "{context}" ) ?;
323330 write ! ( fmt, "{cause}" )
331+ } ,
332+ Error :: Yielding ( _) => {
333+ write ! ( fmt, "yield across Rust/Lua boundary" )
324334 }
325335 }
326336 }
Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ use std::sync::Arc;
66use crate :: error:: { Error , Result } ;
77use crate :: state:: { ExtraData , RawLua } ;
88use crate :: util:: { self , get_internal_metatable, WrappedFailure } ;
9+ use crate :: IntoLuaMulti ;
910
1011pub ( super ) struct StateGuard < ' a > ( & ' a RawLua , * mut ffi:: lua_State ) ;
1112
@@ -107,7 +108,14 @@ where
107108 prealloc_failure. release ( state, extra) ;
108109 r
109110 }
110- Ok ( Err ( err) ) => {
111+ Ok ( Err ( mut err) ) => {
112+ if let Error :: Yielding ( tuple) = err {
113+ let raw = extra. as_ref ( ) . unwrap_unchecked ( ) . raw_lua ( ) ;
114+ match tuple. push_into_stack_multi ( lua) {
115+ Ok ( nargs) => ffi:: lua_yield ( state, nargs) ,
116+ Err ( new_err) => err = new_err,
117+ }
118+ }
111119 let wrapped_error = prealloc_failure. r#use ( state, extra) ;
112120
113121 // Build `CallbackError` with traceback
You can’t perform that action at this time.
0 commit comments