summaryrefslogtreecommitdiff
path: root/Objects
diff options
context:
space:
mode:
authorSjoerd Mullender <sjoerd@acm.org>1993-10-11 12:54:31 +0000
committerSjoerd Mullender <sjoerd@acm.org>1993-10-11 12:54:31 +0000
commit574b7bf269c6eea5a816d09c7b3eb7afa98aed36 (patch)
tree11a32b71938c968cab47f670120b57eed5610cc1 /Objects
parentf4f2ceac98d6a8bd535af85031e278235061b972 (diff)
downloadcpython-574b7bf269c6eea5a816d09c7b3eb7afa98aed36.tar.gz
* Extended X interface: pixmap objects, colormap objects visual objects,
image objects, and lots of new methods. * Added counting of allocations and deallocations of builtin types if COUNT_ALLOCS is defined. Had to move calls to NEWREF down in some files. * Bug fix in sorting lists.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/floatobject.c2
-rw-r--r--Objects/intobject.c2
-rw-r--r--Objects/listobject.c4
-rw-r--r--Objects/object.c40
-rw-r--r--Objects/stringobject.c8
-rw-r--r--Objects/tupleobject.c2
6 files changed, 47 insertions, 11 deletions
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 9994523c68..d3a2c771b2 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -60,9 +60,9 @@ newfloatobject(fval)
register floatobject *op = (floatobject *) malloc(sizeof(floatobject));
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = &Floattype;
op->ob_fval = fval;
+ NEWREF(op);
return (object *) op;
}
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 3021873acd..816a4112a2 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -87,9 +87,9 @@ newintobject(ival)
}
v = free_list;
free_list = *(intobject **)free_list;
- NEWREF(v);
v->ob_type = &Inttype;
v->ob_ival = ival;
+ NEWREF(v);
return (object *) v;
}
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 38829e2d3f..67a61853a6 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -58,11 +58,11 @@ newlistobject(size)
return err_nomem();
}
}
- NEWREF(op);
op->ob_type = &Listtype;
op->ob_size = size;
for (i = 0; i < size; i++)
op->ob_item[i] = NULL;
+ NEWREF(op);
return (object *) op;
}
@@ -520,7 +520,7 @@ cmp(v, w)
return cmpobject(* (object **) v, * (object **) w);
/* Call the user-supplied comparison function */
- t = mkvalue("OO", v, w);
+ t = mkvalue("OO", * (object **) v, * (object **) w);
if (t == NULL)
return 0;
res = call_object(cmpfunc, t);
diff --git a/Objects/object.c b/Objects/object.c
index a469797f58..a20b24d958 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -34,6 +34,36 @@ long ref_total;
These are used by the individual routines for object creation.
Do not call them otherwise, they do not initialize the object! */
+#ifdef COUNT_ALLOCS
+static typeobject *type_list;
+
+void
+dump_counts()
+{
+ typeobject *tp;
+
+ for (tp = type_list; tp; tp = tp->tp_next)
+ printf("%s %d %d %d\n", tp->tp_name, tp->tp_alloc, tp->tp_free,
+ tp->tp_maxalloc);
+}
+
+void
+inc_count(tp)
+ typeobject *tp;
+{
+ if (tp->tp_alloc == 0) {
+ /* first time; hang in linked list */
+ if (tp->tp_next != NULL) /* sanity check */
+ abort();
+ tp->tp_next = type_list;
+ type_list = tp;
+ }
+ tp->tp_alloc++;
+ if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
+ tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
+}
+#endif
+
object *
newobject(tp)
typeobject *tp;
@@ -41,8 +71,8 @@ newobject(tp)
object *op = (object *) malloc(tp->tp_basicsize);
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = tp;
+ NEWREF(op);
return op;
}
@@ -55,9 +85,9 @@ newvarobject(tp, size)
malloc(tp->tp_basicsize + size * tp->tp_itemsize);
if (op == NULL)
return (varobject *)err_nomem();
- NEWREF(op);
op->ob_type = tp;
op->ob_size = size;
+ NEWREF(op);
return op;
}
@@ -301,6 +331,9 @@ NEWREF(op)
op->_ob_prev = &refchain;
refchain._ob_next->_ob_prev = op;
refchain._ob_next = op;
+#ifdef COUNT_ALLOCS
+ inc_count(op->ob_type);
+#endif
}
UNREF(op)
@@ -335,6 +368,9 @@ DELREF(op)
object *op;
{
UNREF(op);
+#ifdef COUNT_ALLOCS
+ op->ob_type->tp_free++;
+#endif
(*(op)->ob_type->tp_dealloc)(op);
op->ob_type = NULL;
}
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index cba8c920db..a3043d49f4 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -35,9 +35,9 @@ newsizedstringobject(str, size)
malloc(sizeof(stringobject) + size * sizeof(char));
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = &Stringtype;
op->ob_size = size;
+ NEWREF(op);
if (str != NULL)
memcpy(op->ob_sval, str, size);
op->ob_sval[size] = '\0';
@@ -53,9 +53,9 @@ newstringobject(str)
malloc(sizeof(stringobject) + size * sizeof(char));
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = &Stringtype;
op->ob_size = size;
+ NEWREF(op);
strcpy(op->ob_sval, str);
return (object *) op;
}
@@ -187,9 +187,9 @@ string_concat(a, bb)
malloc(sizeof(stringobject) + size * sizeof(char));
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = &Stringtype;
op->ob_size = size;
+ NEWREF(op);
memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size);
op->ob_sval[size] = '\0';
@@ -216,9 +216,9 @@ string_repeat(a, n)
malloc(sizeof(stringobject) + size * sizeof(char));
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = &Stringtype;
op->ob_size = size;
+ NEWREF(op);
for (i = 0; i < size; i += a->ob_size)
memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
op->ob_sval[size] = '\0';
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index faf46d52cc..fae9386968 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -40,11 +40,11 @@ newtupleobject(size)
malloc(sizeof(tupleobject) + size * sizeof(object *));
if (op == NULL)
return err_nomem();
- NEWREF(op);
op->ob_type = &Tupletype;
op->ob_size = size;
for (i = 0; i < size; i++)
op->ob_item[i] = NULL;
+ NEWREF(op);
return (object *) op;
}