Commit 075f148d authored by Kevin Modzelewski's avatar Kevin Modzelewski

Running up to compileAndRunModule

parent 691b1409
...@@ -452,7 +452,7 @@ static PyObject* lookup_maybe(PyObject* self, const char* attrstr, PyObject** at ...@@ -452,7 +452,7 @@ static PyObject* lookup_maybe(PyObject* self, const char* attrstr, PyObject** at
PyObject* res; PyObject* res;
if (*attrobj == NULL) { if (*attrobj == NULL) {
*attrobj = PyString_InternFromString(attrstr); *attrobj = getStaticString(attrstr);
if (*attrobj == NULL) if (*attrobj == NULL)
return NULL; return NULL;
} }
...@@ -466,7 +466,7 @@ static PyObject* lookup_maybe(PyObject* self, const char* attrstr, PyObject** at ...@@ -466,7 +466,7 @@ static PyObject* lookup_maybe(PyObject* self, const char* attrstr, PyObject** at
return NULL; return NULL;
} }
} }
return obj; return incref(obj);
} }
extern "C" PyObject* _PyObject_LookupSpecial(PyObject* self, const char* attrstr, PyObject** attrobj) noexcept { extern "C" PyObject* _PyObject_LookupSpecial(PyObject* self, const char* attrstr, PyObject** attrobj) noexcept {
......
...@@ -137,7 +137,7 @@ Box* SourceInfo::getDocString() { ...@@ -137,7 +137,7 @@ Box* SourceInfo::getDocString() {
return boxString(static_cast<AST_Str*>(static_cast<AST_Expr*>(body[0])->value)->str_data); return boxString(static_cast<AST_Str*>(static_cast<AST_Expr*>(body[0])->value)->str_data);
} }
return None; return incref(None);
} }
ScopeInfo* SourceInfo::getScopeInfo() { ScopeInfo* SourceInfo::getScopeInfo() {
......
...@@ -99,19 +99,6 @@ extern "C" inline void allowGLReadPreemption() { ...@@ -99,19 +99,6 @@ extern "C" inline void allowGLReadPreemption() {
} }
#endif #endif
RELEASE_ASSERT(0, "call pending finalizers?");
#if 0
// We need to call the finalizers on dead objects at some point. This is a safe place to do so.
// This needs to be done before checking for other threads waiting on the GIL since there could
// be only one thread doing a lot of work. Similarly for weakref callbacks.
//
// The conditional is an optimization - the function will do nothing if the lists are empty,
// but it's worth checking for to avoid the overhead of making a function call.
if (!gc::pending_finalization_list.empty() || !gc::weakrefs_needing_callback_list.empty()) {
gc::callPendingDestructionLogic();
}
#endif
// Double-checked locking: first read with no ordering constraint: // Double-checked locking: first read with no ordering constraint:
if (!threads_waiting_on_gil.load(std::memory_order_relaxed)) if (!threads_waiting_on_gil.load(std::memory_order_relaxed))
return; return;
......
...@@ -444,12 +444,6 @@ static int main(int argc, char** argv) noexcept { ...@@ -444,12 +444,6 @@ static int main(int argc, char** argv) noexcept {
_t.split("to run"); _t.split("to run");
BoxedModule* main_module = NULL; BoxedModule* main_module = NULL;
// XXX
{
Py_Finalize();
return 0;
}
// if the user invoked `pyston -c command` // if the user invoked `pyston -c command`
if (command != NULL) { if (command != NULL) {
try { try {
...@@ -467,7 +461,7 @@ static int main(int argc, char** argv) noexcept { ...@@ -467,7 +461,7 @@ static int main(int argc, char** argv) noexcept {
main_module = createModule(boxString("__main__"), "<string>"); main_module = createModule(boxString("__main__"), "<string>");
rtncode = (RunModule(module, 1) != 0); rtncode = (RunModule(module, 1) != 0);
} else { } else {
main_module = createModule(boxString("__main__"), fn ? fn : "<stdin>"); main_module = createModule(autoDecref(boxString("__main__")), fn ? fn : "<stdin>");
rtncode = 0; rtncode = 0;
if (fn != NULL) { if (fn != NULL) {
rtncode = RunMainFromImporter(fn); rtncode = RunMainFromImporter(fn);
......
...@@ -223,7 +223,8 @@ void prependToSysPath(llvm::StringRef path) { ...@@ -223,7 +223,8 @@ void prependToSysPath(llvm::StringRef path) {
BoxedList* sys_path = getSysPath(); BoxedList* sys_path = getSysPath();
static BoxedString* insert_str = getStaticString("insert"); static BoxedString* insert_str = getStaticString("insert");
CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(2) }; CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(2) };
callattr(sys_path, insert_str, callattr_flags, boxInt(0), boxString(path), NULL, NULL, NULL); autoDecref(callattr(sys_path, insert_str, callattr_flags, autoDecref(boxInt(0)), autoDecref(boxString(path)), NULL,
NULL, NULL));
} }
static BoxedClass* sys_flags_cls; static BoxedClass* sys_flags_cls;
......
...@@ -707,11 +707,11 @@ Box* nullImporterInit(Box* self, Box* _path) { ...@@ -707,11 +707,11 @@ Box* nullImporterInit(Box* self, Box* _path) {
if (isdir(path->data())) if (isdir(path->data()))
raiseExcHelper(ImportError, "existing directory"); raiseExcHelper(ImportError, "existing directory");
return None; Py_RETURN_NONE;
} }
Box* nullImporterFindModule(Box* self, Box* fullname, Box* path) { Box* nullImporterFindModule(Box* self, Box* fullname, Box* path) {
return None; Py_RETURN_NONE;
} }
extern "C" Box* import(int level, Box* from_imports, llvm::StringRef module_name) { extern "C" Box* import(int level, Box* from_imports, llvm::StringRef module_name) {
......
...@@ -336,7 +336,7 @@ static void _listSetitem(BoxedList* self, int64_t n, Box* v) { ...@@ -336,7 +336,7 @@ static void _listSetitem(BoxedList* self, int64_t n, Box* v) {
extern "C" Box* listSetitemUnboxed(BoxedList* self, int64_t n, Box* v) { extern "C" Box* listSetitemUnboxed(BoxedList* self, int64_t n, Box* v) {
assert(PyList_Check(self)); assert(PyList_Check(self));
_listSetitem(self, n, v); _listSetitem(self, n, v);
return None; Py_RETURN_NONE;
} }
extern "C" Box* listSetitemInt(BoxedList* self, BoxedInt* slice, Box* v) { extern "C" Box* listSetitemInt(BoxedList* self, BoxedInt* slice, Box* v) {
...@@ -567,11 +567,11 @@ extern "C" Box* listSetitemSlice(BoxedList* self, BoxedSlice* slice, Box* v) { ...@@ -567,11 +567,11 @@ extern "C" Box* listSetitemSlice(BoxedList* self, BoxedSlice* slice, Box* v) {
int r = list_ass_ext_slice(self, slice, v); int r = list_ass_ext_slice(self, slice, v);
if (r) if (r)
throwCAPIException(); throwCAPIException();
return None; Py_RETURN_NONE;
} }
listSetitemSliceInt64(self, start, stop, step, v); listSetitemSliceInt64(self, start, stop, step, v);
return None; Py_RETURN_NONE;
} }
// Analoguous to CPython's, used for sq_ slots. // Analoguous to CPython's, used for sq_ slots.
...@@ -589,7 +589,7 @@ extern "C" Box* listSetslice(BoxedList* self, Box* boxedStart, Box* boxedStop, B ...@@ -589,7 +589,7 @@ extern "C" Box* listSetslice(BoxedList* self, Box* boxedStart, Box* boxedStop, B
sliceIndex(boxedStop, &stop); sliceIndex(boxedStop, &stop);
listSetitemSliceInt64(self, start, stop, 1, value); listSetitemSliceInt64(self, start, stop, 1, value);
return None; Py_RETURN_NONE;
} }
extern "C" Box* listSetitem(BoxedList* self, Box* slice, Box* v) { extern "C" Box* listSetitem(BoxedList* self, Box* slice, Box* v) {
...@@ -599,7 +599,7 @@ extern "C" Box* listSetitem(BoxedList* self, Box* slice, Box* v) { ...@@ -599,7 +599,7 @@ extern "C" Box* listSetitem(BoxedList* self, Box* slice, Box* v) {
if (i == -1 && PyErr_Occurred()) if (i == -1 && PyErr_Occurred())
throwCAPIException(); throwCAPIException();
listSetitemUnboxed(self, i, v); listSetitemUnboxed(self, i, v);
return None; Py_RETURN_NONE;
} else if (slice->cls == slice_cls) { } else if (slice->cls == slice_cls) {
return listSetitemSlice(self, static_cast<BoxedSlice*>(slice), v); return listSetitemSlice(self, static_cast<BoxedSlice*>(slice), v);
} else { } else {
...@@ -617,7 +617,7 @@ extern "C" Box* listDelitemInt(BoxedList* self, BoxedInt* slice) { ...@@ -617,7 +617,7 @@ extern "C" Box* listDelitemInt(BoxedList* self, BoxedInt* slice) {
} }
memmove(self->elts->elts + n, self->elts->elts + n + 1, (self->size - n - 1) * sizeof(Box*)); memmove(self->elts->elts + n, self->elts->elts + n + 1, (self->size - n - 1) * sizeof(Box*));
self->size--; self->size--;
return None; Py_RETURN_NONE;
} }
extern "C" Box* listDelitemSlice(BoxedList* self, BoxedSlice* slice) { extern "C" Box* listDelitemSlice(BoxedList* self, BoxedSlice* slice) {
...@@ -665,10 +665,11 @@ extern "C" Box* listInsert(BoxedList* self, Box* idx, Box* v) { ...@@ -665,10 +665,11 @@ extern "C" Box* listInsert(BoxedList* self, Box* idx, Box* v) {
memmove(self->elts->elts + n + 1, self->elts->elts + n, (self->size - n) * sizeof(Box*)); memmove(self->elts->elts + n + 1, self->elts->elts + n, (self->size - n) * sizeof(Box*));
self->size++; self->size++;
Py_INCREF(v);
self->elts->elts[n] = v; self->elts->elts[n] = v;
} }
return None; Py_RETURN_NONE;
} }
extern "C" int PyList_Insert(PyObject* op, Py_ssize_t where, PyObject* newitem) noexcept { extern "C" int PyList_Insert(PyObject* op, Py_ssize_t where, PyObject* newitem) noexcept {
...@@ -825,7 +826,7 @@ Box* listReverse(BoxedList* self) { ...@@ -825,7 +826,7 @@ Box* listReverse(BoxedList* self) {
self->elts->elts[j] = e; self->elts->elts[j] = e;
} }
return None; Py_RETURN_NONE;
} }
extern "C" int PyList_Reverse(PyObject* v) noexcept { extern "C" int PyList_Reverse(PyObject* v) noexcept {
...@@ -923,7 +924,7 @@ void listSort(BoxedList* self, Box* cmp, Box* key, Box* reverse) { ...@@ -923,7 +924,7 @@ void listSort(BoxedList* self, Box* cmp, Box* key, Box* reverse) {
Box* listSortFunc(BoxedList* self, Box* cmp, Box* key, Box** _args) { Box* listSortFunc(BoxedList* self, Box* cmp, Box* key, Box** _args) {
Box* reverse = _args[0]; Box* reverse = _args[0];
listSort(self, cmp, key, reverse); listSort(self, cmp, key, reverse);
return None; Py_RETURN_NONE;
} }
extern "C" int PyList_Sort(PyObject* v) noexcept { extern "C" int PyList_Sort(PyObject* v) noexcept {
...@@ -1084,7 +1085,7 @@ Box* listRemove(BoxedList* self, Box* elt) { ...@@ -1084,7 +1085,7 @@ Box* listRemove(BoxedList* self, Box* elt) {
if (r) { if (r) {
memmove(self->elts->elts + i, self->elts->elts + i + 1, (self->size - i - 1) * sizeof(Box*)); memmove(self->elts->elts + i, self->elts->elts + i + 1, (self->size - i - 1) * sizeof(Box*));
self->size--; self->size--;
return None; Py_RETURN_NONE;
} }
} }
...@@ -1101,7 +1102,7 @@ Box* listInit(BoxedList* self, Box* container) { ...@@ -1101,7 +1102,7 @@ Box* listInit(BoxedList* self, Box* container) {
listIAdd(self, container); listIAdd(self, container);
} }
return None; Py_RETURN_NONE;
} }
extern "C" PyObject* PyList_New(Py_ssize_t size) noexcept { extern "C" PyObject* PyList_New(Py_ssize_t size) noexcept {
......
...@@ -337,12 +337,11 @@ extern "C" BoxedFunctionBase::BoxedFunctionBase(FunctionMetadata* md, std::initi ...@@ -337,12 +337,11 @@ extern "C" BoxedFunctionBase::BoxedFunctionBase(FunctionMetadata* md, std::initi
globals_for_name = md->source->parent_module; globals_for_name = md->source->parent_module;
} }
assert(0 && "check the refcounting here");
static BoxedString* name_str = getStaticString("__name__"); static BoxedString* name_str = getStaticString("__name__");
if (globals_for_name->cls == module_cls) { if (globals_for_name->cls == module_cls) {
this->modname = globals_for_name->getattr(name_str); this->modname = incref(globals_for_name->getattr(name_str));
} else { } else {
this->modname = PyDict_GetItem(globals_for_name, name_str); this->modname = incref(PyDict_GetItem(globals_for_name, name_str));
} }
// It's ok for modname to be NULL // It's ok for modname to be NULL
...@@ -3434,7 +3433,12 @@ int BoxedModule::clear(Box* b) noexcept { ...@@ -3434,7 +3433,12 @@ int BoxedModule::clear(Box* b) noexcept {
assert(!self->str_constants.size()); assert(!self->str_constants.size());
assert(!self->unicode_constants.size()); assert(!self->unicode_constants.size());
assert(!self->int_constants.size());
for (auto p : self->int_constants) {
Py_DECREF(self->int_constants.getMapped(p.second));
}
self->int_constants.~ContiguousMap();
assert(!self->float_constants.size()); assert(!self->float_constants.size());
assert(!self->imaginary_constants.size()); assert(!self->imaginary_constants.size());
assert(!self->long_constants.size()); assert(!self->long_constants.size());
......
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