// returns either an expression or a thunk jl_value_t *jl_expand(jl_value_t *expr) { int np = jl_gc_n_preserved_values(); value_t arg = julia_to_scm(expr); value_t e = fl_applyn(1, symbol_value(symbol("jl-expand-to-thunk")), arg); jl_value_t *result = scm_to_julia(e,0); while (jl_gc_n_preserved_values() > np) { jl_gc_unpreserve(); } return result; }
DLLEXPORT jl_value_t *jl_macroexpand(jl_value_t *expr) { int np = jl_gc_n_preserved_values(); value_t arg = julia_to_scm(expr); value_t e = fl_applyn(1, symbol_value(symbol("jl-macroexpand")), arg); jl_value_t *result; result = scm_to_julia(e); while (jl_gc_n_preserved_values() > np) { jl_gc_unpreserve(); } return result; }
// returns either an expression or a thunk jl_value_t *jl_expand(jl_value_t *expr) { int np = jl_gc_n_preserved_values(); value_t arg = julia_to_scm(expr); value_t e = fl_applyn(1, symbol_value(symbol("jl-expand-to-thunk")), arg); jl_value_t *result; if (e == FL_T || e == FL_F || e == FL_EOF) { result = NULL; } else { result = scm_to_julia(e); } while (jl_gc_n_preserved_values() > np) { jl_gc_unpreserve(); } return result; }
static jl_array_t *_new_array(jl_type_t *atype, uint32_t ndims, size_t *dims) { size_t i, tot, nel=1; int isunboxed=0, elsz; void *data; jl_array_t *a; for(i=0; i < ndims; i++) { nel *= dims[i]; } jl_type_t *el_type = (jl_type_t*)jl_tparam0(atype); isunboxed = jl_is_bits_type(el_type); if (isunboxed) { elsz = jl_bitstype_nbits(el_type)/8; tot = elsz * nel; if (elsz == 1) { // hidden 0 terminator for all byte arrays tot++; } } else { elsz = sizeof(void*); tot = sizeof(void*) * nel; } int ndimwords = (ndims > 2 ? (ndims-2) : 0); #ifndef __LP64__ // on 32-bit, ndimwords must be odd to preserve 8-byte alignment ndimwords += (~ndimwords)&1; #endif if (tot <= ARRAY_INLINE_NBYTES) { a = allocobj(sizeof(jl_array_t) + tot + (ndimwords-1)*sizeof(size_t)); a->type = atype; data = (&a->_space[0] + ndimwords*sizeof(size_t)); if (tot > 0 && !isunboxed) { memset(data, 0, tot); } } else { a = allocobj(sizeof(jl_array_t) + (ndimwords-1)*sizeof(size_t)); jl_gc_preserve((jl_value_t*)a); a->type = atype; // temporarily initialize to make gc-safe a->data = NULL; a->length = 0; a->reshaped = 0; data = alloc_array_buffer(tot, isunboxed); jl_gc_unpreserve(); } a->data = data; if (elsz == 1) ((char*)data)[tot-1] = '\0'; a->length = nel; a->ndims = ndims; a->reshaped = 0; a->elsize = elsz; if (ndims == 1) { a->nrows = nel; a->maxsize = nel; a->offset = 0; } else { size_t *adims = &a->nrows; for(i=0; i < ndims; i++) adims[i] = dims[i]; } return a; }