sexp sexp_make_bignum (sexp ctx, sexp_uint_t len) { sexp_uint_t size = sexp_sizeof(bignum) + len*sizeof(sexp_uint_t); sexp res = sexp_alloc_tagged(ctx, size, SEXP_BIGNUM); sexp_bignum_length(res) = len; sexp_bignum_sign(res) = 1; return res; }
static sexp sexp_heap_walk (sexp ctx, int depth, int printp) { size_t freed; sexp_uint_t stats[256], hi_type=0, i; sexp_heap h = sexp_context_heap(ctx); sexp p, out=SEXP_FALSE; sexp_free_list q, r; char *end; sexp_gc_var3(res, tmp, name); if (printp) out = sexp_parameter_ref(ctx, sexp_env_ref(ctx, sexp_context_env(ctx), sexp_global(ctx,SEXP_G_CUR_OUT_SYMBOL), SEXP_FALSE)); /* run gc once to remove unused variables */ sexp_gc(ctx, &freed); /* initialize stats */ for (i=0; i<256; i++) stats[i]=0; /* loop over each heap chunk */ for ( ; h; h=h->next) { p = (sexp) (h->data + sexp_heap_align(sexp_sizeof(pair))); q = h->free_list; end = (char*)h->data + h->size; while (((char*)p) < end) { /* find the preceding and succeeding free list pointers */ for (r=q->next; r && ((char*)r<(char*)p); q=r, r=r->next) ; if ((char*)r == (char*)p) { /* this is a free block, skip */ p = (sexp) (((char*)p) + r->size); continue; } /* otherwise maybe print, then increment the stat and continue */ if (sexp_oportp(out)) { sexp_print_simple(ctx, p, out, depth); sexp_write_char(ctx, '\n', out); } stats[sexp_pointer_tag(p)]++; if (sexp_pointer_tag(p) > hi_type) hi_type = sexp_pointer_tag(p); p = (sexp) (((char*)p) + sexp_heap_align(sexp_allocated_bytes(ctx, p))); } } /* build and return results */ sexp_gc_preserve3(ctx, res, tmp, name); res = SEXP_NULL; for (i=hi_type; i>0; i--) if (stats[i]) { name = sexp_string_to_symbol(ctx, sexp_type_name_by_index(ctx, i)); tmp = sexp_cons(ctx, name, sexp_make_fixnum(stats[i])); res = sexp_cons(ctx, tmp, res); } sexp_gc_release3(ctx); return res; }
static sexp sexp_make_timeval_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0, sexp arg1) { struct timeval* r; sexp_gc_var1(res); sexp_gc_preserve1(ctx, res); res = sexp_alloc_tagged(ctx, sexp_sizeof(cpointer), sexp_unbox_fixnum(sexp_opcode_return_type(self))); sexp_cpointer_value(res) = calloc(1, sizeof(struct timeval)); r = (struct timeval*) sexp_cpointer_value(res); memset(r, 0, sizeof(struct timeval)); sexp_freep(res) = 1; r->tv_sec = sexp_unshift_epoch(sexp_uint_value(arg0)); r->tv_usec = sexp_sint_value(arg1); sexp_gc_release1(ctx); return res; }
sexp sexp_copy_bignum (sexp ctx, sexp dst, sexp a, sexp_uint_t len0) { sexp_uint_t len = (len0 > 0) ? len0 : sexp_bignum_length(a), size; size = sexp_sizeof(bignum) + len*sizeof(sexp_uint_t); if (! dst || sexp_bignum_length(dst) < len) { dst = sexp_alloc_tagged(ctx, size, SEXP_BIGNUM); memmove(dst, a, size); sexp_bignum_length(dst) = len; } else { memset(dst->value.bignum.data, 0, sexp_bignum_length(dst)*sizeof(sexp_uint_t)); memmove(dst->value.bignum.data, a->value.bignum.data, sexp_bignum_length(a)*sizeof(sexp_uint_t)); } return dst; }
static sexp sexp_make_tm_stub (sexp ctx, sexp self, sexp_sint_t n, sexp arg0, sexp arg1, sexp arg2, sexp arg3, sexp arg4, sexp arg5, sexp arg6) { struct tm* r; sexp_gc_var1(res); sexp_gc_preserve1(ctx, res); res = sexp_alloc_tagged(ctx, sexp_sizeof(cpointer), sexp_unbox_fixnum(sexp_opcode_return_type(self))); sexp_cpointer_value(res) = calloc(1, sizeof(struct tm)); r = (struct tm*) sexp_cpointer_value(res); memset(r, 0, sizeof(struct tm)); sexp_freep(res) = 1; r->tm_sec = sexp_sint_value(arg0); r->tm_min = sexp_sint_value(arg1); r->tm_hour = sexp_sint_value(arg2); r->tm_mday = sexp_sint_value(arg3); r->tm_mon = sexp_sint_value(arg4); r->tm_year = sexp_sint_value(arg5); r->tm_isdst = sexp_sint_value(arg6); sexp_gc_release1(ctx); return res; }