@@ -896,6 +896,37 @@ var LibraryDylink = {
896
896
return dso ;
897
897
} ,
898
898
899
+ $isValidFile__proxy : 'sync' ,
900
+ $isValidFile__deps : [ '$FS' ] ,
901
+ $isValidFile : function ( filenamePtr ) {
902
+ var filename = UTF8ToString ( filenamePtr ) ;
903
+ #if DYLINK_DEBUG
904
+ dbg ( 'isValidFile: ' + filename ) ;
905
+ #endif
906
+ var target = FS . findObject ( filename ) ;
907
+ return target && ! target . isFolder && ! target . isDevice ;
908
+ } ,
909
+
910
+ $readFileProxied__proxy : 'sync' ,
911
+ $readFileProxied__deps : [ '$FS' ] ,
912
+ $readFileProxied : function ( filenamePtr , outPtr ) {
913
+ var filename = UTF8ToString ( filenamePtr ) ;
914
+ #if DYLINK_DEBUG
915
+ dbg ( 'readFileProxied: ' + filename ) ;
916
+ #endif
917
+ if ( ! FS . findObject ( filename ) ) {
918
+ return 0 ;
919
+ }
920
+ var fileData = FS . readFile ( filename , { encoding : 'binary' } ) ;
921
+ if ( ! ( fileData instanceof Uint8Array ) ) {
922
+ fileData = new Uint8Array ( fileData ) ;
923
+ }
924
+ var mem = _malloc ( fileData . length )
925
+ HEAP8 . set ( fileData , mem ) ;
926
+ { { { makeSetValue ( 'outPtr' , 0 , 'mem' , '*' ) } } } ;
927
+ return fileData . length ;
928
+ } ,
929
+
899
930
// loadDynamicLibrary loads dynamic library @ lib URL / path and returns
900
931
// handle for loaded DSO.
901
932
//
@@ -919,7 +950,7 @@ var LibraryDylink = {
919
950
// Once a library becomes "global" or "nodelete", it cannot be removed or unloaded.
920
951
$loadDynamicLibrary__deps : [ '$LDSO' , '$loadWebAssemblyModule' ,
921
952
'$isInternalSym' , '$mergeLibSymbols' , '$newDSO' ,
922
- '$asyncLoad' , '$preloadedWasm' ] ,
953
+ '$asyncLoad' , '$preloadedWasm' , '$readFileProxied' ] ,
923
954
$loadDynamicLibrary__docs : `
924
955
/**
925
956
* @param {number=} handle
@@ -965,12 +996,23 @@ var LibraryDylink = {
965
996
// libName -> libData
966
997
function loadLibData ( ) {
967
998
// for wasm, we can use fetch for async, but for fs mode we can only imitate it
968
- if ( flags . fs && flags . fs . findObject ( libName ) ) {
969
- var libData = flags . fs . readFile ( libName , { encoding : 'binary' } ) ;
970
- if ( ! ( libData instanceof Uint8Array ) ) {
971
- libData = new Uint8Array ( libData ) ;
999
+ if ( flags . fs ) {
1000
+ var libData = withStackSave ( ( ) => {
1001
+ var addrPtr = stackAlloc ( { { { POINTER_SIZE } } } ) ;
1002
+ var len = readFileProxied ( stringToUTF8OnStack ( libName ) , addrPtr ) ;
1003
+ #if DYLINK_DEBUG
1004
+ dbg ( 'readFileProxied done: ' + len ) ;
1005
+ #endif
1006
+ if ( len ) {
1007
+ var addr = { { { makeGetValue ( 'addrPtr' , 0 , '*' ) } } }
1008
+ var rtn = HEAP8 . slice ( addr , addr + len ) ;
1009
+ _free ( addr ) ;
1010
+ return rtn ;
1011
+ }
1012
+ } ) ;
1013
+ if ( libData ) {
1014
+ return flags . loadAsync ? Promise . resolve ( libData ) : libData ;
972
1015
}
973
- return flags . loadAsync ? Promise . resolve ( libData ) : libData ;
974
1016
}
975
1017
976
1018
var libFile = locateFile ( libName ) ;
@@ -992,7 +1034,7 @@ var LibraryDylink = {
992
1034
// lookup preloaded cache first
993
1035
if ( preloadedWasm [ libName ] ) {
994
1036
#if DYLINK_DEBUG
995
- err ( 'using preloaded module for: ' + libName ) ;
1037
+ dbg ( 'using preloaded module for: ' + libName ) ;
996
1038
#endif
997
1039
var libModule = preloadedWasm [ libName ] ;
998
1040
return flags . loadAsync ? Promise . resolve ( libModule ) : libModule ;
@@ -1064,35 +1106,33 @@ var LibraryDylink = {
1064
1106
} ,
1065
1107
1066
1108
// void* dlopen(const char* filename, int flags);
1067
- $dlopenInternal__deps : [ '$FS ' , '$ENV ' , '$dlSetError ' , '$PATH ' ] ,
1109
+ $dlopenInternal__deps : [ '$ENV ' , '$dlSetError ' , '$PATH ' , '$isValidFile ' ] ,
1068
1110
$dlopenInternal : function ( handle , jsflags ) {
1069
1111
// void *dlopen(const char *file, int mode);
1070
1112
// http://pubs.opengroup.org/onlinepubs/009695399/functions/dlopen.html
1071
- var filename = UTF8ToString ( handle + { { { C_STRUCTS . dso . name } } } ) ;
1113
+ var filenamePtr = handle + { { { C_STRUCTS . dso . name } } } ;
1114
+ var filename = UTF8ToString ( filenamePtr ) ;
1072
1115
var flags = { { { makeGetValue ( 'handle' , C_STRUCTS . dso . flags , 'i32' ) } } } ;
1073
1116
#if DYLINK_DEBUG
1074
1117
dbg ( 'dlopenInternal: ' + filename ) ;
1075
1118
#endif
1076
1119
filename = PATH . normalize ( filename ) ;
1077
1120
var searchpaths = [ ] ;
1078
1121
1079
- var isValidFile = ( filename ) => {
1080
- var target = FS . findObject ( filename ) ;
1081
- return target && ! target . isFolder && ! target . isDevice ;
1082
- } ;
1083
-
1084
- if ( ! isValidFile ( filename ) ) {
1122
+ if ( ! isValidFile ( filenamePtr ) ) {
1085
1123
if ( ENV [ 'LD_LIBRARY_PATH' ] ) {
1086
1124
searchpaths = ENV [ 'LD_LIBRARY_PATH' ] . split ( ':' ) ;
1087
1125
}
1088
1126
1089
- for ( var ident in searchpaths ) {
1090
- var searchfile = PATH . join2 ( searchpaths [ ident ] , filename ) ;
1091
- if ( isValidFile ( searchfile ) ) {
1092
- filename = searchfile ;
1093
- break ;
1127
+ withStackSave ( ( ) => {
1128
+ for ( var ident in searchpaths ) {
1129
+ var searchfile = PATH . join2 ( searchpaths [ ident ] , filename ) ;
1130
+ if ( isValidFile ( stringToUTF8OnStack ( searchfile ) ) ) {
1131
+ filename = searchfile ;
1132
+ break ;
1133
+ }
1094
1134
}
1095
- }
1135
+ } ) ;
1096
1136
}
1097
1137
1098
1138
var global = Boolean ( flags & { { { cDefs . RTLD_GLOBAL } } } ) ;
@@ -1130,15 +1170,15 @@ var LibraryDylink = {
1130
1170
return Asyncify . handleSleep ( ( wakeUp ) => {
1131
1171
var jsflags = {
1132
1172
loadAsync : true ,
1133
- fs : FS , // load libraries from provided filesystem
1173
+ fs : true , // load libraries from filesystem
1134
1174
}
1135
1175
var promise = dlopenInternal ( handle , jsflags ) ;
1136
1176
promise . then ( wakeUp ) . catch ( ( ) => wakeUp ( 0 ) ) ;
1137
1177
} ) ;
1138
1178
#else
1139
1179
var jsflags = {
1140
1180
loadAsync : false ,
1141
- fs : FS , // load libraries from provided filesystem
1181
+ fs : true , // load libraries from filesystem
1142
1182
}
1143
1183
return dlopenInternal ( handle , jsflags ) ;
1144
1184
#endif
@@ -1149,8 +1189,8 @@ var LibraryDylink = {
1149
1189
_emscripten_dlopen_js : function ( handle , onsuccess , onerror , user_data ) {
1150
1190
/** @param {Object= } e */
1151
1191
function errorCallback ( e ) {
1152
- var filename = UTF8ToString ( { { { makeGetValue ( 'handle' , C_STRUCTS . dso . name , '*' ) } } } ) ;
1153
- dlSetError ( 'Could not load dynamic lib : ' + filename + '\n' + e ) ;
1192
+ var filename = UTF8ToString ( handle + { { { C_STRUCTS . dso . name } } } ) ;
1193
+ dlSetError ( 'Could not load dynamic libX : ' + filename + '\n' + e ) ;
1154
1194
{ { { runtimeKeepalivePop ( ) } } }
1155
1195
callUserCallback ( ( ) => { { { makeDynCall ( 'vpp' , 'onerror' ) } } } ( handle , user_data ) ) ;
1156
1196
}
@@ -1160,7 +1200,7 @@ var LibraryDylink = {
1160
1200
}
1161
1201
1162
1202
{ { { runtimeKeepalivePush ( ) } } }
1163
- var promise = dlopenInternal ( handle , { loadAsync : true } ) ;
1203
+ var promise = dlopenInternal ( handle , { loadAsync : true , fs : true } ) ;
1164
1204
if ( promise ) {
1165
1205
promise . then ( successCallback , errorCallback ) ;
1166
1206
} else {
0 commit comments