@@ -13,7 +13,7 @@ use crate::{
1313 do_yield_iter, do_yield_splat_iter, do_yield_values_iter, Proc , Yield , YieldSplat ,
1414 YieldValues ,
1515 } ,
16- error:: { raise, Error } ,
16+ error:: { raise, Error , IntoError } ,
1717 into_value:: { ArgList , IntoValue } ,
1818 r_array:: RArray ,
1919 try_convert:: TryConvert ,
@@ -74,12 +74,15 @@ mod private {
7474 fn into_return_value ( self ) -> Result < Value , Error > ;
7575 }
7676
77- impl < T > ReturnValue for Result < T , Error >
77+ impl < T , E > ReturnValue for Result < T , E >
7878 where
7979 T : IntoValue ,
80+ E : IntoError ,
8081 {
8182 fn into_return_value ( self ) -> Result < Value , Error > {
82- self . map ( |val| unsafe { val. into_value_unchecked ( ) } )
83+ let ruby = unsafe { Ruby :: get_unchecked ( ) } ;
84+ self . map ( |val| val. into_value_with ( & ruby) )
85+ . map_err ( |err| err. into_error ( & ruby) )
8386 }
8487 }
8588
@@ -88,83 +91,92 @@ mod private {
8891 T : IntoValue ,
8992 {
9093 fn into_return_value ( self ) -> Result < Value , Error > {
91- Ok ( self ) . into_return_value ( )
94+ Ok :: < T , Error > ( self ) . into_return_value ( )
9295 }
9396 }
9497
95- impl < I , T > ReturnValue for Yield < I >
98+ impl < I , T , E > ReturnValue for Result < Yield < I > , E >
9699 where
97100 I : Iterator < Item = T > ,
98101 T : IntoValue ,
102+ E : IntoError ,
99103 {
100104 fn into_return_value ( self ) -> Result < Value , Error > {
101- match self {
105+ let ruby = unsafe { Ruby :: get_unchecked ( ) } ;
106+ self . map ( |i| match i {
102107 Yield :: Iter ( iter) => unsafe {
103108 do_yield_iter ( iter) ;
104- Ok ( Ruby :: get_unchecked ( ) . qnil ( ) . as_value ( ) )
109+ ruby . qnil ( ) . as_value ( )
105110 } ,
106- Yield :: Enumerator ( e) => Ok ( unsafe { e. into_value_unchecked ( ) } ) ,
107- }
111+ Yield :: Enumerator ( e) => e. into_value_with ( & ruby) ,
112+ } )
113+ . map_err ( |err| err. into_error ( & ruby) )
108114 }
109115 }
110116
111- impl < I , T > ReturnValue for Result < Yield < I > , Error >
117+ impl < I , T > ReturnValue for Yield < I >
112118 where
113119 I : Iterator < Item = T > ,
114120 T : IntoValue ,
115121 {
116122 fn into_return_value ( self ) -> Result < Value , Error > {
117- self ? . into_return_value ( )
123+ Ok :: < Self , Error > ( self ) . into_return_value ( )
118124 }
119125 }
120126
121- impl < I , T > ReturnValue for YieldValues < I >
127+ impl < I , T , E > ReturnValue for Result < YieldValues < I > , E >
122128 where
123129 I : Iterator < Item = T > ,
124130 T : ArgList ,
131+ E : IntoError ,
125132 {
126133 fn into_return_value ( self ) -> Result < Value , Error > {
127- match self {
134+ let ruby = unsafe { Ruby :: get_unchecked ( ) } ;
135+ self . map ( |i| match i {
128136 YieldValues :: Iter ( iter) => unsafe {
129137 do_yield_values_iter ( iter) ;
130- Ok ( Ruby :: get_unchecked ( ) . qnil ( ) . as_value ( ) )
138+ ruby . qnil ( ) . as_value ( )
131139 } ,
132- YieldValues :: Enumerator ( e) => Ok ( unsafe { e. into_value_unchecked ( ) } ) ,
133- }
140+ YieldValues :: Enumerator ( e) => e. into_value_with ( & ruby) ,
141+ } )
142+ . map_err ( |err| err. into_error ( & ruby) )
134143 }
135144 }
136145
137- impl < I , T > ReturnValue for Result < YieldValues < I > , Error >
146+ impl < I , T > ReturnValue for YieldValues < I >
138147 where
139148 I : Iterator < Item = T > ,
140149 T : ArgList ,
141150 {
142151 fn into_return_value ( self ) -> Result < Value , Error > {
143- self ? . into_return_value ( )
152+ Ok :: < Self , Error > ( self ) . into_return_value ( )
144153 }
145154 }
146155
147- impl < I > ReturnValue for YieldSplat < I >
156+ impl < I , E > ReturnValue for Result < YieldSplat < I > , E >
148157 where
149158 I : Iterator < Item = RArray > ,
159+ E : IntoError ,
150160 {
151161 fn into_return_value ( self ) -> Result < Value , Error > {
152- match self {
162+ let ruby = unsafe { Ruby :: get_unchecked ( ) } ;
163+ self . map ( |i| match i {
153164 YieldSplat :: Iter ( iter) => unsafe {
154165 do_yield_splat_iter ( iter) ;
155- Ok ( Ruby :: get_unchecked ( ) . qnil ( ) . as_value ( ) )
166+ ruby . qnil ( ) . as_value ( )
156167 } ,
157- YieldSplat :: Enumerator ( e) => Ok ( unsafe { e. into_value_unchecked ( ) } ) ,
158- }
168+ YieldSplat :: Enumerator ( e) => e. into_value_with ( & ruby) ,
169+ } )
170+ . map_err ( |err| err. into_error ( & ruby) )
159171 }
160172 }
161173
162- impl < I > ReturnValue for Result < YieldSplat < I > , Error >
174+ impl < I > ReturnValue for YieldSplat < I >
163175 where
164176 I : Iterator < Item = RArray > ,
165177 {
166178 fn into_return_value ( self ) -> Result < Value , Error > {
167- self ? . into_return_value ( )
179+ Ok :: < Self , Error > ( self ) . into_return_value ( )
168180 }
169181 }
170182
@@ -178,9 +190,12 @@ mod private {
178190 }
179191 }
180192
181- impl InitReturn for Result < ( ) , Error > {
193+ impl < E > InitReturn for Result < ( ) , E >
194+ where
195+ E : IntoError ,
196+ {
182197 fn into_init_return ( self ) -> Result < ( ) , Error > {
183- self
198+ self . map_err ( |err| err . into_error ( & unsafe { Ruby :: get_unchecked ( ) } ) )
184199 }
185200 }
186201
0 commit comments