Skip to content

Commit 9889e0f

Browse files
committed
WIP Clean up arraylist_t handling
1 parent a23caa0 commit 9889e0f

File tree

8 files changed

+311
-242
lines changed

8 files changed

+311
-242
lines changed

src/ast.c

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,22 @@ static jl_value_t *scm_to_julia_(value_t e, int eo)
380380
}
381381

382382
static value_t julia_to_scm_(jl_value_t *v);
383+
typedef struct {
384+
ssize_t idx;
385+
size_t val;
386+
} jlgensym_str;
387+
383388
static arraylist_t jlgensym_to_flisp;
384389

385390
static value_t julia_to_scm(jl_value_t *v)
386391
{
387392
value_t temp;
388-
if (jlgensym_to_flisp.len)
389-
jlgensym_to_flisp.len = 0; // in case we didn't free it last time we got here (for example, if we threw an error)
390-
else
391-
arraylist_new(&jlgensym_to_flisp, 0);
393+
if (jlgensym_to_flisp.len) {
394+
// in case we didn't free it last time we got here (for example, if we threw an error)
395+
jlgensym_to_flisp.len = 0;
396+
} else {
397+
arraylist_str(&jlgensym_to_flisp, 0, sizeof(jlgensym_str));
398+
}
392399
// need try/catch to reset GC handle stack in case of error
393400
FL_TRY_EXTERN {
394401
temp = julia_to_scm_(v);
@@ -405,7 +412,7 @@ static void array_to_list(jl_array_t *a, value_t *pv)
405412
if (jl_array_len(a) > 300000)
406413
lerror(OutOfMemoryError, "expression too large");
407414
value_t temp;
408-
for(long i=jl_array_len(a)-1; i >= 0; i--) {
415+
for (long i=jl_array_len(a)-1; i >= 0; i--) {
409416
*pv = fl_cons(FL_NIL, *pv);
410417
temp = julia_to_scm_(jl_cellref(a,i));
411418
// note: must be separate statement
@@ -429,15 +436,18 @@ static value_t julia_to_scm_(jl_value_t *v)
429436
return symbol(((jl_sym_t*)v)->name);
430437
if (jl_is_gensym(v)) {
431438
size_t idx = ((jl_gensym_t*)v)->id;
432-
size_t i;
433-
for (i = 0; i < jlgensym_to_flisp.len; i+=2) {
434-
if ((ssize_t)jlgensym_to_flisp.items[i] == idx)
435-
return fl_list2(fl_jlgensym_sym, fixnum((size_t)jlgensym_to_flisp.items[i+1]));
439+
size_t len = jlgensym_to_flisp.len;
440+
if (len) {
441+
jlgensym_str *jlgenp = (jlgensym_str *)jlgensym_to_flisp.items;
442+
do {
443+
if (jlgenp->idx == idx) return fl_list2(fl_jlgensym_sym, fixnum(jlgenp->val));
444+
jlgenp++;
445+
} while (--len);
436446
}
437-
arraylist_push(&jlgensym_to_flisp, (void*)idx);
438447
value_t flv = fl_applyn(0, symbol_value(symbol("make-jlgensym")));
439448
assert(iscons(flv) && car_(flv) == fl_jlgensym_sym);
440-
arraylist_push(&jlgensym_to_flisp, (void*)(size_t)numval(car_(cdr_(flv))));
449+
jlgensym_str jlgensym_tmp = {idx, numval(car_(cdr_(flv)))};
450+
arraylist_push_str(&jlgensym_to_flisp, (void *)&jlgensym_tmp);
441451
return flv;
442452
}
443453
if (v == jl_true)
@@ -569,9 +579,7 @@ jl_value_t *jl_expand(jl_value_t *expr)
569579
value_t arg = julia_to_scm(expr);
570580
value_t e = fl_applyn(1, symbol_value(symbol("jl-expand-to-thunk")), arg);
571581
jl_value_t *result = scm_to_julia(e,0);
572-
while (jl_gc_n_preserved_values() > np) {
573-
jl_gc_unpreserve();
574-
}
582+
jl_gc_reset_preserved_values(np);
575583
return result;
576584
}
577585

@@ -580,11 +588,8 @@ DLLEXPORT jl_value_t *jl_macroexpand(jl_value_t *expr)
580588
int np = jl_gc_n_preserved_values();
581589
value_t arg = julia_to_scm(expr);
582590
value_t e = fl_applyn(1, symbol_value(symbol("jl-macroexpand")), arg);
583-
jl_value_t *result;
584-
result = scm_to_julia(e,0);
585-
while (jl_gc_n_preserved_values() > np) {
586-
jl_gc_unpreserve();
587-
}
591+
jl_value_t *result = scm_to_julia(e,0);
592+
jl_gc_reset_preserved_values(np);
588593
return result;
589594
}
590595

0 commit comments

Comments
 (0)