コード例 #1
0
ファイル: dictionaries.hpp プロジェクト: 601040605/Nuitka
static PyDictEntry *GET_STRING_DICT_ENTRY( PyDictObject *dict, Nuitka_StringObject *key )
{
    assert( PyDict_CheckExact( dict ) );
    assert( Nuitka_String_CheckExact( key ) );

#if PYTHON_VERSION < 300
    Py_hash_t hash = key->ob_shash;
#else
    Py_hash_t hash = key->hash;
#endif

    // Only improvement would be to identify how to ensure that the hash is
    // computed already. Calling hash early on could do that potentially.
    if ( hash == -1 )
    {
#if PYTHON_VERSION < 300
        hash = PyString_Type.tp_hash( (PyObject *)key );
        key->ob_shash = hash;
#else
        hash = PyUnicode_Type.tp_hash( (PyObject *)key );
        key->hash = hash;
#endif
    }

    PyDictEntry *entry = dict->ma_lookup( dict, (PyObject *)key, hash );

    // The "entry" cannot be NULL, it can only be empty for a string dict
    // lookup, but at least assert it.
    assert( entry != NULL );

    return entry;
}
コード例 #2
0
ファイル: dictionaries.hpp プロジェクト: 601040605/Nuitka
static Nuitka_DictEntryHandle GET_STRING_DICT_ENTRY( PyDictObject *dict, Nuitka_StringObject *key )
{
    assert( PyDict_CheckExact( dict ) );
    assert( Nuitka_String_CheckExact( key ) );

    Py_hash_t hash = key->_base._base.hash;

    // Only improvement would be to identify how to ensure that the hash is computed
    // already. Calling hash early on could do that potentially.
    if ( hash == -1 )
    {
        hash = PyUnicode_Type.tp_hash( (PyObject *)key );
        key->_base._base.hash = hash;
    }

    PyObject **value_addr;

    PyDictKeyEntry *entry = dict->ma_keys->dk_lookup( dict, (PyObject *)key, hash, &value_addr );

    // The "entry" cannot be NULL, it can only be empty for a string dict lookup, but at
    // least assert it.
    assert( entry != NULL );

    return value_addr;
}
コード例 #3
0
ファイル: CompiledFrameType.c プロジェクト: kayhayen/Nuitka
PyCodeObject *MAKE_CODEOBJ(PyObject *filename, PyObject *function_name, int line, PyObject *argnames, int arg_count,
                           int kw_only_count, int flags)
#endif
{
    CHECK_OBJECT(filename);
    assert(Nuitka_String_CheckExact(filename));
    CHECK_OBJECT(function_name);
    assert(Nuitka_String_Check(function_name));
    CHECK_OBJECT(argnames);
    assert(PyTuple_Check(argnames));

    // The PyCode_New has funny code that interns, mutating the tuple that owns
    // it. Really serious non-immutable shit. We have triggered that changes
    // behind our back in the past.
#ifndef __NUITKA_NO_ASSERT__
    Py_hash_t hash = DEEP_HASH(argnames);
#endif

    // Not using PyCode_NewEmpty, it doesn't given us much beyond this
    // and is not available for Python2.
    PyCodeObject *result = PyCode_New(arg_count, // argcount
#if PYTHON_VERSION >= 300
                                      kw_only_count, // kw-only count
#endif
                                      0,     // nlocals
                                      0,     // stacksize
                                      flags, // flags
#if PYTHON_VERSION < 300
                                      const_str_empty, // code (bytecode)
#else
                                      const_bytes_empty, // code (bytecode)
#endif
                                      const_tuple_empty, // consts (we are not going to be compatible)
                                      const_tuple_empty, // names (we are not going to be compatible)
                                      argnames,          // varnames (we are not going to be compatible)
                                      const_tuple_empty, // freevars (we are not going to be compatible)
                                      const_tuple_empty, // cellvars (we are not going to be compatible)
                                      filename,          // filename
                                      function_name,     // name
                                      line,              // firstlineno (offset of the code object)
#if PYTHON_VERSION < 300
                                      const_str_empty // lnotab (table to translate code object)
#else
                                      const_bytes_empty  // lnotab (table to translate code object)
#endif
    );

    assert(DEEP_HASH(argnames) == hash);

    CHECK_OBJECT(result);
    return result;
}