diff --git a/basis/alien/c-types/c-types-tests.factor b/basis/alien/c-types/c-types-tests.factor index 31542b2699..40171f56e7 100644 --- a/basis/alien/c-types/c-types-tests.factor +++ b/basis/alien/c-types/c-types-tests.factor @@ -8,10 +8,6 @@ sequences system libc alien.strings io.encodings.utf8 ; [ { "blah" 123 } ] [ { "blah" xyz } expand-constants ] unit-test -: foo ( -- n ) &: fdafd [ 123 ] unless* ; - -[ 123 ] [ foo ] unit-test - [ -1 ] [ -1 *char ] unit-test [ -1 ] [ -1 *short ] unit-test [ -1 ] [ -1 *int ] unit-test diff --git a/basis/alien/syntax/syntax.factor b/basis/alien/syntax/syntax.factor index 853b3281a2..987c73127e 100644 --- a/basis/alien/syntax/syntax.factor +++ b/basis/alien/syntax/syntax.factor @@ -34,6 +34,8 @@ IN: alien.syntax [ [ create-in ] dip define-constant ] each-index ; parsing +: address-of ( name library -- value ) + load-library dlsym [ "No such symbol" throw ] unless* ; + : &: - scan "c-library" get - '[ _ _ load-library dlsym ] over push-all ; parsing + scan "c-library" get '[ _ _ address-of ] over push-all ; parsing diff --git a/basis/heaps/heaps-tests.factor b/basis/heaps/heaps-tests.factor index 8fa6a274e7..7e780cbe5e 100644 --- a/basis/heaps/heaps-tests.factor +++ b/basis/heaps/heaps-tests.factor @@ -32,10 +32,8 @@ IN: heaps.tests : random-alist ( n -- alist ) [ - [ - 32 random-bits dup number>string swap set - ] times - ] H{ } make-assoc ; + drop 32 random-bits dup number>string + ] H{ } map>assoc ; : test-heap-sort ( n -- ? ) random-alist dup >alist sort-keys swap heap-sort = ; diff --git a/core/slots/slots.factor b/core/slots/slots.factor index 99766cadc2..f166378d9d 100644 --- a/core/slots/slots.factor +++ b/core/slots/slots.factor @@ -1,9 +1,9 @@ -! Copyright (C) 2005, 2008 Slava Pestov. +! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays byte-arrays kernel kernel.private math namespaces make sequences strings words effects generic generic.standard classes classes.algebra slots.private combinators accessors -words sequences.private assocs alien quotations ; +words sequences.private assocs alien quotations hashtables ; IN: slots TUPLE: slot-spec name offset class initial read-only ; @@ -86,7 +86,7 @@ ERROR: bad-slot-value value class ; ] [ ] make ; : writer-props ( slot-spec -- assoc ) - [ "writing" set ] H{ } make-assoc ; + "writing" associate ; : define-writer ( class slot-spec -- ) [ name>> writer-word ] [ writer-quot ] [ writer-props ] tri diff --git a/vm/factor.c b/vm/factor.c index b3020e3171..d9042c9455 100755 --- a/vm/factor.c +++ b/vm/factor.c @@ -53,8 +53,7 @@ INLINE bool factor_arg(const F_CHAR* str, const F_CHAR* arg, CELL* value) void init_parameters_from_args(F_PARAMETERS *p, int argc, F_CHAR **argv) { default_parameters(p); - const F_CHAR *executable_path = vm_executable_path(); - p->executable_path = executable_path ? executable_path : argv[0]; + p->executable_path = argv[0]; int i = 0; @@ -106,6 +105,11 @@ void init_factor(F_PARAMETERS *p) /* OS-specific initialization */ early_init(); + const F_CHAR *executable_path = vm_executable_path(); + + if(executable_path) + p->executable_path = executable_path; + if(p->image_path == NULL) p->image_path = default_image_path(); diff --git a/vm/image.c b/vm/image.c index 5f4492e537..08aae5898c 100755 --- a/vm/image.c +++ b/vm/image.c @@ -112,7 +112,9 @@ bool save_image(const F_CHAR *filename) FILE* file; F_HEADER h; - file = OPEN_WRITE(filename); + F_CHAR temporary_filename[] = "##saving-factor-image##"; + + file = OPEN_WRITE(temporary_filename); if(file == NULL) { print_string("Cannot open image file: "); print_native_string(filename); nl(); @@ -163,6 +165,14 @@ bool save_image(const F_CHAR *filename) return false; } + if(MOVE_FILE_FAILS(temporary_filename, filename)) + { + print_string("Failed to rename tempoarary image file: "); print_string(strerror(errno)); nl(); + if(DELETE_FILE_FAILS(temporary_filename)) + print_string("Failed to clean up temporary image file: "); print_string(strerror(errno)); nl(); + return false; + } + return true; } diff --git a/vm/os-unix.h b/vm/os-unix.h index d2f34b4bc4..9f911acded 100755 --- a/vm/os-unix.h +++ b/vm/os-unix.h @@ -22,6 +22,8 @@ typedef char F_SYMBOL; #define STRCMP strcmp #define STRNCMP strncmp #define STRDUP strdup +#define MOVE_FILE_FAILS(old,new) (rename((old),(new)) < 0) +#define DELETE_FILE_FAILS(old) (unlink((old)) < 0) #define FIXNUM_FORMAT "%ld" #define CELL_FORMAT "%lu" diff --git a/vm/os-windows.h b/vm/os-windows.h index a9c3f6d803..beec7ad37c 100755 --- a/vm/os-windows.h +++ b/vm/os-windows.h @@ -19,6 +19,8 @@ typedef wchar_t F_CHAR; #define STRCMP wcscmp #define STRNCMP wcsncmp #define STRDUP _wcsdup +#define MOVE_FILE_FAILS(old,new) (MoveFile((old),(new)) == 0) +#define DELETE_FILE_FAILS(old) (DeleteFile((old)) == 0) #ifdef WIN64 #define CELL_FORMAT "%Iu"