static pic_value pic_error_with_exception_handler(pic_state *pic) { struct pic_proc *handler, *thunk; pic_value val; size_t xp_len; ptrdiff_t xp_offset; pic_get_args(pic, "ll", &handler, &thunk); if (pic->xp >= pic->xpend) { xp_len = (size_t)(pic->xpend - pic->xpbase) * 2; xp_offset = pic->xp - pic->xpbase; pic->xpbase = pic_realloc(pic, pic->xpbase, sizeof(struct pic_proc *) * xp_len); pic->xp = pic->xpbase + xp_offset; pic->xpend = pic->xpbase + xp_len; } *pic->xp++ = handler; val = pic_apply0(pic, thunk); --pic->xp; return val; }
static void gc_protect(pic_state *pic, struct object *obj) { if (pic->ai >= pic->arena_size) { pic->arena_size = pic->arena_size * 2 + 1; pic->arena = pic_realloc(pic, pic->arena, sizeof(struct object *) * pic->arena_size); } pic->arena[pic->ai++] = obj; }
void pic_vec_extend_ip(pic_state *pic, struct pic_vector *vec, size_t size) { size_t len, i; len = vec->len; vec->len = size; vec->data = (pic_value *)pic_realloc(pic, vec->data, sizeof(pic_value) * size); for (i = len; i < size; ++i) { vec->data[i] = pic_none_value(); } }
pic_value pic_protect(pic_state *pic, pic_value v) { if (! pic_obj_p(pic, v)) return v; if (pic->ai >= pic->arena_size) { pic->arena_size = pic->arena_size * 2 + 1; pic->arena = pic_realloc(pic, pic->arena, sizeof(struct object *) * pic->arena_size); } pic->arena[pic->ai++] = pic_ptr(pic, v); return v; }
void pic_push_handler(pic_state *pic, struct pic_proc *handler) { size_t xp_len; ptrdiff_t xp_offset; if (pic->xp >= pic->xpend) { xp_len = (size_t)(pic->xpend - pic->xpbase) * 2; xp_offset = pic->xp - pic->xpbase; pic->xpbase = pic_realloc(pic, pic->xpbase, sizeof(struct pic_proc *) * xp_len); pic->xp = pic->xpbase + xp_offset; pic->xpend = pic->xpbase + xp_len; } *pic->xp++ = handler; }
static pic_value pic_port_read_blob(pic_state *pic) { struct pic_port *port = pic_stdin(pic); pic_blob *blob; size_t k, i; pic_get_args(pic, "k|p", &k, &port); assert_port_profile(port, PIC_PORT_IN | PIC_PORT_BINARY, PIC_PORT_OPEN, "read-bytevector"); blob = pic_make_blob(pic, k); i = xfread(blob->data, sizeof(char), k, port->file); if (i == 0) { return pic_eof_object(); } else { pic_realloc(pic, blob->data, i); blob->len = i; return pic_obj_value(blob); } }
void pic_push_try(pic_state *pic, struct pic_escape *escape) { struct pic_proc *cont, *handler; size_t xp_len; ptrdiff_t xp_offset; cont = pic_make_econt(pic, escape); handler = pic_make_proc(pic, native_exception_handler, "(native-exception-handler)"); pic_attr_set(pic, pic_obj_value(handler), "@@escape", pic_obj_value(cont)); if (pic->xp >= pic->xpend) { xp_len = (size_t)(pic->xpend - pic->xpbase) * 2; xp_offset = pic->xp - pic->xpbase; pic->xpbase = pic_realloc(pic, pic->xpbase, sizeof(struct pic_proc *) * xp_len); pic->xp = pic->xpbase + xp_offset; pic->xpend = pic->xpbase + xp_len; } *pic->xp++ = handler; }
static pic_value pic_error_with_exception_handler(pic_state *pic) { struct pic_proc *handler, *thunk; pic_value v; pic_get_args(pic, "ll", &handler, &thunk); if (pic->ridx >= pic->rlen) { #if DEBUG puts("rescue realloced"); #endif pic->rlen *= 2; pic->rescue = (struct pic_proc **)pic_realloc(pic, pic->rescue, sizeof(struct pic_proc *) * pic->rlen); } pic->rescue[pic->ridx++] = handler; v = pic_apply_argv(pic, thunk, 0); pic->ridx--; return v; }
void * pic_malloc(pic_state *pic, size_t size) { return pic_realloc(pic, NULL, size); }