void jl_load(const char *fname) { char *fpath = (char*)fname; struct stat stbuf; if (jl_stat(fpath, (char*)&stbuf) != 0) { jl_errorf("could not open file %s", fpath); } jl_start_parsing_file(fpath); jl_parse_eval_all(fpath); if (fpath != fname) free(fpath); }
void jl_load(const char *fname) { if (jl_current_module == jl_base_module) { //This deliberatly uses ios, because stdio initialization has been moved to Julia jl_printf(JL_STDOUT, "%s\n", fname); } char *fpath = (char*)fname; uv_statbuf_t stbuf; if (jl_stat(fpath, (char*)&stbuf) != 0 || (stbuf.st_mode & S_IFMT) != S_IFREG) { jl_errorf("could not open file %s", fpath); } jl_start_parsing_file(fpath); jl_parse_eval_all(fpath); if (fpath != fname) free(fpath); if (jl_current_module == jl_base_module) { jl_printf(JL_STDOUT, "\e[1F\e[2K"); }
jl_value_t *jl_load(const char *fname, size_t len) { if (jl_current_module->istopmod) { jl_printf(JL_STDOUT, "%s\r\n", fname); #ifdef _OS_WINDOWS_ uv_run(uv_default_loop(), (uv_run_mode)1); #endif } char *fpath = (char*)fname; uv_stat_t stbuf; if (jl_stat(fpath, (char*)&stbuf) != 0 || (stbuf.st_mode & S_IFMT) != S_IFREG) { jl_errorf("could not open file %s", fpath); } if (jl_start_parsing_file(fpath) != 0) { jl_errorf("could not open file %s", fpath); } jl_value_t *result = jl_parse_eval_all(fpath, len); if (fpath != fname) free(fpath); return result; }
jl_value_t *jl_load(const char *fname) { if (jl_current_module == jl_base_module) { //This deliberatly uses ios, because stdio initialization has been moved to Julia jl_printf(JL_STDOUT, "%s\r\n", fname); #ifdef _OS_WINDOWS_ uv_run(uv_default_loop(), (uv_run_mode)1); #endif } char *fpath = (char*)fname; uv_stat_t stbuf; if (jl_stat(fpath, (char*)&stbuf) != 0 || (stbuf.st_mode & S_IFMT) != S_IFREG) { jl_errorf("could not open file %s", fpath); } if (jl_start_parsing_file(fpath) != 0) { jl_errorf("could not open file %s", fpath); } jl_value_t *result = jl_parse_eval_all(fpath); if (fpath != fname) free(fpath); return result; }
void parse_opts(int *argcp, char ***argvp) { static char* shortopts = "+H:T:hJ:"; static struct option longopts[] = { { "home", required_argument, 0, 'H' }, { "tab", required_argument, 0, 'T' }, { "build", required_argument, 0, 'b' }, { "lisp", no_argument, &lisp_prompt, 1 }, { "help", no_argument, 0, 'h' }, { "sysimage", required_argument, 0, 'J' }, { 0, 0, 0, 0 } }; int c; opterr = 0; int imagepathspecified=0; image_file = JL_SYSTEM_IMAGE_PATH; int skip = 0; int lastind = optind; while ((c = getopt_long(*argcp,*argvp,shortopts,longopts,0)) != -1) { switch (c) { case 0: break; case '?': if (optind != lastind) skip++; lastind = optind; break; case 'H': julia_home = strdup(optarg); break; case 'T': // TODO: more robust error checking. tab_width = atoi(optarg); break; case 'b': build_mode = strdup(optarg); if (!imagepathspecified) image_file = NULL; break; case 'J': image_file = strdup(optarg); imagepathspecified = 1; break; case 'h': printf("%s%s", usage, opts); exit(0); default: ios_printf(ios_stderr, "julia: unhandled option -- %c\n", c); ios_printf(ios_stderr, "This is a bug, please report it.\n"); exit(1); } } if (!julia_home) { julia_home = getenv("JULIA_HOME"); if (julia_home) { julia_home = strdup(julia_home); } else { char *julia_path = (char*)malloc(PATH_MAX); size_t path_size = PATH_MAX; uv_exepath(julia_path, &path_size); julia_home = strdup(dirname(julia_path)); free(julia_path); } } optind -= skip; *argvp += optind; *argcp -= optind; if (image_file==NULL && *argcp > 0) { if (strcmp((*argvp)[0], "-")) { program = (*argvp)[0]; } } if (image_file) { if (image_file[0] != PATHSEP) { struct stat stbuf; char path[512]; if (!imagepathspecified) { // build time path relative to JULIA_HOME snprintf(path, sizeof(path), "%s%s", julia_home, PATHSEPSTRING JL_SYSTEM_IMAGE_PATH); image_file = strdup(path); } else if (jl_stat(image_file, (char*)&stbuf) != 0) { // otherwise try julia_home/../lib/julia/%s snprintf(path, sizeof(path), "%s%s%s", julia_home, PATHSEPSTRING ".." PATHSEPSTRING "lib" PATHSEPSTRING "julia" PATHSEPSTRING, image_file); image_file = strdup(path); } } } }
JL_DLLEXPORT void *jl_load_dynamic_library(const char *modname, unsigned flags, int throw_err) { char path[PATHBUF]; int i; uv_stat_t stbuf; void *handle; int abspath; // number of extensions to try — if modname already ends with the // standard extension, then we don't try adding additional extensions int n_extensions = endswith_extension(modname) ? 1 : N_EXTENSIONS; /* this branch returns handle of libjulia */ if (modname == NULL) { #ifdef _OS_WINDOWS_ if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCWSTR)(uintptr_t)(&jl_load_dynamic_library), (HMODULE*)&handle)) { jl_error("could not load base module"); } #else Dl_info info; if (!dladdr((void*)(uintptr_t)&jl_load_dynamic_library, &info) || !info.dli_fname) jl_error("could not load base module"); handle = dlopen(info.dli_fname, RTLD_NOW); #endif goto done; } abspath = isabspath(modname); /* this branch permutes all base paths in DL_LOAD_PATH with all extensions note: skip when !jl_base_module to avoid UndefVarError(:DL_LOAD_PATH), and also skip for absolute paths */ if (!abspath && jl_base_module != NULL) { jl_array_t *DL_LOAD_PATH = (jl_array_t*)jl_get_global(jl_base_module, jl_symbol("DL_LOAD_PATH")); if (DL_LOAD_PATH != NULL) { size_t j; for (j = 0; j < jl_array_len(DL_LOAD_PATH); j++) { char *dl_path = jl_string_data(jl_array_ptr_data(DL_LOAD_PATH)[j]); size_t len = strlen(dl_path); if (len == 0) continue; for (i=0; i < n_extensions; i++) { const char *ext = extensions[i]; path[0] = '\0'; if (dl_path[len-1] == PATHSEPSTRING[0]) snprintf(path, PATHBUF, "%s%s%s", dl_path, modname, ext); else snprintf(path, PATHBUF, "%s" PATHSEPSTRING "%s%s", dl_path, modname, ext); handle = jl_dlopen(path, flags); if (handle) goto done; // bail out and show the error if file actually exists if (jl_stat(path, (char*)&stbuf) == 0) goto notfound; } } } } // now fall back and look in default library paths, for all extensions for(i=0; i < n_extensions; i++) { const char *ext = extensions[i]; path[0] = '\0'; snprintf(path, PATHBUF, "%s%s", modname, ext); handle = jl_dlopen(path, flags); if (handle) goto done; } notfound: if (throw_err) { const char * reason = jl_dlerror(); jl_errorf("could not load library \"%s\"\n%s", modname, reason); } return NULL; done: return handle; }
void parse_opts(int *argcp, char ***argvp) { static char* shortopts = "+H:T:hJ:"; static struct option longopts[] = { { "home", required_argument, 0, 'H' }, { "tab", required_argument, 0, 'T' }, { "build", required_argument, 0, 'b' }, { "lisp", no_argument, &lisp_prompt, 1 }, { "help", no_argument, 0, 'h' }, { "sysimage", required_argument, 0, 'J' }, { "code-coverage", optional_argument, 0, 'c' }, { "track-allocation",required_argument, 0, 'm' }, { "check-bounds", required_argument, 0, 300 }, { "int-literals", required_argument, 0, 301 }, { "dump-bitcode", required_argument, 0, 302 }, { "compile", required_argument, 0, 303 }, { 0, 0, 0, 0 } }; int c; opterr = 0; int imagepathspecified=0; image_file = system_image; int skip = 0; int lastind = optind; while ((c = getopt_long(*argcp,*argvp,shortopts,longopts,0)) != -1) { switch (c) { case 0: break; case '?': if (optind != lastind) skip++; lastind = optind; break; case 'H': julia_home = strdup(optarg); break; case 'b': jl_compileropts.build_path = strdup(optarg); if (!imagepathspecified) image_file = NULL; break; case 'J': image_file = strdup(optarg); imagepathspecified = 1; break; case 'h': printf("%s%s", usage, opts); exit(0); case 'c': if (optarg != NULL) { if (!strcmp(optarg,"user")) codecov = JL_LOG_USER; else if (!strcmp(optarg,"all")) codecov = JL_LOG_ALL; else if (!strcmp(optarg,"none")) codecov = JL_LOG_NONE; break; } else codecov = JL_LOG_USER; break; case 'm': if (optarg != NULL) { if (!strcmp(optarg,"user")) malloclog = JL_LOG_USER; else if (!strcmp(optarg,"all")) malloclog = JL_LOG_ALL; else if (!strcmp(optarg,"none")) malloclog = JL_LOG_NONE; break; } case 300: if (!strcmp(optarg,"yes")) jl_compileropts.check_bounds = JL_COMPILEROPT_CHECK_BOUNDS_ON; else if (!strcmp(optarg,"no")) jl_compileropts.check_bounds = JL_COMPILEROPT_CHECK_BOUNDS_OFF; break; case 301: if (!strcmp(optarg,"32")) jl_compileropts.int_literals = 32; else if (!strcmp(optarg,"64")) jl_compileropts.int_literals = 64; else { ios_printf(ios_stderr, "julia: invalid integer literal size (%s)\n", optarg); exit(1); } break; case 302: if (!strcmp(optarg,"yes")) jl_compileropts.dumpbitcode = JL_COMPILEROPT_DUMPBITCODE_ON; else if (!strcmp(optarg,"no")) jl_compileropts.dumpbitcode = JL_COMPILEROPT_DUMPBITCODE_OFF; break; case 303: if (!strcmp(optarg,"yes")) jl_compileropts.compile_enabled = 1; else if (!strcmp(optarg,"no")) jl_compileropts.compile_enabled = 0; else if (!strcmp(optarg,"all")) jl_compileropts.compile_enabled = 2; else { ios_printf(ios_stderr, "julia: invalid argument to --compile (%s)\n", optarg); exit(1); } break; default: ios_printf(ios_stderr, "julia: unhandled option -- %c\n", c); ios_printf(ios_stderr, "This is a bug, please report it.\n"); exit(1); } } jl_compileropts.code_coverage = codecov; jl_compileropts.malloc_log = malloclog; if (!julia_home) { julia_home = getenv("JULIA_HOME"); if (julia_home) { julia_home = strdup(julia_home); } else { char *julia_path = (char*)malloc(PATH_MAX); size_t path_size = PATH_MAX; uv_exepath(julia_path, &path_size); julia_home = strdup(dirname(julia_path)); free(julia_path); } } optind -= skip; *argvp += optind; *argcp -= optind; if (image_file==NULL && *argcp > 0) { if (strcmp((*argvp)[0], "-")) { program = (*argvp)[0]; } } if (image_file) { if (image_file[0] != PATHSEP) { uv_stat_t stbuf; char path[512]; if (!imagepathspecified) { // build time path relative to JULIA_HOME snprintf(path, sizeof(path), "%s%s%s", julia_home, PATHSEPSTRING, system_image); image_file = strdup(path); } else if (jl_stat(image_file, (char*)&stbuf) != 0) { // otherwise try julia_home/../lib/julia/%s snprintf(path, sizeof(path), "%s%s%s", julia_home, PATHSEPSTRING ".." PATHSEPSTRING "lib" PATHSEPSTRING "julia" PATHSEPSTRING, image_file); image_file = strdup(path); } } } }
static void *jl_load_dynamic_library_(const char *modname, unsigned flags, int throw_err) { char *ext; char path[PATHBUF]; int i; uv_stat_t stbuf; void *handle; /* this branch returns handle of libjulia */ if (modname == NULL) { #ifdef _OS_WINDOWS_ if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCWSTR)(&jl_load_dynamic_library), (HMODULE*)&handle)) { jl_error("could not load base module"); } #else handle = dlopen(NULL, RTLD_NOW); #endif goto done; } /* this branch shortcuts absolute paths */ #ifdef _OS_WINDOWS_ else if (modname[1] == ':') { #else else if (modname[0] == '/') { #endif handle = jl_dlopen(modname, flags); if (handle) goto done; // bail out and show the error if file actually exists if (jl_stat(modname, (char*)&stbuf) == 0) goto notfound; } /* this branch permutes all base paths in DL_LOAD_PATH with all extensions note: skip when !jl_base_module to avoid UndefVarError(:DL_LOAD_PATH) */ else if (jl_base_module != NULL) { jl_array_t *DL_LOAD_PATH = (jl_array_t*)jl_get_global(jl_base_module, jl_symbol("DL_LOAD_PATH")); if (DL_LOAD_PATH != NULL) { size_t j; for (j = 0; j < jl_array_len(DL_LOAD_PATH); j++) { char *dl_path = jl_string_data(jl_cell_data(DL_LOAD_PATH)[j]); size_t len = strlen(dl_path); if (len == 0) continue; for(i=0; i < N_EXTENSIONS; i++) { ext = extensions[i]; path[0] = '\0'; handle = NULL; if (dl_path[len-1] == PATHSEPSTRING[0]) snprintf(path, PATHBUF, "%s%s%s", dl_path, modname, ext); else snprintf(path, PATHBUF, "%s" PATHSEPSTRING "%s%s", dl_path, modname, ext); handle = jl_dlopen(path, flags); if (handle) goto done; // bail out and show the error if file actually exists if (jl_stat(path, (char*)&stbuf) == 0) goto notfound; } } } } // now fall back and look in default library paths, for all extensions for(i=0; i < N_EXTENSIONS; i++) { ext = extensions[i]; path[0] = '\0'; handle = NULL; snprintf(path, PATHBUF, "%s%s", modname, ext); handle = jl_dlopen(path, flags); if (handle) goto done; } #if defined(__linux__) || defined(__FreeBSD__) // check map of versioned libs from "libX" to full soname "libX.so.ver" { const char *soname = jl_lookup_soname(modname, strlen(modname)); if (soname) { handle = jl_dlopen(soname, flags); if (handle) goto done; } } #endif notfound: if (throw_err) jl_dlerror("could not load library \"%s\"\n%s", modname); return NULL; done: return handle; } JL_DLLEXPORT void *jl_load_dynamic_library_e(const char *modname, unsigned flags) { return jl_load_dynamic_library_(modname, flags, 0); } JL_DLLEXPORT void *jl_load_dynamic_library(const char *modname, unsigned flags) { return jl_load_dynamic_library_(modname, flags, 1); } JL_DLLEXPORT void *jl_dlsym_e(void *handle, const char *symbol) { #ifdef _OS_WINDOWS_ void *ptr = GetProcAddress((HMODULE) handle, symbol); #else dlerror(); /* Reset error status. */ void *ptr = dlsym(handle, symbol); #endif return ptr; }
static uv_lib_t *jl_load_dynamic_library_(const char *modname, unsigned flags, int throw_err) { int error; char *ext; char path[PATHBUF]; int i; uv_stat_t stbuf; uv_lib_t *handle = (uv_lib_t*)malloc(sizeof(uv_lib_t)); handle->errmsg = NULL; /* this branch returns handle of libjulia */ if (modname == NULL) { #ifdef _OS_WINDOWS_ if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCWSTR)(&jl_load_dynamic_library), &handle->handle)) { free(handle); jl_error("could not load base module"); } #else handle->handle = dlopen(NULL,RTLD_NOW); #endif goto done; } /* this branch shortcuts absolute paths */ #ifdef _OS_WINDOWS_ else if (modname[1] == ':') { #else else if (modname[0] == '/') { #endif error = jl_uv_dlopen(modname,handle,flags); if (!error) goto done; // bail out and show the error if file actually exists if (jl_stat(modname, (char*)&stbuf) == 0) goto notfound; if (handle->errmsg) uv_dlclose(handle); } /* this branch permutes all base paths in DL_LOAD_PATH with all extensions note: skip when !jl_base_module to avoid UndefVarError(:DL_LOAD_PATH) */ else if (jl_base_module != NULL) { jl_array_t *DL_LOAD_PATH = (jl_array_t*)jl_get_global(jl_base_module, jl_symbol("DL_LOAD_PATH")); if (DL_LOAD_PATH != NULL) { size_t j; for (j = 0; j < jl_array_len(DL_LOAD_PATH); j++) { char *dl_path = jl_string_data(jl_cell_data(DL_LOAD_PATH)[j]); size_t len = strlen(dl_path); if (len == 0) continue; for(i=0; i < N_EXTENSIONS; i++) { ext = extensions[i]; path[0] = '\0'; handle->handle = NULL; if (dl_path[len-1] == PATHSEPSTRING[0]) snprintf(path, PATHBUF, "%s%s%s", dl_path, modname, ext); else snprintf(path, PATHBUF, "%s" PATHSEPSTRING "%s%s", dl_path, modname, ext); // free handle->errmsg, else it will leak on next uv_dlopen if (handle->errmsg) uv_dlclose(handle); error = jl_uv_dlopen(path, handle, flags); if (!error) goto done; // bail out and show the error if file actually exists if (jl_stat(path, (char*)&stbuf) == 0) goto notfound; } } } } // now fall back and look in default library paths, for all extensions for(i=0; i < N_EXTENSIONS; i++) { ext = extensions[i]; path[0] = '\0'; handle->handle = NULL; snprintf(path, PATHBUF, "%s%s", modname, ext); if (handle->errmsg) uv_dlclose(handle); error = jl_uv_dlopen(path, handle, flags); if (!error) goto done; } #if defined(__linux__) || defined(__FreeBSD__) // check map of versioned libs from "libX" to full soname "libX.so.ver" { const char *soname = jl_lookup_soname(modname, strlen(modname)); error = (soname==NULL) || jl_uv_dlopen(soname, handle, flags); if (!error) goto done; } #endif notfound: // copy the error message into the path buffer so we can free the lib handle path[0] = '\0'; snprintf(path, PATHBUF, "%s", uv_dlerror(handle)); uv_dlclose(handle); free(handle); if (throw_err) jl_errorf("could not load library '%s'\n%s", modname, path); return NULL; done: return handle; } jl_uv_libhandle jl_load_dynamic_library_e(const char *modname, unsigned flags) { return (jl_uv_libhandle) jl_load_dynamic_library_(modname, flags, 0); } jl_uv_libhandle jl_load_dynamic_library(const char *modname, unsigned flags) { return (jl_uv_libhandle) jl_load_dynamic_library_(modname, flags, 1); } void *jl_dlsym_e(jl_uv_libhandle handle, const char *symbol) { void *ptr; int error = uv_dlsym((uv_lib_t *) handle, symbol, &ptr); if (error) ptr=NULL; return ptr; }