mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +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;
							 | 
						||
| 
								 | 
							
								}
							 |