static value_t julia_to_list2(jl_value_t *a, jl_value_t *b) { value_t sa = julia_to_scm_(a); fl_gc_handle(&sa); value_t sb = julia_to_scm_(b); value_t l = fl_list2(sa, sb); fl_free_gc_handles(1); return l; }
static value_t julia_to_list2(fl_context_t *fl_ctx, jl_value_t *a, jl_value_t *b) { value_t sa = julia_to_scm_(fl_ctx, a); fl_gc_handle(fl_ctx, &sa); value_t sb = julia_to_scm_(fl_ctx, b); value_t l = fl_list2(fl_ctx, sa, sb); fl_free_gc_handles(fl_ctx, 1); return l; }
static void array_to_list(fl_context_t *fl_ctx, jl_array_t *a, value_t *pv) { if (jl_array_len(a) > 300000) lerror(fl_ctx, symbol(fl_ctx, "error"), "expression too large"); value_t temp; for(long i=jl_array_len(a)-1; i >= 0; i--) { *pv = fl_cons(fl_ctx, fl_ctx->NIL, *pv); temp = julia_to_scm_(fl_ctx, jl_array_ptr_ref(a,i)); // note: must be separate statement car_(*pv) = temp; } }
static value_t julia_to_scm(fl_context_t *fl_ctx, jl_value_t *v) { value_t temp; // need try/catch to reset GC handle stack in case of error FL_TRY_EXTERN(fl_ctx) { temp = julia_to_scm_(fl_ctx, v); } FL_CATCH_EXTERN(fl_ctx) { temp = fl_ctx->lasterror; } return temp; }
static void array_to_list(jl_array_t *a, value_t *pv) { if (jl_array_len(a) > 300000) lerror(MemoryError, "expression too large"); value_t temp; for(long i=jl_array_len(a)-1; i >= 0; i--) { *pv = fl_cons(FL_NIL, *pv); temp = julia_to_scm_(jl_cellref(a,i)); // note: must be separate statement car_(*pv) = temp; } }
static value_t julia_to_scm(jl_value_t *v) { value_t temp; // need try/catch to reset GC handle stack in case of error FL_TRY_EXTERN { temp = julia_to_scm_(v); } FL_CATCH_EXTERN { temp = fl_list2(fl_error_sym, cvalue_static_cstring("expression too large")); } return temp; }
static value_t julia_to_scm(fl_context_t *fl_ctx, jl_value_t *v) { value_t temp; // need try/catch to reset GC handle stack in case of error FL_TRY_EXTERN(fl_ctx) { temp = julia_to_scm_(fl_ctx, v); } FL_CATCH_EXTERN(fl_ctx) { temp = fl_list2(fl_ctx, jl_ast_ctx(fl_ctx)->error_sym, cvalue_static_cstring(fl_ctx, "expression too large")); } return temp; }
static value_t julia_to_scm_(fl_context_t *fl_ctx, jl_value_t *v) { if (jl_is_symbol(v)) return symbol(fl_ctx, jl_symbol_name((jl_sym_t*)v)); if (v == jl_true) return jl_ast_ctx(fl_ctx)->true_sym; if (v == jl_false) return jl_ast_ctx(fl_ctx)->false_sym; if (v == jl_nothing) return fl_cons(fl_ctx, jl_ast_ctx(fl_ctx)->null_sym, fl_ctx->NIL); if (jl_is_expr(v)) { jl_expr_t *ex = (jl_expr_t*)v; value_t args = fl_ctx->NIL; fl_gc_handle(fl_ctx, &args); array_to_list(fl_ctx, ex->args, &args); value_t hd = julia_to_scm_(fl_ctx, (jl_value_t*)ex->head); if (ex->head == lambda_sym && jl_expr_nargs(ex)>0 && jl_is_array(jl_exprarg(ex,0))) { value_t llist = fl_ctx->NIL; fl_gc_handle(fl_ctx, &llist); array_to_list(fl_ctx, (jl_array_t*)jl_exprarg(ex,0), &llist); car_(args) = llist; fl_free_gc_handles(fl_ctx, 1); } value_t scmv = fl_cons(fl_ctx, hd, args); fl_free_gc_handles(fl_ctx, 1); return scmv; } // GC Note: jl_fieldref(v, 0) allocate for LabelNode, GotoNode // but we don't need a GC root here because julia_to_list2 // shouldn't allocate in this case. if (jl_typeis(v, jl_labelnode_type)) return julia_to_list2(fl_ctx, (jl_value_t*)label_sym, jl_fieldref(v,0)); if (jl_typeis(v, jl_linenumbernode_type)) return julia_to_list2(fl_ctx, (jl_value_t*)line_sym, jl_fieldref(v,0)); if (jl_typeis(v, jl_gotonode_type)) return julia_to_list2(fl_ctx, (jl_value_t*)goto_sym, jl_fieldref(v,0)); if (jl_typeis(v, jl_quotenode_type)) return julia_to_list2(fl_ctx, (jl_value_t*)inert_sym, jl_fieldref(v,0)); if (jl_typeis(v, jl_newvarnode_type)) return julia_to_list2(fl_ctx, (jl_value_t*)newvar_sym, jl_fieldref(v,0)); if (jl_is_long(v) && fits_fixnum(jl_unbox_long(v))) return fixnum(jl_unbox_long(v)); if (jl_is_ssavalue(v)) jl_error("SSAValue objects should not occur in an AST"); if (jl_is_slot(v)) jl_error("Slot objects should not occur in an AST"); value_t opaque = cvalue(fl_ctx, jl_ast_ctx(fl_ctx)->jvtype, sizeof(void*)); *(jl_value_t**)cv_data((cvalue_t*)ptr(opaque)) = v; return opaque; }
static value_t julia_to_scm_(jl_value_t *v) { if (jl_is_symbol(v)) { return symbol(((jl_sym_t*)v)->name); } if (v == jl_true) { return FL_T; } if (v == jl_false) { return FL_F; } if (v == jl_nothing) { return fl_cons(fl_null_sym, FL_NIL); } if (jl_is_expr(v)) { jl_expr_t *ex = (jl_expr_t*)v; value_t args = FL_NIL; fl_gc_handle(&args); array_to_list(ex->args, &args); value_t hd = julia_to_scm_((jl_value_t*)ex->head); value_t scmv = fl_cons(hd, args); fl_free_gc_handles(1); return scmv; } if (jl_typeis(v, jl_linenumbernode_type)) { return julia_to_list2((jl_value_t*)line_sym, jl_fieldref(v,0)); } if (jl_typeis(v, jl_labelnode_type)) { return julia_to_list2((jl_value_t*)label_sym, jl_fieldref(v,0)); } if (jl_typeis(v, jl_gotonode_type)) { return julia_to_list2((jl_value_t*)goto_sym, jl_fieldref(v,0)); } if (jl_typeis(v, jl_quotenode_type)) { return julia_to_list2((jl_value_t*)quote_sym, jl_fieldref(v,0)); } if (jl_typeis(v, jl_newvarnode_type)) { return julia_to_list2((jl_value_t*)newvar_sym, jl_fieldref(v,0)); } if (jl_typeis(v, jl_topnode_type)) { return julia_to_list2((jl_value_t*)top_sym, jl_fieldref(v,0)); } if (jl_is_long(v) && fits_fixnum(jl_unbox_long(v))) { return fixnum(jl_unbox_long(v)); } value_t opaque = cvalue(jvtype, sizeof(void*)); *(jl_value_t**)cv_data((cvalue_t*)ptr(opaque)) = v; return opaque; }