diff options
Diffstat (limited to 'Python/Python-ast.c')
| -rw-r--r-- | Python/Python-ast.c | 394 | 
1 files changed, 389 insertions, 5 deletions
| diff --git a/Python/Python-ast.c b/Python/Python-ast.c index ad53ba35..e0607ba 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -86,6 +86,15 @@ static char *AugAssign_fields[]={      "op",      "value",  }; +static PyTypeObject *AnnAssign_type; +_Py_IDENTIFIER(annotation); +_Py_IDENTIFIER(simple); +static char *AnnAssign_fields[]={ +    "target", +    "annotation", +    "value", +    "simple", +};  static PyTypeObject *For_type;  _Py_IDENTIFIER(iter);  _Py_IDENTIFIER(orelse); @@ -285,6 +294,18 @@ _Py_IDENTIFIER(s);  static char *Str_fields[]={      "s",  }; +static PyTypeObject *FormattedValue_type; +_Py_IDENTIFIER(conversion); +_Py_IDENTIFIER(format_spec); +static char *FormattedValue_fields[]={ +    "value", +    "conversion", +    "format_spec", +}; +static PyTypeObject *JoinedStr_type; +static char *JoinedStr_fields[]={ +    "values", +};  static PyTypeObject *Bytes_type;  static char *Bytes_fields[]={      "s", @@ -294,6 +315,10 @@ static char *NameConstant_fields[]={      "value",  };  static PyTypeObject *Ellipsis_type; +static PyTypeObject *Constant_type; +static char *Constant_fields[]={ +    "value", +};  static PyTypeObject *Attribute_type;  _Py_IDENTIFIER(attr);  _Py_IDENTIFIER(ctx); @@ -410,10 +435,12 @@ static PyTypeObject *NotIn_type;  static PyTypeObject *comprehension_type;  static PyObject* ast2obj_comprehension(void*);  _Py_IDENTIFIER(ifs); +_Py_IDENTIFIER(is_async);  static char *comprehension_fields[]={      "target",      "iter",      "ifs", +    "is_async",  };  static PyTypeObject *excepthandler_type;  static char *excepthandler_attributes[] = { @@ -450,7 +477,6 @@ static char *arg_attributes[] = {      "col_offset",  };  _Py_IDENTIFIER(arg); -_Py_IDENTIFIER(annotation);  static char *arg_fields[]={      "arg",      "annotation", @@ -697,6 +723,7 @@ static PyObject* ast2obj_object(void *o)      return (PyObject*)o;  }  #define ast2obj_singleton ast2obj_object +#define ast2obj_constant ast2obj_object  #define ast2obj_identifier ast2obj_object  #define ast2obj_string ast2obj_object  #define ast2obj_bytes ast2obj_object @@ -734,6 +761,19 @@ static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)      return 0;  } +static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) +{ +    if (obj) { +        if (PyArena_AddPyObject(arena, obj) < 0) { +            *out = NULL; +            return -1; +        } +        Py_INCREF(obj); +    } +    *out = obj; +    return 0; +} +  static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)  {      if (!PyUnicode_CheckExact(obj) && obj != Py_None) { @@ -769,7 +809,7 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)          return 1;      } -    i = (int)PyLong_AsLong(obj); +    i = _PyLong_AsInt(obj);      if (i == -1 && PyErr_Occurred())          return 1;      *out = i; @@ -843,6 +883,8 @@ static int init_types(void)      if (!Assign_type) return 0;      AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);      if (!AugAssign_type) return 0; +    AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4); +    if (!AnnAssign_type) return 0;      For_type = make_type("For", stmt_type, For_fields, 4);      if (!For_type) return 0;      AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4); @@ -917,6 +959,11 @@ static int init_types(void)      if (!Num_type) return 0;      Str_type = make_type("Str", expr_type, Str_fields, 1);      if (!Str_type) return 0; +    FormattedValue_type = make_type("FormattedValue", expr_type, +                                    FormattedValue_fields, 3); +    if (!FormattedValue_type) return 0; +    JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1); +    if (!JoinedStr_type) return 0;      Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);      if (!Bytes_type) return 0;      NameConstant_type = make_type("NameConstant", expr_type, @@ -924,6 +971,8 @@ static int init_types(void)      if (!NameConstant_type) return 0;      Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);      if (!Ellipsis_type) return 0; +    Constant_type = make_type("Constant", expr_type, Constant_fields, 1); +    if (!Constant_type) return 0;      Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);      if (!Attribute_type) return 0;      Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3); @@ -1101,7 +1150,7 @@ static int init_types(void)      NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);      if (!NotIn_singleton) return 0;      comprehension_type = make_type("comprehension", &AST_type, -                                   comprehension_fields, 3); +                                   comprehension_fields, 4);      if (!comprehension_type) return 0;      if (!add_attributes(comprehension_type, NULL, 0)) return 0;      excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0); @@ -1370,6 +1419,34 @@ AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int  }  stmt_ty +AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int +          lineno, int col_offset, PyArena *arena) +{ +    stmt_ty p; +    if (!target) { +        PyErr_SetString(PyExc_ValueError, +                        "field target is required for AnnAssign"); +        return NULL; +    } +    if (!annotation) { +        PyErr_SetString(PyExc_ValueError, +                        "field annotation is required for AnnAssign"); +        return NULL; +    } +    p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); +    if (!p) +        return NULL; +    p->kind = AnnAssign_kind; +    p->v.AnnAssign.target = target; +    p->v.AnnAssign.annotation = annotation; +    p->v.AnnAssign.value = value; +    p->v.AnnAssign.simple = simple; +    p->lineno = lineno; +    p->col_offset = col_offset; +    return p; +} + +stmt_ty  For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int      lineno, int col_offset, PyArena *arena)  { @@ -2063,6 +2140,42 @@ Str(string s, int lineno, int col_offset, PyArena *arena)  }  expr_ty +FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, +               int col_offset, PyArena *arena) +{ +    expr_ty p; +    if (!value) { +        PyErr_SetString(PyExc_ValueError, +                        "field value is required for FormattedValue"); +        return NULL; +    } +    p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); +    if (!p) +        return NULL; +    p->kind = FormattedValue_kind; +    p->v.FormattedValue.value = value; +    p->v.FormattedValue.conversion = conversion; +    p->v.FormattedValue.format_spec = format_spec; +    p->lineno = lineno; +    p->col_offset = col_offset; +    return p; +} + +expr_ty +JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena *arena) +{ +    expr_ty p; +    p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); +    if (!p) +        return NULL; +    p->kind = JoinedStr_kind; +    p->v.JoinedStr.values = values; +    p->lineno = lineno; +    p->col_offset = col_offset; +    return p; +} + +expr_ty  Bytes(bytes s, int lineno, int col_offset, PyArena *arena)  {      expr_ty p; @@ -2114,6 +2227,25 @@ Ellipsis(int lineno, int col_offset, PyArena *arena)  }  expr_ty +Constant(constant value, int lineno, int col_offset, PyArena *arena) +{ +    expr_ty p; +    if (!value) { +        PyErr_SetString(PyExc_ValueError, +                        "field value is required for Constant"); +        return NULL; +    } +    p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); +    if (!p) +        return NULL; +    p->kind = Constant_kind; +    p->v.Constant.value = value; +    p->lineno = lineno; +    p->col_offset = col_offset; +    return p; +} + +expr_ty  Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int            col_offset, PyArena *arena)  { @@ -2315,7 +2447,8 @@ Index(expr_ty value, PyArena *arena)  }  comprehension_ty -comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena) +comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, +              PyArena *arena)  {      comprehension_ty p;      if (!target) { @@ -2334,6 +2467,7 @@ comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena)      p->target = target;      p->iter = iter;      p->ifs = ifs; +    p->is_async = is_async;      return p;  } @@ -2648,6 +2782,30 @@ ast2obj_stmt(void* _o)              goto failed;          Py_DECREF(value);          break; +    case AnnAssign_kind: +        result = PyType_GenericNew(AnnAssign_type, NULL, NULL); +        if (!result) goto failed; +        value = ast2obj_expr(o->v.AnnAssign.target); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) +            goto failed; +        Py_DECREF(value); +        value = ast2obj_expr(o->v.AnnAssign.annotation); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) +            goto failed; +        Py_DECREF(value); +        value = ast2obj_expr(o->v.AnnAssign.value); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) +            goto failed; +        Py_DECREF(value); +        value = ast2obj_int(o->v.AnnAssign.simple); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1) +            goto failed; +        Py_DECREF(value); +        break;      case For_kind:          result = PyType_GenericNew(For_type, NULL, NULL);          if (!result) goto failed; @@ -3164,6 +3322,34 @@ ast2obj_expr(void* _o)              goto failed;          Py_DECREF(value);          break; +    case FormattedValue_kind: +        result = PyType_GenericNew(FormattedValue_type, NULL, NULL); +        if (!result) goto failed; +        value = ast2obj_expr(o->v.FormattedValue.value); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) +            goto failed; +        Py_DECREF(value); +        value = ast2obj_int(o->v.FormattedValue.conversion); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1) +            goto failed; +        Py_DECREF(value); +        value = ast2obj_expr(o->v.FormattedValue.format_spec); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1) +            goto failed; +        Py_DECREF(value); +        break; +    case JoinedStr_kind: +        result = PyType_GenericNew(JoinedStr_type, NULL, NULL); +        if (!result) goto failed; +        value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) +            goto failed; +        Py_DECREF(value); +        break;      case Bytes_kind:          result = PyType_GenericNew(Bytes_type, NULL, NULL);          if (!result) goto failed; @@ -3186,6 +3372,15 @@ ast2obj_expr(void* _o)          result = PyType_GenericNew(Ellipsis_type, NULL, NULL);          if (!result) goto failed;          break; +    case Constant_kind: +        result = PyType_GenericNew(Constant_type, NULL, NULL); +        if (!result) goto failed; +        value = ast2obj_constant(o->v.Constant.value); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) +            goto failed; +        Py_DECREF(value); +        break;      case Attribute_kind:          result = PyType_GenericNew(Attribute_type, NULL, NULL);          if (!result) goto failed; @@ -3531,6 +3726,11 @@ ast2obj_comprehension(void* _o)      if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)          goto failed;      Py_DECREF(value); +    value = ast2obj_int(o->is_async); +    if (!value) goto failed; +    if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1) +        goto failed; +    Py_DECREF(value);      return result;  failed:      Py_XDECREF(value); @@ -4458,6 +4658,64 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (*out == NULL) goto failed;          return 0;      } +    isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type); +    if (isinstance == -1) { +        return 1; +    } +    if (isinstance) { +        expr_ty target; +        expr_ty annotation; +        expr_ty value; +        int simple; + +        if (_PyObject_HasAttrId(obj, &PyId_target)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_target); +            if (tmp == NULL) goto failed; +            res = obj2ast_expr(tmp, &target, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign"); +            return 1; +        } +        if (_PyObject_HasAttrId(obj, &PyId_annotation)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_annotation); +            if (tmp == NULL) goto failed; +            res = obj2ast_expr(tmp, &annotation, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign"); +            return 1; +        } +        if (exists_not_none(obj, &PyId_value)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_value); +            if (tmp == NULL) goto failed; +            res = obj2ast_expr(tmp, &value, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            value = NULL; +        } +        if (_PyObject_HasAttrId(obj, &PyId_simple)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_simple); +            if (tmp == NULL) goto failed; +            res = obj2ast_int(tmp, &simple, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign"); +            return 1; +        } +        *out = AnnAssign(target, annotation, value, simple, lineno, col_offset, +                         arena); +        if (*out == NULL) goto failed; +        return 0; +    }      isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);      if (isinstance == -1) {          return 1; @@ -6205,6 +6463,90 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)          if (*out == NULL) goto failed;          return 0;      } +    isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type); +    if (isinstance == -1) { +        return 1; +    } +    if (isinstance) { +        expr_ty value; +        int conversion; +        expr_ty format_spec; + +        if (_PyObject_HasAttrId(obj, &PyId_value)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_value); +            if (tmp == NULL) goto failed; +            res = obj2ast_expr(tmp, &value, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue"); +            return 1; +        } +        if (exists_not_none(obj, &PyId_conversion)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_conversion); +            if (tmp == NULL) goto failed; +            res = obj2ast_int(tmp, &conversion, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            conversion = 0; +        } +        if (exists_not_none(obj, &PyId_format_spec)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_format_spec); +            if (tmp == NULL) goto failed; +            res = obj2ast_expr(tmp, &format_spec, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            format_spec = NULL; +        } +        *out = FormattedValue(value, conversion, format_spec, lineno, +                              col_offset, arena); +        if (*out == NULL) goto failed; +        return 0; +    } +    isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type); +    if (isinstance == -1) { +        return 1; +    } +    if (isinstance) { +        asdl_seq* values; + +        if (_PyObject_HasAttrId(obj, &PyId_values)) { +            int res; +            Py_ssize_t len; +            Py_ssize_t i; +            tmp = _PyObject_GetAttrId(obj, &PyId_values); +            if (tmp == NULL) goto failed; +            if (!PyList_Check(tmp)) { +                PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); +                goto failed; +            } +            len = PyList_GET_SIZE(tmp); +            values = _Py_asdl_seq_new(len, arena); +            if (values == NULL) goto failed; +            for (i = 0; i < len; i++) { +                expr_ty value; +                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena); +                if (res != 0) goto failed; +                if (len != PyList_GET_SIZE(tmp)) { +                    PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration"); +                    goto failed; +                } +                asdl_seq_SET(values, i, value); +            } +            Py_CLEAR(tmp); +        } else { +            PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr"); +            return 1; +        } +        *out = JoinedStr(values, lineno, col_offset, arena); +        if (*out == NULL) goto failed; +        return 0; +    }      isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);      if (isinstance == -1) {          return 1; @@ -6259,6 +6601,28 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)          if (*out == NULL) goto failed;          return 0;      } +    isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type); +    if (isinstance == -1) { +        return 1; +    } +    if (isinstance) { +        constant value; + +        if (_PyObject_HasAttrId(obj, &PyId_value)) { +            int res; +            tmp = _PyObject_GetAttrId(obj, &PyId_value); +            if (tmp == NULL) goto failed; +            res = obj2ast_constant(tmp, &value, arena); +            if (res != 0) goto failed; +            Py_CLEAR(tmp); +        } else { +            PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant"); +            return 1; +        } +        *out = Constant(value, lineno, col_offset, arena); +        if (*out == NULL) goto failed; +        return 0; +    }      isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);      if (isinstance == -1) {          return 1; @@ -6987,6 +7351,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)      expr_ty target;      expr_ty iter;      asdl_seq* ifs; +    int is_async;      if (_PyObject_HasAttrId(obj, &PyId_target)) {          int res; @@ -7038,7 +7403,18 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)          PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");          return 1;      } -    *out = comprehension(target, iter, ifs, arena); +    if (_PyObject_HasAttrId(obj, &PyId_is_async)) { +        int res; +        tmp = _PyObject_GetAttrId(obj, &PyId_is_async); +        if (tmp == NULL) goto failed; +        res = obj2ast_int(tmp, &is_async, arena); +        if (res != 0) goto failed; +        Py_CLEAR(tmp); +    } else { +        PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension"); +        return 1; +    } +    *out = comprehension(target, iter, ifs, is_async, arena);      return 0;  failed:      Py_XDECREF(tmp); @@ -7502,6 +7878,8 @@ PyInit__ast(void)          NULL;      if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)          return NULL; +    if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0) +        return NULL;      if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;      if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)          return NULL; @@ -7562,12 +7940,18 @@ PyInit__ast(void)      if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;      if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return NULL;      if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return NULL; +    if (PyDict_SetItemString(d, "FormattedValue", +        (PyObject*)FormattedValue_type) < 0) return NULL; +    if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0) +        return NULL;      if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return          NULL;      if (PyDict_SetItemString(d, "NameConstant", (PyObject*)NameConstant_type) <          0) return NULL;      if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)          return NULL; +    if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0) +        return NULL;      if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)          return NULL;      if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0) | 
