@@ -88,6 +88,7 @@ static void set_proc_name(struct core *cr)
88
88
89
89
static obj ecevalgoto (struct core * cr , bool yield )
90
90
{
91
+ bool locked = false;
91
92
obj go_obj = restore (cr );
92
93
goto go_obj ;
93
94
@@ -141,6 +142,8 @@ static obj ecevalgoto(struct core *cr, bool yield)
141
142
goto ev_parallel_eval ;
142
143
if (is_parallel_execute (cr -> expr ))
143
144
goto ev_parallel_execute ;
145
+ if (is_lock (cr -> expr ))
146
+ goto ev_lock ;
144
147
if (is_ecapply (cr -> expr ))
145
148
goto ev_apply ;
146
149
if (is_application (cr -> expr ))
@@ -407,6 +410,21 @@ static obj ecevalgoto(struct core *cr, bool yield)
407
410
go_obj = cr -> cont ;
408
411
goto go_obj ;
409
412
413
+ ev_lock :
414
+ if (locked ) {
415
+ return error_internal (AREA , "Attempted to lock twice" );
416
+ }
417
+ save (cr -> cont , cr );
418
+ locked = true;
419
+ cr -> cont = ev_lock_done ;
420
+ cr -> expr = cons (begin , cdr (cr -> expr ));
421
+ goto eval_dispatch ;
422
+
423
+ ev_lock_done :
424
+ cr -> cont = restore (cr );
425
+ locked = false;
426
+ goto go_cont ;
427
+
410
428
// new
411
429
ev_apply :
412
430
save (cr -> cont , cr );
@@ -442,13 +460,12 @@ static obj ecevalgoto(struct core *cr, bool yield)
442
460
return error_eval (AREA , "Unknown procedure type: %s" , errstr (cr -> proc ));
443
461
444
462
go_cont :
445
- if (yield ) {
463
+ if (yield && ! locked ) {
446
464
save (cr -> cont , cr );
447
465
return yielded ;
448
466
}
449
467
go_obj = cr -> cont ;
450
468
go_obj :
451
- // printf("obj: %s\n", to_string(go_obj));
452
469
if (is_eq (go_obj , ev_return_caller ))
453
470
return cr -> val ;
454
471
if (is_eq (go_obj , ev_appl_accum_last_arg ))
@@ -469,6 +486,8 @@ static obj ecevalgoto(struct core *cr, bool yield)
469
486
goto eval_dispatch ;
470
487
if (is_eq (go_obj , ev_if_decide ))
471
488
goto ev_if_decide ;
489
+ if (is_eq (go_obj , ev_lock_done ))
490
+ goto ev_lock_done ;
472
491
if (is_eq (go_obj , ev_quoted ))
473
492
goto ev_quoted ;
474
493
if (is_eq (go_obj , ev_sequence_continue ))
0 commit comments