diff --git a/Include/Python-ast.h b/Include/Python-ast.h index abc5bcba13b..9609141c046 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -34,6 +34,7 @@ typedef struct _keyword *keyword_ty; typedef struct _alias *alias_ty; + struct _mod { enum { Module_kind=1, Interactive_kind=2, Expression_kind=3, Suite_kind=4 } kind; @@ -326,6 +327,7 @@ struct _alias { identifier asname; }; + mod_ty Module(asdl_seq * body); mod_ty Interactive(asdl_seq * body); mod_ty Expression(expr_ty body); @@ -388,6 +390,7 @@ arguments_ty arguments(asdl_seq * args, identifier vararg, identifier kwarg, asdl_seq * defaults); keyword_ty keyword(identifier arg, expr_ty value); alias_ty alias(identifier name, identifier asname); + void free_mod(mod_ty); void free_stmt(stmt_ty); void free_expr(expr_ty); @@ -402,3 +405,4 @@ void free_excepthandler(excepthandler_ty); void free_arguments(arguments_ty); void free_keyword(keyword_ty); void free_alias(alias_ty); + diff --git a/Include/asdl.h b/Include/asdl.h index 8ad46faf7d4..cf059672a7c 100644 --- a/Include/asdl.h +++ b/Include/asdl.h @@ -44,11 +44,4 @@ void asdl_seq_free(asdl_seq *); #endif #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) -/* Routines to marshal the basic types. */ -int marshal_write_int(PyObject **, int *, int); -int marshal_write_bool(PyObject **, int *, bool); -int marshal_write_identifier(PyObject **, int *, identifier); -int marshal_write_string(PyObject **, int *, string); -int marshal_write_object(PyObject **, int *, object); - #endif /* !Py_ASDL_H */ diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index fa71c23b73a..d056c363aff 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -367,7 +367,12 @@ def has_sequence(types, doing_specialization): class StaticVisitor(PickleVisitor): - '''Very simple, always emit this static code''' + CODE = '''Very simple, always emit this static code. Overide CODE''' + + def visit(self, object): + self.emit(self.CODE, 0, reflow=False) + +class FreeUtilVisitor(StaticVisitor): CODE = '''static void free_seq_exprs(asdl_seq *seq) @@ -390,10 +395,6 @@ free_seq_stmts(asdl_seq *seq) } ''' - def visit(self, object): - self.emit(self.CODE, 0, reflow=False) - - class FreeVisitor(PickleVisitor): def func_begin(self, name, has_seq): @@ -483,6 +484,77 @@ class FreeVisitor(PickleVisitor): self.emit("free_%s((%s)%s);" % (field.type, ctype, value), depth) +class MarshalUtilVisitor(StaticVisitor): + + CODE = ''' +#define CHECKSIZE(BUF, OFF, MIN) { \\ + int need = *(OFF) + MIN; \\ + if (need >= PyString_GET_SIZE(*(BUF))) { \\ + int newsize = PyString_GET_SIZE(*(BUF)) * 2; \\ + if (newsize < need) \\ + newsize = need; \\ + if (_PyString_Resize((BUF), newsize) < 0) \\ + return 0; \\ + } \\ +} + +static int +marshal_write_int(PyObject **buf, int *offset, int x) +{ + char *s; + + CHECKSIZE(buf, offset, 4) + s = PyString_AS_STRING(*buf) + (*offset); + s[0] = (x & 0xff); + s[1] = (x >> 8) & 0xff; + s[2] = (x >> 16) & 0xff; + s[3] = (x >> 24) & 0xff; + *offset += 4; + return 1; +} + +static int +marshal_write_bool(PyObject **buf, int *offset, bool b) +{ + if (b) + marshal_write_int(buf, offset, 1); + else + marshal_write_int(buf, offset, 0); + return 1; +} + +static int +marshal_write_identifier(PyObject **buf, int *offset, identifier id) +{ + int l = PyString_GET_SIZE(id); + marshal_write_int(buf, offset, l); + CHECKSIZE(buf, offset, l); + memcpy(PyString_AS_STRING(*buf) + *offset, + PyString_AS_STRING(id), l); + *offset += l; + return 1; +} + +static int +marshal_write_string(PyObject **buf, int *offset, string s) +{ + int len = PyString_GET_SIZE(s); + marshal_write_int(buf, offset, len); + CHECKSIZE(buf, offset, len); + memcpy(PyString_AS_STRING(*buf) + *offset, + PyString_AS_STRING(s), len); + *offset += len; + return 1; +} + +static int +marshal_write_object(PyObject **buf, int *offset, object s) +{ + /* XXX */ + return 0; +} +''' + class MarshalFunctionVisitor(PickleVisitor): def func_begin(self, name, has_seq): @@ -563,6 +635,7 @@ class ChainOfVisitors: def visit(self, object): for v in self.visitors: v.visit(object) + v.emit("", 0) def main(srcfile): auto_gen_msg = '/* File automatically generated by %s */\n' % sys.argv[0] @@ -595,8 +668,9 @@ def main(srcfile): print >> f v = ChainOfVisitors(MarshalPrototypeVisitor(f), FunctionVisitor(f), - StaticVisitor(f), + FreeUtilVisitor(f), FreeVisitor(f), + MarshalUtilVisitor(f), MarshalFunctionVisitor(f), ) v.visit(mod) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 677705c6430..14040adc53b 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -17,6 +17,7 @@ static int marshal_write_excepthandler(PyObject **, int *, excepthandler_ty); static int marshal_write_arguments(PyObject **, int *, arguments_ty); static int marshal_write_keyword(PyObject **, int *, keyword_ty); static int marshal_write_alias(PyObject **, int *, alias_ty); + mod_ty Module(asdl_seq * body) { @@ -1087,6 +1088,7 @@ alias(identifier name, identifier asname) return p; } + static void free_seq_exprs(asdl_seq *seq) { @@ -1107,6 +1109,7 @@ free_seq_stmts(asdl_seq *seq) asdl_seq_free(seq); } + void free_mod(mod_ty o) { @@ -1533,6 +1536,76 @@ free_alias(alias_ty o) free(o); } + + +#define CHECKSIZE(BUF, OFF, MIN) { \ + int need = *(OFF) + MIN; \ + if (need >= PyString_GET_SIZE(*(BUF))) { \ + int newsize = PyString_GET_SIZE(*(BUF)) * 2; \ + if (newsize < need) \ + newsize = need; \ + if (_PyString_Resize((BUF), newsize) < 0) \ + return 0; \ + } \ +} + +static int +marshal_write_int(PyObject **buf, int *offset, int x) +{ + char *s; + + CHECKSIZE(buf, offset, 4) + s = PyString_AS_STRING(*buf) + (*offset); + s[0] = (x & 0xff); + s[1] = (x >> 8) & 0xff; + s[2] = (x >> 16) & 0xff; + s[3] = (x >> 24) & 0xff; + *offset += 4; + return 1; +} + +static int +marshal_write_bool(PyObject **buf, int *offset, bool b) +{ + if (b) + marshal_write_int(buf, offset, 1); + else + marshal_write_int(buf, offset, 0); + return 1; +} + +static int +marshal_write_identifier(PyObject **buf, int *offset, identifier id) +{ + int l = PyString_GET_SIZE(id); + marshal_write_int(buf, offset, l); + CHECKSIZE(buf, offset, l); + memcpy(PyString_AS_STRING(*buf) + *offset, + PyString_AS_STRING(id), l); + *offset += l; + return 1; +} + +static int +marshal_write_string(PyObject **buf, int *offset, string s) +{ + int len = PyString_GET_SIZE(s); + marshal_write_int(buf, offset, len); + CHECKSIZE(buf, offset, len); + memcpy(PyString_AS_STRING(*buf) + *offset, + PyString_AS_STRING(s), len); + *offset += len; + return 1; +} + +static int +marshal_write_object(PyObject **buf, int *offset, object s) +{ + /* XXX */ + return 0; +} + + static int marshal_write_mod(PyObject **buf, int *off, mod_ty o) { @@ -2286,3 +2359,4 @@ marshal_write_alias(PyObject **buf, int *off, alias_ty o) return 1; } + diff --git a/Python/asdl.c b/Python/asdl.c index bb298575c00..efd345e104c 100644 --- a/Python/asdl.c +++ b/Python/asdl.c @@ -24,69 +24,3 @@ asdl_seq_free(asdl_seq *seq) PyObject_Free(seq); } -#define CHECKSIZE(BUF, OFF, MIN) { \ - int need = *(OFF) + MIN; \ - if (need >= PyString_GET_SIZE(*(BUF))) { \ - int newsize = PyString_GET_SIZE(*(BUF)) * 2; \ - if (newsize < need) \ - newsize = need; \ - if (_PyString_Resize((BUF), newsize) < 0) \ - return 0; \ - } \ -} - -int -marshal_write_int(PyObject **buf, int *offset, int x) -{ - char *s; - - CHECKSIZE(buf, offset, 4) - s = PyString_AS_STRING(*buf) + (*offset); - s[0] = (x & 0xff); - s[1] = (x >> 8) & 0xff; - s[2] = (x >> 16) & 0xff; - s[3] = (x >> 24) & 0xff; - *offset += 4; - return 1; -} - -int -marshal_write_bool(PyObject **buf, int *offset, bool b) -{ - if (b) - marshal_write_int(buf, offset, 1); - else - marshal_write_int(buf, offset, 0); - return 1; -} - -int -marshal_write_identifier(PyObject **buf, int *offset, identifier id) -{ - int l = PyString_GET_SIZE(id); - marshal_write_int(buf, offset, l); - CHECKSIZE(buf, offset, l); - memcpy(PyString_AS_STRING(*buf) + *offset, - PyString_AS_STRING(id), l); - *offset += l; - return 1; -} - -int -marshal_write_string(PyObject **buf, int *offset, string s) -{ - int len = PyString_GET_SIZE(s); - marshal_write_int(buf, offset, len); - CHECKSIZE(buf, offset, len); - memcpy(PyString_AS_STRING(*buf) + *offset, - PyString_AS_STRING(s), len); - *offset += len; - return 1; -} - -int -marshal_write_object(PyObject **buf, int *offset, object s) -{ - /* XXX */ - return 0; -}