Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions mypyc/codegen/emitmodule.py
Original file line number Diff line number Diff line change
Expand Up @@ -1087,6 +1087,7 @@ def emit_module_exec_func(
declaration = f"int CPyExec_{exported_name(module_name)}(PyObject *module)"
module_static = self.module_internal_static_name(module_name, emitter)
emitter.emit_lines(declaration, "{")
emitter.emit_line("intern_strings();")
if self.compiler_options.depends_on_librt_internal:
emitter.emit_line("if (import_librt_internal() < 0) {")
emitter.emit_line("return -1;")
Expand Down
3 changes: 1 addition & 2 deletions mypyc/codegen/emitwrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,9 +452,8 @@ def generate_bin_op_reverse_dunder_call(fn: FuncIR, emitter: Emitter, rmethod: s
if fn.name in ("__pow__", "__rpow__"):
# Ternary pow() will never call the reverse dunder.
emitter.emit_line("if (obj_mod == Py_None) {")
emitter.emit_line(f"_Py_IDENTIFIER({rmethod});")
emitter.emit_line(
'return CPy_CallReverseOpMethod(obj_left, obj_right, "{}", &PyId_{});'.format(
'return CPy_CallReverseOpMethod(obj_left, obj_right, "{}", mypyc_interned_str.{});'.format(
op_methods_to_symbols[fn.name], rmethod
)
)
Expand Down
2 changes: 1 addition & 1 deletion mypyc/lib-rt/CPy.h
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,7 @@ int CPyStatics_Initialize(PyObject **statics,
const int *frozensets);
PyObject *CPy_Super(PyObject *builtins, PyObject *self);
PyObject *CPy_CallReverseOpMethod(PyObject *left, PyObject *right, const char *op,
_Py_Identifier *method);
PyObject *method);

bool CPyImport_ImportMany(PyObject *modules, CPyModule **statics[], PyObject *globals,
PyObject *tb_path, PyObject *tb_function, Py_ssize_t *tb_lines);
Expand Down
7 changes: 1 addition & 6 deletions mypyc/lib-rt/bytes_extra_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,5 @@ PyObject *CPyBytes_Translate(PyObject *bytes, PyObject *table) {
}

// Fallback to Python method call for non-exact types or non-standard tables
_Py_IDENTIFIER(translate);
PyObject *name = _PyUnicode_FromId(&PyId_translate);
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodOneArg(bytes, name, table);
return PyObject_CallMethodOneArg(bytes, mypyc_interned_str.translate, table);
}
14 changes: 2 additions & 12 deletions mypyc/lib-rt/bytes_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,7 @@ PyObject *CPyBytes_Join(PyObject *sep, PyObject *iter) {
if (PyBytes_CheckExact(sep)) {
return PyBytes_Join(sep, iter);
} else {
_Py_IDENTIFIER(join);
PyObject *name = _PyUnicode_FromId(&PyId_join); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodOneArg(sep, name, iter);
return PyObject_CallMethodOneArg(sep, mypyc_interned_str.join, iter);
}
}

Expand Down Expand Up @@ -193,12 +188,7 @@ int CPyBytes_Startswith(PyObject *self, PyObject *subobj) {

return memcmp(self_buf, subobj_buf, (size_t)subobj_len) == 0 ? 1 : 0;
}
_Py_IDENTIFIER(startswith);
PyObject *name = _PyUnicode_FromId(&PyId_startswith);
if (name == NULL) {
return 2;
}
PyObject *result = PyObject_CallMethodOneArg(self, name, subobj);
PyObject *result = PyObject_CallMethodOneArg(self, mypyc_interned_str.startswith, subobj);
if (result == NULL) {
return 2;
}
Expand Down
90 changes: 14 additions & 76 deletions mypyc/lib-rt/dict_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,7 @@ PyObject *CPyDict_SetDefault(PyObject *dict, PyObject *key, PyObject *value) {
Py_XINCREF(ret);
return ret;
}
_Py_IDENTIFIER(setdefault);
PyObject *name = _PyUnicode_FromId(&PyId_setdefault); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodObjArgs(dict, name, key, value, NULL);
return PyObject_CallMethodObjArgs(dict, mypyc_interned_str.setdefault, key, value, NULL);
}

PyObject *CPyDict_SetDefaultWithNone(PyObject *dict, PyObject *key) {
Expand Down Expand Up @@ -136,12 +131,7 @@ static inline int CPy_ObjectToStatus(PyObject *obj) {
}

static int CPyDict_UpdateGeneral(PyObject *dict, PyObject *stuff) {
_Py_IDENTIFIER(update);
PyObject *name = _PyUnicode_FromId(&PyId_update); /* borrowed */
if (name == NULL) {
return -1;
}
PyObject *res = PyObject_CallMethodOneArg(dict, name, stuff);
PyObject *res = PyObject_CallMethodOneArg(dict, mypyc_interned_str.update, stuff);
return CPy_ObjectToStatus(res);
}

Expand Down Expand Up @@ -169,8 +159,7 @@ int CPyDict_Update(PyObject *dict, PyObject *stuff) {
int CPyDict_UpdateFromAny(PyObject *dict, PyObject *stuff) {
if (PyDict_CheckExact(dict)) {
// Argh this sucks
_Py_IDENTIFIER(keys);
if (PyDict_Check(stuff) || _CPyObject_HasAttrId(stuff, &PyId_keys)) {
if (PyDict_Check(stuff) || _CPyObject_HasAttr(stuff, mypyc_interned_str.keys)) {
return PyDict_Update(dict, stuff);
} else {
return PyDict_MergeFromSeq2(dict, stuff, 1);
Expand All @@ -189,8 +178,7 @@ PyObject *CPyDict_FromAny(PyObject *obj) {
if (!dict) {
return NULL;
}
_Py_IDENTIFIER(keys);
if (_CPyObject_HasAttrId(obj, &PyId_keys)) {
if (_CPyObject_HasAttr(obj, mypyc_interned_str.keys)) {
res = PyDict_Update(dict, obj);
} else {
res = PyDict_MergeFromSeq2(dict, obj, 1);
Expand All @@ -207,36 +195,21 @@ PyObject *CPyDict_KeysView(PyObject *dict) {
if (PyDict_CheckExact(dict)){
return _CPyDictView_New(dict, &PyDictKeys_Type);
}
_Py_IDENTIFIER(keys);
PyObject *name = _PyUnicode_FromId(&PyId_keys); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodNoArgs(dict, name);
return PyObject_CallMethodNoArgs(dict, mypyc_interned_str.keys);
}

PyObject *CPyDict_ValuesView(PyObject *dict) {
if (PyDict_CheckExact(dict)){
return _CPyDictView_New(dict, &PyDictValues_Type);
}
_Py_IDENTIFIER(values);
PyObject *name = _PyUnicode_FromId(&PyId_values); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodNoArgs(dict, name);
return PyObject_CallMethodNoArgs(dict, mypyc_interned_str.values);
}

PyObject *CPyDict_ItemsView(PyObject *dict) {
if (PyDict_CheckExact(dict)){
return _CPyDictView_New(dict, &PyDictItems_Type);
}
_Py_IDENTIFIER(items);
PyObject *name = _PyUnicode_FromId(&PyId_items); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodNoArgs(dict, name);
return PyObject_CallMethodNoArgs(dict, mypyc_interned_str.items);
}

PyObject *CPyDict_Keys(PyObject *dict) {
Expand All @@ -245,12 +218,7 @@ PyObject *CPyDict_Keys(PyObject *dict) {
}
// Inline generic fallback logic to also return a list.
PyObject *list = PyList_New(0);
_Py_IDENTIFIER(keys);
PyObject *name = _PyUnicode_FromId(&PyId_keys); /* borrowed */
if (name == NULL) {
return NULL;
}
PyObject *view = PyObject_CallMethodNoArgs(dict, name);
PyObject *view = PyObject_CallMethodNoArgs(dict, mypyc_interned_str.keys);
if (view == NULL) {
return NULL;
}
Expand All @@ -268,12 +236,7 @@ PyObject *CPyDict_Values(PyObject *dict) {
}
// Inline generic fallback logic to also return a list.
PyObject *list = PyList_New(0);
_Py_IDENTIFIER(values);
PyObject *name = _PyUnicode_FromId(&PyId_values); /* borrowed */
if (name == NULL) {
return NULL;
}
PyObject *view = PyObject_CallMethodNoArgs(dict, name);
PyObject *view = PyObject_CallMethodNoArgs(dict, mypyc_interned_str.values);
if (view == NULL) {
return NULL;
}
Expand All @@ -291,12 +254,7 @@ PyObject *CPyDict_Items(PyObject *dict) {
}
// Inline generic fallback logic to also return a list.
PyObject *list = PyList_New(0);
_Py_IDENTIFIER(items);
PyObject *name = _PyUnicode_FromId(&PyId_items); /* borrowed */
if (name == NULL) {
return NULL;
}
PyObject *view = PyObject_CallMethodNoArgs(dict, name);
PyObject *view = PyObject_CallMethodNoArgs(dict, mypyc_interned_str.items);
if (view == NULL) {
return NULL;
}
Expand All @@ -312,12 +270,7 @@ char CPyDict_Clear(PyObject *dict) {
if (PyDict_CheckExact(dict)) {
PyDict_Clear(dict);
} else {
_Py_IDENTIFIER(clear);
PyObject *name = _PyUnicode_FromId(&PyId_clear); /* borrowed */
if (name == NULL) {
return 0;
}
PyObject *res = PyObject_CallMethodNoArgs(dict, name);
PyObject *res = PyObject_CallMethodNoArgs(dict, mypyc_interned_str.clear);
if (res == NULL) {
return 0;
}
Expand All @@ -329,12 +282,7 @@ PyObject *CPyDict_Copy(PyObject *dict) {
if (PyDict_CheckExact(dict)) {
return PyDict_Copy(dict);
}
_Py_IDENTIFIER(copy);
PyObject *name = _PyUnicode_FromId(&PyId_copy); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodNoArgs(dict, name);
return PyObject_CallMethodNoArgs(dict, mypyc_interned_str.copy);
}

PyObject *CPyDict_GetKeysIter(PyObject *dict) {
Expand All @@ -352,12 +300,7 @@ PyObject *CPyDict_GetItemsIter(PyObject *dict) {
Py_INCREF(dict);
return dict;
}
_Py_IDENTIFIER(items);
PyObject *name = _PyUnicode_FromId(&PyId_items); /* borrowed */
if (name == NULL) {
return NULL;
}
PyObject *view = PyObject_CallMethodNoArgs(dict, name);
PyObject *view = PyObject_CallMethodNoArgs(dict, mypyc_interned_str.items);
if (view == NULL) {
return NULL;
}
Expand All @@ -372,12 +315,7 @@ PyObject *CPyDict_GetValuesIter(PyObject *dict) {
Py_INCREF(dict);
return dict;
}
_Py_IDENTIFIER(values);
PyObject *name = _PyUnicode_FromId(&PyId_values); /* borrowed */
if (name == NULL) {
return NULL;
}
PyObject *view = PyObject_CallMethodNoArgs(dict, name);
PyObject *view = PyObject_CallMethodNoArgs(dict, mypyc_interned_str.values);
if (view == NULL) {
return NULL;
}
Expand Down
1 change: 1 addition & 0 deletions mypyc/lib-rt/init.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <Python.h>
#include "CPy.h"
#include "static_data.c"

struct ExcDummyStruct _CPy_ExcDummyStruct = { PyObject_HEAD_INIT(NULL) };
PyObject *_CPy_ExcDummy = (PyObject *)&_CPy_ExcDummyStruct;
Expand Down
15 changes: 2 additions & 13 deletions mypyc/lib-rt/list_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,7 @@ char CPyList_Clear(PyObject *list) {
if (PyList_CheckExact(list)) {
PyList_Clear(list);
} else {
_Py_IDENTIFIER(clear);
PyObject *name = _PyUnicode_FromId(&PyId_clear);
if (name == NULL) {
return 0;
}
PyObject *res = PyObject_CallMethodNoArgs(list, name);
PyObject *res = PyObject_CallMethodNoArgs(list, mypyc_interned_str.clear);
if (res == NULL) {
return 0;
}
Expand All @@ -50,13 +45,7 @@ PyObject *CPyList_Copy(PyObject *list) {
if(PyList_CheckExact(list)) {
return PyList_GetSlice(list, 0, PyList_GET_SIZE(list));
}
_Py_IDENTIFIER(copy);

PyObject *name = _PyUnicode_FromId(&PyId_copy);
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodNoArgs(list, name);
return PyObject_CallMethodNoArgs(list, mypyc_interned_str.copy);
}

PyObject *CPyList_GetItemShort(PyObject *list, CPyTagged index) {
Expand Down
21 changes: 6 additions & 15 deletions mypyc/lib-rt/misc_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,7 @@ PyObject *CPyIter_Send(PyObject *iter, PyObject *val)
if (Py_IsNone(val)) {
return CPyIter_Next(iter);
} else {
_Py_IDENTIFIER(send);
PyObject *name = _PyUnicode_FromId(&PyId_send); /* borrowed */
if (name == NULL) {
return NULL;
}
return PyObject_CallMethodOneArg(iter, name, val);
return PyObject_CallMethodOneArg(iter, mypyc_interned_str.send, val);
}
}

Expand All @@ -50,16 +45,14 @@ PyObject *CPyIter_Send(PyObject *iter, PyObject *val)
// Signals an error (2) if the an exception should be propagated.
int CPy_YieldFromErrorHandle(PyObject *iter, PyObject **outp)
{
_Py_IDENTIFIER(close);
_Py_IDENTIFIER(throw);
PyObject *exc_type = (PyObject *)Py_TYPE(CPy_ExcState()->exc_value);
PyObject *type, *value, *traceback;
PyObject *_m;
PyObject *res;
*outp = NULL;

if (PyErr_GivenExceptionMatches(exc_type, PyExc_GeneratorExit)) {
_m = _PyObject_GetAttrId(iter, &PyId_close);
_m = PyObject_GetAttr(iter, mypyc_interned_str.close_);
if (_m) {
res = PyObject_CallNoArgs(_m);
Py_DECREF(_m);
Expand All @@ -72,7 +65,7 @@ int CPy_YieldFromErrorHandle(PyObject *iter, PyObject **outp)
return 2;
}
} else {
_m = _PyObject_GetAttrId(iter, &PyId_throw);
_m = PyObject_GetAttr(iter, mypyc_interned_str.throw_);
if (_m) {
_CPy_GetExcInfo(&type, &value, &traceback);
res = PyObject_CallFunctionObjArgs(_m, type, value, traceback, NULL);
Expand Down Expand Up @@ -877,9 +870,9 @@ PyObject *
CPy_CallReverseOpMethod(PyObject *left,
PyObject *right,
const char *op,
_Py_Identifier *method) {
PyObject *method) {
// Look up reverse method
PyObject *m = _PyObject_GetAttrId(right, method);
PyObject *m = PyObject_GetAttr(right, method);
if (m == NULL) {
// If reverse method not defined, generate TypeError instead AttributeError
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
Expand Down Expand Up @@ -1065,9 +1058,7 @@ PyObject *CPy_GetName(PyObject *obj) {
if (PyType_Check(obj)) {
return PyType_GetName((PyTypeObject *)obj);
}
_Py_IDENTIFIER(__name__);
PyObject *name = _PyUnicode_FromId(&PyId___name__); /* borrowed */
return PyObject_GetAttr(obj, name);
return PyObject_GetAttr(obj, mypyc_interned_str.__name__);
}

#endif
Expand Down
Loading