[Ironpython-users] Differences with pyc-compiled assemblies?
Jeff Hardy
jdhardy at gmail.com
Mon Nov 12 17:02:49 CET 2012
On Sun, Nov 11, 2012 at 5:43 PM, Nicholas Devenish <misnomer at gmail.com> wrote:
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in <module>
>>> File "sqlalchemy\__init__.py", line 52, in <module>
>>> File "sqlalchemy\types", line 27, in <module>
>>> File "sqlalchemy\schema", line 2670, in <module>
>>> File "sqlalchemy\schema", line 2706, in DDLElement
>>> File "sqlalchemy\util\deprecations", line 45, in decorate
>>> File "sqlalchemy\util\deprecations", line 116, in _decorate_with_warning
>>> File "sqlalchemy\util\langhelpers", line 41, in decorate
>>> File "c:\Program Files\IronPython 2.7\Lib\inspect.py", line 814, in getargspec
>>> File "c:\Program Files\IronPython 2.7\Lib\inspect.py", line 758, in getargs
>>> IndexError: index out of range: 2
>> In inspect.py, just before line 758, it looks at co.co_argcount and
>> co.co_varnames and assumes that they are the same length, but my guess
>> is that they might not be when compiled with pyc. If you can figure
>> out exactly what getargspec is being called on, that might help make a
>> simpler reproduction that I can work off of.
>
> So, I've traced down the stack trace with some tested output. This is what it seems to be doing:
First off, thank you for the detailed analysis. It's very helpful.
>
>> Starting with the wrapped function (though the line number seems off slightly,
>> everything else in the stack trace and debug output before the exception matches
>> up exactly):
>> ... snip ...
>> That calls getargs:
>>
>> def getargs(co):
>> if not iscode(co):
>> raise TypeError('{!r} is not a code object'.format(co))
>>
>> nargs = co.co_argcount
>> names = co.co_varnames
>> args = list(names[:nargs])
>> step = 0
>>
>> for i in range(nargs):
>> if args[i][:1] in ('', '.'):
>>
>> With values for the variables:
>>
>> print "getargs:"
>> print " args: {}".format(args)
>> print " nargs: {}".format(nargs)
>> print " names: {}".format(names)
>>
>> And the output from these print statements:
>>
>> getargs:
>> args: ['target', 'call_event']
>> nargs: 3
>> names: ('target', 'call_event')
>
It's odd that nargs (co_argcount) is 3, but names (co_varnames) has
only 2 elements. I'm afraid it might be a bug in how IronPython
compiles the code. It's possible that no one has tried using pyc on
code that accesses the co_* values before.
- Jeff
More information about the Ironpython-users
mailing list