Merge of descr-branch back into trunk. · python/cpython@6d6c1a3 (original) (raw)

`@@ -202,6 +202,11 @@ typedef long (*hashfunc)(PyObject *);

`

202

202

`typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int);

`

203

203

`typedef PyObject *(*getiterfunc) (PyObject *);

`

204

204

`typedef PyObject *(*iternextfunc) (PyObject *);

`

``

205

`+

typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *);

`

``

206

`+

typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *);

`

``

207

`+

typedef int (*initproc)(PyObject *, PyObject *, PyObject *);

`

``

208

`+

typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *);

`

``

209

`+

typedef PyObject *(*allocfunc)(struct _typeobject *, int);

`

205

210

``

206

211

`typedef struct _typeobject {

`

207

212

`PyObject_VAR_HEAD

`

`@@ -255,18 +260,48 @@ typedef struct _typeobject {

`

255

260

`getiterfunc tp_iter;

`

256

261

`iternextfunc tp_iternext;

`

257

262

``

``

263

`+

/* Attribute descriptor and subclassing stuff */

`

``

264

`+

struct PyMethodDef *tp_methods;

`

``

265

`+

struct memberlist *tp_members;

`

``

266

`+

struct getsetlist *tp_getset;

`

``

267

`+

struct _typeobject *tp_base;

`

``

268

`+

PyObject *tp_dict;

`

``

269

`+

descrgetfunc tp_descr_get;

`

``

270

`+

descrsetfunc tp_descr_set;

`

``

271

`+

long tp_dictoffset;

`

``

272

`+

initproc tp_init;

`

``

273

`+

allocfunc tp_alloc;

`

``

274

`+

newfunc tp_new;

`

``

275

`+

destructor tp_free; /* Low-level free-memory routine */

`

``

276

`+

PyObject *tp_bases;

`

``

277

`+

PyObject tp_mro; / method resolution order */

`

``

278

`+

PyObject *tp_defined;

`

``

279

+

258

280

`#ifdef COUNT_ALLOCS

`

259

281

`/* these must be last and never explicitly initialized */

`

260

``

`-

int tp_alloc;

`

261

``

`-

int tp_free;

`

``

282

`+

int tp_allocs;

`

``

283

`+

int tp_frees;

`

262

284

`int tp_maxalloc;

`

263

285

`struct _typeobject *tp_next;

`

264

286

`#endif

`

265

287

`} PyTypeObject;

`

266

288

``

267

``

`-

extern DL_IMPORT(PyTypeObject) PyType_Type; /* The type of type objects */

`

268

289

``

269

``

`-

#define PyType_Check(op) ((op)->ob_type == &PyType_Type)

`

``

290

`+

/* Generic type check */

`

``

291

`+

extern DL_IMPORT(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *);

`

``

292

`+

#define PyObject_TypeCheck(ob, tp) \

`

``

293

`+

((ob)->ob_type == (tp) || PyType_IsSubtype((ob)->ob_type, (tp)))

`

``

294

+

``

295

`+

extern DL_IMPORT(PyTypeObject) PyType_Type; /* Metatype */

`

``

296

`+

extern DL_IMPORT(PyTypeObject) PyBaseObject_Type; /* Most base object type */

`

``

297

+

``

298

`+

#define PyType_Check(op) PyObject_TypeCheck(op, &PyType_Type)

`

``

299

+

``

300

`+

extern DL_IMPORT(int) PyType_InitDict(PyTypeObject *);

`

``

301

`+

extern DL_IMPORT(PyObject *) PyType_GenericAlloc(PyTypeObject *, int);

`

``

302

`+

extern DL_IMPORT(PyObject *) PyType_GenericNew(PyTypeObject *,

`

``

303

`+

PyObject *, PyObject *);

`

``

304

`+

extern DL_IMPORT(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);

`

270

305

``

271

306

`/* Generic operations on objects */

`

272

307

`extern DL_IMPORT(int) PyObject_Print(PyObject *, FILE *, int);

`

`@@ -283,6 +318,10 @@ extern DL_IMPORT(int) PyObject_HasAttrString(PyObject *, char *);

`

283

318

`extern DL_IMPORT(PyObject *) PyObject_GetAttr(PyObject *, PyObject *);

`

284

319

`extern DL_IMPORT(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *);

`

285

320

`extern DL_IMPORT(int) PyObject_HasAttr(PyObject *, PyObject *);

`

``

321

`+

extern DL_IMPORT(PyObject **) _PyObject_GetDictPtr(PyObject *);

`

``

322

`+

extern DL_IMPORT(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *);

`

``

323

`+

extern DL_IMPORT(int) PyObject_GenericSetAttr(PyObject *,

`

``

324

`+

PyObject *, PyObject *);

`

286

325

`extern DL_IMPORT(long) PyObject_Hash(PyObject *);

`

287

326

`extern DL_IMPORT(int) PyObject_IsTrue(PyObject *);

`

288

327

`extern DL_IMPORT(int) PyObject_Not(PyObject *);

`

`@@ -357,13 +396,26 @@ given type object has a specified feature.

`

357

396

`/* tp_iter is defined */

`

358

397

`#define Py_TPFLAGS_HAVE_ITER (1L<<7)

`

359

398

``

``

399

`+

/* Experimental stuff for healing the type/class split */

`

``

400

`+

#define Py_TPFLAGS_HAVE_CLASS (1L<<8)

`

``

401

+

``

402

`+

/* Set if the type object is dynamically allocated */

`

``

403

`+

#define Py_TPFLAGS_HEAPTYPE (1L<<9)

`

``

404

+

``

405

`+

/* Set if the type allows subclassing */

`

``

406

`+

#define Py_TPFLAGS_BASETYPE (1L<<10)

`

``

407

+

``

408

`+

/* Set if the type's dict may change */

`

``

409

`+

#define Py_TPFLAGS_DYNAMICTYPE (1L<<11)

`

``

410

+

360

411

`#define Py_TPFLAGS_DEFAULT ( \

`

361

412

` Py_TPFLAGS_HAVE_GETCHARBUFFER | \

`

362

413

` Py_TPFLAGS_HAVE_SEQUENCE_IN | \

`

363

414

` Py_TPFLAGS_HAVE_INPLACEOPS | \

`

364

415

` Py_TPFLAGS_HAVE_RICHCOMPARE | \

`

365

416

` Py_TPFLAGS_HAVE_WEAKREFS | \

`

366

417

` Py_TPFLAGS_HAVE_ITER | \

`

``

418

`+

Py_TPFLAGS_HAVE_CLASS | \

`

367

419

` 0)

`

368

420

``

369

421

`#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0)

`

`@@ -412,8 +464,8 @@ extern DL_IMPORT(void) _Py_ResetReferences(void);

`

412

464

``

413

465

`#ifndef Py_TRACE_REFS

`

414

466

`#ifdef COUNT_ALLOCS

`

415

``

`-

#define _Py_Dealloc(op) ((op)->ob_type->tp_free++, (*(op)->ob_type->tp_dealloc)((PyObject *)(op)))

`

416

``

`-

#define _Py_ForgetReference(op) ((op)->ob_type->tp_free++)

`

``

467

`+

#define _Py_Dealloc(op) ((op)->ob_type->tp_frees++, (*(op)->ob_type->tp_dealloc)((PyObject *)(op)))

`

``

468

`+

#define _Py_ForgetReference(op) ((op)->ob_type->tp_frees++)

`

417

469

`#else /* !COUNT_ALLOCS */

`

418

470

`#define _Py_Dealloc(op) (*(op)->ob_type->tp_dealloc)((PyObject *)(op))

`

419

471

`#define _Py_ForgetReference(op) /empty/

`