[Python-checkins] python/dist/src/Python ast.c, 1.1.2.65, 1.1.2.66 newcompile.c, 1.1.2.115, 1.1.2.116

jhylton@users.sourceforge.net jhylton at users.sourceforge.net
Wed Oct 12 05:18:11 CEST 2005


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12337/Python

Modified Files:
      Tag: ast-branch
	ast.c newcompile.c 
Log Message:
Add line numbers to expressions.

The line numbers aren't used yet, but should make it possible to
generate correct line numbers (e.g. co_lnotab, co_firstlineno).
Several tests fails because of the incorrect line numbers currently
generated.



Index: ast.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/ast.c,v
retrieving revision 1.1.2.65
retrieving revision 1.1.2.66
diff -u -d -r1.1.2.65 -r1.1.2.66
--- ast.c	29 Sep 2005 19:27:58 -0000	1.1.2.65
+++ ast.c	12 Oct 2005 03:18:07 -0000	1.1.2.66
@@ -338,7 +338,8 @@
 /* Set the context ctx for expr_ty e returning 0 on success, -1 on error.
 
    Only sets context for expr kinds that "can appear in assignment context"
-   (according to ../Parser/Python.asdl)
+   (according to ../Parser/Python.asdl).  For other expr kinds, it sets
+   an appropriate syntax error and returns false.
 
    If e is a sequential type, items in sequence will also have their context
    set.
@@ -373,6 +374,8 @@
 	    s = e->v.List.elts;
 	    break;
         case Tuple_kind:
+            if (asdl_seq_LEN(e->v.Tuple.elts) == 0) 
+                return ast_error(n, "can't assign to ()");
 	    e->v.Tuple.ctx = ctx;
 	    s = e->v.Tuple.elts;
 	    break;
@@ -384,6 +387,11 @@
 	    else
 		return ast_error(n, "unexpected operation on function call");
 	    break;
+        case BinOp_kind:
+            return ast_error(n, "can't assign to operator");
+        case GeneratorExp_kind:
+            return ast_error(n, "assignment to generator expression "
+                             "not possible");
         default:
 	    return ast_error(n, "unexpected node in assignment");
 	    break;
@@ -533,7 +541,7 @@
 			ast_error(child, "assignment to None");
 			return NULL;
 		}
-            arg = Name(NEW_IDENTIFIER(child), Store);
+            arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child));
 	}
         else
             arg = compiler_complex_args(CHILD(CHILD(n, 2*i), 1));
@@ -541,7 +549,7 @@
         asdl_seq_SET(args, i, arg);
     }
 
-    result = Tuple(args, Store);
+    result = Tuple(args, Store, LINENO(n));
     set_context(result, Store, n);
     return result;
 }
@@ -620,8 +628,9 @@
 			    goto error;
 		    }
                     /* XXX check return value of Name call */
-                    asdl_seq_APPEND(args, Name(NEW_IDENTIFIER(CHILD(ch, 0)),
-                                               Param));
+                    asdl_seq_APPEND(args, 
+				    Name(NEW_IDENTIFIER(CHILD(ch, 0)),
+					 Param, LINENO(ch)));
 		}
                 i += 2; /* the name and the comma */
                 break;
@@ -672,7 +681,7 @@
     id = NEW_IDENTIFIER(CHILD(n, 0));
     if (!id)
         goto error;
-    e = Name(id, Load);
+    e = Name(id, Load, LINENO(n));
     if (!e)
 	goto error;
     id = NULL;
@@ -681,7 +690,7 @@
         id = NEW_IDENTIFIER(CHILD(n, i));
 	if (!id)
 	    goto error;
-	attrib = Attribute(e, id, Load);
+	attrib = Attribute(e, id, Load, LINENO(CHILD(n, i)));
 	if (!attrib)
 	    goto error;
 	e = attrib;
@@ -720,7 +729,7 @@
 	name_expr = NULL;
     }
     else if (NCH(n) == 5) { /* Call with no arguments */
-	d = Call(name_expr, NULL, NULL, NULL, NULL);
+	d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n));
 	if (!d)
 	    goto error;
 	name_expr = NULL;
@@ -827,8 +836,6 @@
         expression = ast_for_expr(c, CHILD(n, 2));
         if (!expression)
             return NULL;
-
-	return Lambda(args, expression);
     }
     else {
         args = ast_for_arguments(c, CHILD(n, 1));
@@ -837,9 +844,9 @@
         expression = ast_for_expr(c, CHILD(n, 3));
         if (!expression)
             return NULL;
-            
-	return Lambda(args, expression);
     }
+
+    return Lambda(args, expression, LINENO(n));
 }
 
 /* Count the number of 'for' loop in a list comprehension.
@@ -958,7 +965,7 @@
 	if (asdl_seq_LEN(t) == 1)
 	    lc = comprehension(asdl_seq_GET(t, 0), expression, NULL);
 	else
-	    lc = comprehension(Tuple(t, Store), expression, NULL);
+	    lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL);
 
         if (!lc) {
             asdl_seq_free(listcomps);
@@ -1003,7 +1010,7 @@
 	asdl_seq_APPEND(listcomps, lc);
     }
 
-    return ListComp(elt, listcomps);
+    return ListComp(elt, listcomps, LINENO(n));
 }
 
 /*
@@ -1117,9 +1124,11 @@
 		}
 		
 		if (asdl_seq_LEN(t) == 1)
-			ge = comprehension(asdl_seq_GET(t, 0), expression, NULL);
+			ge = comprehension(asdl_seq_GET(t, 0), expression,
+					   NULL);
 		else
-			ge = comprehension(Tuple(t, Store), expression, NULL);
+			ge = comprehension(Tuple(t, Store, LINENO(ch)),
+					   expression, NULL);
 		
 		if (!ge) {
 			asdl_seq_free(genexps);
@@ -1148,11 +1157,11 @@
 		
 			for (j = 0; j < n_ifs; j++) {
 				REQ(ch, gen_iter);
-			
 				ch = CHILD(ch, 0);
 				REQ(ch, gen_if);
 			
-				asdl_seq_APPEND(ifs, ast_for_expr(c, CHILD(ch, 1)));
+				asdl_seq_APPEND(ifs, 
+						ast_for_expr(c, CHILD(ch, 1)));
 				if (NCH(ch) == 3)
 					ch = CHILD(ch, 2);
 			}
@@ -1164,7 +1173,7 @@
 		asdl_seq_APPEND(genexps, ge);
 	}
 	
-	return GeneratorExp(elt, genexps);
+	return GeneratorExp(elt, genexps, LINENO(n));
 }
 
 static expr_ty
@@ -1179,14 +1188,14 @@
 		case NAME:
 			/* All names start in Load context, but may later be
 			   changed. */
-			return Name(NEW_IDENTIFIER(ch), Load);
+			return Name(NEW_IDENTIFIER(ch), Load, LINENO(n));
 		case STRING: {
 			PyObject *str = parsestrplus(c, n);
 
 			if (!str)
 				return NULL;
 
-			return Str(str);
+			return Str(str, LINENO(n));
 		}
 		case NUMBER: {
 			PyObject *pynum = parsenumber(STR(ch));
@@ -1194,13 +1203,13 @@
 			if (!pynum)
 				return NULL;
                 
-			return Num(pynum);
+			return Num(pynum, LINENO(n));
 		}
 		case LPAR: /* some parenthesized expressions */
 			ch = CHILD(n, 1);
 
 			if (TYPE(ch) == RPAR)
-				return Tuple(NULL, Load);
+				return Tuple(NULL, Load, LINENO(n));
 
 			if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
 				return ast_for_genexp(c, ch);
@@ -1210,7 +1219,7 @@
 			ch = CHILD(n, 1);
 
 			if (TYPE(ch) == RSQB)
-				return List(NULL, Load);
+				return List(NULL, Load, LINENO(n));
 
 			REQ(ch, listmaker);
 			if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
@@ -1219,7 +1228,7 @@
 				if (!elts)
 					return NULL;
 
-				return List(elts, Load);
+				return List(elts, Load, LINENO(n));
 			}
 			else
 				return ast_for_listcomp(c, ch);
@@ -1255,7 +1264,7 @@
 
 				asdl_seq_SET(values, i / 4, expression);
 			}
-			return Dict(keys, values);
+			return Dict(keys, values, LINENO(n));
 		}
 		case BACKQUOTE: { /* repr */
 			expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
@@ -1263,7 +1272,7 @@
 			if (!expression)
 				return NULL;
 
-			return Repr(expression);
+			return Repr(expression, LINENO(n));
 		}
 		default:
 			PyErr_Format(PyExc_Exception, "unhandled atom %d",
@@ -1367,15 +1376,16 @@
         if (!operator)
             return NULL;
 
-	result = BinOp(expr1, operator, expr2);
+	result = BinOp(expr1, operator, expr2, LINENO(n));
 	if (!result)
             return NULL;
 
 	nops = (NCH(n) - 1) / 2;
 	for (i = 1; i < nops; i++) {
 		expr_ty tmp_result, tmp;
+		const node* next_oper = CHILD(n, i * 2 + 1);
 
-                operator = get_operator(CHILD(n, i * 2 + 1));
+		operator = get_operator(next_oper);
                 if (!operator)
                     return NULL;
 
@@ -1383,7 +1393,8 @@
                 if (!tmp)
                     return NULL;
 
-                tmp_result = BinOp(result, operator, tmp);
+                tmp_result = BinOp(result, operator, tmp, 
+				   LINENO(next_oper));
 		if (!tmp) 
 			return NULL;
 		result = tmp_result;
@@ -1436,10 +1447,10 @@
                 asdl_seq_SET(seq, i / 2, e);
             }
             if (!strcmp(STR(CHILD(n, 1)), "and"))
-                return BoolOp(And, seq);
+                return BoolOp(And, seq, LINENO(n));
             else {
                 assert(!strcmp(STR(CHILD(n, 1)), "or"));
-                return BoolOp(Or, seq);
+                return BoolOp(Or, seq, LINENO(n));
             }
             break;
         case not_test:
@@ -1452,7 +1463,7 @@
                 if (!expression)
                     return NULL;
 
-                return UnaryOp(Not, expression);
+                return UnaryOp(Not, expression, LINENO(n));
             }
         case comparison:
             if (NCH(n) == 1) {
@@ -1489,7 +1500,7 @@
                 if (!expression)
                     return NULL;
                     
-                return Compare(expression, ops, cmps);
+                return Compare(expression, ops, cmps, LINENO(n));
             }
             break;
 
@@ -1522,11 +1533,11 @@
 
             switch (TYPE(CHILD(n, 0))) {
                 case PLUS:
-                    return UnaryOp(UAdd, expression);
+                    return UnaryOp(UAdd, expression, LINENO(n));
                 case MINUS:
-                    return UnaryOp(USub, expression);
+                    return UnaryOp(USub, expression, LINENO(n));
                 case TILDE:
-                    return UnaryOp(Invert, expression);
+                    return UnaryOp(Invert, expression, LINENO(n));
             }
             break;
         }
@@ -1548,7 +1559,7 @@
                     break;
                 if (TYPE(CHILD(ch, 0)) == LPAR) {
                     if (NCH(ch) == 2)
-                        new = Call(new, NULL, NULL, NULL, NULL);
+                        new = Call(new, NULL, NULL, NULL, NULL, LINENO(ch));
                     else
                         new = ast_for_call(c, CHILD(ch, 1), new);
 
@@ -1567,7 +1578,7 @@
                             return NULL;
 			}
 
-                        new = Subscript(e, slc, Load);
+                        new = Subscript(e, slc, Load, LINENO(ch));
                         if (!new) {
 		            /* XXX free(e); */
 		            /* XXX free(slc); */
@@ -1592,7 +1603,7 @@
 			    }
                             asdl_seq_SET(slices, j / 2, slc);
                         }
-                        new = Subscript(e, ExtSlice(slices), Load);
+                        new = Subscript(e, ExtSlice(slices), Load, LINENO(ch));
                         if (!new) {
 		            /* XXX free(e); */
 		            asdl_seq_free(slices);
@@ -1602,7 +1613,8 @@
                 }
                 else {
                     assert(TYPE(CHILD(ch, 0)) == DOT);
-                    new = Attribute(e, NEW_IDENTIFIER(CHILD(ch, 1)), Load);
+                    new = Attribute(e, NEW_IDENTIFIER(CHILD(ch, 1)), Load,
+				    LINENO(ch));
                     if (!new) {
 		        /* XXX free(e); */
                         return NULL;
@@ -1616,7 +1628,7 @@
 		    /* XXX free(e); */
                     return NULL;
 		}
-                return BinOp(e, Pow, f);
+                return BinOp(e, Pow, f, LINENO(n));
             }
             return e;
         }
@@ -1659,9 +1671,16 @@
 	}
     }
     if (ngens > 1 || (ngens && (nargs || nkeywords))) {
-        ast_error(n, "Generator expression must be parenthesised if not sole argument");
+        ast_error(n, "Generator expression must be parenthesised "
+		  "if not sole argument");
 	return NULL;
     }
+
+    if (nargs + nkeywords + ngens > 255) {
+      ast_error(n, "more than 255 arguments");
+      return NULL;
+    }
+
     args = asdl_seq_new(nargs + ngens);
     if (!args)
         goto error;
@@ -1727,8 +1746,7 @@
 	}
     }
 
-    /* XXX syntax error if more than 255 arguments */
-    return Call(func, args, keywords, vararg, kwarg);
+    return Call(func, args, keywords, vararg, kwarg, LINENO(n));
 
  error:
     if (args)
@@ -1751,7 +1769,7 @@
         if (!tmp)
             return NULL;
 
-	return Tuple(tmp, Load);
+	return Tuple(tmp, Load, LINENO(n));
     }
 }
 
@@ -1816,26 +1834,20 @@
 	for (i = 0; i < NCH(n) - 2; i += 2) {
 	    expr_ty e = ast_for_testlist(c, CHILD(n, i));
 
-            if (e->kind == GeneratorExp_kind) {
-              ast_error(CHILD(n, i),
-                        "assignment to generator expression not possible");
-              asdl_seq_free(targets);
-              return NULL;
-            }
-
 	    /* set context to assign */
-	    if (!e) {
-		asdl_seq_free(targets);
-		return NULL;
-	    }
-	    if (!set_context(e, Store, CHILD(n, i))) {
-                asdl_seq_free(targets);
-                return NULL;
-            }
+	    if (!e) 
+	      goto error;
+
+	    if (!set_context(e, Store, CHILD(n, i))) 
+	      goto error;
+
 	    asdl_seq_SET(targets, i / 2, e);
 	}
         expression = ast_for_testlist(c, CHILD(n, NCH(n) - 1));
 	return Assign(targets, expression, LINENO(n));
+    error:
+        asdl_seq_free(targets);
+        return NULL;
     }
     return NULL;
 }
@@ -2499,7 +2511,7 @@
 	asdl_seq_free(_target);
     }
     else
-	target = Tuple(_target, Store);
+	target = Tuple(_target, Store, LINENO(n));
 
     expression = ast_for_testlist(c, CHILD(n, 3));
     if (!expression)

Index: newcompile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/newcompile.c,v
retrieving revision 1.1.2.115
retrieving revision 1.1.2.116
diff -u -d -r1.1.2.115 -r1.1.2.116
--- newcompile.c	11 Oct 2005 22:54:03 -0000	1.1.2.115
+++ newcompile.c	12 Oct 2005 03:18:07 -0000	1.1.2.116
@@ -3463,7 +3463,7 @@
 	switch (e->kind) {
 	case Attribute_kind:
 		auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
-				 AugLoad);
+				 AugLoad, e->lineno);
                 if (auge == NULL)
                     return 0;
 		VISIT(c, expr, auge);
@@ -3475,7 +3475,7 @@
 		break;
 	case Subscript_kind:
 		auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
-				 AugLoad);
+				 AugLoad, e->lineno);
                 if (auge == NULL)
                     return 0;
 		VISIT(c, expr, auge);



More information about the Python-checkins mailing list