diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index 3cca798fa4..fc7a44d21d 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -2,6 +2,7 @@ ERROR: I/O error: [ "primitive_read_line_fd_8" "Resource temporarily unavailable" ] +- bignum= - fixup-words is crusty - decide if overflow is a fatal error - f >n: crashes diff --git a/library/hashtables.factor b/library/hashtables.factor index e28c6b2c7b..e23ac1aa97 100644 --- a/library/hashtables.factor +++ b/library/hashtables.factor @@ -49,7 +49,7 @@ USE: vectors : (hashcode) ( key table -- index ) #! Compute the index of the bucket for a key. - >r hashcode HEX: ffffff bitand r> vector-length pred mod ; + >r hashcode HEX: ffffff bitand r> vector-length mod ; : hash* ( key table -- [ key | value ] ) #! Look up a value in the hashtable. First the bucket is diff --git a/library/platform/native/init.factor b/library/platform/native/init.factor index 4b0f673b93..741114af8c 100644 --- a/library/platform/native/init.factor +++ b/library/platform/native/init.factor @@ -39,6 +39,7 @@ USE: io-internals USE: math USE: namespaces USE: parser +USE: prettyprint USE: stack USE: stdio USE: streams @@ -77,4 +78,5 @@ USE: unparser print-banner room. + init-interpreter ; diff --git a/library/platform/native/kernel.factor b/library/platform/native/kernel.factor index 24d7e74689..ddb1b11b7b 100644 --- a/library/platform/native/kernel.factor +++ b/library/platform/native/kernel.factor @@ -48,6 +48,7 @@ USE: unparser [ cons? ] [ 4 cons-hashcode ] [ string? ] [ str-hashcode ] [ fixnum? ] [ ( return the object ) ] + [ bignum? ] [ ( return the object ) ] [ drop t ] [ drop 0 ] ] cond ; @@ -97,7 +98,7 @@ USE: unparser : room. ( -- ) room unparse write " bytes total, " write - unparse write " bytes used" print ; + unparse write " bytes free" print ; ! No compiler... : inline ; diff --git a/native/arithmetic.c b/native/arithmetic.c index 340b2c6ecf..d40299fc28 100644 --- a/native/arithmetic.c +++ b/native/arithmetic.c @@ -34,7 +34,7 @@ INLINE void add_fixnum(CELL x, CELL y) CELL_TO_INTEGER(untag_fixnum_fast(x) + untag_fixnum_fast(y)); } -INLINE void add_bignum(CELL x, CELL y) +void add_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n + ((BIGNUM*)UNTAG(y))->n)); @@ -48,7 +48,7 @@ INLINE void subtract_fixnum(CELL x, CELL y) CELL_TO_INTEGER(untag_fixnum_fast(x) - untag_fixnum_fast(y)); } -INLINE void subtract_bignum(CELL x, CELL y) +void subtract_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n - ((BIGNUM*)UNTAG(y))->n)); @@ -63,7 +63,7 @@ INLINE void multiply_fixnum(CELL x, CELL y) * (BIGNUM_2)untag_fixnum_fast(y)); } -INLINE void multiply_bignum(CELL x, CELL y) +void multiply_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n * ((BIGNUM*)UNTAG(y))->n)); @@ -80,7 +80,7 @@ INLINE void divmod_fixnum(CELL x, CELL y) env.dt = q.rem; } -INLINE void divmod_bignum(CELL x, CELL y) +void divmod_bignum(CELL x, CELL y) { dpush(tag_object(bignum(((BIGNUM*)UNTAG(x))->n / ((BIGNUM*)UNTAG(y))->n))); @@ -96,7 +96,7 @@ INLINE void mod_fixnum(CELL x, CELL y) env.dt = x % y; } -INLINE void mod_bignum(CELL x, CELL y) +void mod_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n % ((BIGNUM*)UNTAG(y))->n)); @@ -110,7 +110,7 @@ INLINE void and_fixnum(CELL x, CELL y) env.dt = x & y; } -INLINE void and_bignum(CELL x, CELL y) +void and_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n & ((BIGNUM*)UNTAG(y))->n)); @@ -124,7 +124,7 @@ INLINE void or_fixnum(CELL x, CELL y) env.dt = x | y; } -INLINE void or_bignum(CELL x, CELL y) +void or_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n | ((BIGNUM*)UNTAG(y))->n)); @@ -138,7 +138,7 @@ INLINE void xor_fixnum(CELL x, CELL y) env.dt = x ^ y; } -INLINE void xor_bignum(CELL x, CELL y) +void xor_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n ^ ((BIGNUM*)UNTAG(y))->n)); @@ -153,7 +153,7 @@ INLINE void shiftleft_fixnum(CELL x, CELL y) << (BIGNUM_2)untag_fixnum_fast(y)); } -INLINE void shiftleft_bignum(CELL x, CELL y) +void shiftleft_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n << ((BIGNUM*)UNTAG(y))->n)); @@ -168,7 +168,7 @@ INLINE void shiftright_fixnum(CELL x, CELL y) >> (BIGNUM_2)untag_fixnum_fast(y)); } -INLINE void shiftright_bignum(CELL x, CELL y) +void shiftright_bignum(CELL x, CELL y) { env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n >> ((BIGNUM*)UNTAG(y))->n)); @@ -182,7 +182,7 @@ INLINE void less_fixnum(CELL x, CELL y) env.dt = tag_boolean((FIXNUM)x < (FIXNUM)y); } -INLINE void less_bignum(CELL x, CELL y) +void less_bignum(CELL x, CELL y) { env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n < ((BIGNUM*)UNTAG(y))->n); @@ -196,7 +196,7 @@ INLINE void lesseq_fixnum(CELL x, CELL y) env.dt = tag_boolean((FIXNUM)x <= (FIXNUM)y); } -INLINE void lesseq_bignum(CELL x, CELL y) +void lesseq_bignum(CELL x, CELL y) { env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n <= ((BIGNUM*)UNTAG(y))->n); @@ -210,7 +210,7 @@ INLINE void greater_fixnum(CELL x, CELL y) env.dt = tag_boolean((FIXNUM)x > (FIXNUM)y); } -INLINE void greater_bignum(CELL x, CELL y) +void greater_bignum(CELL x, CELL y) { env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n > ((BIGNUM*)UNTAG(y))->n); @@ -224,7 +224,7 @@ INLINE void greatereq_fixnum(CELL x, CELL y) env.dt = tag_boolean((FIXNUM)x >= (FIXNUM)y); } -INLINE void greatereq_bignum(CELL x, CELL y) +void greatereq_bignum(CELL x, CELL y) { env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n >= ((BIGNUM*)UNTAG(y))->n); diff --git a/native/memory.c b/native/memory.c index 623545feda..e3193ccabc 100644 --- a/native/memory.c +++ b/native/memory.c @@ -67,8 +67,8 @@ bool in_zone(ZONE* z, CELL pointer) void primitive_room(void) { - /* push: limit here */ + /* push: free total */ dpush(env.dt); env.dt = tag_fixnum(active->limit - active->base); - dpush(tag_fixnum(active->here - active->base)); + dpush(tag_fixnum(active->limit - active->here)); } diff --git a/native/string.c b/native/string.c index 882fbd4b16..cc78257c44 100644 --- a/native/string.c +++ b/native/string.c @@ -13,8 +13,8 @@ STRING* allot_string(CELL capacity) /* uses same algorithm as java.lang.String for compatibility */ void hash_string(STRING* str) { - CELL hash = 0; - int i; + FIXNUM hash = 0; + CELL i; for(i = 0; i < str->capacity; i++) hash = 31*hash + string_nth(str,i); str->hashcode = hash; @@ -23,7 +23,7 @@ void hash_string(STRING* str) /* untagged */ STRING* string(CELL capacity, CELL fill) { - int i; + CELL i; STRING* string = allot_string(capacity); @@ -38,7 +38,7 @@ STRING* string(CELL capacity, CELL fill) STRING* grow_string(STRING* string, CELL capacity, CHAR fill) { /* later on, do an optimization: if end of array is here, just grow */ - int i; + CELL i; STRING* new_string = allot_string(capacity); @@ -55,7 +55,7 @@ STRING* from_c_string(const char* c_string) { CELL length = strlen(c_string); STRING* s = allot_string(length); - int i; + CELL i; for(i = 0; i < length; i++) { @@ -72,7 +72,7 @@ STRING* from_c_string(const char* c_string) char* to_c_string(STRING* s) { STRING* _c_str = allot_string(s->capacity + 1 /* null byte */); - int i; + CELL i; char* c_str = (char*)(_c_str + 1); @@ -147,14 +147,14 @@ void primitive_string_eq(void) CELL with = dpop(); check_non_empty(with); if(typep(STRING_TYPE,with)) - env.dt = tag_boolean(string_eq(s1,UNTAG(with))); + env.dt = tag_boolean(string_eq(s1,(STRING*)UNTAG(with))); else env.dt = F; } void primitive_string_hashcode(void) { - env.dt = tag_fixnum(untag_string(env.dt)->hashcode); + env.dt = tag_object(bignum(untag_string(env.dt)->hashcode)); } INLINE CELL index_of_ch(CELL index, STRING* string, CELL ch) diff --git a/native/string.h b/native/string.h index 916e47fcb4..43088217e8 100644 --- a/native/string.h +++ b/native/string.h @@ -3,7 +3,7 @@ typedef struct { /* untagged */ CELL capacity; /* untagged */ - CELL hashcode; + FIXNUM hashcode; } STRING; INLINE STRING* untag_string(CELL tagged)