468,134 Members | 1,248 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,134 developers. It's quick & easy.

Problems with adding a new built-in data type

Evening all,

I'm trying to add a new built-in number data type to Python with its own
syntax, so I'm working directly with the interpreter rather than
creating my own extension module (side note: I've appended something
extra to the version thing in the Makefile - I doubt this is relevant to
the problem but it's probably best you have all the info). The complex
data type is similar to what I'm trying to do so I've been following
that as an example. I've successfully extended the tokenizer and the
parsenumber() function in compile.c to do what I want and written the
data type in my two new files Objects/mynewobject.c and
Include/mynewobject.h. I've included mynewobject.h in Python.h and added
the two files to the Makefile.

However, when I tried to run the code by typing in the syntax to produce
my data type, Python suffers a segmentation fault. I traced this to an
attempt to get the hash of a null pointer when adding the new instance
of my type after parsenumber() was called. For completeness, here's the
backtrace:

Program received signal SIGSEGV, Segmentation fault.
0x08080e9a in PyObject_Hash (v=0x81486c0) at Objects/object.c:1162
1162 if (tp->tp_hash != NULL)
(gdb) bt
#0 0x08080e9a in PyObject_Hash (v=0x81486c0) at Objects/object.c:1162
#1 0x0808e199 in tuplehash (v=0x40324574) at Objects/tupleobject.c:244
#2 0x08080eae in PyObject_Hash (v=0x40324574) at Objects/object.c:1163
#3 0x0807b46c in PyDict_GetItem (op=0x40319c14, key=0x40324574) at
Objects/dictobject.c:492
#4 0x080c72c7 in com_add (c=0xbfffed60, list=0x40326114,
dict=0x40319c14, v=0x40326290) at Python/compile.c:975
#5 0x080c74ac in com_addconst (c=0xbfffed60, v=0x40326290) at
Python/compile.c:1001
#6 0x080c90e3 in com_atom (c=0xbfffed60, n=0x4028d500) at
Python/compile.c:1689

The crash appears to be caused because while v exists, v's members are
all 0 and so tp becomes 0 when it is made equal to v->ob_type and you
get a NULL pointer exception. As far as I can tell, this v is the second
object in the tuple created in com_add() and is supposed to be the type
of the object being added to the dictionary in a tuple. Not knowing why
it was coming out as zero, I did some more poking around (been doing a
lot of that over the past 5 days...) and found that there is a file
called bltinmodule.c with a bunch of lines, one of which mentions the
complex data type that I am using as a guide:

SETBUILTIN("complex", &PyComplex_Type);

So I made one of these for mynewobject and added it. I figured from this
bit of code that the reason I was getting NULL pointer exceptions was
because my type hadn't been initialised in some way and that this would
do it. But here's the problem: despite trying for longer than I've slept
in the past week, I can't get it to work. With that line in the Python
interpreter segfaults as soon as it starts (while trying to import the
os module) and so it can't even finish compiling the extension modules.
If I comment out the SETBUILTIN line I added it will compile fine but
then I go back to the first problem.

I have structured my object identically to the complex object as far as
I can tell, which works. So the question is, what's broken? What have I
missed when adding a new builtin?

(This mess is all happening on Linux tillinshir 2.6.7-gentoo-r11-gb #1
Wed Aug 4 11:13:14 NZST 2004 i686 mobile AMD Athlon(tm) XP 2000+
AuthenticAMD GNU/Linux, if that matters.)

Thanks in advance,
Geoff Biggs
Jul 18 '05 #1
1 1957
No need to worry anymore, I've fixed the problem. If you're making a
built-in type, remember to define your PyTypeObject with something other
than NULL in the PyObject_HEAD_INIT. Non-built-ins don't need to worry
about this because it gets filled in later for them (as in the example
in the docs), but built-ins appear to need to fill it in themselves.

Geoff Biggs

Geoff Biggs wrote:
Evening all,

I'm trying to add a new built-in number data type to Python with its own
syntax, so I'm working directly with the interpreter rather than
creating my own extension module (side note: I've appended something
extra to the version thing in the Makefile - I doubt this is relevant to
the problem but it's probably best you have all the info). The complex
data type is similar to what I'm trying to do so I've been following
that as an example. I've successfully extended the tokenizer and the
parsenumber() function in compile.c to do what I want and written the
data type in my two new files Objects/mynewobject.c and
Include/mynewobject.h. I've included mynewobject.h in Python.h and added
the two files to the Makefile.

However, when I tried to run the code by typing in the syntax to produce
my data type, Python suffers a segmentation fault. I traced this to an
attempt to get the hash of a null pointer when adding the new instance
of my type after parsenumber() was called. For completeness, here's the
backtrace:

Program received signal SIGSEGV, Segmentation fault.
0x08080e9a in PyObject_Hash (v=0x81486c0) at Objects/object.c:1162
1162 if (tp->tp_hash != NULL)
(gdb) bt
#0 0x08080e9a in PyObject_Hash (v=0x81486c0) at Objects/object.c:1162
#1 0x0808e199 in tuplehash (v=0x40324574) at Objects/tupleobject.c:244
#2 0x08080eae in PyObject_Hash (v=0x40324574) at Objects/object.c:1163
#3 0x0807b46c in PyDict_GetItem (op=0x40319c14, key=0x40324574) at
Objects/dictobject.c:492
#4 0x080c72c7 in com_add (c=0xbfffed60, list=0x40326114,
dict=0x40319c14, v=0x40326290) at Python/compile.c:975
#5 0x080c74ac in com_addconst (c=0xbfffed60, v=0x40326290) at
Python/compile.c:1001
#6 0x080c90e3 in com_atom (c=0xbfffed60, n=0x4028d500) at
Python/compile.c:1689

The crash appears to be caused because while v exists, v's members are
all 0 and so tp becomes 0 when it is made equal to v->ob_type and you
get a NULL pointer exception. As far as I can tell, this v is the second
object in the tuple created in com_add() and is supposed to be the type
of the object being added to the dictionary in a tuple. Not knowing why
it was coming out as zero, I did some more poking around (been doing a
lot of that over the past 5 days...) and found that there is a file
called bltinmodule.c with a bunch of lines, one of which mentions the
complex data type that I am using as a guide:

SETBUILTIN("complex", &PyComplex_Type);

So I made one of these for mynewobject and added it. I figured from this
bit of code that the reason I was getting NULL pointer exceptions was
because my type hadn't been initialised in some way and that this would
do it. But here's the problem: despite trying for longer than I've slept
in the past week, I can't get it to work. With that line in the Python
interpreter segfaults as soon as it starts (while trying to import the
os module) and so it can't even finish compiling the extension modules.
If I comment out the SETBUILTIN line I added it will compile fine but
then I go back to the first problem.

I have structured my object identically to the complex object as far as
I can tell, which works. So the question is, what's broken? What have I
missed when adding a new builtin?

(This mess is all happening on Linux tillinshir 2.6.7-gentoo-r11-gb #1
Wed Aug 4 11:13:14 NZST 2004 i686 mobile AMD Athlon(tm) XP 2000+
AuthenticAMD GNU/Linux, if that matters.)

Thanks in advance,
Geoff Biggs

Jul 18 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by PyUser | last post: by
2 posts views Thread by V. Srinivas | last post: by
19 posts views Thread by Bill Davidson | last post: by
reply views Thread by Wysiwyg | last post: by
33 posts views Thread by wespvp | last post: by
5 posts views Thread by Jonathan Boivin | last post: by
27 posts views Thread by didacticone | last post: by
1 post views Thread by gcdp | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.