Commit 5f429e02 authored by Benjamin Peterson's avatar Benjamin Peterson

account for PyObject_IsInstance's new ability to fail

parent c169c781
...@@ -367,6 +367,7 @@ class Obj2ModVisitor(PickleVisitor): ...@@ -367,6 +367,7 @@ class Obj2ModVisitor(PickleVisitor):
self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0)
self.emit("{", 0) self.emit("{", 0)
self.emit("PyObject* tmp = NULL;", 1) self.emit("PyObject* tmp = NULL;", 1)
self.emit("int isinstance;", 1)
self.emit("", 0) self.emit("", 0)
def sumTrailer(self, name): def sumTrailer(self, name):
...@@ -386,7 +387,13 @@ class Obj2ModVisitor(PickleVisitor): ...@@ -386,7 +387,13 @@ class Obj2ModVisitor(PickleVisitor):
def simpleSum(self, sum, name): def simpleSum(self, sum, name):
self.funcHeader(name) self.funcHeader(name)
for t in sum.types: for t in sum.types:
self.emit("if (PyObject_IsInstance(obj, (PyObject*)%s_type)) {" % t.name, 1) line = ("isinstance = PyObject_IsInstance(obj, "
"(PyObject *)%s_type);")
self.emit(line % (t.name,), 1)
self.emit("if (isinstance == -1) {", 1)
self.emit("return 1;", 2)
self.emit("}", 1)
self.emit("if (isinstance) {", 1)
self.emit("*out = %s;" % t.name, 2) self.emit("*out = %s;" % t.name, 2)
self.emit("return 0;", 2) self.emit("return 0;", 2)
self.emit("}", 1) self.emit("}", 1)
...@@ -408,7 +415,12 @@ class Obj2ModVisitor(PickleVisitor): ...@@ -408,7 +415,12 @@ class Obj2ModVisitor(PickleVisitor):
for a in sum.attributes: for a in sum.attributes:
self.visitField(a, name, sum=sum, depth=1) self.visitField(a, name, sum=sum, depth=1)
for t in sum.types: for t in sum.types:
self.emit("if (PyObject_IsInstance(obj, (PyObject*)%s_type)) {" % t.name, 1) line = "isinstance = PyObject_IsInstance(obj, (PyObject*)%s_type);"
self.emit(line % (t.name,), 1)
self.emit("if (isinstance == -1) {", 1)
self.emit("return 1;", 2)
self.emit("}", 1)
self.emit("if (isinstance) {", 1)
for f in t.fields: for f in t.fields:
self.visitFieldDeclaration(f, t.name, sum=sum, depth=2) self.visitFieldDeclaration(f, t.name, sum=sum, depth=2)
self.emit("", 0) self.emit("", 0)
...@@ -1093,11 +1105,15 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) ...@@ -1093,11 +1105,15 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type, PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
(PyObject*)Interactive_type}; (PyObject*)Interactive_type};
char *req_name[] = {"Module", "Expression", "Interactive"}; char *req_name[] = {"Module", "Expression", "Interactive"};
int isinstance;
assert(0 <= mode && mode <= 2); assert(0 <= mode && mode <= 2);
init_types(); init_types();
if (!PyObject_IsInstance(ast, req_type[mode])) { isinstance = PyObject_IsInstance(ast, req_type[mode]);
if (isinstance == -1)
return NULL;
if (!isinstance) {
PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
req_name[mode], Py_TYPE(ast)->tp_name); req_name[mode], Py_TYPE(ast)->tp_name);
return NULL; return NULL;
......
This diff is collapsed.
...@@ -466,6 +466,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -466,6 +466,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
int mode = -1; int mode = -1;
int dont_inherit = 0; int dont_inherit = 0;
int supplied_flags = 0; int supplied_flags = 0;
int is_ast;
PyCompilerFlags cf; PyCompilerFlags cf;
PyObject *result = NULL, *cmd, *tmp = NULL; PyObject *result = NULL, *cmd, *tmp = NULL;
Py_ssize_t length; Py_ssize_t length;
...@@ -505,7 +506,10 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -505,7 +506,10 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
return NULL; return NULL;
} }
if (PyAST_Check(cmd)) { is_ast = PyAST_Check(cmd);
if (is_ast == -1)
return NULL;
if (is_ast) {
if (supplied_flags & PyCF_ONLY_AST) { if (supplied_flags & PyCF_ONLY_AST) {
Py_INCREF(cmd); Py_INCREF(cmd);
result = cmd; result = cmd;
......
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