Commit dcb6fca3 authored by Kevin Modzelewski's avatar Kevin Modzelewski

Add a missing annotation

And add some extra ref checking.  The rewriter didn't verify that it didn't
over-decref which made this hard to find.
parent a951853a
......@@ -20,6 +20,7 @@
#include "core/common.h"
#include "core/stats.h"
#include "runtime/types.h"
#include "runtime/objmodel.h"
namespace pyston {
......@@ -567,6 +568,12 @@ void Rewriter::_decref(RewriterVar* var) {
_setupCall(true, llvm::ArrayRef<RewriterVar*>(&var, 1), llvm::ArrayRef<RewriterVar*>(NULL, (int)0), assembler::RAX);
#ifdef Py_REF_DEBUG
assembler->mov(assembler::Immediate((void*)assertAlive), assembler::R11);
assembler->callq(assembler::R11);
assembler->mov(assembler::RAX, assembler::RDI);
#endif
// _setupCall doesn't remember that it added the arg regs to the location set
auto reg = assembler::RDI;
//auto reg = var->getInReg();
......
......@@ -646,7 +646,8 @@ Box* setattrFunc(Box* obj, Box* _str, Box* value) {
return incref(None);
}
static Box* hasattrFuncHelper(Box* return_val) noexcept {
// Not sure if this should be stealing or not:
static Box* hasattrFuncHelper(STOLEN(Box*) return_val) noexcept {
AUTO_XDECREF(return_val);
if (return_val)
......@@ -744,6 +745,7 @@ Box* hasattrFuncInternal(BoxedFunctionBase* func, CallRewriteArgs* rewrite_args,
if (rewrite_args) {
RewriterVar* final_rtn
= rewrite_args->rewriter->call(false, (void*)hasattrFuncHelper, r_rtn)->setType(RefType::OWNED);
r_rtn->refConsumed();
if (S == CXX)
rewrite_args->rewriter->checkAndThrowCAPIException(final_rtn);
......
......@@ -6950,4 +6950,8 @@ extern "C" void boxedLocalsDel(Box* boxedLocals, BoxedString* attr) {
extern "C" void checkRefs(Box* b) {
RELEASE_ASSERT(b->ob_refcnt >= 0, "%ld", b->ob_refcnt);
}
extern "C" Box* assertAlive(Box* b) {
RELEASE_ASSERT(b->ob_refcnt > 0, "%ld", b->ob_refcnt);
return b;
}
}
......@@ -226,6 +226,7 @@ extern "C" void boxedLocalsSet(Box* boxedLocals, BoxedString* attr, Box* val);
extern "C" Box* boxedLocalsGet(Box* boxedLocals, BoxedString* attr, Box* globals);
extern "C" void boxedLocalsDel(Box* boxedLocals, BoxedString* attr);
extern "C" void checkRefs(Box* b);
extern "C" void checkRefs(Box* b); // asserts that b has >= 0 refs
extern "C" Box* assertAlive(Box* b); // asserts that b has > 0 refs, and returns b
}
#endif
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