mirror of
https://github.com/python/cpython.git
synced 2025-08-02 08:02:56 +00:00
Lots of minor changes. Note for mappingobject.c: the hash table pointer
can now be NULL.
This commit is contained in:
parent
1ae940a587
commit
d7047b395e
12 changed files with 172 additions and 98 deletions
|
@ -247,7 +247,6 @@ addaccess(class, inst)
|
||||||
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
|
while (mappinggetnext(class->cl_dict, &pos, &key, &value)) {
|
||||||
object *v;
|
|
||||||
if (!is_accessobject(value))
|
if (!is_accessobject(value))
|
||||||
continue;
|
continue;
|
||||||
if (hasaccessvalue(value))
|
if (hasaccessvalue(value))
|
||||||
|
@ -274,7 +273,6 @@ newinstanceobject(class, arg)
|
||||||
object *arg;
|
object *arg;
|
||||||
{
|
{
|
||||||
register instanceobject *inst;
|
register instanceobject *inst;
|
||||||
object *v;
|
|
||||||
object *init;
|
object *init;
|
||||||
if (!is_classobject(class)) {
|
if (!is_classobject(class)) {
|
||||||
err_badcall();
|
err_badcall();
|
||||||
|
@ -328,12 +326,12 @@ static void
|
||||||
instance_dealloc(inst)
|
instance_dealloc(inst)
|
||||||
register instanceobject *inst;
|
register instanceobject *inst;
|
||||||
{
|
{
|
||||||
object *error_type, *error_value;
|
object *error_type, *error_value, *error_traceback;
|
||||||
object *del;
|
object *del;
|
||||||
/* Call the __del__ method if it exists. First temporarily
|
/* Call the __del__ method if it exists. First temporarily
|
||||||
revive the object and save the current exception, if any. */
|
revive the object and save the current exception, if any. */
|
||||||
INCREF(inst);
|
INCREF(inst);
|
||||||
err_get(&error_type, &error_value);
|
err_fetch(&error_type, &error_value, &error_traceback);
|
||||||
if ((del = instance_getattr1(inst, "__del__")) != NULL) {
|
if ((del = instance_getattr1(inst, "__del__")) != NULL) {
|
||||||
object *args = newtupleobject(0);
|
object *args = newtupleobject(0);
|
||||||
object *res = args;
|
object *res = args;
|
||||||
|
@ -345,7 +343,7 @@ instance_dealloc(inst)
|
||||||
/* XXX If __del__ raised an exception, it is ignored! */
|
/* XXX If __del__ raised an exception, it is ignored! */
|
||||||
}
|
}
|
||||||
/* Restore the saved exception and undo the temporary revival */
|
/* Restore the saved exception and undo the temporary revival */
|
||||||
err_setval(error_type, error_value);
|
err_restore(error_type, error_value, error_traceback);
|
||||||
/* Can't use DECREF here, it would cause a recursive call */
|
/* Can't use DECREF here, it would cause a recursive call */
|
||||||
if (--inst->ob_refcnt > 0)
|
if (--inst->ob_refcnt > 0)
|
||||||
return; /* __del__ added a reference; don't delete now */
|
return; /* __del__ added a reference; don't delete now */
|
||||||
|
@ -427,6 +425,7 @@ instance_getattr(inst, name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
err_clear();
|
||||||
args = mkvalue("(Os)", inst, name);
|
args = mkvalue("(Os)", inst, name);
|
||||||
if (args == NULL)
|
if (args == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -46,9 +46,9 @@ static long primes[] = {
|
||||||
3, 7, 13, 31, 61, 127, 251, 509, 1021, 2017, 4093,
|
3, 7, 13, 31, 61, 127, 251, 509, 1021, 2017, 4093,
|
||||||
5987,
|
5987,
|
||||||
9551, 15683, 19609, 31397,
|
9551, 15683, 19609, 31397,
|
||||||
65521L, 131071L, 262139L, 524287L, 1048573L, 2097143L,
|
65521L, 131071L, 262139L, 524287L, 1048573L, 2097143L,
|
||||||
4194301L, 8388593L, 16777213L, 33554393L, 67108859L,
|
4194301L, 8388593L, 16777213L, 33554393L, 67108859L,
|
||||||
134217689L, 268435399L, 536870909L, 1073741789L,
|
134217689L, 268435399L, 536870909L, 1073741789L,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,12 +95,8 @@ newmappingobject()
|
||||||
mp = NEWOBJ(mappingobject, &Mappingtype);
|
mp = NEWOBJ(mappingobject, &Mappingtype);
|
||||||
if (mp == NULL)
|
if (mp == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
mp->ma_size = primes[0];
|
mp->ma_size = 0;
|
||||||
mp->ma_table = (mappingentry *) calloc(sizeof(mappingentry), mp->ma_size);
|
mp->ma_table = NULL;
|
||||||
if (mp->ma_table == NULL) {
|
|
||||||
DEL(mp);
|
|
||||||
return err_nomem();
|
|
||||||
}
|
|
||||||
mp->ma_fill = 0;
|
mp->ma_fill = 0;
|
||||||
mp->ma_used = 0;
|
mp->ma_used = 0;
|
||||||
return (object *)mp;
|
return (object *)mp;
|
||||||
|
@ -173,10 +169,13 @@ insertmapping(mp, key, hash, value)
|
||||||
long hash;
|
long hash;
|
||||||
object *value;
|
object *value;
|
||||||
{
|
{
|
||||||
|
object *old_value;
|
||||||
register mappingentry *ep;
|
register mappingentry *ep;
|
||||||
ep = lookmapping(mp, key, hash);
|
ep = lookmapping(mp, key, hash);
|
||||||
if (ep->me_value != NULL) {
|
if (ep->me_value != NULL) {
|
||||||
DECREF(ep->me_value);
|
old_value = ep->me_value;
|
||||||
|
ep->me_value = value;
|
||||||
|
DECREF(old_value); /* which **CAN** re-enter */
|
||||||
DECREF(key);
|
DECREF(key);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -186,9 +185,9 @@ insertmapping(mp, key, hash, value)
|
||||||
DECREF(ep->me_key);
|
DECREF(ep->me_key);
|
||||||
ep->me_key = key;
|
ep->me_key = key;
|
||||||
ep->me_hash = hash;
|
ep->me_hash = hash;
|
||||||
|
ep->me_value = value;
|
||||||
mp->ma_used++;
|
mp->ma_used++;
|
||||||
}
|
}
|
||||||
ep->me_value = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -233,14 +232,19 @@ mappingresize(mp)
|
||||||
mp->ma_table = newtable;
|
mp->ma_table = newtable;
|
||||||
mp->ma_fill = 0;
|
mp->ma_fill = 0;
|
||||||
mp->ma_used = 0;
|
mp->ma_used = 0;
|
||||||
|
|
||||||
|
/* Make two passes, so we can avoid decrefs
|
||||||
|
(and possible side effects) till the table is copied */
|
||||||
for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
|
for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
|
||||||
if (ep->me_value != NULL)
|
if (ep->me_value != NULL)
|
||||||
insertmapping(mp,ep->me_key,ep->me_hash,ep->me_value);
|
insertmapping(mp,ep->me_key,ep->me_hash,ep->me_value);
|
||||||
else {
|
|
||||||
XDECREF(ep->me_key);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
DEL(oldtable);
|
for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
|
||||||
|
if (ep->me_value == NULL)
|
||||||
|
XDECREF(ep->me_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
XDEL(oldtable);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +258,8 @@ mappinglookup(op, key)
|
||||||
err_badcall();
|
err_badcall();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (((mappingobject *)op)->ma_table == NULL)
|
||||||
|
return NULL;
|
||||||
#ifdef CACHE_HASH
|
#ifdef CACHE_HASH
|
||||||
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -303,6 +309,8 @@ mappingremove(op, key)
|
||||||
register mappingobject *mp;
|
register mappingobject *mp;
|
||||||
register long hash;
|
register long hash;
|
||||||
register mappingentry *ep;
|
register mappingentry *ep;
|
||||||
|
object *old_value, *old_key;
|
||||||
|
|
||||||
if (!is_mappingobject(op)) {
|
if (!is_mappingobject(op)) {
|
||||||
err_badcall();
|
err_badcall();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -319,12 +327,14 @@ mappingremove(op, key)
|
||||||
err_setval(KeyError, key);
|
err_setval(KeyError, key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
DECREF(ep->me_key);
|
old_key = ep->me_key;
|
||||||
INCREF(dummy);
|
INCREF(dummy);
|
||||||
ep->me_key = dummy;
|
ep->me_key = dummy;
|
||||||
DECREF(ep->me_value);
|
old_value = ep->me_value;
|
||||||
ep->me_value = NULL;
|
ep->me_value = NULL;
|
||||||
mp->ma_used--;
|
mp->ma_used--;
|
||||||
|
DECREF(old_value);
|
||||||
|
DECREF(old_key);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,18 +342,23 @@ void
|
||||||
mappingclear(op)
|
mappingclear(op)
|
||||||
object *op;
|
object *op;
|
||||||
{
|
{
|
||||||
int i;
|
int i, n;
|
||||||
register mappingobject *mp;
|
register mappingentry *table;
|
||||||
|
mappingobject *mp;
|
||||||
if (!is_mappingobject(op))
|
if (!is_mappingobject(op))
|
||||||
return;
|
return;
|
||||||
mp = (mappingobject *)op;
|
mp = (mappingobject *)op;
|
||||||
for (i = 0; i < mp->ma_size; i++) {
|
table = mp->ma_table;
|
||||||
XDECREF(mp->ma_table[i].me_key);
|
if (table == NULL)
|
||||||
XDECREF(mp->ma_table[i].me_value);
|
return;
|
||||||
mp->ma_table[i].me_key = NULL;
|
n = mp->ma_size;
|
||||||
mp->ma_table[i].me_value = NULL;
|
mp->ma_size = mp->ma_used = mp->ma_fill = 0;
|
||||||
|
mp->ma_table = NULL;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
XDECREF(table[i].me_key);
|
||||||
|
XDECREF(table[i].me_value);
|
||||||
}
|
}
|
||||||
mp->ma_used = 0;
|
DEL(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -387,8 +402,7 @@ mapping_dealloc(mp)
|
||||||
if (ep->me_value != NULL)
|
if (ep->me_value != NULL)
|
||||||
DECREF(ep->me_value);
|
DECREF(ep->me_value);
|
||||||
}
|
}
|
||||||
if (mp->ma_table != NULL)
|
XDEL(mp->ma_table);
|
||||||
DEL(mp->ma_table);
|
|
||||||
DEL(mp);
|
DEL(mp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,6 +474,10 @@ mapping_subscript(mp, key)
|
||||||
{
|
{
|
||||||
object *v;
|
object *v;
|
||||||
long hash;
|
long hash;
|
||||||
|
if (mp->ma_table == NULL) {
|
||||||
|
err_setval(KeyError, key);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#ifdef CACHE_HASH
|
#ifdef CACHE_HASH
|
||||||
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -700,7 +718,7 @@ mapping_has_key(mp, args)
|
||||||
hash = hashobject(key);
|
hash = hashobject(key);
|
||||||
if (hash == -1)
|
if (hash == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
ok = lookmapping(mp, key, hash)->me_value != NULL;
|
ok = mp->ma_size != 0 && lookmapping(mp, key, hash)->me_value != NULL;
|
||||||
return newintobject(ok);
|
return newintobject(ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ newfileobject(name, mode)
|
||||||
f = (fileobject *) newopenfileobject((FILE *)NULL, name, mode, fclose);
|
f = (fileobject *) newopenfileobject((FILE *)NULL, name, mode, fclose);
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
#ifdef USE_FOPENRF
|
#ifdef HAVE_FOPENRF
|
||||||
if (*mode == '*') {
|
if (*mode == '*') {
|
||||||
FILE *fopenRF();
|
FILE *fopenRF();
|
||||||
f->f_fp = fopenRF(name, mode+1);
|
f->f_fp = fopenRF(name, mode+1);
|
||||||
|
@ -231,6 +231,51 @@ file_seek(f, args)
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_FTRUNCATE
|
||||||
|
static object *
|
||||||
|
file_truncate(f, args)
|
||||||
|
fileobject *f;
|
||||||
|
object *args;
|
||||||
|
{
|
||||||
|
long newsize;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (f->f_fp == NULL)
|
||||||
|
return err_closed();
|
||||||
|
if (!getargs(args, "l", &newsize)) {
|
||||||
|
err_clear();
|
||||||
|
if (!getnoarg(args))
|
||||||
|
return NULL;
|
||||||
|
BGN_SAVE
|
||||||
|
errno = 0;
|
||||||
|
newsize = ftell(f->f_fp); /* default to current position*/
|
||||||
|
END_SAVE
|
||||||
|
if (newsize == -1L) {
|
||||||
|
err_errno(IOError);
|
||||||
|
clearerr(f->f_fp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BGN_SAVE
|
||||||
|
errno = 0;
|
||||||
|
ret = fflush(f->f_fp);
|
||||||
|
END_SAVE
|
||||||
|
if (ret == 0) {
|
||||||
|
BGN_SAVE
|
||||||
|
errno = 0;
|
||||||
|
ret = ftruncate(fileno(f->f_fp), newsize);
|
||||||
|
END_SAVE
|
||||||
|
}
|
||||||
|
if (ret != 0) {
|
||||||
|
err_errno(IOError);
|
||||||
|
clearerr(f->f_fp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
INCREF(None);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_FTRUNCATE */
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
file_tell(f, args)
|
file_tell(f, args)
|
||||||
fileobject *f;
|
fileobject *f;
|
||||||
|
@ -615,6 +660,9 @@ static struct methodlist file_methods[] = {
|
||||||
{"readline", (method)file_readline},
|
{"readline", (method)file_readline},
|
||||||
{"readlines", (method)file_readlines},
|
{"readlines", (method)file_readlines},
|
||||||
{"seek", (method)file_seek},
|
{"seek", (method)file_seek},
|
||||||
|
#ifdef HAVE_FTRUNCATE
|
||||||
|
{"truncate", (method)file_truncate},
|
||||||
|
#endif
|
||||||
{"tell", (method)file_tell},
|
{"tell", (method)file_tell},
|
||||||
{"write", (method)file_write},
|
{"write", (method)file_write},
|
||||||
{"writelines", (method)file_writelines},
|
{"writelines", (method)file_writelines},
|
||||||
|
|
|
@ -285,7 +285,6 @@ float_divmod(v, w)
|
||||||
{
|
{
|
||||||
double vx, wx;
|
double vx, wx;
|
||||||
double div, mod;
|
double div, mod;
|
||||||
object *t;
|
|
||||||
wx = w->ob_fval;
|
wx = w->ob_fval;
|
||||||
if (wx == 0.0) {
|
if (wx == 0.0) {
|
||||||
err_setstr(ZeroDivisionError, "float divmod()");
|
err_setstr(ZeroDivisionError, "float divmod()");
|
||||||
|
|
|
@ -39,7 +39,9 @@ static struct memberlist frame_memberlist[] = {
|
||||||
{"f_globals", T_OBJECT, OFF(f_globals), RO},
|
{"f_globals", T_OBJECT, OFF(f_globals), RO},
|
||||||
{"f_locals", T_OBJECT, OFF(f_locals), RO},
|
{"f_locals", T_OBJECT, OFF(f_locals), RO},
|
||||||
{"f_owner", T_OBJECT, OFF(f_owner), RO},
|
{"f_owner", T_OBJECT, OFF(f_owner), RO},
|
||||||
/* {"f_fastlocals",T_OBJECT, OFF(f_fastlocals),RO}, /* XXX Unsafe */
|
#if 0
|
||||||
|
{"f_fastlocals",T_OBJECT, OFF(f_fastlocals),RO}, /* XXX Unsafe */
|
||||||
|
#endif
|
||||||
{"f_localmap", T_OBJECT, OFF(f_localmap),RO},
|
{"f_localmap", T_OBJECT, OFF(f_localmap),RO},
|
||||||
{"f_lasti", T_INT, OFF(f_lasti), RO},
|
{"f_lasti", T_INT, OFF(f_lasti), RO},
|
||||||
{"f_lineno", T_INT, OFF(f_lineno), RO},
|
{"f_lineno", T_INT, OFF(f_lineno), RO},
|
||||||
|
@ -217,10 +219,8 @@ setup_block(f, type, handler, level)
|
||||||
int level;
|
int level;
|
||||||
{
|
{
|
||||||
block *b;
|
block *b;
|
||||||
if (f->f_iblock >= f->f_nblocks) {
|
if (f->f_iblock >= f->f_nblocks)
|
||||||
fprintf(stderr, "XXX block stack overflow\n");
|
fatal("XXX block stack overflow");
|
||||||
abort();
|
|
||||||
}
|
|
||||||
b = &f->f_blockstack[f->f_iblock++];
|
b = &f->f_blockstack[f->f_iblock++];
|
||||||
b->b_type = type;
|
b->b_type = type;
|
||||||
b->b_level = level;
|
b->b_level = level;
|
||||||
|
@ -232,10 +232,8 @@ pop_block(f)
|
||||||
frameobject *f;
|
frameobject *f;
|
||||||
{
|
{
|
||||||
block *b;
|
block *b;
|
||||||
if (f->f_iblock <= 0) {
|
if (f->f_iblock <= 0)
|
||||||
fprintf(stderr, "XXX block stack underflow\n");
|
fatal("XXX block stack underflow");
|
||||||
abort();
|
|
||||||
}
|
|
||||||
b = &f->f_blockstack[--f->f_iblock];
|
b = &f->f_blockstack[--f->f_iblock];
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
@ -248,7 +246,7 @@ fast_2_locals(f)
|
||||||
{
|
{
|
||||||
/* Merge f->f_fastlocals into f->f_locals */
|
/* Merge f->f_fastlocals into f->f_locals */
|
||||||
object *locals, *fast, *map;
|
object *locals, *fast, *map;
|
||||||
object *error_type, *error_value;
|
object *error_type, *error_value, *error_traceback;
|
||||||
int j;
|
int j;
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -260,7 +258,7 @@ fast_2_locals(f)
|
||||||
if (!is_dictobject(locals) || !is_listobject(fast) ||
|
if (!is_dictobject(locals) || !is_listobject(fast) ||
|
||||||
!is_tupleobject(map))
|
!is_tupleobject(map))
|
||||||
return;
|
return;
|
||||||
err_get(&error_type, &error_value);
|
err_fetch(&error_type, &error_value, &error_traceback);
|
||||||
for (j = gettuplesize(map); --j >= 0; ) {
|
for (j = gettuplesize(map); --j >= 0; ) {
|
||||||
object *key = gettupleitem(map, j);
|
object *key = gettupleitem(map, j);
|
||||||
object *value = getlistitem(fast, j);
|
object *value = getlistitem(fast, j);
|
||||||
|
@ -274,7 +272,7 @@ fast_2_locals(f)
|
||||||
err_clear();
|
err_clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err_setval(error_type, error_value);
|
err_restore(error_type, error_value, error_traceback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -284,7 +282,7 @@ locals_2_fast(f, clear)
|
||||||
{
|
{
|
||||||
/* Merge f->f_locals into f->f_fastlocals */
|
/* Merge f->f_locals into f->f_fastlocals */
|
||||||
object *locals, *fast, *map;
|
object *locals, *fast, *map;
|
||||||
object *error_type, *error_value;
|
object *error_type, *error_value, *error_traceback;
|
||||||
int j;
|
int j;
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -296,7 +294,7 @@ locals_2_fast(f, clear)
|
||||||
if (!is_dictobject(locals) || !is_listobject(fast) ||
|
if (!is_dictobject(locals) || !is_listobject(fast) ||
|
||||||
!is_tupleobject(map))
|
!is_tupleobject(map))
|
||||||
return;
|
return;
|
||||||
err_get(&error_type, &error_value);
|
err_fetch(&error_type, &error_value, &error_traceback);
|
||||||
for (j = gettuplesize(map); --j >= 0; ) {
|
for (j = gettuplesize(map); --j >= 0; ) {
|
||||||
object *key = gettupleitem(map, j);
|
object *key = gettupleitem(map, j);
|
||||||
object *value = dict2lookup(locals, key);
|
object *value = dict2lookup(locals, key);
|
||||||
|
@ -308,5 +306,5 @@ locals_2_fast(f, clear)
|
||||||
if (setlistitem(fast, j, value) != 0)
|
if (setlistitem(fast, j, value) != 0)
|
||||||
err_clear();
|
err_clear();
|
||||||
}
|
}
|
||||||
err_setval(error_type, error_value);
|
err_restore(error_type, error_value, error_traceback);
|
||||||
}
|
}
|
||||||
|
|
|
@ -456,7 +456,6 @@ int_divmod(x, y)
|
||||||
intobject *x;
|
intobject *x;
|
||||||
intobject *y;
|
intobject *y;
|
||||||
{
|
{
|
||||||
object *v, *v0, *v1;
|
|
||||||
long d, m;
|
long d, m;
|
||||||
if (i_divmod(x, y, &d, &m) < 0)
|
if (i_divmod(x, y, &d, &m) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -404,7 +404,7 @@ list_ass_slice(a, ilow, ihigh, v)
|
||||||
d = n - (ihigh-ilow);
|
d = n - (ihigh-ilow);
|
||||||
if (d <= 0) { /* Delete -d items; XDECREF ihigh-ilow items */
|
if (d <= 0) { /* Delete -d items; XDECREF ihigh-ilow items */
|
||||||
for (k = ilow; k < ihigh; k++)
|
for (k = ilow; k < ihigh; k++)
|
||||||
XDECREF(item[k]);
|
XDECREF(item[k]); /* bug: reentrant side effects */
|
||||||
if (d < 0) {
|
if (d < 0) {
|
||||||
for (/*k = ihigh*/; k < a->ob_size; k++)
|
for (/*k = ihigh*/; k < a->ob_size; k++)
|
||||||
item[k+d] = item[k];
|
item[k+d] = item[k];
|
||||||
|
@ -422,7 +422,7 @@ list_ass_slice(a, ilow, ihigh, v)
|
||||||
for (k = a->ob_size; --k >= ihigh; )
|
for (k = a->ob_size; --k >= ihigh; )
|
||||||
item[k+d] = item[k];
|
item[k+d] = item[k];
|
||||||
for (/*k = ihigh-1*/; k >= ilow; --k)
|
for (/*k = ihigh-1*/; k >= ilow; --k)
|
||||||
XDECREF(item[k]);
|
XDECREF(item[k]); /* bug: side effects :-( */
|
||||||
a->ob_item = item;
|
a->ob_item = item;
|
||||||
a->ob_size += d;
|
a->ob_size += d;
|
||||||
}
|
}
|
||||||
|
@ -454,6 +454,7 @@ list_ass_item(a, i, v)
|
||||||
int i;
|
int i;
|
||||||
object *v;
|
object *v;
|
||||||
{
|
{
|
||||||
|
object *old_value;
|
||||||
if (i < 0 || i >= a->ob_size) {
|
if (i < 0 || i >= a->ob_size) {
|
||||||
err_setstr(IndexError, "list assignment index out of range");
|
err_setstr(IndexError, "list assignment index out of range");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -461,8 +462,9 @@ list_ass_item(a, i, v)
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
return list_ass_slice(a, i, i+1, v);
|
return list_ass_slice(a, i, i+1, v);
|
||||||
INCREF(v);
|
INCREF(v);
|
||||||
DECREF(a->ob_item[i]);
|
old_value = a->ob_item[i];
|
||||||
a->ob_item[i] = v;
|
a->ob_item[i] = v;
|
||||||
|
DECREF(old_value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -570,7 +570,6 @@ x_divrem(v1, w1, prem)
|
||||||
|
|
||||||
/* Forward */
|
/* Forward */
|
||||||
static void long_dealloc PROTO((object *));
|
static void long_dealloc PROTO((object *));
|
||||||
static int long_print PROTO((object *, FILE *, int));
|
|
||||||
static object *long_repr PROTO((object *));
|
static object *long_repr PROTO((object *));
|
||||||
static int long_compare PROTO((longobject *, longobject *));
|
static int long_compare PROTO((longobject *, longobject *));
|
||||||
static long long_hash PROTO((longobject *));
|
static long long_hash PROTO((longobject *));
|
||||||
|
|
|
@ -46,9 +46,9 @@ static long primes[] = {
|
||||||
3, 7, 13, 31, 61, 127, 251, 509, 1021, 2017, 4093,
|
3, 7, 13, 31, 61, 127, 251, 509, 1021, 2017, 4093,
|
||||||
5987,
|
5987,
|
||||||
9551, 15683, 19609, 31397,
|
9551, 15683, 19609, 31397,
|
||||||
65521L, 131071L, 262139L, 524287L, 1048573L, 2097143L,
|
65521L, 131071L, 262139L, 524287L, 1048573L, 2097143L,
|
||||||
4194301L, 8388593L, 16777213L, 33554393L, 67108859L,
|
4194301L, 8388593L, 16777213L, 33554393L, 67108859L,
|
||||||
134217689L, 268435399L, 536870909L, 1073741789L,
|
134217689L, 268435399L, 536870909L, 1073741789L,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,12 +95,8 @@ newmappingobject()
|
||||||
mp = NEWOBJ(mappingobject, &Mappingtype);
|
mp = NEWOBJ(mappingobject, &Mappingtype);
|
||||||
if (mp == NULL)
|
if (mp == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
mp->ma_size = primes[0];
|
mp->ma_size = 0;
|
||||||
mp->ma_table = (mappingentry *) calloc(sizeof(mappingentry), mp->ma_size);
|
mp->ma_table = NULL;
|
||||||
if (mp->ma_table == NULL) {
|
|
||||||
DEL(mp);
|
|
||||||
return err_nomem();
|
|
||||||
}
|
|
||||||
mp->ma_fill = 0;
|
mp->ma_fill = 0;
|
||||||
mp->ma_used = 0;
|
mp->ma_used = 0;
|
||||||
return (object *)mp;
|
return (object *)mp;
|
||||||
|
@ -173,10 +169,13 @@ insertmapping(mp, key, hash, value)
|
||||||
long hash;
|
long hash;
|
||||||
object *value;
|
object *value;
|
||||||
{
|
{
|
||||||
|
object *old_value;
|
||||||
register mappingentry *ep;
|
register mappingentry *ep;
|
||||||
ep = lookmapping(mp, key, hash);
|
ep = lookmapping(mp, key, hash);
|
||||||
if (ep->me_value != NULL) {
|
if (ep->me_value != NULL) {
|
||||||
DECREF(ep->me_value);
|
old_value = ep->me_value;
|
||||||
|
ep->me_value = value;
|
||||||
|
DECREF(old_value); /* which **CAN** re-enter */
|
||||||
DECREF(key);
|
DECREF(key);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -186,9 +185,9 @@ insertmapping(mp, key, hash, value)
|
||||||
DECREF(ep->me_key);
|
DECREF(ep->me_key);
|
||||||
ep->me_key = key;
|
ep->me_key = key;
|
||||||
ep->me_hash = hash;
|
ep->me_hash = hash;
|
||||||
|
ep->me_value = value;
|
||||||
mp->ma_used++;
|
mp->ma_used++;
|
||||||
}
|
}
|
||||||
ep->me_value = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -233,14 +232,19 @@ mappingresize(mp)
|
||||||
mp->ma_table = newtable;
|
mp->ma_table = newtable;
|
||||||
mp->ma_fill = 0;
|
mp->ma_fill = 0;
|
||||||
mp->ma_used = 0;
|
mp->ma_used = 0;
|
||||||
|
|
||||||
|
/* Make two passes, so we can avoid decrefs
|
||||||
|
(and possible side effects) till the table is copied */
|
||||||
for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
|
for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
|
||||||
if (ep->me_value != NULL)
|
if (ep->me_value != NULL)
|
||||||
insertmapping(mp,ep->me_key,ep->me_hash,ep->me_value);
|
insertmapping(mp,ep->me_key,ep->me_hash,ep->me_value);
|
||||||
else {
|
|
||||||
XDECREF(ep->me_key);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
DEL(oldtable);
|
for (i = 0, ep = oldtable; i < oldsize; i++, ep++) {
|
||||||
|
if (ep->me_value == NULL)
|
||||||
|
XDECREF(ep->me_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
XDEL(oldtable);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +258,8 @@ mappinglookup(op, key)
|
||||||
err_badcall();
|
err_badcall();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (((mappingobject *)op)->ma_table == NULL)
|
||||||
|
return NULL;
|
||||||
#ifdef CACHE_HASH
|
#ifdef CACHE_HASH
|
||||||
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -303,6 +309,8 @@ mappingremove(op, key)
|
||||||
register mappingobject *mp;
|
register mappingobject *mp;
|
||||||
register long hash;
|
register long hash;
|
||||||
register mappingentry *ep;
|
register mappingentry *ep;
|
||||||
|
object *old_value, *old_key;
|
||||||
|
|
||||||
if (!is_mappingobject(op)) {
|
if (!is_mappingobject(op)) {
|
||||||
err_badcall();
|
err_badcall();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -319,12 +327,14 @@ mappingremove(op, key)
|
||||||
err_setval(KeyError, key);
|
err_setval(KeyError, key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
DECREF(ep->me_key);
|
old_key = ep->me_key;
|
||||||
INCREF(dummy);
|
INCREF(dummy);
|
||||||
ep->me_key = dummy;
|
ep->me_key = dummy;
|
||||||
DECREF(ep->me_value);
|
old_value = ep->me_value;
|
||||||
ep->me_value = NULL;
|
ep->me_value = NULL;
|
||||||
mp->ma_used--;
|
mp->ma_used--;
|
||||||
|
DECREF(old_value);
|
||||||
|
DECREF(old_key);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,18 +342,23 @@ void
|
||||||
mappingclear(op)
|
mappingclear(op)
|
||||||
object *op;
|
object *op;
|
||||||
{
|
{
|
||||||
int i;
|
int i, n;
|
||||||
register mappingobject *mp;
|
register mappingentry *table;
|
||||||
|
mappingobject *mp;
|
||||||
if (!is_mappingobject(op))
|
if (!is_mappingobject(op))
|
||||||
return;
|
return;
|
||||||
mp = (mappingobject *)op;
|
mp = (mappingobject *)op;
|
||||||
for (i = 0; i < mp->ma_size; i++) {
|
table = mp->ma_table;
|
||||||
XDECREF(mp->ma_table[i].me_key);
|
if (table == NULL)
|
||||||
XDECREF(mp->ma_table[i].me_value);
|
return;
|
||||||
mp->ma_table[i].me_key = NULL;
|
n = mp->ma_size;
|
||||||
mp->ma_table[i].me_value = NULL;
|
mp->ma_size = mp->ma_used = mp->ma_fill = 0;
|
||||||
|
mp->ma_table = NULL;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
XDECREF(table[i].me_key);
|
||||||
|
XDECREF(table[i].me_value);
|
||||||
}
|
}
|
||||||
mp->ma_used = 0;
|
DEL(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -387,8 +402,7 @@ mapping_dealloc(mp)
|
||||||
if (ep->me_value != NULL)
|
if (ep->me_value != NULL)
|
||||||
DECREF(ep->me_value);
|
DECREF(ep->me_value);
|
||||||
}
|
}
|
||||||
if (mp->ma_table != NULL)
|
XDEL(mp->ma_table);
|
||||||
DEL(mp->ma_table);
|
|
||||||
DEL(mp);
|
DEL(mp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,6 +474,10 @@ mapping_subscript(mp, key)
|
||||||
{
|
{
|
||||||
object *v;
|
object *v;
|
||||||
long hash;
|
long hash;
|
||||||
|
if (mp->ma_table == NULL) {
|
||||||
|
err_setval(KeyError, key);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#ifdef CACHE_HASH
|
#ifdef CACHE_HASH
|
||||||
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
if (!is_stringobject(key) || (hash = ((stringobject *) key)->ob_shash) == -1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -700,7 +718,7 @@ mapping_has_key(mp, args)
|
||||||
hash = hashobject(key);
|
hash = hashobject(key);
|
||||||
if (hash == -1)
|
if (hash == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
ok = lookmapping(mp, key, hash)->me_value != NULL;
|
ok = mp->ma_size != 0 && lookmapping(mp, key, hash)->me_value != NULL;
|
||||||
return newintobject(ok);
|
return newintobject(ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ static long
|
||||||
meth_hash(a)
|
meth_hash(a)
|
||||||
methodobject *a;
|
methodobject *a;
|
||||||
{
|
{
|
||||||
long x, y;
|
long x;
|
||||||
if (a->m_self == NULL)
|
if (a->m_self == NULL)
|
||||||
x = 0;
|
x = 0;
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -63,7 +63,7 @@ inc_count(tp)
|
||||||
if (tp->tp_alloc == 0) {
|
if (tp->tp_alloc == 0) {
|
||||||
/* first time; hang in linked list */
|
/* first time; hang in linked list */
|
||||||
if (tp->tp_next != NULL) /* sanity check */
|
if (tp->tp_next != NULL) /* sanity check */
|
||||||
abort();
|
fatal("XXX inc_count sanity check");
|
||||||
tp->tp_next = type_list;
|
tp->tp_next = type_list;
|
||||||
type_list = tp;
|
type_list = tp;
|
||||||
}
|
}
|
||||||
|
@ -379,24 +379,18 @@ UNREF(op)
|
||||||
register object *op;
|
register object *op;
|
||||||
{
|
{
|
||||||
register object *p;
|
register object *p;
|
||||||
if (op->ob_refcnt < 0) {
|
if (op->ob_refcnt < 0)
|
||||||
fprintf(stderr, "UNREF negative refcnt\n");
|
fatal("UNREF negative refcnt");
|
||||||
abort();
|
|
||||||
}
|
|
||||||
if (op == &refchain ||
|
if (op == &refchain ||
|
||||||
op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) {
|
op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
|
||||||
fprintf(stderr, "UNREF invalid object\n");
|
fatal("UNREF invalid object");
|
||||||
abort();
|
|
||||||
}
|
|
||||||
#ifdef SLOW_UNREF_CHECK
|
#ifdef SLOW_UNREF_CHECK
|
||||||
for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
|
for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
|
||||||
if (p == op)
|
if (p == op)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (p == &refchain) { /* Not found */
|
if (p == &refchain) /* Not found */
|
||||||
fprintf(stderr, "UNREF unknown object\n");
|
fatal("UNREF unknown object");
|
||||||
abort();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
op->_ob_next->_ob_prev = op->_ob_prev;
|
op->_ob_next->_ob_prev = op->_ob_prev;
|
||||||
op->_ob_prev->_ob_next = op->_ob_next;
|
op->_ob_prev->_ob_next = op->_ob_next;
|
||||||
|
|
|
@ -159,7 +159,7 @@ string_dealloc(op)
|
||||||
DEL(op);
|
DEL(op);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
int
|
||||||
getstringsize(op)
|
getstringsize(op)
|
||||||
register object *op;
|
register object *op;
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue