Commit bacf0cfa authored by Marius Wachtler's avatar Marius Wachtler

Merge pull request #1140 from undingen/misc_refcounting_fixed

Misc refcounting leaks encountered while fixing the generator abandonment tests
parents 30d2e36c c6994906
...@@ -732,6 +732,9 @@ _PyIO_trap_eintr(void) ...@@ -732,6 +732,9 @@ _PyIO_trap_eintr(void)
if (eintr_int == NULL) { if (eintr_int == NULL) {
eintr_int = PyLong_FromLong(EINTR); eintr_int = PyLong_FromLong(EINTR);
assert(eintr_int != NULL); assert(eintr_int != NULL);
// Pyston change:
PyGC_RegisterStaticConstant(eintr_int);
} }
if (!PyErr_ExceptionMatches(PyExc_EnvironmentError)) if (!PyErr_ExceptionMatches(PyExc_EnvironmentError))
return 0; return 0;
......
...@@ -1574,8 +1574,13 @@ Value ASTInterpreter::visit_dict(AST_Dict* node) { ...@@ -1574,8 +1574,13 @@ Value ASTInterpreter::visit_dict(AST_Dict* node) {
BoxedDict* dict = new BoxedDict(); BoxedDict* dict = new BoxedDict();
for (size_t i = 0; i < node->keys.size(); ++i) { for (size_t i = 0; i < node->keys.size(); ++i) {
Value v = visit_expr(node->values[i]); Value v = visit_expr(node->values[i]);
AUTO_DECREF(v.o);
Value k = visit_expr(node->keys[i]); Value k = visit_expr(node->keys[i]);
dict->d[k.o] = v.o; AUTO_DECREF(k.o);
int ret = PyDict_SetItem(dict, k.o, v.o);
if (ret == -1)
throwCAPIException();
values.push_back(v); values.push_back(v);
keys.push_back(k); keys.push_back(k);
...@@ -1590,7 +1595,11 @@ Value ASTInterpreter::visit_set(AST_Set* node) { ...@@ -1590,7 +1595,11 @@ Value ASTInterpreter::visit_set(AST_Set* node) {
BoxedSet::Set set; BoxedSet::Set set;
for (AST_expr* e : node->elts) { for (AST_expr* e : node->elts) {
Value v = visit_expr(e); Value v = visit_expr(e);
set.insert(v.o); auto&& p = set.insert(v.o);
if (!p.second /* already exists */) {
Py_DECREF(p.first->value);
*p.first = v.o;
}
items.push_back(v); items.push_back(v);
} }
......
...@@ -854,7 +854,9 @@ Box* JitFragmentWriter::callattrHelper(Box* obj, BoxedString* attr, CallattrFlag ...@@ -854,7 +854,9 @@ Box* JitFragmentWriter::callattrHelper(Box* obj, BoxedString* attr, CallattrFlag
Box* JitFragmentWriter::createDictHelper(uint64_t num, Box** keys, Box** values) { Box* JitFragmentWriter::createDictHelper(uint64_t num, Box** keys, Box** values) {
BoxedDict* dict = (BoxedDict*)createDict(); BoxedDict* dict = (BoxedDict*)createDict();
for (uint64_t i = 0; i < num; ++i) { for (uint64_t i = 0; i < num; ++i) {
dict->d[keys[i]] = values[i]; int ret = PyDict_SetItem(dict, autoDecref(keys[i]), autoDecref(values[i]));
if (ret == -1)
throwCAPIException();
} }
return dict; return dict;
} }
...@@ -870,8 +872,13 @@ Box* JitFragmentWriter::createListHelper(uint64_t num, Box** data) { ...@@ -870,8 +872,13 @@ Box* JitFragmentWriter::createListHelper(uint64_t num, Box** data) {
Box* JitFragmentWriter::createSetHelper(uint64_t num, Box** data) { Box* JitFragmentWriter::createSetHelper(uint64_t num, Box** data) {
BoxedSet* set = (BoxedSet*)createSet(); BoxedSet* set = (BoxedSet*)createSet();
for (int i = 0; i < num; ++i) for (int i = 0; i < num; ++i) {
set->s.insert(data[i]); auto&& p = set->s.insert(data[i]);
if (!p.second /* already exists */) {
Py_DECREF(p.first->value);
*p.first = data[i];
}
}
return set; return set;
} }
......
...@@ -476,7 +476,7 @@ static int main(int argc, char** argv) noexcept { ...@@ -476,7 +476,7 @@ static int main(int argc, char** argv) noexcept {
} }
} else if (module != NULL) { } else if (module != NULL) {
// TODO: CPython uses the same main module for all code paths // TODO: CPython uses the same main module for all code paths
main_module = createModule(boxString("__main__"), "<string>"); main_module = createModule(autoDecref(boxString("__main__")), "<string>");
rtncode = (RunModule(module, 1) != 0); rtncode = (RunModule(module, 1) != 0);
} else { } else {
main_module = createModule(autoDecref(boxString("__main__")), fn ? fn : "<stdin>"); main_module = createModule(autoDecref(boxString("__main__")), fn ? fn : "<stdin>");
...@@ -526,6 +526,8 @@ static int main(int argc, char** argv) noexcept { ...@@ -526,6 +526,8 @@ static int main(int argc, char** argv) noexcept {
PyObject* v = PyImport_ImportModule("readline"); PyObject* v = PyImport_ImportModule("readline");
if (!v) if (!v)
PyErr_Clear(); PyErr_Clear();
else
Py_CLEAR(v);
printf("Pyston v%d.%d.%d (rev " STRINGIFY(GITREV) ")", PYSTON_VERSION_MAJOR, PYSTON_VERSION_MINOR, printf("Pyston v%d.%d.%d (rev " STRINGIFY(GITREV) ")", PYSTON_VERSION_MAJOR, PYSTON_VERSION_MINOR,
PYSTON_VERSION_MICRO); PYSTON_VERSION_MICRO);
......
...@@ -987,8 +987,6 @@ extern "C" int PyRun_InteractiveOneFlags(FILE* fp, const char* filename, PyCompi ...@@ -987,8 +987,6 @@ extern "C" int PyRun_InteractiveOneFlags(FILE* fp, const char* filename, PyCompi
// Pyston change: // Pyston change:
// d = PyModule_GetDict(m); // d = PyModule_GetDict(m);
// v = run_mod(mod, filename, d, d, flags, arena); // v = run_mod(mod, filename, d, d, flags, arena);
v = None;
Py_INCREF(v);
assert(PyModule_Check(m)); assert(PyModule_Check(m));
bool failed = false; bool failed = false;
try { try {
...@@ -1005,7 +1003,9 @@ extern "C" int PyRun_InteractiveOneFlags(FILE* fp, const char* filename, PyCompi ...@@ -1005,7 +1003,9 @@ extern "C" int PyRun_InteractiveOneFlags(FILE* fp, const char* filename, PyCompi
PyErr_Print(); PyErr_Print();
return -1; return -1;
} }
Py_DECREF(v); // Pyston change: we dont't have v
// Py_DECREF(v);
if (Py_FlushLine()) if (Py_FlushLine())
PyErr_Clear(); PyErr_Clear();
return 0; return 0;
......
...@@ -3120,6 +3120,7 @@ extern "C" void setattr(Box* obj, BoxedString* attr, STOLEN(Box*) attr_val) { ...@@ -3120,6 +3120,7 @@ extern "C" void setattr(Box* obj, BoxedString* attr, STOLEN(Box*) attr_val) {
STAT_TIMER(t1, "us_timer_slowpath_tpsetattr", 10); STAT_TIMER(t1, "us_timer_slowpath_tpsetattr", 10);
assert(attr->data()[attr->size()] == '\0'); assert(attr->data()[attr->size()] == '\0');
AUTO_DECREF(attr_val);
int rtn = obj->cls->tp_setattr(obj, const_cast<char*>(attr->data()), attr_val); int rtn = obj->cls->tp_setattr(obj, const_cast<char*>(attr->data()), attr_val);
if (rtn) if (rtn)
throwCAPIException(); throwCAPIException();
......
d = {2:2} d = {2:"should get overwritten", 2:2}
d[1] = 1 d[1] = 1
print d print d
print d[1], d[1L], d[1.0], d[True] print d[1], d[1L], d[1.0], d[True]
......
s1 = {1} s1 = {1, 1}
def sorted(s): def sorted(s):
l = list(s) l = list(s)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment