words are now hashed
parent
dd45011141
commit
9901fbdc28
|
@ -6,6 +6,7 @@
|
||||||
- index.html
|
- index.html
|
||||||
- if a directory is requested and URL does not end with /, redirect
|
- if a directory is requested and URL does not end with /, redirect
|
||||||
- minimize stage2 initialization code, just move it to source files
|
- minimize stage2 initialization code, just move it to source files
|
||||||
|
_ push call/allot counts as ulong bignums
|
||||||
|
|
||||||
+ bignums:
|
+ bignums:
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,7 @@ DEFER: (random-int)
|
||||||
|
|
||||||
IN: words
|
IN: words
|
||||||
DEFER: <word>
|
DEFER: <word>
|
||||||
|
DEFER: word-hashcode
|
||||||
DEFER: word-primitive
|
DEFER: word-primitive
|
||||||
DEFER: set-word-primitive
|
DEFER: set-word-primitive
|
||||||
DEFER: word-parameter
|
DEFER: word-parameter
|
||||||
|
@ -196,6 +197,7 @@ IN: cross-compiler
|
||||||
fsqrt
|
fsqrt
|
||||||
word?
|
word?
|
||||||
<word>
|
<word>
|
||||||
|
word-hashcode
|
||||||
word-primitive
|
word-primitive
|
||||||
set-word-primitive
|
set-word-primitive
|
||||||
word-parameter
|
word-parameter
|
||||||
|
|
|
@ -36,6 +36,7 @@ USE: logic
|
||||||
USE: math
|
USE: math
|
||||||
USE: namespaces
|
USE: namespaces
|
||||||
USE: prettyprint
|
USE: prettyprint
|
||||||
|
USE: random
|
||||||
USE: stack
|
USE: stack
|
||||||
USE: stdio
|
USE: stdio
|
||||||
USE: streams
|
USE: streams
|
||||||
|
@ -168,7 +169,9 @@ USE: words
|
||||||
( Words )
|
( Words )
|
||||||
|
|
||||||
: word, ( -- pointer )
|
: word, ( -- pointer )
|
||||||
word-tag here-as word-tag >header emit 0 emit ;
|
word-tag here-as word-tag >header emit
|
||||||
|
0 HEX: fffffff random-int emit ( hashcode )
|
||||||
|
0 emit ;
|
||||||
|
|
||||||
! This is to handle mutually recursive words
|
! This is to handle mutually recursive words
|
||||||
! It is a hack. A recursive word in the cdr of a
|
! It is a hack. A recursive word in the cdr of a
|
||||||
|
@ -295,7 +298,6 @@ IN: cross-compiler
|
||||||
r> ( parameter -- ) emit
|
r> ( parameter -- ) emit
|
||||||
( plist -- ) emit
|
( plist -- ) emit
|
||||||
0 emit ( padding )
|
0 emit ( padding )
|
||||||
0 emit
|
|
||||||
0 emit ;
|
0 emit ;
|
||||||
|
|
||||||
: primitive, ( word primitive -- ) f (worddef,) ;
|
: primitive, ( word primitive -- ) f (worddef,) ;
|
||||||
|
|
|
@ -47,6 +47,7 @@ USE: vectors
|
||||||
: hashcode ( obj -- hash )
|
: hashcode ( obj -- hash )
|
||||||
#! If two objects are =, they must have equal hashcodes.
|
#! If two objects are =, they must have equal hashcodes.
|
||||||
[
|
[
|
||||||
|
[ word? ] [ word-hashcode ]
|
||||||
[ cons? ] [ 4 cons-hashcode ]
|
[ cons? ] [ 4 cons-hashcode ]
|
||||||
[ string? ] [ str-hashcode ]
|
[ string? ] [ str-hashcode ]
|
||||||
[ number? ] [ >fixnum ]
|
[ number? ] [ >fixnum ]
|
||||||
|
|
|
@ -87,6 +87,7 @@ XT primitives[] = {
|
||||||
primitive_fsqrt,
|
primitive_fsqrt,
|
||||||
primitive_wordp,
|
primitive_wordp,
|
||||||
primitive_word,
|
primitive_word,
|
||||||
|
primitive_word_hashcode,
|
||||||
primitive_word_primitive,
|
primitive_word_primitive,
|
||||||
primitive_set_word_primitive,
|
primitive_set_word_primitive,
|
||||||
primitive_word_parameter,
|
primitive_word_parameter,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
extern XT primitives[];
|
extern XT primitives[];
|
||||||
#define PRIMITIVE_COUNT 144
|
#define PRIMITIVE_COUNT 145
|
||||||
|
|
||||||
CELL primitive_to_xt(CELL primitive);
|
CELL primitive_to_xt(CELL primitive);
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
WORD* word(CELL primitive, CELL parameter, CELL plist)
|
WORD* word(CELL primitive, CELL parameter, CELL plist)
|
||||||
{
|
{
|
||||||
WORD* word = allot_object(WORD_TYPE,sizeof(WORD));
|
WORD* word = allot_object(WORD_TYPE,sizeof(WORD));
|
||||||
|
word->hashcode = (CELL)word; /* initial address */
|
||||||
word->xt = primitive_to_xt(primitive);
|
word->xt = primitive_to_xt(primitive);
|
||||||
word->primitive = primitive;
|
word->primitive = primitive;
|
||||||
word->parameter = parameter;
|
word->parameter = parameter;
|
||||||
word->plist = plist;
|
word->plist = plist;
|
||||||
word->call_count = 0;
|
word->call_count = 0;
|
||||||
|
word->allot_count = 0;
|
||||||
|
|
||||||
return word;
|
return word;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +37,11 @@ void primitive_word(void)
|
||||||
dpush(tag_word(word(primitive,parameter,plist)));
|
dpush(tag_word(word(primitive,parameter,plist)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void primitive_word_hashcode(void)
|
||||||
|
{
|
||||||
|
drepl(tag_fixnum(untag_word(dpeek())->hashcode));
|
||||||
|
}
|
||||||
|
|
||||||
void primitive_word_primitive(void)
|
void primitive_word_primitive(void)
|
||||||
{
|
{
|
||||||
drepl(tag_fixnum(untag_word(dpeek())->primitive));
|
drepl(tag_fixnum(untag_word(dpeek())->primitive));
|
||||||
|
|
|
@ -3,6 +3,8 @@ typedef void (*XT)(void);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* TAGGED header */
|
/* TAGGED header */
|
||||||
CELL header;
|
CELL header;
|
||||||
|
/* untagged hashcode */
|
||||||
|
CELL hashcode;
|
||||||
/* untagged execution token: jump here to execute word */
|
/* untagged execution token: jump here to execute word */
|
||||||
CELL xt;
|
CELL xt;
|
||||||
/* untagged on-disk primitive number */
|
/* untagged on-disk primitive number */
|
||||||
|
@ -15,7 +17,6 @@ typedef struct {
|
||||||
CELL call_count;
|
CELL call_count;
|
||||||
/* UNTAGGED amount of memory allocated in word */
|
/* UNTAGGED amount of memory allocated in word */
|
||||||
CELL allot_count;
|
CELL allot_count;
|
||||||
CELL padding;
|
|
||||||
} WORD;
|
} WORD;
|
||||||
|
|
||||||
INLINE WORD* untag_word(CELL tagged)
|
INLINE WORD* untag_word(CELL tagged)
|
||||||
|
@ -33,6 +34,7 @@ WORD* word(CELL primitive, CELL parameter, CELL plist);
|
||||||
void update_xt(WORD* word);
|
void update_xt(WORD* word);
|
||||||
void primitive_wordp(void);
|
void primitive_wordp(void);
|
||||||
void primitive_word(void);
|
void primitive_word(void);
|
||||||
|
void primitive_word_hashcode(void);
|
||||||
void primitive_word_primitive(void);
|
void primitive_word_primitive(void);
|
||||||
void primitive_set_word_primitive(void);
|
void primitive_set_word_primitive(void);
|
||||||
void primitive_word_parameter(void);
|
void primitive_word_parameter(void);
|
||||||
|
|
Loading…
Reference in New Issue