PUSH(value);
DISPATCH();
}
- Py_INCREF(exc_value);
PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value));
PyObject *exc_traceback = PyException_GetTraceback(exc_value);
- _PyErr_Restore(tstate, exc_type, exc_value, exc_traceback);
+ _PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback);
goto exception_unwind;
}
}
assert(PyExceptionInstance_Check(error));
SET_TOP(error);
- PyException_SetCause(error, exc);
- Py_INCREF(exc);
+ PyException_SetCause(error, Py_NewRef(exc));
+ // Steal exc reference, rather than Py_NewRef+Py_DECREF
PyException_SetContext(error, exc);
Py_DECREF(message);
}
// stack effect: ( -- __0)
inst(LOAD_ASSERTION_ERROR) {
PyObject *value = PyExc_AssertionError;
- Py_INCREF(value);
- PUSH(value);
+ PUSH(Py_NewRef(value));
}
// stack effect: ( -- __0)
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
STAT_INC(LOAD_GLOBAL, hit);
STACK_GROW(push_null+1);
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
}
// error: LOAD_GLOBAL has irregular stack effect
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
STAT_INC(LOAD_GLOBAL, hit);
STACK_GROW(push_null+1);
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
}
// stack effect: ( -- )
format_exc_unbound(tstate, frame->f_code, oparg);
goto error;
}
- Py_INCREF(value);
- PUSH(value);
+ PUSH(Py_NewRef(value));
}
// stack effect: (__0 -- )
assert(oparg == co->co_nfreevars);
for (int i = 0; i < oparg; ++i) {
PyObject *o = PyTuple_GET_ITEM(closure, i);
- Py_INCREF(o);
- frame->localsplus[offset + i] = o;
+ frame->localsplus[offset + i] = Py_NewRef(o);
}
}
SET_TOP(NULL);
int shrink_stack = !(oparg & 1);
STACK_SHRINK(shrink_stack);
- Py_INCREF(name);
new_frame->localsplus[0] = owner;
- new_frame->localsplus[1] = name;
+ new_frame->localsplus[1] = Py_NewRef(name);
for (int i = 2; i < code->co_nlocalsplus; i++) {
new_frame->localsplus[i] = NULL;
}
PyObject *left = TOP();
int res = Py_Is(left, right) ^ oparg;
PyObject *b = res ? Py_True : Py_False;
- Py_INCREF(b);
- SET_TOP(b);
+ SET_TOP(Py_NewRef(b));
Py_DECREF(left);
Py_DECREF(right);
}
goto error;
}
PyObject *b = (res^oparg) ? Py_True : Py_False;
- Py_INCREF(b);
- PUSH(b);
+ PUSH(Py_NewRef(b));
}
// stack effect: ( -- )
}
else {
// Failure!
- Py_INCREF(Py_None);
- SET_TOP(Py_None);
+ SET_TOP(Py_NewRef(Py_None));
}
Py_DECREF(subject);
}
PyObject *subject = TOP();
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
PyObject *res = match ? Py_True : Py_False;
- Py_INCREF(res);
- PUSH(res);
+ PUSH(Py_NewRef(res));
PREDICT(POP_JUMP_IF_FALSE);
}
PyObject *subject = TOP();
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
PyObject *res = match ? Py_True : Py_False;
- Py_INCREF(res);
- PUSH(res);
+ PUSH(Py_NewRef(res));
PREDICT(POP_JUMP_IF_FALSE);
}
if (seq) {
if (it->it_index < PyList_GET_SIZE(seq)) {
PyObject *next = PyList_GET_ITEM(seq, it->it_index++);
- Py_INCREF(next);
- PUSH(next);
+ PUSH(Py_NewRef(next));
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER);
DISPATCH();
}
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg);
assert(_Py_OPCODE(*next_instr) == END_FOR);
frame->prev_instr = next_instr - 1;
- Py_INCREF(Py_None);
- _PyFrame_StackPush(gen_frame, Py_None);
+ _PyFrame_StackPush(gen_frame, Py_NewRef(Py_None));
gen->gi_frame_state = FRAME_EXECUTING;
gen->gi_exc_state.previous_item = tstate->exc_info;
tstate->exc_info = &gen->gi_exc_state;
SET_TOP(exc_info->exc_value);
}
else {
- Py_INCREF(Py_None);
- SET_TOP(Py_None);
+ SET_TOP(Py_NewRef(Py_None));
}
- Py_INCREF(value);
- PUSH(value);
+ PUSH(Py_NewRef(value));
assert(PyExceptionInstance_Check(value));
exc_info->exc_value = value;
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
}
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
}
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
}
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
}
PyObject *function = PEEK(oparg + 1);
DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL);
STAT_INC(CALL, hit);
- PyObject *meth = ((PyMethodObject *)function)->im_func;
PyObject *self = ((PyMethodObject *)function)->im_self;
- Py_INCREF(meth);
- Py_INCREF(self);
- PEEK(oparg + 1) = self;
- PEEK(oparg + 2) = meth;
+ PEEK(oparg + 1) = Py_NewRef(self);
+ PyObject *meth = ((PyMethodObject *)function)->im_func;
+ PEEK(oparg + 2) = Py_NewRef(meth);
Py_DECREF(function);
GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS);
}
is_meth = is_method(stack_pointer, oparg);
PyObject *function = PEEK(oparg + 1);
if (!is_meth && Py_TYPE(function) == &PyMethod_Type) {
- PyObject *meth = ((PyMethodObject *)function)->im_func;
PyObject *self = ((PyMethodObject *)function)->im_self;
- Py_INCREF(meth);
- Py_INCREF(self);
- PEEK(oparg+1) = self;
- PEEK(oparg+2) = meth;
+ PEEK(oparg+1) = Py_NewRef(self);
+ PyObject *meth = ((PyMethodObject *)function)->im_func;
+ PEEK(oparg+2) = Py_NewRef(meth);
Py_DECREF(function);
is_meth = 1;
}
for (int i = argcount; i < code->co_argcount; i++) {
PyObject *def = PyTuple_GET_ITEM(func->func_defaults,
i - minargs);
- Py_INCREF(def);
- new_frame->localsplus[i] = def;
+ new_frame->localsplus[i] = Py_NewRef(def);
}
for (int i = code->co_argcount; i < code->co_nlocalsplus; i++) {
new_frame->localsplus[i] = NULL;
inst(COPY) {
assert(oparg != 0);
PyObject *peek = PEEK(oparg);
- Py_INCREF(peek);
- PUSH(peek);
+ PUSH(Py_NewRef(peek));
}
// stack effect: (__0 -- )
Py_DECREF(value);
Py_DECREF(values);
// Return None:
- Py_INCREF(Py_None);
- values = Py_None;
+ values = Py_NewRef(Py_None);
goto done;
}
PyTuple_SET_ITEM(values, i, value);
for (; i < defcount; i++) {
if (localsplus[m+i] == NULL) {
PyObject *def = defs[i];
- Py_INCREF(def);
- localsplus[m+i] = def;
+ localsplus[m+i] = Py_NewRef(def);
}
}
}
if (func->func_kwdefaults != NULL) {
PyObject *def = PyDict_GetItemWithError(func->func_kwdefaults, varname);
if (def) {
- Py_INCREF(def);
- localsplus[i] = def;
+ localsplus[i] = Py_NewRef(def);
continue;
}
else if (_PyErr_Occurred(tstate)) {
newargs[i] = args[i];
}
for (int i = 0; i < kwcount; i++) {
- Py_INCREF(kws[2*i]);
- PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
+ PyTuple_SET_ITEM(kwnames, i, Py_NewRef(kws[2*i]));
newargs[argcount+i] = kws[2*i+1];
}
allargs = newargs;
}
for (int i = 0; i < kwcount; i++) {
- Py_INCREF(kws[2*i]);
- PyTuple_SET_ITEM(kwnames, i, kws[2*i]);
+ PyTuple_SET_ITEM(kwnames, i, Py_NewRef(kws[2*i]));
}
PyFrameConstructor constr = {
.fc_globals = globals,
int err;
_PyErr_Fetch(tstate, &type, &value, &orig_traceback);
if (value == NULL) {
- value = Py_None;
- Py_INCREF(value);
+ value = Py_NewRef(Py_None);
}
_PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
return -1;
}
- Py_XINCREF(firstiter);
- Py_XSETREF(tstate->async_gen_firstiter, firstiter);
+ Py_XSETREF(tstate->async_gen_firstiter, Py_XNewRef(firstiter));
return 0;
}
return -1;
}
- Py_XINCREF(finalizer);
- Py_XSETREF(tstate->async_gen_finalizer, finalizer);
+ Py_XSETREF(tstate->async_gen_finalizer, Py_XNewRef(finalizer));
return 0;
}
PUSH(value);
DISPATCH();
}
- Py_INCREF(exc_value);
PyObject *exc_type = Py_NewRef(Py_TYPE(exc_value));
PyObject *exc_traceback = PyException_GetTraceback(exc_value);
- _PyErr_Restore(tstate, exc_type, exc_value, exc_traceback);
+ _PyErr_Restore(tstate, exc_type, Py_NewRef(exc_value), exc_traceback);
goto exception_unwind;
}
}
assert(PyExceptionInstance_Check(error));
SET_TOP(error);
- PyException_SetCause(error, exc);
- Py_INCREF(exc);
+ PyException_SetCause(error, Py_NewRef(exc));
+ // Steal exc reference, rather than Py_NewRef+Py_DECREF
PyException_SetContext(error, exc);
Py_DECREF(message);
}
TARGET(LOAD_ASSERTION_ERROR) {
PyObject *value = PyExc_AssertionError;
- Py_INCREF(value);
- PUSH(value);
+ PUSH(Py_NewRef(value));
DISPATCH();
}
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
STAT_INC(LOAD_GLOBAL, hit);
STACK_GROW(push_null+1);
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
DISPATCH();
}
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_GLOBAL);
STAT_INC(LOAD_GLOBAL, hit);
STACK_GROW(push_null+1);
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
DISPATCH();
}
format_exc_unbound(tstate, frame->f_code, oparg);
goto error;
}
- Py_INCREF(value);
- PUSH(value);
+ PUSH(Py_NewRef(value));
DISPATCH();
}
assert(oparg == co->co_nfreevars);
for (int i = 0; i < oparg; ++i) {
PyObject *o = PyTuple_GET_ITEM(closure, i);
- Py_INCREF(o);
- frame->localsplus[offset + i] = o;
+ frame->localsplus[offset + i] = Py_NewRef(o);
}
DISPATCH();
}
SET_TOP(NULL);
int shrink_stack = !(oparg & 1);
STACK_SHRINK(shrink_stack);
- Py_INCREF(name);
new_frame->localsplus[0] = owner;
- new_frame->localsplus[1] = name;
+ new_frame->localsplus[1] = Py_NewRef(name);
for (int i = 2; i < code->co_nlocalsplus; i++) {
new_frame->localsplus[i] = NULL;
}
PyObject *left = TOP();
int res = Py_Is(left, right) ^ oparg;
PyObject *b = res ? Py_True : Py_False;
- Py_INCREF(b);
- SET_TOP(b);
+ SET_TOP(Py_NewRef(b));
Py_DECREF(left);
Py_DECREF(right);
DISPATCH();
goto error;
}
PyObject *b = (res^oparg) ? Py_True : Py_False;
- Py_INCREF(b);
- PUSH(b);
+ PUSH(Py_NewRef(b));
DISPATCH();
}
}
else {
// Failure!
- Py_INCREF(Py_None);
- SET_TOP(Py_None);
+ SET_TOP(Py_NewRef(Py_None));
}
Py_DECREF(subject);
DISPATCH();
PyObject *subject = TOP();
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING;
PyObject *res = match ? Py_True : Py_False;
- Py_INCREF(res);
- PUSH(res);
+ PUSH(Py_NewRef(res));
PREDICT(POP_JUMP_IF_FALSE);
DISPATCH();
}
PyObject *subject = TOP();
int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE;
PyObject *res = match ? Py_True : Py_False;
- Py_INCREF(res);
- PUSH(res);
+ PUSH(Py_NewRef(res));
PREDICT(POP_JUMP_IF_FALSE);
DISPATCH();
}
if (seq) {
if (it->it_index < PyList_GET_SIZE(seq)) {
PyObject *next = PyList_GET_ITEM(seq, it->it_index++);
- Py_INCREF(next);
- PUSH(next);
+ PUSH(Py_NewRef(next));
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER);
DISPATCH();
}
JUMPBY(INLINE_CACHE_ENTRIES_FOR_ITER + oparg);
assert(_Py_OPCODE(*next_instr) == END_FOR);
frame->prev_instr = next_instr - 1;
- Py_INCREF(Py_None);
- _PyFrame_StackPush(gen_frame, Py_None);
+ _PyFrame_StackPush(gen_frame, Py_NewRef(Py_None));
gen->gi_frame_state = FRAME_EXECUTING;
gen->gi_exc_state.previous_item = tstate->exc_info;
tstate->exc_info = &gen->gi_exc_state;
SET_TOP(exc_info->exc_value);
}
else {
- Py_INCREF(Py_None);
- SET_TOP(Py_None);
+ SET_TOP(Py_NewRef(Py_None));
}
- Py_INCREF(value);
- PUSH(value);
+ PUSH(Py_NewRef(value));
assert(PyExceptionInstance_Check(value));
exc_info->exc_value = value;
DISPATCH();
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH();
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH();
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH();
PyObject *res = read_obj(cache->descr);
assert(res != NULL);
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
- Py_INCREF(res);
- SET_TOP(res);
+ SET_TOP(Py_NewRef(res));
PUSH(self);
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
DISPATCH();
PyObject *function = PEEK(oparg + 1);
DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL);
STAT_INC(CALL, hit);
- PyObject *meth = ((PyMethodObject *)function)->im_func;
PyObject *self = ((PyMethodObject *)function)->im_self;
- Py_INCREF(meth);
- Py_INCREF(self);
- PEEK(oparg + 1) = self;
- PEEK(oparg + 2) = meth;
+ PEEK(oparg + 1) = Py_NewRef(self);
+ PyObject *meth = ((PyMethodObject *)function)->im_func;
+ PEEK(oparg + 2) = Py_NewRef(meth);
Py_DECREF(function);
GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS);
}
is_meth = is_method(stack_pointer, oparg);
PyObject *function = PEEK(oparg + 1);
if (!is_meth && Py_TYPE(function) == &PyMethod_Type) {
- PyObject *meth = ((PyMethodObject *)function)->im_func;
PyObject *self = ((PyMethodObject *)function)->im_self;
- Py_INCREF(meth);
- Py_INCREF(self);
- PEEK(oparg+1) = self;
- PEEK(oparg+2) = meth;
+ PEEK(oparg+1) = Py_NewRef(self);
+ PyObject *meth = ((PyMethodObject *)function)->im_func;
+ PEEK(oparg+2) = Py_NewRef(meth);
Py_DECREF(function);
is_meth = 1;
}
for (int i = argcount; i < code->co_argcount; i++) {
PyObject *def = PyTuple_GET_ITEM(func->func_defaults,
i - minargs);
- Py_INCREF(def);
- new_frame->localsplus[i] = def;
+ new_frame->localsplus[i] = Py_NewRef(def);
}
for (int i = code->co_argcount; i < code->co_nlocalsplus; i++) {
new_frame->localsplus[i] = NULL;
TARGET(COPY) {
assert(oparg != 0);
PyObject *peek = PEEK(oparg);
- Py_INCREF(peek);
- PUSH(peek);
+ PUSH(Py_NewRef(peek));
DISPATCH();
}