more descriptive undefined-method error

cvs
Slava Pestov 2005-01-24 02:31:32 +00:00
parent c026fd7786
commit af40535556
5 changed files with 30 additions and 9 deletions

View File

@ -37,6 +37,11 @@ USE: namespaces
USE: strings
USE: vectors
: undefined-method ( object generic -- )
#! This word is redefined in tools/debugger.factor with a
#! more useful definition once unparse is available.
"No suitable method" throw ;
! This is a very lightweight exception handling system.
: catchstack ( -- cs ) 6 getenv ;

View File

@ -38,6 +38,7 @@ USE: words
USE: vectors
USE: math
USE: math-internals
USE: unparser
! A simple single-dispatch generic word system.
@ -64,9 +65,6 @@ USE: math-internals
! Metaclasses have priority -- this induces an order in which
! methods are added to the vtable.
: undefined-method
"No applicable method." throw ;
: metaclass ( class -- metaclass )
"metaclass" word-property ;
@ -94,14 +92,17 @@ USE: math-internals
#! Add the method entry to the vtable. Unlike define-method,
#! this is called at vtable build time, and in the sorted
#! order.
dup metaclass "add-method" word-property
[ [ undefined-method ] ] unless* call ;
dup metaclass "add-method" word-property [
[ "Metaclass is missing add-method" throw ]
] unless* call ;
: <empty-vtable> ( -- vtable )
num-types [ drop [ undefined-method ] ] vector-project ;
: <empty-vtable> ( generic -- vtable )
unit num-types
[ drop dup [ car undefined-method ] cons ] vector-project
nip ;
: <vtable> ( generic -- vtable )
<empty-vtable> over methods [
dup <empty-vtable> over methods [
( generic vtable method )
>r 2dup r> unswons add-method
] each nip ;

View File

@ -204,5 +204,6 @@ M: symbol (apply-word) ( word -- )
\ - [ [ number number ] [ number ] ] "infer-effect" set-word-property
\ undefined-method t "terminator" set-word-property
\ undefined-method [ [ object word ] [ ] ] "infer-effect" set-word-property
\ not-a-number t "terminator" set-word-property
\ throw t "terminator" set-word-property

View File

@ -121,7 +121,11 @@ M: word prettyprint* ( indent word -- indent )
[ prettyprint-element ] each ;
M: list prettyprint* ( indent list -- indent )
swap prettyprint-[ swap prettyprint-list prettyprint-] ;
[
swap prettyprint-[ swap prettyprint-list prettyprint-]
] [
f unparse write
] ifte* ;
M: cons prettyprint* ( indent cons -- indent )
\ [[ prettyprint* " " write

View File

@ -175,6 +175,16 @@ M: object error. ( error -- )
[ dup save-error rethrow ] 5 setenv ( kernel calls on error )
kernel-error 12 setenv ;
: undefined-method ( object generic -- )
#! We 2dup here to leave both values on the stack, for
#! post-mortem inspection.
2dup [
"The generic word " ,
unparse ,
" does not have a suitable method for " ,
unparse ,
] make-string throw ;
! So that stage 2 boot gives a useful error message if something
! fails after this file is loaded.
init-error-handler