Fix method redefinition bug

db4
Slava Pestov 2008-02-17 18:38:29 -06:00
parent 9660a9c2d6
commit de8b804abe
9 changed files with 32 additions and 16 deletions

View File

@ -78,7 +78,7 @@ nl
[ compiled-usages recompile ] recompile-hook set-global ;
: disable-compiler ( -- )
[ [ f ] { } map>assoc modify-code-heap ] recompile-hook set-global ;
[ default-recompile-hook ] recompile-hook set-global ;
enable-compiler

View File

@ -55,7 +55,9 @@ IN: compiler
H{ } clone compiled set
[ queue-compile ] each
compile-queue get compile-loop
compiled get >alist modify-code-heap
compiled get >alist
dup [ drop crossref? ] assoc-contains?
modify-code-heap
] with-scope ; inline
: compile ( words -- )
@ -70,4 +72,4 @@ IN: compiler
[ all-words recompile ] with-compiler-errors ;
: decompile ( word -- )
f 2array 1array modify-code-heap ;
f 2array 1array t modify-code-heap ;

View File

@ -77,6 +77,11 @@ GENERIC: definitions-changed ( assoc obj -- )
[ ] cleanup
] with-scope ; inline
: default-recompile-hook
[ f ] { } map>assoc
dup [ drop crossref? ] assoc-contains?
modify-code-heap ;
recompile-hook global
[ [ [ f ] { } map>assoc modify-code-heap ] or ]
[ [ default-recompile-hook ] or ]
change-at

View File

@ -1,11 +1,11 @@
! Copyright (C) 2004, 2007 Slava Pestov.
! Copyright (C) 2004, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays definitions generic hashtables inspector io kernel
math namespaces prettyprint sequences assocs sequences.private
strings io.styles vectors words system splitting math.parser
tuples continuations continuations.private combinators
generic.math io.streams.duplex classes compiler.units
generic.standard ;
generic.standard vocabs ;
IN: debugger
GENERIC: error. ( error -- )
@ -254,3 +254,6 @@ M: no-compilation-unit error.
"Attempting to define " write
no-compilation-unit-definition pprint
" outside of a compilation unit" print ;
M: no-vocab summary
drop "Vocabulary does not exist" ;

View File

@ -10,7 +10,7 @@ namespaces.private parser prettyprint quotations
quotations.private sbufs sbufs.private sequences
sequences.private slots.private strings strings.private system
threads.private tuples tuples.private vectors vectors.private
words words.private assocs inspector ;
words words.private assocs inspector compiler.units ;
IN: inference.known-words
! Shuffle words
@ -598,3 +598,5 @@ set-primitive-effect
\ do-primitive [ \ do-primitive no-effect ] "infer" set-word-prop
\ dll-valid? { object } { object } <effect> set-primitive-effect
\ modify-code-heap { array object } { } <effect> set-primitive-effect

View File

@ -48,7 +48,14 @@ M: duplex-stream stream-read-quot
: listen ( -- )
listener-hook get call prompt.
[ read-quot [ call ] [ bye ] if* ] try ;
[ read-quot [ try ] [ bye ] if* ]
[
dup parse-error? [
error-hook get call
] [
rethrow
] if
] recover ;
: until-quit ( -- )
quit-flag get

View File

@ -63,6 +63,7 @@ DEFER: (flat-length)
: inline-standard-method ( node word -- node )
2dup dispatching-class dup [
over +inlined+ depends-on
swap method method-word 1quotation f splice-quot
] [
3drop t

View File

@ -7,7 +7,7 @@ IN: temporary
[ ] [ foo ] unit-test
! erg's bug
GENERIC: some-generic
GENERIC: some-generic ( a -- b )
M: integer some-generic 1+ ;

View File

@ -28,7 +28,7 @@ void *get_rel_symbol(F_REL *rel, CELL literals_start)
if(type_of(symbol) == BYTE_ARRAY_TYPE)
{
F_CHAR *name = alien_offset(symbol);
F_SYMBOL *name = alien_offset(symbol);
void *sym = ffi_dlsym(dll,name);
if(sym)
@ -40,7 +40,7 @@ void *get_rel_symbol(F_REL *rel, CELL literals_start)
F_ARRAY *names = untag_object(symbol);
for(i = 0; i < array_capacity(names); i++)
{
F_CHAR *name = alien_offset(array_nth(names,i));
F_SYMBOL *name = alien_offset(array_nth(names,i));
void *sym = ffi_dlsym(dll,name);
if(sym)
@ -318,10 +318,9 @@ void default_word_code(F_WORD *word, bool relocate)
DEFINE_PRIMITIVE(modify_code_heap)
{
bool rescan_code_heap = to_boolean(dpop());
F_ARRAY *alist = untag_array(dpop());
bool rescan_code_heap = false;
CELL count = untag_fixnum_fast(alist->capacity);
CELL i;
for(i = 0; i < count; i++)
@ -330,9 +329,6 @@ DEFINE_PRIMITIVE(modify_code_heap)
F_WORD *word = untag_word(array_nth(pair,0));
if(word->vocabulary != F)
rescan_code_heap = true;
CELL data = array_nth(pair,1);
if(data == F)