@@ -23,7 +23,6 @@ addToLibrary({
23
23
24
24
$FS__postset : `
25
25
FS.init();
26
- FS.createPreloadedFile = FS_createPreloadedFile;
27
26
` ,
28
27
$FS__deps : [
29
28
'$MEMFS' ,
@@ -35,6 +34,7 @@ FS.createPreloadedFile = FS_createPreloadedFile;
35
34
'$withStackSave' ,
36
35
'$readI53FromI64' ,
37
36
'$readI53FromU64' ,
37
+ '$FS_createDataFile' ,
38
38
'$FS_createPreloadedFile' ,
39
39
'$FS_getMode' ,
40
40
// For FS.readFile
@@ -44,6 +44,12 @@ FS.createPreloadedFile = FS_createPreloadedFile;
44
44
// up requiring all of our code
45
45
// here.
46
46
'$FS_modeStringToFlags' ,
47
+ '$FS_create' ,
48
+ '$FS_mknod' ,
49
+ '$FS_mkdir' ,
50
+ '$FS_mkdirTree' ,
51
+ '$FS_writeFile' ,
52
+ '$FS_unlink' ,
47
53
#if LibraryManager . has ( 'library_icasefs.js' )
48
54
'$ICASEFS' ,
49
55
#endif
@@ -93,19 +99,7 @@ FS.createPreloadedFile = FS_createPreloadedFile;
93
99
FS . ErrnoError . prototype . constructor = FS . ErrnoError ;
94
100
} ,
95
101
createDataFile ( parent , name , fileData , canRead , canWrite , canOwn ) {
96
- var pathName = name ? parent + '/' + name : parent ;
97
- var mode = FS_getMode ( canRead , canWrite ) ;
98
-
99
- if ( ! wasmFSPreloadingFlushed ) {
100
- // WasmFS code in the wasm is not ready to be called yet. Cache the
101
- // files we want to create here in JS, and WasmFS will read them
102
- // later.
103
- wasmFSPreloadedFiles . push ( { pathName, fileData, mode} ) ;
104
- } else {
105
- // WasmFS is already running, so create the file normally.
106
- FS . create ( pathName , mode ) ;
107
- FS . writeFile ( pathName , fileData ) ;
108
- }
102
+ return FS_createDataFile ( parent , name , fileData , canRead , canWrite , canOwn ) ;
109
103
} ,
110
104
createPath ( parent , path , canRead , canWrite ) {
111
105
// Cache file path directory names.
@@ -124,6 +118,10 @@ FS.createPreloadedFile = FS_createPreloadedFile;
124
118
return current ;
125
119
} ,
126
120
121
+ createPreloadedFile ( parent , name , url , canRead , canWrite , onload , onerror , dontCreateFile , canOwn , preFinish ) {
122
+ return FS_createPreloadedFile ( parent , name , url , canRead , canWrite , onload , onerror , dontCreateFile , canOwn , preFinish ) ;
123
+ } ,
124
+
127
125
#if hasExportedSymbol ( '_wasmfs_read_file' ) // Support the JS function exactly
128
126
// when the __wasmfs_* function is
129
127
// present to be called (otherwise,
@@ -173,24 +171,8 @@ FS.createPreloadedFile = FS_createPreloadedFile;
173
171
174
172
// libc methods
175
173
176
- mkdir : ( path , mode ) = > FS . handleError ( withStackSave ( ( ) => {
177
- mode = mode !== undefined ? mode : 511 /* 0777 */ ;
178
- var buffer = stringToUTF8OnStack ( path ) ;
179
- return __wasmfs_mkdir ( buffer , mode ) ;
180
- } ) ) ,
181
- mkdirTree ( path , mode ) {
182
- var dirs = path . split ( '/' ) ;
183
- var d = '';
184
- for ( var i = 0 ; i < dirs . length ; ++ i ) {
185
- if ( ! dirs [ i ] ) continue ;
186
- d += '/ ' + dirs [ i ] ;
187
- try {
188
- FS . mkdir ( d , mode ) ;
189
- } catch ( e ) {
190
- if ( e . errno != { { { cDefs . EEXIST } } } ) throw e ;
191
- }
192
- }
193
- } ,
174
+ mkdir : ( path , mode ) = > FS_mkdir ( path , mode ) ,
175
+ mkdirTree : ( path , mode ) = > FS_mkdirTree ( path , mode ) ,
194
176
rmdir : ( path ) = > FS . handleError (
195
177
withStackSave ( ( ) => __wasmfs_rmdir ( stringToUTF8OnStack ( path ) ) )
196
178
) ,
@@ -201,18 +183,9 @@ FS.createPreloadedFile = FS_createPreloadedFile;
201
183
var fd = FS . handleError ( __wasmfs_open ( buffer , flags , mode ) ) ;
202
184
return { fd : fd } ;
203
185
} ) ,
204
- create ( path , mode ) {
205
- // Default settings copied from the legacy JS FS API.
206
- mode = mode !== undefined ? mode : 438 /* 0666 */ ;
207
- mode &= { { { cDefs . S_IALLUGO } } } ;
208
- mode |= { { { cDefs . S_IFREG } } } ;
209
- return FS . mknod ( path, mode, 0 ) ;
210
- } ,
186
+ create : ( path , mode ) = > FS_create ( path , mode ) ,
211
187
close : ( stream ) = > FS . handleError ( - __wasmfs_close ( stream . fd ) ) ,
212
- unlink : ( path ) => withStackSave ( ( ) => {
213
- var buffer = stringToUTF8OnStack ( path ) ;
214
- return __wasmfs_unlink ( buffer ) ;
215
- } ) ,
188
+ unlink : ( path ) = > FS_unlink ( path ) ,
216
189
chdir : ( path ) = > withStackSave ( ( ) => {
217
190
var buffer = stringToUTF8OnStack ( path ) ;
218
191
return __wasmfs_chdir ( buffer ) ;
@@ -260,6 +233,7 @@ FS.createPreloadedFile = FS_createPreloadedFile;
260
233
allocate ( stream , offset , length ) {
261
234
return FS . handleError ( __wasmfs_allocate ( stream . fd , { { { splitI64 ( 'offset' ) } } } , { { { splitI64 ( 'length' ) } } } ) ) ;
262
235
} ,
236
+ writeFile : ( path , data ) = > FS_writeFile ( path , data ) ,
263
237
mmap : ( stream , length , offset , prot , flags ) = > {
264
238
var buf = FS . handleError ( __wasmfs_mmap ( length , prot , flags , stream . fd , { { { splitI64 ( 'offset' ) } } } ) ) ;
265
239
return { ptr : buf , allocated : true } ;
@@ -273,24 +247,6 @@ FS.createPreloadedFile = FS_createPreloadedFile;
273
247
munmap : ( addr , length ) = > (
274
248
FS . handleError ( __wasmfs_munmap ( addr , length ) )
275
249
) ,
276
- writeFile : ( path , data ) = > withStackSave ( ( ) => {
277
- var pathBuffer = stringToUTF8OnStack ( path ) ;
278
- if ( typeof data == 'string' ) {
279
- var buf = new Uint8Array ( lengthBytesUTF8 ( data ) + 1 ) ;
280
- var actualNumBytes = stringToUTF8Array ( data , buf , 0 , buf . length ) ;
281
- data = buf . slice ( 0 , actualNumBytes ) ;
282
- }
283
- var dataBuffer = _malloc ( data . length ) ;
284
- #if ASSERTIONS
285
- assert ( dataBuffer ) ;
286
- #endif
287
- for ( var i = 0 ; i < data . length ; i ++ ) {
288
- { { { makeSetValue ( 'dataBuffer' , 'i' , 'data[i]' , 'i8' ) } } } ;
289
- }
290
- var ret = __wasmfs_write_file ( pathBuffer , dataBuffer , data . length ) ;
291
- _free ( dataBuffer ) ;
292
- return ret ;
293
- } ) ,
294
250
symlink : ( target , linkpath ) = > withStackSave ( ( ) => (
295
251
__wasmfs_symlink ( stringToUTF8OnStack ( target ) , stringToUTF8OnStack ( linkpath ) )
296
252
) ) ,
@@ -402,12 +358,7 @@ FS.createPreloadedFile = FS_createPreloadedFile;
402
358
FS . handleError ( withStackSave ( ( ) => __wasmfs_unmount ( stringToUTF8OnStack ( mountpoint ) ) ) )
403
359
) ,
404
360
// TODO: lookup
405
- mknod ( path , mode , dev ) {
406
- return FS . handleError ( withStackSave ( ( ) => {
407
- var pathBuffer = stringToUTF8OnStack ( path ) ;
408
- return __wasmfs_mknod ( pathBuffer , mode , dev ) ;
409
- } ) ) ;
410
- } ,
361
+ mknod : ( path , mode , dev ) = > FS_mknod ( path , mode , dev ) ,
411
362
makedev : ( ma , mi ) = > ( ( ma ) << 8 | ( mi ) ) ,
412
363
registerDevice ( dev , ops ) {
413
364
var backendPointer = _wasmfs_create_jsimpl_backend ( ) ;
@@ -522,6 +473,110 @@ FS.createPreloadedFile = FS_createPreloadedFile;
522
473
#endif
523
474
} ,
524
475
476
+ // Split-out FS.* methods. These are split out for code size reasons, so that
477
+ // we can include the ones we need on demand, rather than put them all on the
478
+ // main FS object. As a result the entire FS object is not needed if you just
479
+ // need some specific FS_* operations. When the FS object is present, it calls
480
+ // into those FS_* methods as needed.
481
+ //
482
+ // In contrast, the old JS FS (library_fs.js) does the opposite: it puts all
483
+ // things on the FS object, and copies them to FS_* methods for use from JS
484
+ // library code. Given that the JS FS is implemented entirely in JS, that
485
+ // makes sense there (as almost all that FS object ends up needed anyhow all
486
+ // the time).
487
+
488
+ $FS_createDataFile__deps: [
489
+ '$wasmFSPreloadingFlushed' , '$wasmFSPreloadedFiles' ,
490
+ '$FS_create' , '$FS_writeFile' ,
491
+ ] ,
492
+ $FS_createDataFile : ( parent , name , fileData , canRead , canWrite , canOwn ) = > {
493
+ var pathName = name ? parent + '/' + name : parent ;
494
+ var mode = FS_getMode ( canRead , canWrite ) ;
495
+
496
+ if ( ! wasmFSPreloadingFlushed ) {
497
+ // WasmFS code in the wasm is not ready to be called yet. Cache the
498
+ // files we want to create here in JS, and WasmFS will read them
499
+ // later.
500
+ wasmFSPreloadedFiles . push ( { pathName, fileData, mode} ) ;
501
+ } else {
502
+ // WasmFS is already running, so create the file normally.
503
+ FS_create ( pathName , mode ) ;
504
+ FS_writeFile ( pathName , fileData ) ;
505
+ }
506
+ } ,
507
+
508
+ $FS_mknod__deps: [ '_wasmfs_mknod' ] ,
509
+ $FS_mknod : ( path , mode , dev ) => {
510
+ return FS . handleError ( withStackSave ( ( ) => {
511
+ var pathBuffer = stringToUTF8OnStack ( path ) ;
512
+ return __wasmfs_mknod ( pathBuffer , mode , dev ) ;
513
+ } ) ) ;
514
+ } ,
515
+
516
+ $FS_create__deps : [ '$FS_mknod' ] ,
517
+ $FS_create : ( path , mode ) => {
518
+ // Default settings copied from the legacy JS FS API.
519
+ mode = mode !== undefined ? mode : 438 /* 0666 */ ;
520
+ mode &= { { { cDefs . S_IALLUGO } } } ;
521
+ mode |= { { { cDefs . S_IFREG } } } ;
522
+ return FS_mknod ( path, mode, 0 ) ;
523
+ } ,
524
+
525
+ $FS_writeFile__deps : [ '_wasmfs_write_file' ] ,
526
+ $FS_writeFile : ( path , data ) => withStackSave ( ( ) => {
527
+ var pathBuffer = stringToUTF8OnStack ( path ) ;
528
+ if ( typeof data == 'string' ) {
529
+ var buf = new Uint8Array ( lengthBytesUTF8 ( data ) + 1 ) ;
530
+ var actualNumBytes = stringToUTF8Array ( data , buf , 0 , buf . length ) ;
531
+ data = buf . slice ( 0 , actualNumBytes ) ;
532
+ }
533
+ var dataBuffer = _malloc ( data . length ) ;
534
+ #if ASSERTIONS
535
+ assert ( dataBuffer ) ;
536
+ #endif
537
+ for ( var i = 0 ; i < data . length ; i ++ ) {
538
+ { { { makeSetValue ( 'dataBuffer' , 'i' , 'data[i]' , 'i8' ) } } } ;
539
+ }
540
+ var ret = __wasmfs_write_file ( pathBuffer , dataBuffer , data . length ) ;
541
+ _free ( dataBuffer ) ;
542
+ return ret ;
543
+ } ) ,
544
+
545
+ $FS_mkdir__deps : [ '_wasmfs_mkdir' ] ,
546
+ $FS_mkdir : ( path , mode ) = > FS . handleError ( withStackSave ( ( ) => {
547
+ mode = mode !== undefined ? mode : 511 /* 0777 */ ;
548
+ var buffer = stringToUTF8OnStack ( path ) ;
549
+ return __wasmfs_mkdir ( buffer , mode ) ;
550
+ } ) ) ,
551
+
552
+ $FS_mkdirTree__docs : `
553
+ /**
554
+ * @param {number=} mode Optionally, the mode to create in. Uses mkdir's
555
+ * default if not set.
556
+ */` ,
557
+ $FS_mkdirTree__deps : [ '$FS_mkdir' ] ,
558
+ $FS_mkdirTree : ( path , mode ) => {
559
+ var dirs = path . split ( '/' ) ;
560
+ var d = '' ;
561
+ for ( var i = 0 ; i < dirs . length ; ++ i ) {
562
+ if ( ! dirs [ i ] ) continue ;
563
+ d += '/' + dirs [ i ] ;
564
+ try {
565
+ FS_mkdir ( d , mode ) ;
566
+ } catch ( e ) {
567
+ if ( e . errno != { { { cDefs . EEXIST } } } ) throw e ;
568
+ }
569
+ }
570
+ } ,
571
+
572
+ $FS_unlink__deps : [ '_wasmfs_unlink' ] ,
573
+ $FS_unlink : ( path ) => withStackSave ( ( ) => {
574
+ var buffer = stringToUTF8OnStack ( path ) ;
575
+ return __wasmfs_unlink ( buffer ) ;
576
+ } ) ,
577
+
578
+ // Wasm access calls.
579
+
525
580
_wasmfs_get_num_preloaded_files__deps : [
526
581
'$wasmFSPreloadedFiles' ,
527
582
'$wasmFSPreloadingFlushed' ] ,
0 commit comments