File tree 2 files changed +13
-2
lines changed
2 files changed +13
-2
lines changed Original file line number Diff line number Diff line change @@ -157,8 +157,14 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
157
157
/* top-level does not have block slot (alway false) */
158
158
if (sp == mrb -> c -> stbase )
159
159
return mrb_false_value ();
160
- ci = mrb -> c -> cibase + e -> cioff ;
161
- bp = ci [1 ].stackent + 1 ;
160
+ if (e -> cioff < 0 ) {
161
+ /* use saved block arg position */
162
+ bp = & e -> stack [- e -> cioff ];
163
+ }
164
+ else {
165
+ ci = mrb -> c -> cibase + e -> cioff ;
166
+ bp = ci [1 ].stackent + 1 ;
167
+ }
162
168
}
163
169
}
164
170
if (ci -> argc > 0 ) {
Original file line number Diff line number Diff line change @@ -257,8 +257,13 @@ mrb_env_unshare(mrb_state *mrb, struct REnv *e)
257
257
{
258
258
size_t len = (size_t )MRB_ENV_STACK_LEN (e );
259
259
mrb_value * p = (mrb_value * )mrb_malloc (mrb , sizeof (mrb_value )* len );
260
+ ptrdiff_t cioff = e -> cioff ;
260
261
261
262
MRB_ENV_UNSHARE_STACK (e );
263
+ if (!e -> c ) {
264
+ /* save block argument position (negated) */
265
+ e -> cioff = - mrb -> c -> cibase [cioff ].argc - 1 ;
266
+ }
262
267
if (len > 0 ) {
263
268
stack_copy (p , e -> stack , len );
264
269
}
You can’t perform that action at this time.
0 commit comments