diff --git a/scheme/ikarus.boot.4.prebuilt b/scheme/ikarus.boot.4.prebuilt index d269109..a534189 100644 Binary files a/scheme/ikarus.boot.4.prebuilt and b/scheme/ikarus.boot.4.prebuilt differ diff --git a/scheme/ikarus.boot.8.prebuilt b/scheme/ikarus.boot.8.prebuilt index 052eead..1477441 100644 Binary files a/scheme/ikarus.boot.8.prebuilt and b/scheme/ikarus.boot.8.prebuilt differ diff --git a/scheme/ikarus.load.ss b/scheme/ikarus.load.ss index 673f760..2c8ca1b 100644 --- a/scheme/ikarus.load.ss +++ b/scheme/ikarus.load.ss @@ -30,11 +30,10 @@ (define fasl-extension ".ikarus-fasl") (define (load-serialized-library filename sk) - ;;; TODO: check file last-modified date (let ([ikfasl (string-append filename fasl-extension)]) (cond [(not (file-exists? ikfasl)) #f] - [(<= (file-ctime ikfasl) (file-ctime filename)) + [(< (file-mtime ikfasl) (file-mtime filename)) (fprintf (current-error-port) "WARNING: not using fasl file ~s because it is older \ than the source file ~s\n" diff --git a/scheme/ikarus.posix.ss b/scheme/ikarus.posix.ss index a912292..cc66747 100644 --- a/scheme/ikarus.posix.ss +++ b/scheme/ikarus.posix.ss @@ -16,7 +16,8 @@ (library (ikarus.posix) (export posix-fork fork waitpid system file-exists? delete-file - nanosleep getenv env environ file-ctime current-directory + nanosleep getenv env environ file-ctime file-mtime + current-directory file-regular? file-directory? file-symbolic-link? make-symbolic-link directory-list make-directory delete-directory change-mode kill strerror @@ -26,7 +27,8 @@ (except (ikarus) nanosleep posix-fork fork waitpid system file-exists? delete-file - getenv env environ file-ctime current-directory + getenv env environ file-ctime file-mtime + current-directory file-regular? file-directory? file-symbolic-link? make-symbolic-link directory-list make-directory delete-directory change-mode kill strerror @@ -237,16 +239,22 @@ (unless (eq? r #t) (raise/strerror who r path))))) - (define (file-ctime x) - (define who 'file-ctime) + (define ($file-time x who proc) (unless (string? x) (die who "not a string" x)) (let ([p (cons #f #f)]) - (let ([v (foreign-call "ikrt_file_ctime" (string->utf8 x) p)]) + (let ([v (proc (string->utf8 x) p)]) (case v [(0) (+ (* (car p) #e1e9) (cdr p))] [else (raise/strerror who v x)])))) + (define (file-ctime x) + ($file-time x 'file-ctime + (lambda (u p) (foreign-call "ikrt_file_ctime" u p)))) + + (define (file-mtime x) + ($file-time x 'file-mtime + (lambda (u p) (foreign-call "ikrt_file_mtime" u p)))) (define ($getenv-bv key) (foreign-call "ikrt_getenv" key)) diff --git a/scheme/last-revision b/scheme/last-revision index af2b5c5..047d57f 100644 --- a/scheme/last-revision +++ b/scheme/last-revision @@ -1 +1 @@ -1657 +1658 diff --git a/scheme/makefile.ss b/scheme/makefile.ss index 0c5f00f..23a9a01 100755 --- a/scheme/makefile.ss +++ b/scheme/makefile.ss @@ -1256,6 +1256,7 @@ [change-mode i] [make-symbolic-link i] [file-ctime i] + [file-mtime i] [fork i] [define-record-type i r rs] [fields i r rs] diff --git a/src/ikarus-io.c b/src/ikarus-io.c index dfe238c..e8c2ccd 100644 --- a/src/ikarus-io.c +++ b/src/ikarus-io.c @@ -298,6 +298,19 @@ ikrt_file_ctime(ikptr filename, ikptr res){ return fix(0); } +ikptr +ikrt_file_mtime(ikptr filename, ikptr res){ + struct stat s; + int err = stat((char*)(filename + off_bytevector_data), &s); + if(err) { + return ik_errno_to_code(); + } + + ref(res, off_car) = fix(s.st_mtime); + ref(res, off_cdr) = 0; + return fix(0); +} + diff --git a/src/ikarus-runtime.c b/src/ikarus-runtime.c index e5b9bf2..75a0032 100644 --- a/src/ikarus-runtime.c +++ b/src/ikarus-runtime.c @@ -246,13 +246,13 @@ ik_munmap(ikptr mem, unsigned long int size){ assert(((-pagesize) & (int)mem) == (int)mem); total_allocated_pages -= pages; #ifndef __CYGWIN__ - int err = munmap((char*)(long)mem, mapsize); + int err = munmap((char*)mem, mapsize); if(err != 0){ fprintf(stderr, "ik_munmap failed: %s\n", strerror(errno)); exit(-1); } #else - win_munmap(mem, mapsize); + win_munmap((char*)mem, mapsize); #endif #ifndef NDEBUG fprintf(stderr, "UNMAP 0x%08x .. 0x%08x\n", (int)mem,