jl_value_t *jl_readuntil(ios_t *s, uint8_t delim) { jl_array_t *a; // manually inlined common case char *pd = (char*)memchr(s->buf+s->bpos, delim, s->size - s->bpos); if (pd) { size_t n = pd-(s->buf+s->bpos)+1; a = jl_alloc_array_1d(jl_array_uint8_type, n); memcpy(jl_array_data(a), s->buf+s->bpos, n); s->bpos += n; } else { a = jl_alloc_array_1d(jl_array_uint8_type, 80); ios_t dest; jl_ios_mem(&dest, 0); ios_setbuf(&dest, a->data, 80, 0); size_t n = ios_copyuntil(&dest, s, delim); if (dest.buf != a->data) { a = jl_takebuf_array(&dest); } else { a->length = n; a->nrows = n; ((char*)a->data)[n] = '\0'; } } JL_GC_PUSH(&a); jl_struct_type_t* string_type = u8_isvalid(a->data, a->length) == 1 ? // ASCII jl_ascii_string_type : jl_utf8_string_type; jl_value_t *str = alloc_2w(); str->type = (jl_type_t*)string_type; jl_fieldref(str,0) = (jl_value_t*)a; JL_GC_POP(); return str; }
DLLEXPORT jl_weakref_t *jl_gc_new_weakref(jl_value_t *value) { jl_weakref_t *wr = (jl_weakref_t*)alloc_2w(); wr->type = (jl_type_t*)jl_weakref_type; wr->value = value; arraylist_push(&weak_refs, wr); return wr; }
jl_value_t *jl_array_to_string(jl_array_t *a) { // TODO: check type of array? jl_struct_type_t* string_type = u8_isvalid(a->data, a->length) == 1 ? // ASCII jl_ascii_string_type : jl_utf8_string_type; jl_value_t *s = alloc_2w(); s->type = (jl_type_t*)string_type; jl_set_nth_field(s, 0, (jl_value_t*)a); return s; }
jl_tuple_t *jl_tuple1(void *a) { #ifdef OVERLAP_TUPLE_LEN jl_tuple_t *t = (jl_tuple_t*)alloc_2w(); #else jl_tuple_t *t = (jl_tuple_t*)alloc_3w(); #endif t->type = (jl_value_t*)jl_tuple_type; jl_tuple_set_len_unsafe(t, 1); jl_tupleset(t, 0, a); return t; }