@@ -380,15 +380,22 @@ static jl_value_t *scm_to_julia_(value_t e, int eo)
380380}
381381
382382static value_t julia_to_scm_ (jl_value_t * v );
383+ typedef struct {
384+ ssize_t idx ;
385+ size_t val ;
386+ } jlgensym_str ;
387+
383388static arraylist_t jlgensym_to_flisp ;
384389
385390static 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