@@ -92,11 +92,11 @@ addToLibrary({
9292        node . node_ops  =  MEMFS . ops_table . chrdev . node ; 
9393        node . stream_ops  =  MEMFS . ops_table . chrdev . stream ; 
9494      } 
95-       node . timestamp  =  Date . now ( ) ; 
95+       node . atime   =   node . mtime   =   node . ctime  =  Date . now ( ) ; 
9696      // add the new node to the parent 
9797      if  ( parent )  { 
9898        parent . contents [ name ]  =  node ; 
99-         parent . timestamp  =  node . timestamp ; 
99+         parent . atime  =  parent . mtime   =   parent . ctime   =   node . atime ; 
100100      } 
101101      return  node ; 
102102    } , 
@@ -161,21 +161,20 @@ addToLibrary({
161161        }  else  { 
162162          attr . size  =  0 ; 
163163        } 
164-         attr . atime  =  new  Date ( node . timestamp ) ; 
165-         attr . mtime  =  new  Date ( node . timestamp ) ; 
166-         attr . ctime  =  new  Date ( node . timestamp ) ; 
164+         attr . atime  =  new  Date ( node . atime ) ; 
165+         attr . mtime  =  new  Date ( node . mtime ) ; 
166+         attr . ctime  =  new  Date ( node . ctime ) ; 
167167        // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), 
168168        //       but this is not required by the standard. 
169169        attr . blksize  =  4096 ; 
170170        attr . blocks  =  Math . ceil ( attr . size  /  attr . blksize ) ; 
171171        return  attr ; 
172172      } , 
173173      setattr ( node ,  attr )  { 
174-         if  ( attr . mode  !==  undefined )  { 
175-           node . mode  =  attr . mode ; 
176-         } 
177-         if  ( attr . timestamp  !==  undefined )  { 
178-           node . timestamp  =  attr . timestamp ; 
174+         for  ( const  key  of  [ "mode" ,  "atime" ,  "mtime" ,  "ctime" ] )  { 
175+           if  ( attr [ key ] )  { 
176+             node [ key ]  =  attr [ key ] ; 
177+           } 
179178        } 
180179        if  ( attr . size  !==  undefined )  { 
181180          MEMFS . resizeFileStorage ( node ,  attr . size ) ; 
@@ -192,44 +191,39 @@ addToLibrary({
192191        return  MEMFS . createNode ( parent ,  name ,  mode ,  dev ) ; 
193192      } , 
194193      rename ( old_node ,  new_dir ,  new_name )  { 
195-         // if we're overwriting a directory at new_name, make sure it's empty. 
196-         if  ( FS . isDir ( old_node . mode ) )  { 
197-           var  new_node ; 
198-           try  { 
199-             new_node  =  FS . lookupNode ( new_dir ,  new_name ) ; 
200-           }  catch  ( e )  { 
201-           } 
202-           if  ( new_node )  { 
194+         var  new_node ; 
195+         try  { 
196+           new_node  =  FS . lookupNode ( new_dir ,  new_name ) ; 
197+         }  catch  ( e )  { } 
198+         if  ( new_node )  { 
199+           if  ( FS . isDir ( old_node . mode ) )  { 
200+             // if we're overwriting a directory at new_name, make sure it's empty. 
203201            for  ( var  i  in  new_node . contents )  { 
204202              throw  new  FS . ErrnoError ( { { {  cDefs . ENOTEMPTY  } } } ) ; 
205203            } 
206204          } 
205+           FS . hashRemoveNode ( new_node ) ; 
207206        } 
208207        // do the internal rewiring 
209208        delete  old_node . parent . contents [ old_node . name ] ; 
210-         old_node . parent . timestamp  =  Date . now ( ) 
211-         old_node . name  =  new_name ; 
212209        new_dir . contents [ new_name ]  =  old_node ; 
213-         new_dir . timestamp  =  old_node . parent . timestamp ; 
210+         old_node . name  =  new_name ; 
211+         new_dir . ctime  =  new_dir . mtime  =  old_node . parent . ctime  =  old_node . parent . mtime  =  Date . now ( ) ; 
214212      } , 
215213      unlink ( parent ,  name )  { 
216214        delete  parent . contents [ name ] ; 
217-         parent . timestamp  =  Date . now ( ) ; 
215+         parent . ctime   =   parent . mtime  =  Date . now ( ) ; 
218216      } , 
219217      rmdir ( parent ,  name )  { 
220218        var  node  =  FS . lookupNode ( parent ,  name ) ; 
221219        for  ( var  i  in  node . contents )  { 
222220          throw  new  FS . ErrnoError ( { { {  cDefs . ENOTEMPTY  } } } ) ; 
223221        } 
224222        delete  parent . contents [ name ] ; 
225-         parent . timestamp  =  Date . now ( ) ; 
223+         parent . ctime   =   parent . mtime  =  Date . now ( ) ; 
226224      } , 
227225      readdir ( node )  { 
228-         var  entries  =  [ '.' ,  '..' ] ; 
229-         for  ( var  key  of  Object . keys ( node . contents ) )  { 
230-           entries . push ( key ) ; 
231-         } 
232-         return  entries ; 
226+         return  [ '.' ,  '..' ,  ...Object . keys ( node . contents ) ] ; 
233227      } , 
234228      symlink ( parent ,  newname ,  oldpath )  { 
235229        var  node  =  MEMFS . createNode ( parent ,  newname ,  0o777  |  { { {  cDefs . S_IFLNK  } } } ,  0 ) ; 
@@ -282,7 +276,7 @@ addToLibrary({
282276
283277        if  ( ! length )  return  0 ; 
284278        var  node  =  stream . node ; 
285-         node . timestamp  =  Date . now ( ) ; 
279+         node . mtime   =   node . ctime  =  Date . now ( ) ; 
286280
287281        if  ( buffer . subarray  &&  ( ! node . contents  ||  node . contents . subarray ) )  {  // This write is from a typed array to a typed array? 
288282          if  ( canOwn )  { 
0 commit comments