Remove integer-slot and set-integer-slot primitives, add word-xt primitive
parent
0620697603
commit
1398494f1d
|
@ -1,8 +1,8 @@
|
||||||
- auto-invoke code gc
|
- auto-invoke code gc
|
||||||
- fix alien-callback/SEH bug on win32
|
|
||||||
- live search: timer delay would be nice
|
- live search: timer delay would be nice
|
||||||
- help responder has no way to access { "foo" "bar" }
|
- help responder has no way to access { "foo" "bar" }
|
||||||
- httpd search tools
|
- httpd search tools
|
||||||
|
- code-gc instability with callbacks
|
||||||
|
|
||||||
+ ui:
|
+ ui:
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,7 @@ call
|
||||||
{ "float>=" "math-internals" }
|
{ "float>=" "math-internals" }
|
||||||
{ "(word)" "kernel-internals" }
|
{ "(word)" "kernel-internals" }
|
||||||
{ "update-xt" "words" }
|
{ "update-xt" "words" }
|
||||||
|
{ "word-xt" "words" }
|
||||||
{ "drop" "kernel" }
|
{ "drop" "kernel" }
|
||||||
{ "2drop" "kernel" }
|
{ "2drop" "kernel" }
|
||||||
{ "3drop" "kernel" }
|
{ "3drop" "kernel" }
|
||||||
|
@ -183,8 +184,6 @@ call
|
||||||
{ "alien-address" "alien" }
|
{ "alien-address" "alien" }
|
||||||
{ "slot" "kernel-internals" }
|
{ "slot" "kernel-internals" }
|
||||||
{ "set-slot" "kernel-internals" }
|
{ "set-slot" "kernel-internals" }
|
||||||
{ "integer-slot" "kernel-internals" }
|
|
||||||
{ "set-integer-slot" "kernel-internals" }
|
|
||||||
{ "char-slot" "kernel-internals" }
|
{ "char-slot" "kernel-internals" }
|
||||||
{ "set-char-slot" "kernel-internals" }
|
{ "set-char-slot" "kernel-internals" }
|
||||||
{ "resize-array" "arrays" }
|
{ "resize-array" "arrays" }
|
||||||
|
|
|
@ -229,7 +229,8 @@ t over set-effect-terminated?
|
||||||
\ (word) { object object } { word } <effect> "infer-effect" set-word-prop
|
\ (word) { object object } { word } <effect> "infer-effect" set-word-prop
|
||||||
|
|
||||||
\ update-xt { word } { } <effect> "infer-effect" set-word-prop
|
\ update-xt { word } { } <effect> "infer-effect" set-word-prop
|
||||||
\ compiled? { word } { object } <effect> "infer-effect" set-word-prop
|
|
||||||
|
\ word-xt { word } { integer } <effect> "infer-effect" set-word-prop
|
||||||
|
|
||||||
\ getenv { fixnum } { object } <effect> "infer-effect" set-word-prop
|
\ getenv { fixnum } { object } <effect> "infer-effect" set-word-prop
|
||||||
\ setenv { object fixnum } { } <effect> "infer-effect" set-word-prop
|
\ setenv { object fixnum } { } <effect> "infer-effect" set-word-prop
|
||||||
|
@ -323,10 +324,6 @@ t over set-effect-terminated?
|
||||||
|
|
||||||
\ set-slot { object object fixnum } { } <effect> "infer-effect" set-word-prop
|
\ set-slot { object object fixnum } { } <effect> "infer-effect" set-word-prop
|
||||||
|
|
||||||
\ integer-slot { object fixnum } { integer } <effect> "infer-effect" set-word-prop
|
|
||||||
|
|
||||||
\ set-integer-slot { integer object fixnum } { } <effect> "infer-effect" set-word-prop
|
|
||||||
|
|
||||||
\ char-slot { fixnum object } { fixnum } <effect> "infer-effect" set-word-prop
|
\ char-slot { fixnum object } { fixnum } <effect> "infer-effect" set-word-prop
|
||||||
|
|
||||||
\ set-char-slot { fixnum fixnum object } { } <effect> "infer-effect" set-word-prop
|
\ set-char-slot { fixnum fixnum object } { } <effect> "infer-effect" set-word-prop
|
||||||
|
|
|
@ -356,16 +356,6 @@ HELP: setenv ( obj n -- )
|
||||||
{ $values { "n" "a non-negative integer" } { "obj" "an object" } }
|
{ $values { "n" "a non-negative integer" } { "obj" "an object" } }
|
||||||
{ $description "Writes an object to the Factor runtime's environment table. User code never has to write to the environment table directly; instead, use one of the callers of this word." } ;
|
{ $description "Writes an object to the Factor runtime's environment table. User code never has to write to the environment table directly; instead, use one of the callers of this word." } ;
|
||||||
|
|
||||||
HELP: integer-slot ( obj m -- n )
|
|
||||||
{ $values { "obj" "an object" } { "m" "a non-negative fixnum" } { "n" "an integer" } }
|
|
||||||
{ $description "Reads the untagged integer stored at the " { $snippet "n" } "th slot of " { $snippet "obj" } "." }
|
|
||||||
{ $warning "This word is in the " { $vocab-link "kernel-internals" } " vocabulary because it does not perform type or bounds checks, and slot numbers are implementation detail." } ;
|
|
||||||
|
|
||||||
HELP: set-integer-slot ( m obj n -- )
|
|
||||||
{ $values { "n" "an integer" } { "obj" "an object" } { "m" "a non-negative fixnum" } }
|
|
||||||
{ $description "Writes an untagged integer to the " { $snippet "n" } "th slot of " { $snippet "obj" } "." }
|
|
||||||
{ $warning "This word is in the " { $vocab-link "kernel-internals" } " vocabulary because it does not perform type or bounds checks, and slot numbers are implementation detail." } ;
|
|
||||||
|
|
||||||
HELP: slot ( obj m -- value )
|
HELP: slot ( obj m -- value )
|
||||||
{ $values { "obj" "an object" } { "m" "a non-negative fixnum" } { "value" "an object" } }
|
{ $values { "obj" "an object" } { "m" "a non-negative fixnum" } { "value" "an object" } }
|
||||||
{ $description "Reads the object stored at the " { $snippet "n" } "th slot of " { $snippet "obj" } "." }
|
{ $description "Reads the object stored at the " { $snippet "n" } "th slot of " { $snippet "obj" } "." }
|
||||||
|
|
|
@ -49,9 +49,6 @@ M: symbol definer drop \ SYMBOL: ;
|
||||||
[ rot word-props set-hash ]
|
[ rot word-props set-hash ]
|
||||||
[ nip remove-word-prop ] if ;
|
[ nip remove-word-prop ] if ;
|
||||||
|
|
||||||
GENERIC: word-xt ( word -- xt )
|
|
||||||
M: word word-xt 8 integer-slot ;
|
|
||||||
|
|
||||||
SYMBOL: vocabularies
|
SYMBOL: vocabularies
|
||||||
|
|
||||||
: vocab ( name -- vocab ) vocabularies get hash ;
|
: vocab ( name -- vocab ) vocabularies get hash ;
|
||||||
|
|
|
@ -68,6 +68,7 @@ void* primitives[] = {
|
||||||
primitive_float_greatereq,
|
primitive_float_greatereq,
|
||||||
primitive_word,
|
primitive_word,
|
||||||
primitive_update_xt,
|
primitive_update_xt,
|
||||||
|
primitive_word_xt,
|
||||||
primitive_drop,
|
primitive_drop,
|
||||||
primitive_2drop,
|
primitive_2drop,
|
||||||
primitive_3drop,
|
primitive_3drop,
|
||||||
|
@ -150,8 +151,6 @@ void* primitives[] = {
|
||||||
primitive_alien_address,
|
primitive_alien_address,
|
||||||
primitive_slot,
|
primitive_slot,
|
||||||
primitive_set_slot,
|
primitive_set_slot,
|
||||||
primitive_integer_slot,
|
|
||||||
primitive_set_integer_slot,
|
|
||||||
primitive_char_slot,
|
primitive_char_slot,
|
||||||
primitive_set_char_slot,
|
primitive_set_char_slot,
|
||||||
primitive_resize_array,
|
primitive_resize_array,
|
||||||
|
|
15
vm/run.c
15
vm/run.c
|
@ -217,21 +217,6 @@ void primitive_set_slot(void)
|
||||||
write_barrier(obj);
|
write_barrier(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void primitive_integer_slot(void)
|
|
||||||
{
|
|
||||||
F_FIXNUM slot = untag_fixnum_fast(dpop());
|
|
||||||
CELL obj = UNTAG(dpop());
|
|
||||||
dpush(tag_cell(get(SLOT(obj,slot))));
|
|
||||||
}
|
|
||||||
|
|
||||||
void primitive_set_integer_slot(void)
|
|
||||||
{
|
|
||||||
F_FIXNUM slot = untag_fixnum_fast(dpop());
|
|
||||||
CELL obj = UNTAG(dpop());
|
|
||||||
F_FIXNUM value = to_cell(dpop());
|
|
||||||
put(SLOT(obj,slot),value);
|
|
||||||
}
|
|
||||||
|
|
||||||
CELL clone(CELL obj)
|
CELL clone(CELL obj)
|
||||||
{
|
{
|
||||||
CELL size = object_size(obj);
|
CELL size = object_size(obj);
|
||||||
|
|
2
vm/run.h
2
vm/run.h
|
@ -123,8 +123,6 @@ void primitive_type(void);
|
||||||
void primitive_tag(void);
|
void primitive_tag(void);
|
||||||
void primitive_slot(void);
|
void primitive_slot(void);
|
||||||
void primitive_set_slot(void);
|
void primitive_set_slot(void);
|
||||||
void primitive_integer_slot(void);
|
|
||||||
void primitive_set_integer_slot(void);
|
|
||||||
CELL clone(CELL obj);
|
CELL clone(CELL obj);
|
||||||
void primitive_clone(void);
|
void primitive_clone(void);
|
||||||
|
|
||||||
|
|
|
@ -450,6 +450,12 @@ void primitive_update_xt(void)
|
||||||
update_xt(untag_word(dpop()));
|
update_xt(untag_word(dpop()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void primitive_word_xt(void)
|
||||||
|
{
|
||||||
|
F_WORD *word = untag_word(dpeek());
|
||||||
|
drepl(tag_cell(word->xt));
|
||||||
|
}
|
||||||
|
|
||||||
void fixup_word(F_WORD* word)
|
void fixup_word(F_WORD* word)
|
||||||
{
|
{
|
||||||
/* If this is a compiled word, relocate the code pointer. Otherwise,
|
/* If this is a compiled word, relocate the code pointer. Otherwise,
|
||||||
|
|
|
@ -161,6 +161,7 @@ INLINE CELL tag_word(F_WORD *word)
|
||||||
void update_xt(F_WORD* word);
|
void update_xt(F_WORD* word);
|
||||||
void primitive_word(void);
|
void primitive_word(void);
|
||||||
void primitive_update_xt(void);
|
void primitive_update_xt(void);
|
||||||
|
void primitive_word_xt(void);
|
||||||
void fixup_word(F_WORD* word);
|
void fixup_word(F_WORD* word);
|
||||||
|
|
||||||
INLINE F_WRAPPER *untag_wrapper_fast(CELL tagged)
|
INLINE F_WRAPPER *untag_wrapper_fast(CELL tagged)
|
||||||
|
|
Loading…
Reference in New Issue