2001-06-06
2001-06-06 02:22:39 by Martin Stjernholm <mast@lysator.liu.se>
-
be08a8c4c2e37b5e824a2c4dca50a29b32a9425b
(61 lines)
(+50/-11)
[
Show
| Annotate
]
Branch: 7.9
Fixed [bug 1728 (#1728)] where setting the weak flag on an empty array or multiset
caused multisets created later to also be weak.
Rev: src/array.c:1.106
Rev: src/array.h:1.35
Rev: src/builtin_functions.c:1.373
Rev: src/gc.c:1.152
23:
#include "stuff.h"
#include "bignum.h"
- RCSID("$Id: array.c,v 1.105 2001/04/30 17:31:28 mast Exp $");
+ RCSID("$Id: array.c,v 1.106 2001/06/06 02:22:38 mast Exp $");
PMOD_EXPORT struct array empty_array=
{
PIKE_CONSTANT_MEMOBJ_INIT(1), /* Never free */
- &empty_array, /* Next */
- &empty_array, /* previous (circular) */
+ &weak_empty_array, /* Next */
+ &weak_shrink_empty_array, /* previous (circular) */
0, /* Size = 0 */
0, /* malloced Size = 0 */
0, /* no types */
0, /* no flags */
};
-
+ PMOD_EXPORT struct array weak_empty_array=
+ {
+ PIKE_CONSTANT_MEMOBJ_INIT(1),
+ &weak_shrink_empty_array, &empty_array, 0, 0, 0, ARRAY_WEAK_FLAG
+ };
+ PMOD_EXPORT struct array weak_shrink_empty_array=
+ {
+ PIKE_CONSTANT_MEMOBJ_INIT(1),
+ &empty_array, &weak_empty_array, 0, 0, 0, ARRAY_WEAK_FLAG|ARRAY_WEAK_SHRINK
+ };
struct array *gc_internal_array = &empty_array;
static struct array *gc_mark_array_pos = 0;
101:
PMOD_EXPORT void really_free_array(struct array *v)
{
#ifdef PIKE_DEBUG
- if(v == & empty_array)
- fatal("Tried to free the empty_array.\n");
+ if(v == & empty_array || v == &weak_empty_array || v == &weak_shrink_empty_array)
+ fatal("Tried to free some *_empty_array.\n");
#endif
#ifdef PIKE_DEBUG
122:
free_array(a);
}
+ PMOD_EXPORT struct array *array_set_flags(struct array *a, int flags)
+ {
+ if (a->size)
+ a->flags = flags;
+ else {
+ free_array(a);
+ switch (flags) {
+ case 0:
+ add_ref(a = &empty_array); break;
+ case ARRAY_WEAK_FLAG:
+ add_ref(a = &weak_empty_array); break;
+ case ARRAY_WEAK_FLAG|ARRAY_WEAK_SHRINK:
+ add_ref(a = &weak_shrink_empty_array); break;
+ default:
+ fatal("Invalid flags %x\n", flags);
+ }
+ }
+ return a;
+ }
+
/*
* Extract an svalue from an array
*/
1981:
int e;
if(gc_mark(a)) {
#ifdef PIKE_DEBUG
- if (a == &empty_array) fatal("Trying to gc mark empty_array.\n");
+ if (a == &empty_array || a == &weak_empty_array || a == &weak_shrink_empty_array)
+ fatal("Trying to gc mark some *_empty_array.\n");
#endif
if (a == gc_mark_array_pos)
2048:
GC_CYCLE_ENTER(a, weak) {
int e;
#ifdef PIKE_DEBUG
- if (a == &empty_array) fatal("Trying to gc cycle check empty_array.\n");
+ if (a == &empty_array || a == &weak_empty_array || a == &weak_shrink_empty_array)
+ fatal("Trying to gc cycle check some *_empty_array.\n");
#endif
if (a->type_field & BIT_COMPLEX)
2110:
{
gc_mark_array_pos = gc_internal_array;
gc_mark(&empty_array);
+ gc_mark(&weak_empty_array);
+ gc_mark(&weak_shrink_empty_array);
while (gc_mark_array_pos != &empty_array) {
struct array *a = gc_mark_array_pos;
#ifdef PIKE_DEBUG
2145:
{
struct array *a,*next;
- for (a = gc_internal_array; a != &empty_array; a = next)
+ for (a = gc_internal_array; a != &weak_empty_array; a = next)
{
#ifdef PIKE_DEBUG
if (!a)
2193: Inside #if defined(PIKE_DEBUG)
a->flags,
a->size,
a->malloced_size,
- a == &empty_array ? " (the empty_array)" : "");
+ a == &empty_array ? " (the empty_array)" :
+ a == &weak_empty_array ? " (the weak_empty_array)" :
+ a == &weak_shrink_empty_array ? " (the weak_shrink_empty_array)" :
+ "");
fprintf(stderr,"Type field = ");
debug_dump_type_field(a->type_field);
fprintf(stderr,"\n");
2211:
{
#if defined(PIKE_DEBUG) && defined(DEBUG_MALLOC)
- if(verbose_debug_exit && a!=&empty_array)
+ if(verbose_debug_exit && a!=&empty_array &&
+ a!=&weak_empty_array && a!=&weak_shrink_empty_array)
describe(a);
#endif
2231:
{
INT32 num=0, size=0;
struct array *m;
- for(m=empty_array.next;m!=&empty_array;m=m->next)
+ for(m=empty_array.next;m!=&weak_empty_array;m=m->next)
{
num++;
size+=sizeof(struct array)+