Added 'depth' counter to stack frames. The idea is two-fold:
1. You can limit runaway recursion by binding a symbol *max_stack_depth* in the environment 2. You can limit the number of backtrace frames printed. However, neither of these have been implemented yet.
This commit is contained in:
parent
72a8bc09e0
commit
2536e76617
7 changed files with 140 additions and 79 deletions
151
src/ops/intern.c
151
src/ops/intern.c
|
|
@ -316,81 +316,92 @@ struct cons_pointer search_store( struct cons_pointer key,
|
|||
return_key ? "key" : "value" );
|
||||
#endif
|
||||
|
||||
if ( symbolp( key ) || keywordp( key ) ) {
|
||||
struct cons_space_object *store_cell = &pointer2cell( store );
|
||||
switch ( get_tag_value( key) ) {
|
||||
case SYMBOLTV:
|
||||
case KEYTV:
|
||||
struct cons_space_object *store_cell = &pointer2cell( store );
|
||||
|
||||
switch ( get_tag_value( store ) ) {
|
||||
case CONSTV:
|
||||
for ( struct cons_pointer cursor = store;
|
||||
nilp( result ) && ( consp( cursor )
|
||||
|| hashmapp( cursor ) );
|
||||
cursor = pointer2cell( cursor ).payload.cons.cdr ) {
|
||||
switch ( get_tag_value( cursor ) ) {
|
||||
case CONSTV:
|
||||
struct cons_pointer entry_ptr = c_car( cursor );
|
||||
switch ( get_tag_value( store ) ) {
|
||||
case CONSTV:
|
||||
for ( struct cons_pointer cursor = store;
|
||||
nilp( result ) && ( consp( cursor )
|
||||
|| hashmapp( cursor ) );
|
||||
cursor = pointer2cell( cursor ).payload.cons.cdr ) {
|
||||
switch ( get_tag_value( cursor ) ) {
|
||||
case CONSTV:
|
||||
struct cons_pointer entry_ptr = c_car( cursor );
|
||||
|
||||
switch ( get_tag_value( entry_ptr ) ) {
|
||||
case CONSTV:
|
||||
if ( equal( key, c_car( entry_ptr ) ) ) {
|
||||
switch ( get_tag_value( entry_ptr ) ) {
|
||||
case CONSTV:
|
||||
if ( equal( key, c_car( entry_ptr ) ) ) {
|
||||
result =
|
||||
return_key ? c_car( entry_ptr ) :
|
||||
c_cdr( entry_ptr );
|
||||
}
|
||||
break;
|
||||
case HASHTV:
|
||||
case NAMESPACETV:
|
||||
// TODO: I think this should be impossible, and we should maybe
|
||||
// throw an exception.
|
||||
result =
|
||||
return_key ? c_car( entry_ptr ) :
|
||||
c_cdr( entry_ptr );
|
||||
}
|
||||
break;
|
||||
case HASHTV:
|
||||
case NAMESPACETV:
|
||||
// TODO: I think this should be impossible, and we should maybe
|
||||
// throw an exception.
|
||||
result =
|
||||
hashmap_get( entry_ptr, key,
|
||||
return_key );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception
|
||||
( c_string_to_lisp_symbol
|
||||
( L"search-store (entry)" ),
|
||||
make_cons( c_string_to_lisp_string
|
||||
( L"Unexpected store type: " ),
|
||||
c_type( c_car
|
||||
( entry_ptr ) ) ),
|
||||
NIL );
|
||||
hashmap_get( entry_ptr, key,
|
||||
return_key );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception
|
||||
( c_string_to_lisp_symbol
|
||||
( L"search-store (entry)" ),
|
||||
make_cons( c_string_to_lisp_string
|
||||
( L"Unexpected store type: " ),
|
||||
c_type( c_car
|
||||
( entry_ptr ) ) ),
|
||||
NIL );
|
||||
|
||||
}
|
||||
break;
|
||||
case HASHTV:
|
||||
case NAMESPACETV:
|
||||
debug_print
|
||||
( L"\n\tHashmap as top-level value in list",
|
||||
DEBUG_BIND );
|
||||
result = hashmap_get( cursor, key, return_key );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception( c_string_to_lisp_symbol
|
||||
( L"search-store (cursor)" ),
|
||||
make_cons
|
||||
( c_string_to_lisp_string
|
||||
( L"Unexpected store type: " ),
|
||||
c_type( cursor ) ), NIL );
|
||||
}
|
||||
break;
|
||||
case HASHTV:
|
||||
case NAMESPACETV:
|
||||
debug_print
|
||||
( L"\n\tHashmap as top-level value in list",
|
||||
DEBUG_BIND );
|
||||
result = hashmap_get( cursor, key, return_key );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception( c_string_to_lisp_symbol
|
||||
( L"search-store (cursor)" ),
|
||||
make_cons
|
||||
( c_string_to_lisp_string
|
||||
( L"Unexpected store type: " ),
|
||||
c_type( cursor ) ), NIL );
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HASHTV:
|
||||
case NAMESPACETV:
|
||||
result = hashmap_get( store, key, return_key );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception( c_string_to_lisp_symbol
|
||||
( L"search-store (store)" ),
|
||||
make_cons( c_string_to_lisp_string
|
||||
( L"Unexpected store type: " ),
|
||||
c_type( store ) ), NIL );
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// failing with key type NIL here (?). Probably worth dumping the stack?
|
||||
break;
|
||||
case HASHTV:
|
||||
case NAMESPACETV:
|
||||
result = hashmap_get( store, key, return_key );
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception( c_string_to_lisp_symbol
|
||||
( L"search-store (store)" ),
|
||||
make_cons( c_string_to_lisp_string
|
||||
( L"Unexpected store type: " ),
|
||||
c_type( store ) ), NIL );
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case EXCEPTIONTV:
|
||||
result =
|
||||
throw_exception( c_string_to_lisp_symbol( L"search-store (exception)" ),
|
||||
make_cons
|
||||
( c_string_to_lisp_string
|
||||
( L"Unexpected key type: " ), c_type( key ) ),
|
||||
NIL );
|
||||
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
throw_exception( c_string_to_lisp_symbol( L"search-store (key)" ),
|
||||
make_cons
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue