Skip to content

Commit f771303

Browse files
committed
Mod: simpler save
1 parent 607ec25 commit f771303

File tree

1 file changed

+42
-77
lines changed

1 file changed

+42
-77
lines changed

src/eceval.c

Lines changed: 42 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
#define AREA "ECEVAL"
1515

16-
enum reg { ARGL, CONT, ENV, EXPR, PROC, STACK, UNEV, VAL };
17-
1816
static obj argl; // 1
1917
static obj cont; // 2
2018
static obj env; // 3
@@ -26,7 +24,8 @@ static obj val; // 8
2624
// Plus... the_global_environment // 9
2725
obj anenv; // 10
2826
obj ambenv; // 11
29-
const int rootlen = 11;
27+
obj savetmp; // 12
28+
const int rootlen = 12;
3029
static obj rootlst;
3130

3231
// ln 182
@@ -58,50 +57,11 @@ static void timed_eval(obj start)
5857
displaydat(of_string("s ] "));
5958
}
6059

61-
static void save(enum reg reg)
60+
static void save(obj val)
6261
{
63-
// Why use an enum? Why not just pass the obj to save as an argument?
64-
//
65-
// Because the call to newpair (below) allows garbage collection.
66-
//
67-
// So? The argument obj wouldn't be reachable from the GC 'root' list.
68-
//
69-
// So? If the arg(ument) is a pointer to a pair (i.e., is_pair), and a
70-
// collection occurs, then the arg's pointer will not be updated
71-
// because the garbage collector doesn't know about it.
72-
//
73-
// So? The arg would still point to the pair's original location (now a
74-
// 'broken heart') and not to the pair's new location.
75-
//
76-
// Oh! That's right, you just avoided putting corrupt data on the stack!
77-
//
78-
79-
switch (reg) {
80-
case ARGL:
81-
stack = consgc(&argl, &stack);
82-
break;
83-
case CONT:
84-
stack = consgc(&cont, &stack);
85-
break;
86-
case ENV:
87-
stack = consgc(&env, &stack);
88-
break;
89-
case EXPR:
90-
stack = consgc(&expr, &stack);
91-
break;
92-
case PROC:
93-
stack = consgc(&proc, &stack);
94-
break;
95-
case STACK:
96-
stack = consgc(&stack, &stack);
97-
break;
98-
case UNEV:
99-
stack = consgc(&unev, &stack);
100-
break;
101-
case VAL:
102-
stack = consgc(&val, &stack);
103-
break;
104-
}
62+
savetmp = val;
63+
stack = consgc(&savetmp, &stack);
64+
10565
if (is_err(stack)) {
10666
eprintf(AREA, "Halting - Reached Memory Limit");
10767
exit(1);
@@ -129,7 +89,7 @@ obj getroot(void)
12989

13090
// intentionally not using rootlen here, change number manually after
13191
// modifying body below.
132-
if ((actlen = length_u(rootlst)) != 11) {
92+
if ((actlen = length_u(rootlst)) != 12) {
13393
error_internal(
13494
AREA,
13595
"Bug! getroot() got list of unexpected length: %d ",
@@ -158,6 +118,8 @@ obj getroot(void)
158118
set_car(lst, anenv);
159119
lst = cdr(lst);
160120
set_car(lst, ambenv);
121+
lst = cdr(lst);
122+
set_car(lst, savetmp);
161123

162124
return rootlst;
163125
}
@@ -170,7 +132,7 @@ obj setroot(obj rlst)
170132

171133
// intentionally not using rootlen here, change number manually after
172134
// modifying body below.
173-
if ((actlen = length_u(rootlst)) != 11) {
135+
if ((actlen = length_u(rootlst)) != 12) {
174136
return error_internal(
175137
AREA,
176138
"Bug! setroot() got list of unexpected length: %d",
@@ -198,6 +160,8 @@ obj setroot(obj rlst)
198160
anenv = car(lst);
199161
lst = cdr(lst);
200162
ambenv = car(lst);
163+
lst = cdr(lst);
164+
savetmp = car(lst);
201165

202166
return unspecified;
203167
}
@@ -219,7 +183,7 @@ static obj init(void)
219183

220184
stack = emptylst;
221185
// preallocate storage for gc root
222-
rootlst = listn(11, // <----- actual length
186+
rootlst = listn(12, // <----- actual length
223187
unspecified, // 1
224188
unspecified, // 2
225189
unspecified, // 3
@@ -230,7 +194,8 @@ static obj init(void)
230194
unspecified, // 8
231195
unspecified, // 9
232196
unspecified, // 10
233-
unspecified // 11
197+
unspecified, // 11
198+
unspecified // 12
234199
);
235200
if ((actlen = length_u(rootlst)) != rootlen) {
236201
error_internal(
@@ -331,10 +296,10 @@ obj eceval(obj expression, obj _environment)
331296

332297
// ln 277
333298
ev_application:
334-
save(CONT);
335-
save(ENV);
299+
save(cont);
300+
save(env);
336301
unev = operands(expr);
337-
save(UNEV);
302+
save(unev);
338303
expr = operator(expr);
339304
set_proc_name();
340305
cont = ev_appl_did_operator;
@@ -350,16 +315,16 @@ obj eceval(obj expression, obj _environment)
350315
return proc;
351316
if (no_operands(unev))
352317
goto apply_dispatch;
353-
save(PROC);
318+
save(proc);
354319

355320
// ln 295
356321
ev_appl_operand_loop:
357-
save(ARGL);
322+
save(argl);
358323
expr = first_operand(unev);
359324
if (is_last_operand(unev))
360325
goto ev_appl_last_arg;
361-
save(ENV);
362-
save(UNEV);
326+
save(env);
327+
save(unev);
363328
cont = ev_appl_accumulate_arg;
364329
goto eval_dispatch;
365330

@@ -403,7 +368,7 @@ obj eceval(obj expression, obj _environment)
403368
// ln 348
404369
ev_begin:
405370
unev = begin_actions(expr);
406-
save(CONT);
371+
save(cont);
407372
goto ev_sequence;
408373

409374
// ln 338
@@ -423,8 +388,8 @@ obj eceval(obj expression, obj _environment)
423388
expr = first_exp(unev);
424389
if (is_last_exp(unev))
425390
goto ev_sequence_last_exp;
426-
save(UNEV);
427-
save(ENV);
391+
save(unev);
392+
save(env);
428393
cont = ev_sequence_continue;
429394
goto eval_dispatch;
430395
ev_sequence_continue:
@@ -440,9 +405,9 @@ obj eceval(obj expression, obj _environment)
440405

441406
// ln 374
442407
ev_if:
443-
save(EXPR); // save expression for later
444-
save(ENV);
445-
save(CONT);
408+
save(expr); // save expression for later
409+
save(env);
410+
save(cont);
446411
cont = ev_if_decide;
447412
expr = if_predicate(expr);
448413
goto eval_dispatch; // evaluate the predicate
@@ -466,10 +431,10 @@ obj eceval(obj expression, obj _environment)
466431
// ln 399
467432
ev_assignment:
468433
unev = assignment_variable(expr);
469-
save(UNEV); // save variable for later
434+
save(unev); // save variable for later
470435
expr = assignment_value(expr);
471-
save(ENV);
472-
save(CONT);
436+
save(env);
437+
save(cont);
473438
cont = ev_assignment_1;
474439
goto eval_dispatch; // evaluate the assignment value
475440

@@ -484,10 +449,10 @@ obj eceval(obj expression, obj _environment)
484449
// ln 416
485450
ev_definition:
486451
unev = definition_variable(expr);
487-
save(UNEV); // save variable for later
452+
save(unev); // save variable for later
488453
expr = definition_value(expr);
489-
save(ENV);
490-
save(CONT);
454+
save(env);
455+
save(cont);
491456
cont = ev_definition_1;
492457
goto eval_dispatch; // evaluate the definition value
493458
ev_definition_1:
@@ -538,10 +503,10 @@ obj eceval(obj expression, obj _environment)
538503

539504
// new
540505
ev_timed:
541-
save(UNEV);
506+
save(unev);
542507
unev = runtime(emptylst);
543-
save(UNEV);
544-
save(CONT);
508+
save(unev);
509+
save(cont);
545510
cont = ev_timed_done;
546511
expr = cons(begin, cdr(expr));
547512
goto eval_dispatch;
@@ -555,10 +520,10 @@ obj eceval(obj expression, obj _environment)
555520

556521
// new
557522
ev_apply:
558-
save(CONT);
559-
save(ENV);
523+
save(cont);
524+
save(env);
560525
unev = apply_operands(expr);
561-
save(UNEV);
526+
save(unev);
562527
expr = apply_operator(expr);
563528
cont = ev_apply_2;
564529
goto eval_dispatch;
@@ -567,8 +532,8 @@ obj eceval(obj expression, obj _environment)
567532
unev = restore();
568533
env = restore();
569534
proc = val;
570-
save(PROC);
571-
save(ENV);
535+
save(proc);
536+
save(env);
572537
expr = unev;
573538
cont = ev_apply_3;
574539
goto eval_dispatch;

0 commit comments

Comments
 (0)