[Patches] [ python-Patches-1184418 ] [ast] fix for 1183468: return/yield in class
SourceForge.net
noreply at sourceforge.net
Thu Jun 2 07:17:39 CEST 2005
Patches item #1184418, was opened at 2005-04-16 22:01
Message generated for change (Comment added) made by nascheme
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1184418&group_id=5470
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: AST
>Status: Closed
>Resolution: Rejected
Priority: 5
Submitted By: logistix (logistix)
Assigned to: Neil Schemenauer (nascheme)
Summary: [ast] fix for 1183468: return/yield in class
Initial Comment:
I've got a patch that may or may not be acceptable. I've
added a 'u_flags' field to the compiler_unit structure to
track what sort of block we are in.
This doesn't seem much different that it is in the current
compiler, there is a boolean field called 'isfunction' that
checks for this.
There is a 'block_type' tracked by the symbol table
entries, but I can't figure out how to harvest it.
Fell free to accept or reject.
----------------------------------------------------------------------
>Comment By: Neil Schemenauer (nascheme)
Date: 2005-06-02 05:17
Message:
Logged In: YES
user_id=35752
Using the block type from the symbol table seems like a
better solution. I checked in a fix.
----------------------------------------------------------------------
Comment By: logistix (logistix)
Date: 2005-04-23 19:12
Message:
Logged In: YES
user_id=699438
Sourceforge finally let me upload a real patch file.
----------------------------------------------------------------------
Comment By: logistix (logistix)
Date: 2005-04-16 22:04
Message:
Logged In: YES
user_id=699438
Well, the patch attachment is failing due to a sf error with
problems writing to an 'ArticleFile'. I'll try again later. Here it
is in text for the curious:
Index: python/newcompile.c
=============================================
======================
RCS
file: /cvsroot/python/python/dist/src/Python/Attic/newcompile.
c,v
retrieving revision 1.1.2.107
diff -u -r1.1.2.107 newcompile.c
--- python/newcompile.c 15 Apr 2005 01:49:23 -0000
1.1.2.107
+++ python/newcompile.c 16 Apr 2005 21:47:22 -0000
@@ -104,6 +104,13 @@
/* The following items change on entry and exit of code
blocks.
They must be saved and restored when returning to a
block.
*/
+
+#define UNIT_SCOPE_MODULE 1
+#define UNIT_SCOPE_CLASS 2
+#define UNIT_SCOPE_FUNCTION 4
+#define UNIT_SCOPE_LAMBDA 8
+#define UNIT_SCOPE_GENEXP 16
+
struct compiler_unit {
PySTEntryObject *u_ste;
@@ -132,6 +139,8 @@
int u_lineno; /* the lineno for the current stmt */
bool u_lineno_set; /* boolean to indicate whether
instr
has been generated
with current lineno */
+
+ unsigned int u_flags; /* only tracks type now */
};
struct compiler {
@@ -159,7 +168,7 @@
int a_lineno_off; /* bytecode offset of last lineno
*/
};
-static int compiler_enter_scope(struct compiler *, identifier,
void *, int);
+static int compiler_enter_scope(struct compiler *, identifier,
void *, int, unsigned int);
static void compiler_free(struct compiler *);
static basicblock *compiler_new_block(struct compiler *);
static int compiler_next_instr(struct compiler *, basicblock *);
@@ -568,7 +577,7 @@
static int
compiler_enter_scope(struct compiler *c, identifier name,
void *key,
- int lineno)
+ int lineno, unsigned int flags)
{
struct compiler_unit *u;
@@ -600,6 +609,8 @@
u->u_private = NULL;
+ u->u_flags = flags;
+
/* A little debugging output */
compiler_display_symbols(name, u->u_ste-
>ste_symbols);
@@ -1252,7 +1263,7 @@
if (!module)
return NULL;
}
- if (!compiler_enter_scope(c, module, mod, 1))
+ if (!compiler_enter_scope(c, module, mod, 1,
UNIT_SCOPE_MODULE))
return NULL;
switch (mod->kind) {
case Module_kind:
@@ -1396,7 +1407,7 @@
if (args->defaults)
VISIT_SEQ(c, expr, args->defaults);
if (!compiler_enter_scope(c, s-
>v.FunctionDef.name, (void *)s,
- s->lineno))
+ s-
>lineno,UNIT_SCOPE_FUNCTION))
return 0;
st = asdl_seq_GET(s->v.FunctionDef.body, 0);
@@ -1461,7 +1472,7 @@
VISIT_SEQ(c, expr, s-
>v.ClassDef.bases);
ADDOP_I(c, BUILD_TUPLE, n);
if (!compiler_enter_scope(c, s->v.ClassDef.name,
(void *)s,
- s->lineno))
+ s-
>lineno,UNIT_SCOPE_CLASS))
return 0;
c->u->u_private = s->v.ClassDef.name;
Py_INCREF(c->u->u_private);
@@ -1511,7 +1522,7 @@
if (args->defaults)
VISIT_SEQ(c, expr, args->defaults);
- if (!compiler_enter_scope(c, name, (void *)e, c->u-
>u_lineno))
+ if (!compiler_enter_scope(c, name, (void *)e, c->u-
>u_lineno,UNIT_SCOPE_LAMBDA))
return 0;
c->u->u_argcount = asdl_seq_LEN(args->args);
VISIT(c, expr, e->v.Lambda.body);
@@ -1992,7 +2003,7 @@
case ClassDef_kind:
return compiler_class(c, s);
case Return_kind:
- if (c->c_nestlevel <= 1)
+ if (!(c->u->u_flags & UNIT_SCOPE_FUNCTION))
return compiler_error(c, "'return' outside
function");
if (s->v.Return.value) {
if (c->u->u_ste-
>ste_generator) {
@@ -2006,7 +2017,7 @@
ADDOP(c, RETURN_VALUE);
break;
case Yield_kind:
- if (c->c_nestlevel <= 1)
+ if (!(c->u->u_flags & UNIT_SCOPE_FUNCTION))
return compiler_error(c, "'yield' outside
function");
for (i = 0; i < c->u->u_nfblocks; i++) {
if (c->u->u_fblock[i].fb_type
== FINALLY_TRY)
@@ -2650,7 +2661,7 @@
if (!name)
return 0;
- if (!compiler_enter_scope(c, name, (void *)e, c->u-
>u_lineno))
+ if (!compiler_enter_scope(c, name, (void *)e, c->u-
>u_lineno,UNIT_SCOPE_GENEXP))
return 0;
compiler_genexp_generator(c, e-
>v.GeneratorExp.generators, 0,
e-
>v.GeneratorExp.elt);
Index: lib/test/test_grammar.py
=============================================
======================
RCS
file: /cvsroot/python/python/dist/src/Lib/test/test_grammar.py,v
retrieving revision 1.40.8.3
diff -u -r1.40.8.3 test_grammar.py
--- lib/test/test_grammar.py 7 Jan 2005 06:59:09 -0000
1.40.8.3
+++ lib/test/test_grammar.py 16 Apr 2005 21:51:39 -0000
@@ -413,6 +413,7 @@
def g2(): return 1
g1()
x = g2()
+check_syntax("class foo:return 1")
print 'raise_stmt' # 'raise' test [',' test]
try: raise RuntimeError, 'just testing'
@@ -789,3 +790,7 @@
x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x))
x = 5; t = True;
verify([(i,j) for i in range(10) for j in range(5)] == list(g))
+
+print 'yield_stmt'
+check_syntax("class foo:yield 1")
+
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1184418&group_id=5470
More information about the Patches
mailing list