[INTERPRETER]

* BUG: Collection methods now always update the Key property, being called normally or from the debugger.
* BUG: The debugger now sends the current key when enumerating collection keys.


git-svn-id: svn://localhost/gambas/trunk@7627 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Benoît Minisini 2016-03-11 23:44:26 +00:00
parent 0944141a51
commit 214ce4f43e
2 changed files with 33 additions and 38 deletions

View file

@ -194,7 +194,7 @@ BEGIN_METHOD_VOID(Collection_next)
HASH_TABLE *hash_table = OBJECT(CCOLLECTION)->hash_table;
HASH_ENUM *iter = (HASH_ENUM *)GB_GetEnum();
value = HASH_TABLE_next(hash_table, iter, !DEBUG_inside_eval);
value = HASH_TABLE_next(hash_table, iter, TRUE);
if (value == NULL)
GB_StopEnum();
@ -206,7 +206,7 @@ END_METHOD
BEGIN_METHOD(Collection_get, GB_STRING key)
void *value = get_key(THIS, STRING(key), LENGTH(key), !DEBUG_inside_eval);
void *value = get_key(THIS, STRING(key), LENGTH(key), TRUE);
if (!value)
{
if (THIS->has_default)
@ -342,7 +342,7 @@ bool GB_CollectionGet(GB_COLLECTION col, const char *key, int len, GB_VARIANT *v
value->type = T_VARIANT;
var = (VARIANT *)get_key(THIS, key, len, !DEBUG_inside_eval);
var = (VARIANT *)get_key(THIS, key, len, TRUE);
if (!var)
{
@ -376,7 +376,7 @@ bool GB_CollectionEnum(GB_COLLECTION col, GB_COLLECTION_ITER *iter, GB_VARIANT *
return FALSE;
}
val = HASH_TABLE_next(hash_table, (HASH_ENUM *)iter, !DEBUG_inside_eval);
val = HASH_TABLE_next(hash_table, (HASH_ENUM *)iter, TRUE);
if (!val)
return TRUE;

View file

@ -78,7 +78,7 @@ const char *DEBUG_get_position(CLASS *cp, FUNCTION *fp, PCODE *pc)
if (!cp || !pc)
return "?";
if (fp != NULL && fp->debug)
calc_line_from_position(cp, fp, pc, &line);
@ -115,10 +115,10 @@ void DEBUG_init(void)
LIBRARY_get_interface_by_name("gb.debug", DEBUG_INTERFACE_VERSION, &DEBUG);
DEBUG_info = DEBUG.Init((GB_DEBUG_INTERFACE *)(void *)GAMBAS_DebugApi, EXEC_fifo, EXEC_fifo_name);
if (!DEBUG_info)
ERROR_panic("Cannot initializing debug mode");
if (EXEC_profile)
{
EXEC_profile_instr = TRUE;
@ -248,14 +248,8 @@ bool DEBUG_get_value(const char *sym, int len, GB_VARIANT *ret)
__FOUND:
/*printf("%.*s =", (int)len, sym);
print_value(&value);*/
BORROW(&value);
/*if (value.type == T_ARRAY)
value._array.keep = TRUE;
else*/
VALUE_conv_variant(&value);
VALUE_conv_variant(&value);
UNBORROW(&value);
*((VALUE *)ret) = value;
@ -322,7 +316,7 @@ int DEBUG_set_value(const char *sym, int len, VALUE *value)
}
ret = GB_DEBUG_SET_READ_ONLY;
__FOUND:
0;
@ -348,7 +342,7 @@ int DEBUG_get_object_access_type(void *object, CLASS *class, int *count)
if (!object)
goto __NORMAL;
if (class == CLASS_Class || OBJECT_is_class(object))
{
class = (CLASS *)object;
@ -375,20 +369,20 @@ int DEBUG_get_object_access_type(void *object, CLASS *class, int *count)
access = GB_DEBUG_ACCESS_COLLECTION;
else
goto __NORMAL;
desc = CLASS_get_symbol_desc(class, "Count");
if (!desc)
goto __NORMAL;
type = CLASS_DESC_get_type(desc);
// The two only possible cases:
// A static read-only property, and object == NULL
// or a dynamic read-only property, and object != NULL
if (!((type == CD_PROPERTY_READ && object) || (type == CD_STATIC_PROPERTY_READ && !object)))
goto __NORMAL;
TRY
{
if (desc->property.native)
@ -411,7 +405,7 @@ int DEBUG_get_object_access_type(void *object, CLASS *class, int *count)
UNBORROW(RP);
RP->type = T_VOID;
}
if (access != GB_DEBUG_ACCESS_NORMAL)
{
VALUE_conv_integer(&TEMP);
@ -424,15 +418,15 @@ int DEBUG_get_object_access_type(void *object, CLASS *class, int *count)
}
END_TRY
// For collection-like objects, check _next and Key property
if (access == GB_DEBUG_ACCESS_COLLECTION)
{
dm = CLASS_get_special_desc(class, SPEC_NEXT);
if (!dm)
goto __NORMAL;
desc = CLASS_get_symbol_desc(class, "Key");
if (!desc)
goto __NORMAL;
@ -441,7 +435,7 @@ int DEBUG_get_object_access_type(void *object, CLASS *class, int *count)
if (type != CD_PROPERTY_READ && type != CD_PROPERTY && type != CD_STATIC_PROPERTY_READ && type != CD_STATIC_PROPERTY && type != CD_VARIABLE && type != CD_STATIC_VARIABLE)
goto __NORMAL;
}
return access;
__NORMAL:
@ -454,7 +448,7 @@ void DEBUG_print_backtrace(STACK_BACKTRACE *bt)
bool stop;
STACK_BACKTRACE *NO_WARNING(end);
//STACK_CONTEXT *sc = (STACK_CONTEXT *)(STACK_base + STACK_size) - err->bt_count;
//fprintf(stderr, "0: %s\n", DEBUG_get_position(err->cp, err->fp, err->pc));
for (i = 0, n = 0, stop = FALSE; !stop; i++)
{
@ -472,7 +466,7 @@ void DEBUG_print_backtrace(STACK_BACKTRACE *bt)
}
}
fputc('\n', stderr);
STACK_backtrace_set_end(end);
}
@ -493,7 +487,7 @@ GB_ARRAY DEBUG_get_string_array_from_backtrace(STACK_BACKTRACE *bt)
GB_ARRAY array;
int i, n, size;
STACK_BACKTRACE *end;
for (i = 0, size = 0;; i++)
{
if (bt[i].pc)
@ -505,10 +499,10 @@ GB_ARRAY DEBUG_get_string_array_from_backtrace(STACK_BACKTRACE *bt)
break;
}
}
GB_ArrayNew(&array, GB_T_STRING, size);
//*((char **)GB_ArrayGet(array, 0)) = STRING_new_zero(DEBUG_get_position(err->cp, err->fp, err->pc));
for (i = 0, n = 0; n < size; i++)
{
if (!bt[i].pc)
@ -525,15 +519,15 @@ GB_CLASS DEBUG_find_class(const char *name)
{
CLASS *class;
CLASS *save = CP;
// As the startup class is automatically exported, this is the only way for the debugger to find it.
if (PROJECT_class && !strcmp(name, PROJECT_class->name))
return (GB_CLASS)PROJECT_class;
CP = NULL;
class = CLASS_find(name);
CP = save;
return (GB_CLASS)class;
}
@ -548,20 +542,21 @@ void DEBUG_enum_keys(void *object, GB_DEBUG_ENUM_CB cb)
char *save_key;
int save_lkey;
GB_VALUE value;
old = EXEC_enum;
class = OBJECT_class(object);
if (class == CLASS_Class)
{
class = (CLASS *)object;
object = NULL;
}
TRY
{
GB_GetProperty(object, "Key");
SUBR_get_string_len(&TEMP, &save_key, &save_lkey);
(*cb)(save_key, save_lkey);
cenum = CENUM_create(object ? object : class);
@ -592,7 +587,7 @@ void DEBUG_enum_keys(void *object, GB_DEBUG_ENUM_CB cb)
SUBR_get_string_len(&TEMP, &str, &len);
(*cb)(str, len);
}
__END:
value.type = GB_T_CSTRING;