Index: Python/pythonrun.c =================================================================== --- Python/pythonrun.c (révision 68329) +++ Python/pythonrun.c (copie de travail) @@ -922,9 +922,17 @@ } /* compute parser flags based on compiler flags */ -#define PARSER_FLAGS(flags) \ - ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ - PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0) +static int PARSER_FLAGS(PyCompilerFlags *flags) +{ + int parser_flags = 0; + if (!flags) + return 0; + if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT) + parser_flags |= PyPARSE_DONT_IMPLY_DEDENT; + if (flags->cf_flags & PyCF_IGNORE_COOKIE) + parser_flags |= PyPARSE_IGNORE_COOKIE; + return parser_flags; +} #if 0 /* Keep an example of flags with future keyword support. */ Index: Python/bltinmodule.c =================================================================== --- Python/bltinmodule.c (révision 68329) +++ Python/bltinmodule.c (copie de travail) @@ -514,12 +514,13 @@ static char * -source_as_string(PyObject *cmd, char *funcname, char *what) +source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf) { char *str; Py_ssize_t size; if (PyUnicode_Check(cmd)) { + cf->cf_flags |= PyCF_IGNORE_COOKIE; cmd = _PyUnicode_AsDefaultEncodedString(cmd, NULL); if (cmd == NULL) return NULL; @@ -611,7 +612,8 @@ return result; } - str = source_as_string(cmd, "compile", "string, bytes, AST or code"); + cf.cf_flags = supplied_flags | PyCF_SOURCE_IS_UTF8; + str = source_as_string(cmd, "compile", "string, bytes, AST or code", &cf); if (str == NULL) return NULL; @@ -723,14 +725,14 @@ return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals); } - str = source_as_string(cmd, "eval", "string, bytes or code"); + cf.cf_flags = PyCF_SOURCE_IS_UTF8; + str = source_as_string(cmd, "eval", "string, bytes or code", &cf); if (str == NULL) return NULL; while (*str == ' ' || *str == '\t') str++; - cf.cf_flags = PyCF_SOURCE_IS_UTF8; (void)PyEval_MergeCompilerFlags(&cf); result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); Py_XDECREF(tmp); @@ -799,12 +801,13 @@ v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals); } else { - char *str = source_as_string(prog, "exec", - "string, bytes or code"); + char *str; PyCompilerFlags cf; + cf.cf_flags = PyCF_SOURCE_IS_UTF8; + str = source_as_string(prog, "exec", + "string, bytes or code", &cf); if (str == NULL) return NULL; - cf.cf_flags = PyCF_SOURCE_IS_UTF8; if (PyEval_MergeCompilerFlags(&cf)) v = PyRun_StringFlags(str, Py_file_input, globals, locals, &cf); Index: Include/parsetok.h =================================================================== --- Include/parsetok.h (révision 68329) +++ Include/parsetok.h (copie de travail) @@ -29,6 +29,8 @@ #define PyPARSE_UNICODE_LITERALS 0x0008 #endif +#define PyPARSE_IGNORE_COOKIE 0x0010 + PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, perrdetail *); PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, Index: Include/pythonrun.h =================================================================== --- Include/pythonrun.h (révision 68329) +++ Include/pythonrun.h (copie de travail) @@ -12,6 +12,7 @@ #define PyCF_SOURCE_IS_UTF8 0x0100 #define PyCF_DONT_IMPLY_DEDENT 0x0200 #define PyCF_ONLY_AST 0x0400 +#define PyCF_IGNORE_COOKIE 0x0800 typedef struct { int cf_flags; /* bitmask of CO_xxx flags relevant to future */ Index: Parser/tokenizer.h =================================================================== --- Parser/tokenizer.h (révision 68329) +++ Parser/tokenizer.h (copie de travail) @@ -60,7 +60,7 @@ const char* str; }; -extern struct tok_state *PyTokenizer_FromString(const char *); +extern struct tok_state *PyTokenizer_FromString(const char *, int ignore_cookie); extern struct tok_state *PyTokenizer_FromFile(FILE *, char*, char *, char *); extern void PyTokenizer_Free(struct tok_state *); Index: Parser/parsetok.c =================================================================== --- Parser/parsetok.c (révision 68329) +++ Parser/parsetok.c (copie de travail) @@ -49,7 +49,8 @@ initerr(err_ret, filename); - if ((tok = PyTokenizer_FromString(s)) == NULL) { + tok = PyTokenizer_FromString(s, *flags & PyPARSE_IGNORE_COOKIE); + if (tok == NULL) { err_ret->error = PyErr_Occurred() ? E_DECODE : E_NOMEM; return NULL; } --- Parser/tokenizer.c.orig 2009-01-05 02:39:56.000000000 +0100 +++ Parser/tokenizer.c 2009-01-05 02:23:07.000000000 +0100 @@ -699,15 +699,28 @@ /* Set up tokenizer for string */ struct tok_state * -PyTokenizer_FromString(const char *str) +PyTokenizer_FromString(const char *str, int ignore_cookie) { struct tok_state *tok = tok_new(); if (tok == NULL) return NULL; - str = (char *)decode_str(str, tok); - if (str == NULL) { - PyTokenizer_Free(tok); - return NULL; + if (ignore_cookie) { + tok->decoding_state = STATE_RAW; + tok->read_coding_spec = 1; + tok->enc = NULL; + tok->str = str; + tok->encoding = (char *)PyMem_MALLOC(6); + if (!tok->encoding) { + PyTokenizer_Free(tok); + return NULL; + } + strcpy(tok->encoding, "utf-8"); + } else { + str = (char *)decode_str(str, tok); + if (str == NULL) { + PyTokenizer_Free(tok); + return NULL; + } } /* XXX: constify members. */