mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			80 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #include "Python.h"
 | ||
|  | 
 | ||
|  | typedef struct { | ||
|  |     PyObject_HEAD | ||
|  |     PyObject *container; | ||
|  | } MyObject; | ||
|  | 
 | ||
|  | static int | ||
|  | my_traverse(MyObject *self, visitproc visit, void *arg) | ||
|  | { | ||
|  |     if (self->container != NULL) | ||
|  |         return visit(self->container, arg); | ||
|  |     else | ||
|  |         return 0; | ||
|  | } | ||
|  | 
 | ||
|  | static int | ||
|  | my_clear(MyObject *self) | ||
|  | { | ||
|  |     Py_XDECREF(self->container); | ||
|  |     self->container = NULL; | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | static void | ||
|  | my_dealloc(MyObject *self) | ||
|  | { | ||
|  |     PyObject_GC_UnTrack((PyObject *) self); | ||
|  |     Py_XDECREF(self->container); | ||
|  |     PyObject_GC_Del(self); | ||
|  | } | ||
|  | 
 | ||
|  | static PyTypeObject | ||
|  | MyObject_Type = { | ||
|  |     PyObject_HEAD_INIT(NULL) | ||
|  |     0, | ||
|  |     "MyObject", | ||
|  |     sizeof(MyObject), | ||
|  |     0, | ||
|  |     (destructor)my_dealloc,     /* tp_dealloc */ | ||
|  |     0,                          /* tp_print */ | ||
|  |     0,                          /* tp_getattr */ | ||
|  |     0,                          /* tp_setattr */ | ||
|  |     0,                          /* tp_compare */ | ||
|  |     0,                          /* tp_repr */ | ||
|  |     0,                          /* tp_as_number */ | ||
|  |     0,                          /* tp_as_sequence */ | ||
|  |     0,                          /* tp_as_mapping */ | ||
|  |     0,                          /* tp_hash */ | ||
|  |     0,                          /* tp_call */ | ||
|  |     0,                          /* tp_str */ | ||
|  |     0,                          /* tp_getattro */ | ||
|  |     0,                          /* tp_setattro */ | ||
|  |     0,                          /* tp_as_buffer */ | ||
|  |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, | ||
|  |     0,                          /* tp_doc */ | ||
|  |     (traverseproc)my_traverse,  /* tp_traverse */ | ||
|  |     (inquiry)my_clear,          /* tp_clear */ | ||
|  |     0,                          /* tp_richcompare */ | ||
|  |     0,                          /* tp_weaklistoffset */ | ||
|  | }; | ||
|  | 
 | ||
|  | /* This constructor should be made accessible from Python. */ | ||
|  | static PyObject * | ||
|  | new_object(PyObject *unused, PyObject *args) | ||
|  | { | ||
|  |     PyObject *container = NULL; | ||
|  |     MyObject *result = NULL; | ||
|  | 
 | ||
|  |     if (PyArg_ParseTuple(args, "|O:new_object", &container)) { | ||
|  |         result = PyObject_GC_New(MyObject, &MyObject_Type); | ||
|  |         if (result != NULL) { | ||
|  |             result->container = container; | ||
|  |             PyObject_GC_Track(result); | ||
|  |         } | ||
|  |     } | ||
|  |     return (PyObject *) result; | ||
|  | } |