Ticket #560: parrot_libloading_2.patch

File parrot_libloading_2.patch, 3.4 KB (added by wayland, 5 years ago)

Code to show path during error while loading library

  • src/library.c

     
    768768 
    769769/* 
    770770 
     771=item C<STRING* Parrot_path_str> 
     772 
     773Returns a STRING that contains the specified path, separated by colons (:).   
     774 
     775The C<enum_runtime_ft type> is one or more of the types defined in 
     776F<include/parrot/library.h>. 
     777 
     778=cut 
     779 
     780*/ 
     781 
     782PARROT_EXPORT 
     783PARROT_WARN_UNUSED_RESULT 
     784PARROT_CAN_RETURN_NULL 
     785STRING* 
     786Parrot_path_str(PARROT_INTERP, enum_runtime_ft type) 
     787{ 
     788    ASSERT_ARGS(Parrot_path_str) 
     789    STRING *prefix; 
     790    STRING *full_path; 
     791    PMC    *paths; 
     792    INTVAL  i, n; 
     793 
     794/* TODO: Get the real separator, not this hacked-together stuff */ 
     795#ifdef WIN32 
     796    STRING * const envpathsep = CONST_STRING(interp, ";");  
     797#else 
     798    STRING * const envpathsep = CONST_STRING(interp, ":"); 
     799#endif 
     800 
     801    if (type & PARROT_RUNTIME_FT_DYNEXT) 
     802        paths = get_search_paths(interp, PARROT_LIB_PATH_DYNEXT); 
     803    else if (type & (PARROT_RUNTIME_FT_PBC | PARROT_RUNTIME_FT_SOURCE)) 
     804        paths = get_search_paths(interp, PARROT_LIB_PATH_LIBRARY); 
     805    else 
     806        paths = get_search_paths(interp, PARROT_LIB_PATH_INCLUDE); 
     807 
     808    prefix = Parrot_get_runtime_path(interp); 
     809    n = VTABLE_elements(interp, paths); 
     810 
     811    for (i = 0; i < n; ++i) { 
     812        STRING * const path = VTABLE_get_string_keyed_int(interp, paths, i); 
     813        STRING *found_name; 
     814 
     815        if ( 0 == i ) { 
     816            full_path = Parrot_str_copy(interp, path); 
     817        } else { 
     818            if(path) { 
     819                full_path = Parrot_str_append(interp, full_path, envpathsep); 
     820                full_path = Parrot_str_append(interp, full_path, path); 
     821            } 
     822        } 
     823    } 
     824 
     825    return full_path; 
     826} 
     827 
     828/* 
     829 
    771830=item C<char* Parrot_get_runtime_prefix(PARROT_INTERP)> 
    772831 
    773832Return a malloced C-string for the runtime prefix.  The calling function 
  • src/dynext.c

     
    620620        /* 
    621621         * XXX Parrot_ex_throw_from_c_args? return PMCNULL? 
    622622         * PMC Undef seems convenient, because it can be queried with get_bool() 
     623         * -- 
     624         * Changed to Parrot_ex_throw_from_c_args because silently continuing and 
     625         * giving weird errors later is not a cool look - wayland/Tim Nelson 
    623626         */ 
    624         return pmc_new(interp, enum_class_Undef); 
     627        /* return pmc_new(interp, enum_class_Undef); */ 
     628 
     629        path = Parrot_path_str(interp, PARROT_RUNTIME_FT_DYNEXT); 
     630 
     631        Parrot_ex_throw_from_c_args(interp, NULL, 
     632                EXCEPTION_LIBRARY_ERROR, 
     633                "Parrot VM: Can't load library '%s'; searched path %s\n",  
     634                wo_ext->strstart, path->strstart); 
    625635    } 
    626636 
    627637    return run_init_lib(interp, handle, lib_name, wo_ext); 
  • include/parrot/library.h

     
    8383        __attribute__nonnull__(2) 
    8484        FUNC_MODIFIES(*file); 
    8585 
     86PARROT_EXPORT 
     87PARROT_WARN_UNUSED_RESULT 
     88PARROT_CAN_RETURN_NULL 
     89STRING* Parrot_path_str(PARROT_INTERP, 
     90    enum_runtime_ft type) 
     91        __attribute__nonnull__(1); 
     92 
    8693void parrot_init_library_paths(PARROT_INTERP) 
    8794        __attribute__nonnull__(1); 
    8895