Remove int tag from ExprLitObject

This commit is contained in:
John J. Camilleri
2021-09-09 20:42:01 +02:00
parent 5eade6f111
commit 8bc171d7a1
3 changed files with 9 additions and 20 deletions

View File

@@ -129,16 +129,17 @@ static PyObject *
ExprLit_richcompare(ExprLitObject *t1, ExprLitObject *t2, int op) ExprLit_richcompare(ExprLitObject *t1, ExprLitObject *t2, int op)
{ {
bool same = false; bool same = false;
if (t1->type != t2->type) goto done; if (PyLong_Check(t1->value)) {
if (!PyLong_Check(t2->value)) goto done;
if (t1->type == 0) {
int o1, o2; int o1, o2;
int l1 = PyLong_AsLongAndOverflow(t1->value, &o1); int l1 = PyLong_AsLongAndOverflow(t1->value, &o1);
int l2 = PyLong_AsLongAndOverflow(t2->value, &o2); int l2 = PyLong_AsLongAndOverflow(t2->value, &o2);
if (!(l1 == l2 && o1 == o2)) goto done; if (!(l1 == l2 && o1 == o2)) goto done;
} else if (t1->type == 1) { } else if (PyFloat_Check(t1->value)) {
if (!PyFloat_Check(t2->value)) goto done;
if (PyFloat_AsDouble(t1->value) != PyFloat_AsDouble(t2->value)) goto done; if (PyFloat_AsDouble(t1->value) != PyFloat_AsDouble(t2->value)) goto done;
} else if (t1->type == 2) { } else if (PyString_Check(t1->value)) {
if (!PyString_Check(t2->value)) goto done;
if (PyString_Compare(t1->value, t2->value) != 0) goto done; if (PyString_Compare(t1->value, t2->value) != 0) goto done;
} else { } else {
PyErr_SetString(PyExc_TypeError, "unknown literal type"); PyErr_SetString(PyExc_TypeError, "unknown literal type");

View File

@@ -23,8 +23,7 @@ typedef struct {
typedef struct { typedef struct {
PyObject_HEAD PyObject_HEAD
int type; // 0 = int, 1 = float, 2 = str PyObject *value;
PyObject *value; // depends on type
} ExprLitObject; } ExprLitObject;
extern PyTypeObject pgf_ExprType; extern PyTypeObject pgf_ExprType;

View File

@@ -28,21 +28,8 @@ PgfExpr eapp(PgfUnmarshaller *this, PgfExpr fun, PgfExpr arg)
PgfExpr elit(PgfUnmarshaller *this, PgfLiteral lit) PgfExpr elit(PgfUnmarshaller *this, PgfLiteral lit)
{ {
ExprLitObject *pyexpr = (ExprLitObject *)pgf_ExprLitType.tp_alloc(&pgf_ExprLitType, 0); ExprLitObject *pyexpr = (ExprLitObject *)pgf_ExprLitType.tp_alloc(&pgf_ExprLitType, 0);
PyObject *pyobj = (PyObject *)lit; PyObject *pyobj = (PyObject *)lit;
pyexpr->value = pyobj; pyexpr->value = pyobj;
if (PyLong_Check(pyobj)) {
pyexpr->type = 0;
} else if (PyFloat_Check(pyobj)) {
pyexpr->type = 1;
} else if (PyString_Check(pyobj)) {
pyexpr->type = 2;
} else {
PyErr_SetString(PyExc_TypeError, "unable to unmarshall literal");
return 0;
}
Py_INCREF(pyobj); Py_INCREF(pyobj);
return (PgfExpr) pyexpr; return (PgfExpr) pyexpr;
} }
@@ -208,6 +195,8 @@ object match_expr(PgfUnmarshaller *u, PgfExpr expr)
object match_type(PgfUnmarshaller *u, PgfType ty) object match_type(PgfUnmarshaller *u, PgfType ty)
{ {
// PySys_WriteStdout(">match_type<\n");
TypeObject *type = (TypeObject *)ty; TypeObject *type = (TypeObject *)ty;
// PySys_WriteStdout(">%s<\n", PyUnicode_AS_DATA(type->cat)); // PySys_WriteStdout(">%s<\n", PyUnicode_AS_DATA(type->cat));