static int symtab_get_matches(jl_sym_t *tree, const char *str, char **answer) { int x, plen, count=0; ios_t ans; plen = strlen(str); while (tree != NULL) { x = common_prefix(str, tree->name); if (x == plen) { ios_mem(&ans, 0); symtab_search(tree, &count, &ans, str, plen); size_t nb; *answer = ios_takebuf(&ans, &nb); return count; } else { x = strcmp(str, tree->name); if (x < 0) tree = tree->left; else tree = tree->right; } } return 0; }
value_t fl_accum_julia_symbol(value_t *args, u_int32_t nargs) { argcount("accum-julia-symbol", nargs, 2); ios_t *s = fl_toiostream(args[1], "accum-julia-symbol"); if (!iscprim(args[0]) || ((cprim_t*)ptr(args[0]))->type != wchartype) type_error("accum-julia-symbol", "wchar", args[0]); uint32_t wc = *(uint32_t*)cp_data((cprim_t*)ptr(args[0])); ios_t str; ios_mem(&str, 0); while (jl_id_char(wc)) { ios_getutf8(s, &wc); if (wc == '!') { uint32_t nwc; ios_peekutf8(s, &nwc); // make sure != is always an operator if (nwc == '=') { ios_ungetc('!', s); break; } } ios_pututf8(&str, wc); if (ios_peekutf8(s, &wc) == IOS_EOF) break; } ios_pututf8(&str, 0); return symbol(normalize(str.buf)); }
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; 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_set_nth_field(str, 0, (jl_value_t*)a); JL_GC_POP(); return str; }
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; 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 { #ifdef STORE_ARRAY_LEN a->length = n; #endif a->nrows = n; ((char*)a->data)[n] = '\0'; } } return (jl_value_t*)a; }
value_t fl_accum_julia_symbol(fl_context_t *fl_ctx, value_t *args, uint32_t nargs) { argcount(fl_ctx, "accum-julia-symbol", nargs, 2); ios_t *s = fl_toiostream(fl_ctx, args[1], "accum-julia-symbol"); if (!iscprim(args[0]) || ((cprim_t*)ptr(args[0]))->type != fl_ctx->wchartype) type_error(fl_ctx, "accum-julia-symbol", "wchar", args[0]); uint32_t wc = *(uint32_t*)cp_data((cprim_t*)ptr(args[0])); ios_t str; int allascii=1; ios_mem(&str, 0); do { allascii &= (wc <= 0x7f); ios_getutf8(s, &wc); if (wc == '!') { uint32_t nwc; ios_peekutf8(s, &nwc); // make sure != is always an operator if (nwc == '=') { ios_ungetc('!', s); break; } } ios_pututf8(&str, wc); if (ios_peekutf8(s, &wc) == IOS_EOF) break; } while (jl_id_char(wc)); ios_pututf8(&str, 0); return symbol(fl_ctx, allascii ? str.buf : normalize(fl_ctx, str.buf)); }
DLLEXPORT jl_value_t *jl_compress_ast(jl_lambda_info_t *li, jl_value_t *ast) { ios_t dest; ios_mem(&dest, 0); int en = jl_gc_is_enabled(); jl_gc_disable(); if (li->roots == NULL) li->roots = jl_alloc_cell_1d(0); tree_literal_values = li->roots; jl_serialize_value(&dest, ast); //JL_PRINTF(JL_STDERR, "%d bytes, %d values\n", dest.size, vals->length); jl_value_t *v = (jl_value_t*)jl_takebuf_array(&dest); if (jl_array_len(tree_literal_values) == 0) { tree_literal_values = (jl_array_t*)jl_an_empty_cell; li->roots = NULL; } v = (jl_value_t*)jl_tuple(4, v, tree_literal_values, jl_lam_body((jl_expr_t*)ast)->etype, jl_lam_capt((jl_expr_t*)ast)); tree_literal_values = NULL; if (en) jl_gc_enable(); return v; }
static int symtab_get_matches(jl_sym_t *tree, const char *str, char **answer) { int x, plen, count=0; ios_t ans; // given str "X.Y.a", set module := X.Y and name := "a" jl_module_t *module = NULL; char *name = NULL, *strcopy = strdup(str); for (char *s=strcopy, *r=NULL;; s=NULL) { char *t = strtok_r(s, ".", &r); if (!t) { if (str[strlen(str)-1] == '.') { // this case is "Module." if (name) { if (!module) module = jl_current_module; module = find_submodule_named(module, name); if (!module) goto symtab_get_matches_exit; } name = ""; } break; } if (name) { if (!module) module = jl_current_module; module = find_submodule_named(module, name); if (!module) goto symtab_get_matches_exit; } name = t; } if (!name) goto symtab_get_matches_exit; plen = strlen(name); while (tree != NULL) { x = common_prefix(name, tree->name); if (x == plen) { ios_mem(&ans, 0); symtab_search(tree, &count, &ans, module, str, name, plen); size_t nb; *answer = ios_takebuf(&ans, &nb); break; } else { x = strcmp(name, tree->name); if (x < 0) tree = tree->left; else tree = tree->right; } } symtab_get_matches_exit: free(strcopy); return count; }
JL_DLLEXPORT jl_value_t *jl_readuntil(ios_t *s, uint8_t delim, uint8_t str, uint8_t chomp) { jl_array_t *a; // manually inlined common case char *pd = (char*)memchr(s->buf + s->bpos, delim, (size_t)(s->size - s->bpos)); if (pd) { size_t n = pd - (s->buf + s->bpos) + 1; if (str) { size_t nchomp = 0; if (chomp) { nchomp = ios_nchomp(s, n); } jl_value_t *str = jl_pchar_to_string(s->buf + s->bpos, n - nchomp); s->bpos += n; return str; } 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; ios_mem(&dest, 0); ios_setbuf(&dest, (char*)a->data, 80, 0); size_t n = ios_copyuntil(&dest, s, delim); if (chomp && n > 0 && dest.buf[n - 1] == '\n') { n--; if (n > 0 && dest.buf[n - 1] == '\r') { n--; } int truncret = ios_trunc(&dest, n); // it should always be possible to truncate dest assert(truncret == 0); (void)truncret; // ensure the variable is used to avoid warnings } if (dest.buf != a->data) { a = jl_take_buffer(&dest); } else { #ifdef STORE_ARRAY_LEN a->length = n; #endif a->nrows = n; ((char*)a->data)[n] = '\0'; } if (str) { JL_GC_PUSH1(&a); jl_value_t *st = jl_array_to_string(a); JL_GC_POP(); return st; } } return (jl_value_t*)a; }
void jl_errorf(const char *fmt, ...) { va_list args; ios_t buf; ios_mem(&buf, 0); va_start(args, fmt); ios_vprintf(&buf, fmt, args); va_end(args); if (jl_errorexception_type == NULL) { JL_PRINTF(JL_STDERR, "%s", buf.buf); jl_exit(1); } jl_value_t *msg = jl_takebuf_string(&buf); JL_GC_PUSH1(&msg); jl_throw(jl_new_struct(jl_errorexception_type, msg)); }
DLLEXPORT jl_value_t *jl_uncompress_ast(jl_tuple_t *data) { jl_array_t *bytes = (jl_array_t*)jl_tupleref(data, 0); tree_literal_values = (jl_array_t*)jl_tupleref(data, 1); ios_t src; ios_mem(&src, 0); ios_setbuf(&src, bytes->data, jl_array_len(bytes), 0); src.size = jl_array_len(bytes); int en = jl_gc_is_enabled(); jl_gc_disable(); jl_gc_ephemeral_on(); jl_value_t *v = jl_deserialize_value(&src); jl_gc_ephemeral_off(); if (en) jl_gc_enable(); tree_literal_values = NULL; return v; }
DLLEXPORT void jl_restore_system_image(char *fname) { ios_t f; char *fpath = jl_find_file_in_path(fname); if (ios_file(&f, fpath, 1, 0, 0, 0) == NULL) { ios_printf(ios_stderr, "system image file not found\n"); exit(1); } #ifdef JL_GC_MARKSWEEP int en = jl_gc_is_enabled(); jl_gc_disable(); #endif tagtype_list = jl_alloc_cell_1d(0); jl_array_type->env = jl_deserialize_value(&f); jl_base_module = (jl_module_t*)jl_deserialize_value(&f); jl_current_module = (jl_module_t*)jl_deserialize_value(&f); jl_system_module = (jl_module_t*)jl_get_global(jl_base_module, jl_symbol("System")); jl_array_t *idtl = (jl_array_t*)jl_deserialize_value(&f); // rehash IdTables for(int i=0; i < idtl->length; i++) { jl_value_t *v = jl_cellref(idtl, i); jl_idtable_rehash(&((jl_array_t**)v)[1], ((jl_array_t**)v)[1]->length); } // cache builtin parametric types for(int i=0; i < tagtype_list->length; i++) { jl_value_t *v = jl_cellref(tagtype_list, i); uint32_t uid=0; if (jl_is_struct_type(v)) uid = ((jl_struct_type_t*)v)->uid; else if (jl_is_bits_type(v)) uid = ((jl_bits_type_t*)v)->uid; jl_cache_type_((jl_tag_type_t*)v); if (jl_is_struct_type(v)) ((jl_struct_type_t*)v)->uid = uid; else if (jl_is_bits_type(v)) ((jl_bits_type_t*)v)->uid = uid; } jl_get_builtin_hooks(); jl_get_system_hooks(); jl_boot_file_loaded = 1; jl_typeinf_func = (jl_function_t*)jl_get_global(jl_system_module, jl_symbol("typeinf_ext")); jl_init_box_caches(); //jl_deserialize_finalizers(&f); jl_set_t_uid_ctr(read_int32(&f)); jl_set_gs_ctr(read_int32(&f)); htable_reset(&backref_table, 0); ios_t ss; ios_mem(&ss, 0); ios_copyuntil(&ss, &f, '\0'); ios_close(&f); if (fpath != fname) free(fpath); #ifdef JL_GC_MARKSWEEP if (en) jl_gc_enable(); #endif // TODO: there is no exception handler here! jl_load_file_string(ss.buf); ios_close(&ss); }