some more bootstrapping fixes
parent
df455b5de8
commit
ed63d91759
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -3,7 +3,7 @@ typedef struct {
|
|||
/* untagged */
|
||||
CELL capacity;
|
||||
/* untagged */
|
||||
CELL hashcode;
|
||||
FIXNUM hashcode;
|
||||
} STRING;
|
||||
|
||||
INLINE STRING* untag_string(CELL tagged)
|
||||
|
|
Loading…
Reference in New Issue