[pypy-dev] 回复: fail about resumable hashlib code under pypy

Maciej Fijalkowski fijall at gmail.com
Fri Nov 8 09:51:43 CET 2013


this can work, but these days we have implemented hashlib differently., why?

On Fri, Nov 8, 2013 at 10:49 AM, KaShining <mail2shine at qq.com> wrote:
> Maybe this way can work:
> https://bitbucket.org/pypy/pypy/src/cli-jit/pypy/lib/_hashlib.py?at=cli-jit
>
>
> ------------------ 原始邮件 ------------------
> 发件人: "Maciej Fijalkowski";<fijall at gmail.com>;
> 发送时间: 2013年11月8日(星期五) 下午4:47
> 收件人: "KaShining"<mail2shine at qq.com>;
> 抄送: "pypy-dev"<pypy-dev at python.org>;
> 主题: Re: [pypy-dev] fail about resumable hashlib code under pypy
>
> PyPy objects are not implemented like this. This is an evil and
> atrocious hack to get the refcount and pyobjects stuff from python
> level using ctypes. works only on cpython.
>
> On Fri, Nov 8, 2013 at 10:02 AM, KaShining <mail2shine at qq.com> wrote:
>> Here is my test.py about resumable-hashlib:
>>
>> from ctypes import *
>> import hashlib
>>
>> PyObject_HEAD = [
>>     ('ob_refcnt', c_size_t),
>>     ('ob_type', c_void_p),
>> ]
>>
>> class EVP_MD(Structure):
>>     _fields_ = [
>>         ('type', c_int),
>>         ('pkey_type', c_int),
>>         ('md_size', c_int),
>>         ('flags', c_ulong),
>>         ('init', c_void_p),
>>         ('update', c_void_p),
>>         ('final', c_void_p),
>>         ('copy', c_void_p),
>>         ('cleanup', c_void_p),
>>         ('sign', c_void_p),
>>         ('verify', c_void_p),
>>         ('required_pkey_type', c_int*5),
>>         ('block_size', c_int),
>>         ('ctx_size', c_int),
>>     ]
>>
>> class EVP_MD_CTX(Structure):
>>     _fields_ = [
>>         ('digest', POINTER(EVP_MD)),
>>         ('engine', c_void_p),
>>         ('flags', c_ulong),
>>         ('md_data', POINTER(c_char)),
>>     ]
>>
>> class EVPobject(Structure):
>>     _fields_ = PyObject_HEAD + [
>>         ('name', py_object),
>>         ('ctx', EVP_MD_CTX),
>>     ]
>>
>> #import string
>>
>> #    str4096 = random_str(4096)
>> str4096 = 'sssss'
>>
>> hash2 = hashlib.sha1()
>> c_evp_obj = cast(c_void_p(id(hash2)), POINTER(EVPobject)).contents
>> ctx = c_evp_obj.ctx
>> digest = ctx.digest.contents
>> state = ctx.md_data[:digest.ctx_size]
>> #print digest.ctx_size
>>
>> Pass in cpython while fail in pypy:
>>
>> Traceback (most recent call last):
>>   File "app_main.py", line 72, in run_toplevel
>>   File "t.py", line 49, in <module>
>>     digest = ctx.digest.contents
>>   File "/opt/pypy2.1/lib_pypy/_ctypes/pointer.py", line 83, in getcontents
>>     raise ValueError("NULL pointer access")
>> ValueError: NULL pointer access
>>
>>
>>
>>
>> _______________________________________________
>> pypy-dev mailing list
>> pypy-dev at python.org
>> https://mail.python.org/mailman/listinfo/pypy-dev
>>


More information about the pypy-dev mailing list