comparison Python/sysmodule.c @ 61467:f197407bdba2 3.1

Recorded merge of revisions 81032 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r81032 | antoine.pitrou | 2010-05-09 17:52:27 +0200 (dim., 09 mai 2010) | 9 lines Recorded merge of revisions 81029 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81029 | antoine.pitrou | 2010-05-09 16:46:46 +0200 (dim., 09 mai 2010) | 3 lines Untabify C files. Will watch buildbots. ........ ................
author Antoine Pitrou <solipsis@pitrou.net>
date Sun, 09 May 2010 16:14:21 +0000
parents c6b4f4f2b9a8
children 9db8c414921f
comparison
equal deleted inserted replaced
61459:f8c19c5f5dd2 61467:f197407bdba2
43 #endif 43 #endif
44 44
45 PyObject * 45 PyObject *
46 PySys_GetObject(const char *name) 46 PySys_GetObject(const char *name)
47 { 47 {
48 PyThreadState *tstate = PyThreadState_GET(); 48 PyThreadState *tstate = PyThreadState_GET();
49 PyObject *sd = tstate->interp->sysdict; 49 PyObject *sd = tstate->interp->sysdict;
50 if (sd == NULL) 50 if (sd == NULL)
51 return NULL; 51 return NULL;
52 return PyDict_GetItemString(sd, name); 52 return PyDict_GetItemString(sd, name);
53 } 53 }
54 54
55 int 55 int
56 PySys_SetObject(const char *name, PyObject *v) 56 PySys_SetObject(const char *name, PyObject *v)
57 { 57 {
58 PyThreadState *tstate = PyThreadState_GET(); 58 PyThreadState *tstate = PyThreadState_GET();
59 PyObject *sd = tstate->interp->sysdict; 59 PyObject *sd = tstate->interp->sysdict;
60 if (v == NULL) { 60 if (v == NULL) {
61 if (PyDict_GetItemString(sd, name) == NULL) 61 if (PyDict_GetItemString(sd, name) == NULL)
62 return 0; 62 return 0;
63 else 63 else
64 return PyDict_DelItemString(sd, name); 64 return PyDict_DelItemString(sd, name);
65 } 65 }
66 else 66 else
67 return PyDict_SetItemString(sd, name, v); 67 return PyDict_SetItemString(sd, name, v);
68 } 68 }
69 69
70 static PyObject * 70 static PyObject *
71 sys_displayhook(PyObject *self, PyObject *o) 71 sys_displayhook(PyObject *self, PyObject *o)
72 { 72 {
73 PyObject *outf; 73 PyObject *outf;
74 PyInterpreterState *interp = PyThreadState_GET()->interp; 74 PyInterpreterState *interp = PyThreadState_GET()->interp;
75 PyObject *modules = interp->modules; 75 PyObject *modules = interp->modules;
76 PyObject *builtins = PyDict_GetItemString(modules, "builtins"); 76 PyObject *builtins = PyDict_GetItemString(modules, "builtins");
77 77
78 if (builtins == NULL) { 78 if (builtins == NULL) {
79 PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); 79 PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
80 return NULL; 80 return NULL;
81 } 81 }
82 82
83 /* Print value except if None */ 83 /* Print value except if None */
84 /* After printing, also assign to '_' */ 84 /* After printing, also assign to '_' */
85 /* Before, set '_' to None to avoid recursion */ 85 /* Before, set '_' to None to avoid recursion */
86 if (o == Py_None) { 86 if (o == Py_None) {
87 Py_INCREF(Py_None); 87 Py_INCREF(Py_None);
88 return Py_None; 88 return Py_None;
89 } 89 }
90 if (PyObject_SetAttrString(builtins, "_", Py_None) != 0) 90 if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
91 return NULL; 91 return NULL;
92 outf = PySys_GetObject("stdout"); 92 outf = PySys_GetObject("stdout");
93 if (outf == NULL || outf == Py_None) { 93 if (outf == NULL || outf == Py_None) {
94 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); 94 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
95 return NULL; 95 return NULL;
96 } 96 }
97 if (PyFile_WriteObject(o, outf, 0) != 0) 97 if (PyFile_WriteObject(o, outf, 0) != 0)
98 return NULL; 98 return NULL;
99 if (PyFile_WriteString("\n", outf) != 0) 99 if (PyFile_WriteString("\n", outf) != 0)
100 return NULL; 100 return NULL;
101 if (PyObject_SetAttrString(builtins, "_", o) != 0) 101 if (PyObject_SetAttrString(builtins, "_", o) != 0)
102 return NULL; 102 return NULL;
103 Py_INCREF(Py_None); 103 Py_INCREF(Py_None);
104 return Py_None; 104 return Py_None;
105 } 105 }
106 106
107 PyDoc_STRVAR(displayhook_doc, 107 PyDoc_STRVAR(displayhook_doc,
108 "displayhook(object) -> None\n" 108 "displayhook(object) -> None\n"
109 "\n" 109 "\n"
111 ); 111 );
112 112
113 static PyObject * 113 static PyObject *
114 sys_excepthook(PyObject* self, PyObject* args) 114 sys_excepthook(PyObject* self, PyObject* args)
115 { 115 {
116 PyObject *exc, *value, *tb; 116 PyObject *exc, *value, *tb;
117 if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb)) 117 if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
118 return NULL; 118 return NULL;
119 PyErr_Display(exc, value, tb); 119 PyErr_Display(exc, value, tb);
120 Py_INCREF(Py_None); 120 Py_INCREF(Py_None);
121 return Py_None; 121 return Py_None;
122 } 122 }
123 123
124 PyDoc_STRVAR(excepthook_doc, 124 PyDoc_STRVAR(excepthook_doc,
125 "excepthook(exctype, value, traceback) -> None\n" 125 "excepthook(exctype, value, traceback) -> None\n"
126 "\n" 126 "\n"
128 ); 128 );
129 129
130 static PyObject * 130 static PyObject *
131 sys_exc_info(PyObject *self, PyObject *noargs) 131 sys_exc_info(PyObject *self, PyObject *noargs)
132 { 132 {
133 PyThreadState *tstate; 133 PyThreadState *tstate;
134 tstate = PyThreadState_GET(); 134 tstate = PyThreadState_GET();
135 return Py_BuildValue( 135 return Py_BuildValue(
136 "(OOO)", 136 "(OOO)",
137 tstate->exc_type != NULL ? tstate->exc_type : Py_None, 137 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
138 tstate->exc_value != NULL ? tstate->exc_value : Py_None, 138 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
139 tstate->exc_traceback != NULL ? 139 tstate->exc_traceback != NULL ?
140 tstate->exc_traceback : Py_None); 140 tstate->exc_traceback : Py_None);
141 } 141 }
142 142
143 PyDoc_STRVAR(exc_info_doc, 143 PyDoc_STRVAR(exc_info_doc,
144 "exc_info() -> (type, value, traceback)\n\ 144 "exc_info() -> (type, value, traceback)\n\
145 \n\ 145 \n\
148 ); 148 );
149 149
150 static PyObject * 150 static PyObject *
151 sys_exit(PyObject *self, PyObject *args) 151 sys_exit(PyObject *self, PyObject *args)
152 { 152 {
153 PyObject *exit_code = 0; 153 PyObject *exit_code = 0;
154 if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code)) 154 if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
155 return NULL; 155 return NULL;
156 /* Raise SystemExit so callers may catch it or clean up. */ 156 /* Raise SystemExit so callers may catch it or clean up. */
157 PyErr_SetObject(PyExc_SystemExit, exit_code); 157 PyErr_SetObject(PyExc_SystemExit, exit_code);
158 return NULL; 158 return NULL;
159 } 159 }
160 160
161 PyDoc_STRVAR(exit_doc, 161 PyDoc_STRVAR(exit_doc,
162 "exit([status])\n\ 162 "exit([status])\n\
163 \n\ 163 \n\
170 170
171 171
172 static PyObject * 172 static PyObject *
173 sys_getdefaultencoding(PyObject *self) 173 sys_getdefaultencoding(PyObject *self)
174 { 174 {
175 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding()); 175 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
176 } 176 }
177 177
178 PyDoc_STRVAR(getdefaultencoding_doc, 178 PyDoc_STRVAR(getdefaultencoding_doc,
179 "getdefaultencoding() -> string\n\ 179 "getdefaultencoding() -> string\n\
180 \n\ 180 \n\
183 ); 183 );
184 184
185 static PyObject * 185 static PyObject *
186 sys_setdefaultencoding(PyObject *self, PyObject *args) 186 sys_setdefaultencoding(PyObject *self, PyObject *args)
187 { 187 {
188 char *encoding; 188 char *encoding;
189 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding)) 189 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
190 return NULL; 190 return NULL;
191 if (PyUnicode_SetDefaultEncoding(encoding)) 191 if (PyUnicode_SetDefaultEncoding(encoding))
192 return NULL; 192 return NULL;
193 Py_INCREF(Py_None); 193 Py_INCREF(Py_None);
194 return Py_None; 194 return Py_None;
195 } 195 }
196 196
197 PyDoc_STRVAR(setdefaultencoding_doc, 197 PyDoc_STRVAR(setdefaultencoding_doc,
198 "setdefaultencoding(encoding)\n\ 198 "setdefaultencoding(encoding)\n\
199 \n\ 199 \n\
201 ); 201 );
202 202
203 static PyObject * 203 static PyObject *
204 sys_getfilesystemencoding(PyObject *self) 204 sys_getfilesystemencoding(PyObject *self)
205 { 205 {
206 if (Py_FileSystemDefaultEncoding) 206 if (Py_FileSystemDefaultEncoding)
207 return PyUnicode_FromString(Py_FileSystemDefaultEncoding); 207 return PyUnicode_FromString(Py_FileSystemDefaultEncoding);
208 Py_INCREF(Py_None); 208 Py_INCREF(Py_None);
209 return Py_None; 209 return Py_None;
210 } 210 }
211 211
212 PyDoc_STRVAR(getfilesystemencoding_doc, 212 PyDoc_STRVAR(getfilesystemencoding_doc,
213 "getfilesystemencoding() -> string\n\ 213 "getfilesystemencoding() -> string\n\
214 \n\ 214 \n\
217 ); 217 );
218 218
219 static PyObject * 219 static PyObject *
220 sys_setfilesystemencoding(PyObject *self, PyObject *args) 220 sys_setfilesystemencoding(PyObject *self, PyObject *args)
221 { 221 {
222 PyObject *new_encoding; 222 PyObject *new_encoding;
223 if (!PyArg_ParseTuple(args, "U:setfilesystemencoding", &new_encoding)) 223 if (!PyArg_ParseTuple(args, "U:setfilesystemencoding", &new_encoding))
224 return NULL; 224 return NULL;
225 if (_Py_SetFileSystemEncoding(new_encoding)) 225 if (_Py_SetFileSystemEncoding(new_encoding))
226 return NULL; 226 return NULL;
227 Py_INCREF(Py_None); 227 Py_INCREF(Py_None);
228 return Py_None; 228 return Py_None;
229 } 229 }
230 230
231 PyDoc_STRVAR(setfilesystemencoding_doc, 231 PyDoc_STRVAR(setfilesystemencoding_doc,
232 "setfilesystemencoding(string) -> None\n\ 232 "setfilesystemencoding(string) -> None\n\
233 \n\ 233 \n\
236 ); 236 );
237 237
238 static PyObject * 238 static PyObject *
239 sys_intern(PyObject *self, PyObject *args) 239 sys_intern(PyObject *self, PyObject *args)
240 { 240 {
241 PyObject *s; 241 PyObject *s;
242 if (!PyArg_ParseTuple(args, "U:intern", &s)) 242 if (!PyArg_ParseTuple(args, "U:intern", &s))
243 return NULL; 243 return NULL;
244 if (PyUnicode_CheckExact(s)) { 244 if (PyUnicode_CheckExact(s)) {
245 Py_INCREF(s); 245 Py_INCREF(s);
246 PyUnicode_InternInPlace(&s); 246 PyUnicode_InternInPlace(&s);
247 return s; 247 return s;
248 } 248 }
249 else { 249 else {
250 PyErr_Format(PyExc_TypeError, 250 PyErr_Format(PyExc_TypeError,
251 "can't intern %.400s", s->ob_type->tp_name); 251 "can't intern %.400s", s->ob_type->tp_name);
252 return NULL; 252 return NULL;
253 } 253 }
254 } 254 }
255 255
256 PyDoc_STRVAR(intern_doc, 256 PyDoc_STRVAR(intern_doc,
257 "intern(string) -> string\n\ 257 "intern(string) -> string\n\
258 \n\ 258 \n\
269 static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; 269 static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
270 270
271 static int 271 static int
272 trace_init(void) 272 trace_init(void)
273 { 273 {
274 static char *whatnames[7] = {"call", "exception", "line", "return", 274 static char *whatnames[7] = {"call", "exception", "line", "return",
275 "c_call", "c_exception", "c_return"}; 275 "c_call", "c_exception", "c_return"};
276 PyObject *name; 276 PyObject *name;
277 int i; 277 int i;
278 for (i = 0; i < 7; ++i) { 278 for (i = 0; i < 7; ++i) {
279 if (whatstrings[i] == NULL) { 279 if (whatstrings[i] == NULL) {
280 name = PyUnicode_InternFromString(whatnames[i]); 280 name = PyUnicode_InternFromString(whatnames[i]);
281 if (name == NULL) 281 if (name == NULL)
282 return -1; 282 return -1;
283 whatstrings[i] = name; 283 whatstrings[i] = name;
284 } 284 }
285 } 285 }
286 return 0; 286 return 0;
287 } 287 }
288 288
289 289
290 static PyObject * 290 static PyObject *
291 call_trampoline(PyThreadState *tstate, PyObject* callback, 291 call_trampoline(PyThreadState *tstate, PyObject* callback,
292 PyFrameObject *frame, int what, PyObject *arg) 292 PyFrameObject *frame, int what, PyObject *arg)
293 { 293 {
294 PyObject *args = PyTuple_New(3); 294 PyObject *args = PyTuple_New(3);
295 PyObject *whatstr; 295 PyObject *whatstr;
296 PyObject *result; 296 PyObject *result;
297 297
298 if (args == NULL) 298 if (args == NULL)
299 return NULL; 299 return NULL;
300 Py_INCREF(frame); 300 Py_INCREF(frame);
301 whatstr = whatstrings[what]; 301 whatstr = whatstrings[what];
302 Py_INCREF(whatstr); 302 Py_INCREF(whatstr);
303 if (arg == NULL) 303 if (arg == NULL)
304 arg = Py_None; 304 arg = Py_None;
305 Py_INCREF(arg); 305 Py_INCREF(arg);
306 PyTuple_SET_ITEM(args, 0, (PyObject *)frame); 306 PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
307 PyTuple_SET_ITEM(args, 1, whatstr); 307 PyTuple_SET_ITEM(args, 1, whatstr);
308 PyTuple_SET_ITEM(args, 2, arg); 308 PyTuple_SET_ITEM(args, 2, arg);
309 309
310 /* call the Python-level function */ 310 /* call the Python-level function */
311 PyFrame_FastToLocals(frame); 311 PyFrame_FastToLocals(frame);
312 result = PyEval_CallObject(callback, args); 312 result = PyEval_CallObject(callback, args);
313 PyFrame_LocalsToFast(frame, 1); 313 PyFrame_LocalsToFast(frame, 1);
314 if (result == NULL) 314 if (result == NULL)
315 PyTraceBack_Here(frame); 315 PyTraceBack_Here(frame);
316 316
317 /* cleanup */ 317 /* cleanup */
318 Py_DECREF(args); 318 Py_DECREF(args);
319 return result; 319 return result;
320 } 320 }
321 321
322 static int 322 static int
323 profile_trampoline(PyObject *self, PyFrameObject *frame, 323 profile_trampoline(PyObject *self, PyFrameObject *frame,
324 int what, PyObject *arg) 324 int what, PyObject *arg)
325 { 325 {
326 PyThreadState *tstate = frame->f_tstate; 326 PyThreadState *tstate = frame->f_tstate;
327 PyObject *result; 327 PyObject *result;
328 328
329 if (arg == NULL) 329 if (arg == NULL)
330 arg = Py_None; 330 arg = Py_None;
331 result = call_trampoline(tstate, self, frame, what, arg); 331 result = call_trampoline(tstate, self, frame, what, arg);
332 if (result == NULL) { 332 if (result == NULL) {
333 PyEval_SetProfile(NULL, NULL); 333 PyEval_SetProfile(NULL, NULL);
334 return -1; 334 return -1;
335 } 335 }
336 Py_DECREF(result); 336 Py_DECREF(result);
337 return 0; 337 return 0;
338 } 338 }
339 339
340 static int 340 static int
341 trace_trampoline(PyObject *self, PyFrameObject *frame, 341 trace_trampoline(PyObject *self, PyFrameObject *frame,
342 int what, PyObject *arg) 342 int what, PyObject *arg)
343 { 343 {
344 PyThreadState *tstate = frame->f_tstate; 344 PyThreadState *tstate = frame->f_tstate;
345 PyObject *callback; 345 PyObject *callback;
346 PyObject *result; 346 PyObject *result;
347 347
348 if (what == PyTrace_CALL) 348 if (what == PyTrace_CALL)
349 callback = self; 349 callback = self;
350 else 350 else
351 callback = frame->f_trace; 351 callback = frame->f_trace;
352 if (callback == NULL) 352 if (callback == NULL)
353 return 0; 353 return 0;
354 result = call_trampoline(tstate, callback, frame, what, arg); 354 result = call_trampoline(tstate, callback, frame, what, arg);
355 if (result == NULL) { 355 if (result == NULL) {
356 PyEval_SetTrace(NULL, NULL); 356 PyEval_SetTrace(NULL, NULL);
357 Py_XDECREF(frame->f_trace); 357 Py_XDECREF(frame->f_trace);
358 frame->f_trace = NULL; 358 frame->f_trace = NULL;
359 return -1; 359 return -1;
360 } 360 }
361 if (result != Py_None) { 361 if (result != Py_None) {
362 PyObject *temp = frame->f_trace; 362 PyObject *temp = frame->f_trace;
363 frame->f_trace = NULL; 363 frame->f_trace = NULL;
364 Py_XDECREF(temp); 364 Py_XDECREF(temp);
365 frame->f_trace = result; 365 frame->f_trace = result;
366 } 366 }
367 else { 367 else {
368 Py_DECREF(result); 368 Py_DECREF(result);
369 } 369 }
370 return 0; 370 return 0;
371 } 371 }
372 372
373 static PyObject * 373 static PyObject *
374 sys_settrace(PyObject *self, PyObject *args) 374 sys_settrace(PyObject *self, PyObject *args)
375 { 375 {
376 if (trace_init() == -1) 376 if (trace_init() == -1)
377 return NULL; 377 return NULL;
378 if (args == Py_None) 378 if (args == Py_None)
379 PyEval_SetTrace(NULL, NULL); 379 PyEval_SetTrace(NULL, NULL);
380 else 380 else
381 PyEval_SetTrace(trace_trampoline, args); 381 PyEval_SetTrace(trace_trampoline, args);
382 Py_INCREF(Py_None); 382 Py_INCREF(Py_None);
383 return Py_None; 383 return Py_None;
384 } 384 }
385 385
386 PyDoc_STRVAR(settrace_doc, 386 PyDoc_STRVAR(settrace_doc,
387 "settrace(function)\n\ 387 "settrace(function)\n\
388 \n\ 388 \n\
391 ); 391 );
392 392
393 static PyObject * 393 static PyObject *
394 sys_gettrace(PyObject *self, PyObject *args) 394 sys_gettrace(PyObject *self, PyObject *args)
395 { 395 {
396 PyThreadState *tstate = PyThreadState_GET(); 396 PyThreadState *tstate = PyThreadState_GET();
397 PyObject *temp = tstate->c_traceobj; 397 PyObject *temp = tstate->c_traceobj;
398 398
399 if (temp == NULL) 399 if (temp == NULL)
400 temp = Py_None; 400 temp = Py_None;
401 Py_INCREF(temp); 401 Py_INCREF(temp);
402 return temp; 402 return temp;
403 } 403 }
404 404
405 PyDoc_STRVAR(gettrace_doc, 405 PyDoc_STRVAR(gettrace_doc,
406 "gettrace()\n\ 406 "gettrace()\n\
407 \n\ 407 \n\
410 ); 410 );
411 411
412 static PyObject * 412 static PyObject *
413 sys_setprofile(PyObject *self, PyObject *args) 413 sys_setprofile(PyObject *self, PyObject *args)
414 { 414 {
415 if (trace_init() == -1) 415 if (trace_init() == -1)
416 return NULL; 416 return NULL;
417 if (args == Py_None) 417 if (args == Py_None)
418 PyEval_SetProfile(NULL, NULL); 418 PyEval_SetProfile(NULL, NULL);
419 else 419 else
420 PyEval_SetProfile(profile_trampoline, args); 420 PyEval_SetProfile(profile_trampoline, args);
421 Py_INCREF(Py_None); 421 Py_INCREF(Py_None);
422 return Py_None; 422 return Py_None;
423 } 423 }
424 424
425 PyDoc_STRVAR(setprofile_doc, 425 PyDoc_STRVAR(setprofile_doc,
426 "setprofile(function)\n\ 426 "setprofile(function)\n\
427 \n\ 427 \n\
430 ); 430 );
431 431
432 static PyObject * 432 static PyObject *
433 sys_getprofile(PyObject *self, PyObject *args) 433 sys_getprofile(PyObject *self, PyObject *args)
434 { 434 {
435 PyThreadState *tstate = PyThreadState_GET(); 435 PyThreadState *tstate = PyThreadState_GET();
436 PyObject *temp = tstate->c_profileobj; 436 PyObject *temp = tstate->c_profileobj;
437 437
438 if (temp == NULL) 438 if (temp == NULL)
439 temp = Py_None; 439 temp = Py_None;
440 Py_INCREF(temp); 440 Py_INCREF(temp);
441 return temp; 441 return temp;
442 } 442 }
443 443
444 PyDoc_STRVAR(getprofile_doc, 444 PyDoc_STRVAR(getprofile_doc,
445 "getprofile()\n\ 445 "getprofile()\n\
446 \n\ 446 \n\
449 ); 449 );
450 450
451 static PyObject * 451 static PyObject *
452 sys_setcheckinterval(PyObject *self, PyObject *args) 452 sys_setcheckinterval(PyObject *self, PyObject *args)
453 { 453 {
454 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval)) 454 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
455 return NULL; 455 return NULL;
456 Py_INCREF(Py_None); 456 Py_INCREF(Py_None);
457 return Py_None; 457 return Py_None;
458 } 458 }
459 459
460 PyDoc_STRVAR(setcheckinterval_doc, 460 PyDoc_STRVAR(setcheckinterval_doc,
461 "setcheckinterval(n)\n\ 461 "setcheckinterval(n)\n\
462 \n\ 462 \n\
465 ); 465 );
466 466
467 static PyObject * 467 static PyObject *
468 sys_getcheckinterval(PyObject *self, PyObject *args) 468 sys_getcheckinterval(PyObject *self, PyObject *args)
469 { 469 {
470 return PyLong_FromLong(_Py_CheckInterval); 470 return PyLong_FromLong(_Py_CheckInterval);
471 } 471 }
472 472
473 PyDoc_STRVAR(getcheckinterval_doc, 473 PyDoc_STRVAR(getcheckinterval_doc,
474 "getcheckinterval() -> current check interval; see setcheckinterval()." 474 "getcheckinterval() -> current check interval; see setcheckinterval()."
475 ); 475 );
476 476
477 #ifdef WITH_TSC 477 #ifdef WITH_TSC
478 static PyObject * 478 static PyObject *
479 sys_settscdump(PyObject *self, PyObject *args) 479 sys_settscdump(PyObject *self, PyObject *args)
480 { 480 {
481 int bool; 481 int bool;
482 PyThreadState *tstate = PyThreadState_Get(); 482 PyThreadState *tstate = PyThreadState_Get();
483 483
484 if (!PyArg_ParseTuple(args, "i:settscdump", &bool)) 484 if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
485 return NULL; 485 return NULL;
486 if (bool) 486 if (bool)
487 tstate->interp->tscdump = 1; 487 tstate->interp->tscdump = 1;
488 else 488 else
489 tstate->interp->tscdump = 0; 489 tstate->interp->tscdump = 0;
490 Py_INCREF(Py_None); 490 Py_INCREF(Py_None);
491 return Py_None; 491 return Py_None;
492 492
493 } 493 }
494 494
495 PyDoc_STRVAR(settscdump_doc, 495 PyDoc_STRVAR(settscdump_doc,
496 "settscdump(bool)\n\ 496 "settscdump(bool)\n\
502 #endif /* TSC */ 502 #endif /* TSC */
503 503
504 static PyObject * 504 static PyObject *
505 sys_setrecursionlimit(PyObject *self, PyObject *args) 505 sys_setrecursionlimit(PyObject *self, PyObject *args)
506 { 506 {
507 int new_limit; 507 int new_limit;
508 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit)) 508 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
509 return NULL; 509 return NULL;
510 if (new_limit <= 0) { 510 if (new_limit <= 0) {
511 PyErr_SetString(PyExc_ValueError, 511 PyErr_SetString(PyExc_ValueError,
512 "recursion limit must be positive"); 512 "recursion limit must be positive");
513 return NULL; 513 return NULL;
514 } 514 }
515 Py_SetRecursionLimit(new_limit); 515 Py_SetRecursionLimit(new_limit);
516 Py_INCREF(Py_None); 516 Py_INCREF(Py_None);
517 return Py_None; 517 return Py_None;
518 } 518 }
519 519
520 PyDoc_STRVAR(setrecursionlimit_doc, 520 PyDoc_STRVAR(setrecursionlimit_doc,
521 "setrecursionlimit(n)\n\ 521 "setrecursionlimit(n)\n\
522 \n\ 522 \n\
527 ); 527 );
528 528
529 static PyObject * 529 static PyObject *
530 sys_getrecursionlimit(PyObject *self) 530 sys_getrecursionlimit(PyObject *self)
531 { 531 {
532 return PyLong_FromLong(Py_GetRecursionLimit()); 532 return PyLong_FromLong(Py_GetRecursionLimit());
533 } 533 }
534 534
535 PyDoc_STRVAR(getrecursionlimit_doc, 535 PyDoc_STRVAR(getrecursionlimit_doc,
536 "getrecursionlimit()\n\ 536 "getrecursionlimit()\n\
537 \n\ 537 \n\
552 ); 552 );
553 553
554 static PyObject * 554 static PyObject *
555 sys_getwindowsversion(PyObject *self) 555 sys_getwindowsversion(PyObject *self)
556 { 556 {
557 OSVERSIONINFO ver; 557 OSVERSIONINFO ver;
558 ver.dwOSVersionInfoSize = sizeof(ver); 558 ver.dwOSVersionInfoSize = sizeof(ver);
559 if (!GetVersionEx(&ver)) 559 if (!GetVersionEx(&ver))
560 return PyErr_SetFromWindowsErr(0); 560 return PyErr_SetFromWindowsErr(0);
561 return Py_BuildValue("HHHHs", 561 return Py_BuildValue("HHHHs",
562 ver.dwMajorVersion, 562 ver.dwMajorVersion,
563 ver.dwMinorVersion, 563 ver.dwMinorVersion,
564 ver.dwBuildNumber, 564 ver.dwBuildNumber,
565 ver.dwPlatformId, 565 ver.dwPlatformId,
566 ver.szCSDVersion); 566 ver.szCSDVersion);
567 } 567 }
568 568
569 #endif /* MS_WINDOWS */ 569 #endif /* MS_WINDOWS */
570 570
571 #ifdef HAVE_DLOPEN 571 #ifdef HAVE_DLOPEN
572 static PyObject * 572 static PyObject *
573 sys_setdlopenflags(PyObject *self, PyObject *args) 573 sys_setdlopenflags(PyObject *self, PyObject *args)
574 { 574 {
575 int new_val; 575 int new_val;
576 PyThreadState *tstate = PyThreadState_GET(); 576 PyThreadState *tstate = PyThreadState_GET();
577 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val)) 577 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
578 return NULL; 578 return NULL;
579 if (!tstate) 579 if (!tstate)
580 return NULL; 580 return NULL;
581 tstate->interp->dlopenflags = new_val; 581 tstate->interp->dlopenflags = new_val;
582 Py_INCREF(Py_None); 582 Py_INCREF(Py_None);
583 return Py_None; 583 return Py_None;
584 } 584 }
585 585
586 PyDoc_STRVAR(setdlopenflags_doc, 586 PyDoc_STRVAR(setdlopenflags_doc,
587 "setdlopenflags(n) -> None\n\ 587 "setdlopenflags(n) -> None\n\
588 \n\ 588 \n\
596 h2py script."); 596 h2py script.");
597 597
598 static PyObject * 598 static PyObject *
599 sys_getdlopenflags(PyObject *self, PyObject *args) 599 sys_getdlopenflags(PyObject *self, PyObject *args)
600 { 600 {
601 PyThreadState *tstate = PyThreadState_GET(); 601 PyThreadState *tstate = PyThreadState_GET();
602 if (!tstate) 602 if (!tstate)
603 return NULL; 603 return NULL;
604 return PyLong_FromLong(tstate->interp->dlopenflags); 604 return PyLong_FromLong(tstate->interp->dlopenflags);
605 } 605 }
606 606
607 PyDoc_STRVAR(getdlopenflags_doc, 607 PyDoc_STRVAR(getdlopenflags_doc,
608 "getdlopenflags() -> int\n\ 608 "getdlopenflags() -> int\n\
609 \n\ 609 \n\
610 Return the current value of the flags that are used for dlopen calls.\n\ 610 Return the current value of the flags that are used for dlopen calls.\n\
611 The flag constants are defined in the ctypes and DLFCN modules."); 611 The flag constants are defined in the ctypes and DLFCN modules.");
612 612
613 #endif /* HAVE_DLOPEN */ 613 #endif /* HAVE_DLOPEN */
614 614
615 #ifdef USE_MALLOPT 615 #ifdef USE_MALLOPT
616 /* Link with -lmalloc (or -lmpc) on an SGI */ 616 /* Link with -lmalloc (or -lmpc) on an SGI */
617 #include <malloc.h> 617 #include <malloc.h>
618 618
619 static PyObject * 619 static PyObject *
620 sys_mdebug(PyObject *self, PyObject *args) 620 sys_mdebug(PyObject *self, PyObject *args)
621 { 621 {
622 int flag; 622 int flag;
623 if (!PyArg_ParseTuple(args, "i:mdebug", &flag)) 623 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
624 return NULL; 624 return NULL;
625 mallopt(M_DEBUG, flag); 625 mallopt(M_DEBUG, flag);
626 Py_INCREF(Py_None); 626 Py_INCREF(Py_None);
627 return Py_None; 627 return Py_None;
628 } 628 }
629 #endif /* USE_MALLOPT */ 629 #endif /* USE_MALLOPT */
630 630
631 static PyObject * 631 static PyObject *
632 sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) 632 sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
633 { 633 {
634 PyObject *res = NULL; 634 PyObject *res = NULL;
635 static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL; 635 static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL;
636 static char *kwlist[] = {"object", "default", 0}; 636 static char *kwlist[] = {"object", "default", 0};
637 PyObject *o, *dflt = NULL; 637 PyObject *o, *dflt = NULL;
638 PyObject *method; 638 PyObject *method;
639 639
640 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", 640 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
641 kwlist, &o, &dflt)) 641 kwlist, &o, &dflt))
642 return NULL; 642 return NULL;
643 643
644 /* Initialize static variable for GC head size */ 644 /* Initialize static variable for GC head size */
645 if (gc_head_size == NULL) { 645 if (gc_head_size == NULL) {
646 gc_head_size = PyLong_FromSsize_t(sizeof(PyGC_Head)); 646 gc_head_size = PyLong_FromSsize_t(sizeof(PyGC_Head));
647 if (gc_head_size == NULL) 647 if (gc_head_size == NULL)
648 return NULL; 648 return NULL;
649 } 649 }
650 650
651 /* Make sure the type is initialized. float gets initialized late */ 651 /* Make sure the type is initialized. float gets initialized late */
652 if (PyType_Ready(Py_TYPE(o)) < 0) 652 if (PyType_Ready(Py_TYPE(o)) < 0)
653 return NULL; 653 return NULL;
654 654
655 method = _PyObject_LookupSpecial(o, "__sizeof__", 655 method = _PyObject_LookupSpecial(o, "__sizeof__",
656 &str__sizeof__); 656 &str__sizeof__);
657 if (method == NULL) { 657 if (method == NULL) {
658 if (!PyErr_Occurred()) 658 if (!PyErr_Occurred())
659 PyErr_Format(PyExc_TypeError, 659 PyErr_Format(PyExc_TypeError,
660 "Type %.100s doesn't define __sizeof__", 660 "Type %.100s doesn't define __sizeof__",
661 Py_TYPE(o)->tp_name); 661 Py_TYPE(o)->tp_name);
662 } 662 }
663 else { 663 else {
664 res = PyObject_CallFunctionObjArgs(method, NULL); 664 res = PyObject_CallFunctionObjArgs(method, NULL);
665 Py_DECREF(method); 665 Py_DECREF(method);
666 } 666 }
667 667
668 /* Has a default value been given */ 668 /* Has a default value been given */
669 if ((res == NULL) && (dflt != NULL) && 669 if ((res == NULL) && (dflt != NULL) &&
670 PyErr_ExceptionMatches(PyExc_TypeError)) 670 PyErr_ExceptionMatches(PyExc_TypeError))
671 { 671 {
672 PyErr_Clear(); 672 PyErr_Clear();
673 Py_INCREF(dflt); 673 Py_INCREF(dflt);
674 return dflt; 674 return dflt;
675 } 675 }
676 else if (res == NULL) 676 else if (res == NULL)
677 return res; 677 return res;
678 678
679 /* add gc_head size */ 679 /* add gc_head size */
680 if (PyObject_IS_GC(o)) { 680 if (PyObject_IS_GC(o)) {
681 PyObject *tmp = res; 681 PyObject *tmp = res;
682 res = PyNumber_Add(tmp, gc_head_size); 682 res = PyNumber_Add(tmp, gc_head_size);
683 Py_DECREF(tmp); 683 Py_DECREF(tmp);
684 } 684 }
685 return res; 685 return res;
686 } 686 }
687 687
688 PyDoc_STRVAR(getsizeof_doc, 688 PyDoc_STRVAR(getsizeof_doc,
689 "getsizeof(object, default) -> int\n\ 689 "getsizeof(object, default) -> int\n\
690 \n\ 690 \n\
691 Return the size of object in bytes."); 691 Return the size of object in bytes.");
692 692
693 static PyObject * 693 static PyObject *
694 sys_getrefcount(PyObject *self, PyObject *arg) 694 sys_getrefcount(PyObject *self, PyObject *arg)
695 { 695 {
696 return PyLong_FromSsize_t(arg->ob_refcnt); 696 return PyLong_FromSsize_t(arg->ob_refcnt);
697 } 697 }
698 698
699 #ifdef Py_REF_DEBUG 699 #ifdef Py_REF_DEBUG
700 static PyObject * 700 static PyObject *
701 sys_gettotalrefcount(PyObject *self) 701 sys_gettotalrefcount(PyObject *self)
702 { 702 {
703 return PyLong_FromSsize_t(_Py_GetRefTotal()); 703 return PyLong_FromSsize_t(_Py_GetRefTotal());
704 } 704 }
705 #endif /* Py_REF_DEBUG */ 705 #endif /* Py_REF_DEBUG */
706 706
707 PyDoc_STRVAR(getrefcount_doc, 707 PyDoc_STRVAR(getrefcount_doc,
708 "getrefcount(object) -> integer\n\ 708 "getrefcount(object) -> integer\n\
714 714
715 #ifdef COUNT_ALLOCS 715 #ifdef COUNT_ALLOCS
716 static PyObject * 716 static PyObject *
717 sys_getcounts(PyObject *self) 717 sys_getcounts(PyObject *self)
718 { 718 {
719 extern PyObject *get_counts(void); 719 extern PyObject *get_counts(void);
720 720
721 return get_counts(); 721 return get_counts();
722 } 722 }
723 #endif 723 #endif
724 724
725 PyDoc_STRVAR(getframe_doc, 725 PyDoc_STRVAR(getframe_doc,
726 "_getframe([depth]) -> frameobject\n\ 726 "_getframe([depth]) -> frameobject\n\
735 ); 735 );
736 736
737 static PyObject * 737 static PyObject *
738 sys_getframe(PyObject *self, PyObject *args) 738 sys_getframe(PyObject *self, PyObject *args)
739 { 739 {
740 PyFrameObject *f = PyThreadState_GET()->frame; 740 PyFrameObject *f = PyThreadState_GET()->frame;
741 int depth = -1; 741 int depth = -1;
742 742
743 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth)) 743 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
744 return NULL; 744 return NULL;
745 745
746 while (depth > 0 && f != NULL) { 746 while (depth > 0 && f != NULL) {
747 f = f->f_back; 747 f = f->f_back;
748 --depth; 748 --depth;
749 } 749 }
750 if (f == NULL) { 750 if (f == NULL) {
751 PyErr_SetString(PyExc_ValueError, 751 PyErr_SetString(PyExc_ValueError,
752 "call stack is not deep enough"); 752 "call stack is not deep enough");
753 return NULL; 753 return NULL;
754 } 754 }
755 Py_INCREF(f); 755 Py_INCREF(f);
756 return (PyObject*)f; 756 return (PyObject*)f;
757 } 757 }
758 758
759 PyDoc_STRVAR(current_frames_doc, 759 PyDoc_STRVAR(current_frames_doc,
760 "_current_frames() -> dictionary\n\ 760 "_current_frames() -> dictionary\n\
761 \n\ 761 \n\
766 ); 766 );
767 767
768 static PyObject * 768 static PyObject *
769 sys_current_frames(PyObject *self, PyObject *noargs) 769 sys_current_frames(PyObject *self, PyObject *noargs)
770 { 770 {
771 return _PyThread_CurrentFrames(); 771 return _PyThread_CurrentFrames();
772 } 772 }
773 773
774 PyDoc_STRVAR(call_tracing_doc, 774 PyDoc_STRVAR(call_tracing_doc,
775 "call_tracing(func, args) -> object\n\ 775 "call_tracing(func, args) -> object\n\
776 \n\ 776 \n\
780 ); 780 );
781 781
782 static PyObject * 782 static PyObject *
783 sys_call_tracing(PyObject *self, PyObject *args) 783 sys_call_tracing(PyObject *self, PyObject *args)
784 { 784 {
785 PyObject *func, *funcargs; 785 PyObject *func, *funcargs;
786 if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs)) 786 if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
787 return NULL; 787 return NULL;
788 return _PyEval_CallTracing(func, funcargs); 788 return _PyEval_CallTracing(func, funcargs);
789 } 789 }
790 790
791 PyDoc_STRVAR(callstats_doc, 791 PyDoc_STRVAR(callstats_doc,
792 "callstats() -> tuple of integers\n\ 792 "callstats() -> tuple of integers\n\
793 \n\ 793 \n\
830 #endif 830 #endif
831 831
832 static PyObject * 832 static PyObject *
833 sys_clear_type_cache(PyObject* self, PyObject* args) 833 sys_clear_type_cache(PyObject* self, PyObject* args)
834 { 834 {
835 PyType_ClearCache(); 835 PyType_ClearCache();
836 Py_RETURN_NONE; 836 Py_RETURN_NONE;
837 } 837 }
838 838
839 PyDoc_STRVAR(sys_clear_type_cache__doc__, 839 PyDoc_STRVAR(sys_clear_type_cache__doc__,
840 "_clear_type_cache() -> None\n\ 840 "_clear_type_cache() -> None\n\
841 Clear the internal type lookup cache."); 841 Clear the internal type lookup cache.");
842 842
843 843
844 static PyMethodDef sys_methods[] = { 844 static PyMethodDef sys_methods[] = {
845 /* Might as well keep this in alphabetic order */ 845 /* Might as well keep this in alphabetic order */
846 {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS, 846 {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
847 callstats_doc}, 847 callstats_doc},
848 {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS, 848 {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS,
849 sys_clear_type_cache__doc__}, 849 sys_clear_type_cache__doc__},
850 {"_current_frames", sys_current_frames, METH_NOARGS, 850 {"_current_frames", sys_current_frames, METH_NOARGS,
851 current_frames_doc}, 851 current_frames_doc},
852 {"displayhook", sys_displayhook, METH_O, displayhook_doc}, 852 {"displayhook", sys_displayhook, METH_O, displayhook_doc},
853 {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc}, 853 {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc},
854 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc}, 854 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
855 {"exit", sys_exit, METH_VARARGS, exit_doc}, 855 {"exit", sys_exit, METH_VARARGS, exit_doc},
856 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding, 856 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
857 METH_NOARGS, getdefaultencoding_doc}, 857 METH_NOARGS, getdefaultencoding_doc},
858 #ifdef HAVE_DLOPEN 858 #ifdef HAVE_DLOPEN
859 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS, 859 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
860 getdlopenflags_doc}, 860 getdlopenflags_doc},
861 #endif 861 #endif
862 #ifdef COUNT_ALLOCS 862 #ifdef COUNT_ALLOCS
863 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS}, 863 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS},
864 #endif 864 #endif
865 #ifdef DYNAMIC_EXECUTION_PROFILE 865 #ifdef DYNAMIC_EXECUTION_PROFILE
866 {"getdxp", _Py_GetDXProfile, METH_VARARGS}, 866 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
867 #endif 867 #endif
868 {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding, 868 {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
869 METH_NOARGS, getfilesystemencoding_doc}, 869 METH_NOARGS, getfilesystemencoding_doc},
870 #ifdef Py_TRACE_REFS 870 #ifdef Py_TRACE_REFS
871 {"getobjects", _Py_GetObjects, METH_VARARGS}, 871 {"getobjects", _Py_GetObjects, METH_VARARGS},
872 #endif 872 #endif
873 #ifdef Py_REF_DEBUG 873 #ifdef Py_REF_DEBUG
874 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS}, 874 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
875 #endif 875 #endif
876 {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc}, 876 {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
877 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS, 877 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
878 getrecursionlimit_doc}, 878 getrecursionlimit_doc},
879 {"getsizeof", (PyCFunction)sys_getsizeof, 879 {"getsizeof", (PyCFunction)sys_getsizeof,
880 METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, 880 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
881 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc}, 881 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
882 #ifdef MS_WINDOWS 882 #ifdef MS_WINDOWS
883 {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS, 883 {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
884 getwindowsversion_doc}, 884 getwindowsversion_doc},
885 #endif /* MS_WINDOWS */ 885 #endif /* MS_WINDOWS */
886 {"intern", sys_intern, METH_VARARGS, intern_doc}, 886 {"intern", sys_intern, METH_VARARGS, intern_doc},
887 #ifdef USE_MALLOPT 887 #ifdef USE_MALLOPT
888 {"mdebug", sys_mdebug, METH_VARARGS}, 888 {"mdebug", sys_mdebug, METH_VARARGS},
889 #endif 889 #endif
890 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS, 890 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
891 setdefaultencoding_doc}, 891 setdefaultencoding_doc},
892 {"setfilesystemencoding", sys_setfilesystemencoding, METH_VARARGS, 892 {"setfilesystemencoding", sys_setfilesystemencoding, METH_VARARGS,
893 setfilesystemencoding_doc}, 893 setfilesystemencoding_doc},
894 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS, 894 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
895 setcheckinterval_doc}, 895 setcheckinterval_doc},
896 {"getcheckinterval", sys_getcheckinterval, METH_NOARGS, 896 {"getcheckinterval", sys_getcheckinterval, METH_NOARGS,
897 getcheckinterval_doc}, 897 getcheckinterval_doc},
898 #ifdef HAVE_DLOPEN 898 #ifdef HAVE_DLOPEN
899 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS, 899 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
900 setdlopenflags_doc}, 900 setdlopenflags_doc},
901 #endif 901 #endif
902 {"setprofile", sys_setprofile, METH_O, setprofile_doc}, 902 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
903 {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc}, 903 {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc},
904 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS, 904 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
905 setrecursionlimit_doc}, 905 setrecursionlimit_doc},
906 #ifdef WITH_TSC 906 #ifdef WITH_TSC
907 {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc}, 907 {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
908 #endif 908 #endif
909 {"settrace", sys_settrace, METH_O, settrace_doc}, 909 {"settrace", sys_settrace, METH_O, settrace_doc},
910 {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc}, 910 {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
911 {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, 911 {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
912 {NULL, NULL} /* sentinel */ 912 {NULL, NULL} /* sentinel */
913 }; 913 };
914 914
915 static PyObject * 915 static PyObject *
916 list_builtin_module_names(void) 916 list_builtin_module_names(void)
917 { 917 {
918 PyObject *list = PyList_New(0); 918 PyObject *list = PyList_New(0);
919 int i; 919 int i;
920 if (list == NULL) 920 if (list == NULL)
921 return NULL; 921 return NULL;
922 for (i = 0; PyImport_Inittab[i].name != NULL; i++) { 922 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
923 PyObject *name = PyUnicode_FromString( 923 PyObject *name = PyUnicode_FromString(
924 PyImport_Inittab[i].name); 924 PyImport_Inittab[i].name);
925 if (name == NULL) 925 if (name == NULL)
926 break; 926 break;
927 PyList_Append(list, name); 927 PyList_Append(list, name);
928 Py_DECREF(name); 928 Py_DECREF(name);
929 } 929 }
930 if (PyList_Sort(list) != 0) { 930 if (PyList_Sort(list) != 0) {
931 Py_DECREF(list); 931 Py_DECREF(list);
932 list = NULL; 932 list = NULL;
933 } 933 }
934 if (list) { 934 if (list) {
935 PyObject *v = PyList_AsTuple(list); 935 PyObject *v = PyList_AsTuple(list);
936 Py_DECREF(list); 936 Py_DECREF(list);
937 list = v; 937 list = v;
938 } 938 }
939 return list; 939 return list;
940 } 940 }
941 941
942 static PyObject *warnoptions = NULL; 942 static PyObject *warnoptions = NULL;
943 943
944 void 944 void
945 PySys_ResetWarnOptions(void) 945 PySys_ResetWarnOptions(void)
946 { 946 {
947 if (warnoptions == NULL || !PyList_Check(warnoptions)) 947 if (warnoptions == NULL || !PyList_Check(warnoptions))
948 return; 948 return;
949 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); 949 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
950 } 950 }
951 951
952 void 952 void
953 PySys_AddWarnOption(const wchar_t *s) 953 PySys_AddWarnOption(const wchar_t *s)
954 { 954 {
955 PyObject *str; 955 PyObject *str;
956 956
957 if (warnoptions == NULL || !PyList_Check(warnoptions)) { 957 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
958 Py_XDECREF(warnoptions); 958 Py_XDECREF(warnoptions);
959 warnoptions = PyList_New(0); 959 warnoptions = PyList_New(0);
960 if (warnoptions == NULL) 960 if (warnoptions == NULL)
961 return; 961 return;
962 } 962 }
963 str = PyUnicode_FromWideChar(s, -1); 963 str = PyUnicode_FromWideChar(s, -1);
964 if (str != NULL) { 964 if (str != NULL) {
965 PyList_Append(warnoptions, str); 965 PyList_Append(warnoptions, str);
966 Py_DECREF(str); 966 Py_DECREF(str);
967 } 967 }
968 } 968 }
969 969
970 int 970 int
971 PySys_HasWarnOptions(void) 971 PySys_HasWarnOptions(void)
972 { 972 {
1074 static const char *svn_revision; 1074 static const char *svn_revision;
1075 1075
1076 static void 1076 static void
1077 svnversion_init(void) 1077 svnversion_init(void)
1078 { 1078 {
1079 const char *python, *br_start, *br_end, *br_end2, *svnversion; 1079 const char *python, *br_start, *br_end, *br_end2, *svnversion;
1080 Py_ssize_t len; 1080 Py_ssize_t len;
1081 int istag = 0; 1081 int istag = 0;
1082 1082
1083 if (svn_initialized) 1083 if (svn_initialized)
1084 return; 1084 return;
1085 1085
1086 python = strstr(headurl, "/python/"); 1086 python = strstr(headurl, "/python/");
1087 if (!python) { 1087 if (!python) {
1088 strcpy(branch, "unknown branch"); 1088 strcpy(branch, "unknown branch");
1089 strcpy(shortbranch, "unknown"); 1089 strcpy(shortbranch, "unknown");
1090 } 1090 }
1091 else { 1091 else {
1092 br_start = python + 8; 1092 br_start = python + 8;
1093 br_end = strchr(br_start, '/'); 1093 br_end = strchr(br_start, '/');
1094 assert(br_end); 1094 assert(br_end);
1095 1095
1096 /* Works even for trunk, 1096 /* Works even for trunk,
1097 as we are in trunk/Python/sysmodule.c */ 1097 as we are in trunk/Python/sysmodule.c */
1098 br_end2 = strchr(br_end+1, '/'); 1098 br_end2 = strchr(br_end+1, '/');
1099 1099
1100 istag = strncmp(br_start, "tags", 4) == 0; 1100 istag = strncmp(br_start, "tags", 4) == 0;
1101 if (strncmp(br_start, "trunk", 5) == 0) { 1101 if (strncmp(br_start, "trunk", 5) == 0) {
1102 strcpy(branch, "trunk"); 1102 strcpy(branch, "trunk");
1103 strcpy(shortbranch, "trunk"); 1103 strcpy(shortbranch, "trunk");
1104 } 1104 }
1105 else if (istag || strncmp(br_start, "branches", 8) == 0) { 1105 else if (istag || strncmp(br_start, "branches", 8) == 0) {
1106 len = br_end2 - br_start; 1106 len = br_end2 - br_start;
1107 strncpy(branch, br_start, len); 1107 strncpy(branch, br_start, len);
1108 branch[len] = '\0'; 1108 branch[len] = '\0';
1109 1109
1110 len = br_end2 - (br_end + 1); 1110 len = br_end2 - (br_end + 1);
1111 strncpy(shortbranch, br_end + 1, len); 1111 strncpy(shortbranch, br_end + 1, len);
1112 shortbranch[len] = '\0'; 1112 shortbranch[len] = '\0';
1113 } 1113 }
1114 else { 1114 else {
1115 Py_FatalError("bad HeadURL"); 1115 Py_FatalError("bad HeadURL");
1116 return; 1116 return;
1117 } 1117 }
1118 } 1118 }
1119 1119
1120 1120
1121 svnversion = _Py_svnversion(); 1121 svnversion = _Py_svnversion();
1122 if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) 1122 if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0)
1123 svn_revision = svnversion; 1123 svn_revision = svnversion;
1124 else if (istag) { 1124 else if (istag) {
1125 len = strlen(_patchlevel_revision); 1125 len = strlen(_patchlevel_revision);
1126 assert(len >= 13); 1126 assert(len >= 13);
1127 assert(len < (sizeof(patchlevel_revision) + 13)); 1127 assert(len < (sizeof(patchlevel_revision) + 13));
1128 strncpy(patchlevel_revision, _patchlevel_revision + 11, 1128 strncpy(patchlevel_revision, _patchlevel_revision + 11,
1129 len - 13); 1129 len - 13);
1130 patchlevel_revision[len - 13] = '\0'; 1130 patchlevel_revision[len - 13] = '\0';
1131 svn_revision = patchlevel_revision; 1131 svn_revision = patchlevel_revision;
1132 } 1132 }
1133 else 1133 else
1134 svn_revision = ""; 1134 svn_revision = "";
1135 1135
1136 svn_initialized = 1; 1136 svn_initialized = 1;
1137 } 1137 }
1138 1138
1139 /* Return svnversion output if available. 1139 /* Return svnversion output if available.
1140 Else return Revision of patchlevel.h if on branch. 1140 Else return Revision of patchlevel.h if on branch.
1141 Else return empty string */ 1141 Else return empty string */
1142 const char* 1142 const char*
1143 Py_SubversionRevision() 1143 Py_SubversionRevision()
1144 { 1144 {
1145 svnversion_init(); 1145 svnversion_init();
1146 return svn_revision; 1146 return svn_revision;
1147 } 1147 }
1148 1148
1149 const char* 1149 const char*
1150 Py_SubversionShortBranch() 1150 Py_SubversionShortBranch()
1151 { 1151 {
1152 svnversion_init(); 1152 svnversion_init();
1153 return shortbranch; 1153 return shortbranch;
1154 } 1154 }
1155 1155
1156 1156
1157 PyDoc_STRVAR(flags__doc__, 1157 PyDoc_STRVAR(flags__doc__,
1158 "sys.flags\n\ 1158 "sys.flags\n\
1160 Flags provided through command line arguments or environment vars."); 1160 Flags provided through command line arguments or environment vars.");
1161 1161
1162 static PyTypeObject FlagsType; 1162 static PyTypeObject FlagsType;
1163 1163
1164 static PyStructSequence_Field flags_fields[] = { 1164 static PyStructSequence_Field flags_fields[] = {
1165 {"debug", "-d"}, 1165 {"debug", "-d"},
1166 {"division_warning", "-Q"}, 1166 {"division_warning", "-Q"},
1167 {"inspect", "-i"}, 1167 {"inspect", "-i"},
1168 {"interactive", "-i"}, 1168 {"interactive", "-i"},
1169 {"optimize", "-O or -OO"}, 1169 {"optimize", "-O or -OO"},
1170 {"dont_write_bytecode", "-B"}, 1170 {"dont_write_bytecode", "-B"},
1171 {"no_user_site", "-s"}, 1171 {"no_user_site", "-s"},
1172 {"no_site", "-S"}, 1172 {"no_site", "-S"},
1173 {"ignore_environment", "-E"}, 1173 {"ignore_environment", "-E"},
1174 {"verbose", "-v"}, 1174 {"verbose", "-v"},
1175 #ifdef RISCOS 1175 #ifdef RISCOS
1176 {"riscos_wimp", "???"}, 1176 {"riscos_wimp", "???"},
1177 #endif 1177 #endif
1178 /* {"unbuffered", "-u"}, */ 1178 /* {"unbuffered", "-u"}, */
1179 /* {"skip_first", "-x"}, */ 1179 /* {"skip_first", "-x"}, */
1180 {"bytes_warning", "-b"}, 1180 {"bytes_warning", "-b"},
1181 {0} 1181 {0}
1182 }; 1182 };
1183 1183
1184 static PyStructSequence_Desc flags_desc = { 1184 static PyStructSequence_Desc flags_desc = {
1185 "sys.flags", /* name */ 1185 "sys.flags", /* name */
1186 flags__doc__, /* doc */ 1186 flags__doc__, /* doc */
1187 flags_fields, /* fields */ 1187 flags_fields, /* fields */
1188 #ifdef RISCOS 1188 #ifdef RISCOS
1189 12 1189 12
1190 #else 1190 #else
1191 11 1191 11
1192 #endif 1192 #endif
1193 }; 1193 };
1194 1194
1195 static PyObject* 1195 static PyObject*
1196 make_flags(void) 1196 make_flags(void)
1197 { 1197 {
1198 int pos = 0; 1198 int pos = 0;
1199 PyObject *seq; 1199 PyObject *seq;
1200 1200
1201 seq = PyStructSequence_New(&FlagsType); 1201 seq = PyStructSequence_New(&FlagsType);
1202 if (seq == NULL) 1202 if (seq == NULL)
1203 return NULL; 1203 return NULL;
1204 1204
1205 #define SetFlag(flag) \ 1205 #define SetFlag(flag) \
1206 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag)) 1206 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
1207 1207
1208 SetFlag(Py_DebugFlag); 1208 SetFlag(Py_DebugFlag);
1209 SetFlag(Py_DivisionWarningFlag); 1209 SetFlag(Py_DivisionWarningFlag);
1210 SetFlag(Py_InspectFlag); 1210 SetFlag(Py_InspectFlag);
1211 SetFlag(Py_InteractiveFlag); 1211 SetFlag(Py_InteractiveFlag);
1212 SetFlag(Py_OptimizeFlag); 1212 SetFlag(Py_OptimizeFlag);
1213 SetFlag(Py_DontWriteBytecodeFlag); 1213 SetFlag(Py_DontWriteBytecodeFlag);
1214 SetFlag(Py_NoUserSiteDirectory); 1214 SetFlag(Py_NoUserSiteDirectory);
1215 SetFlag(Py_NoSiteFlag); 1215 SetFlag(Py_NoSiteFlag);
1216 SetFlag(Py_IgnoreEnvironmentFlag); 1216 SetFlag(Py_IgnoreEnvironmentFlag);
1217 SetFlag(Py_VerboseFlag); 1217 SetFlag(Py_VerboseFlag);
1218 #ifdef RISCOS 1218 #ifdef RISCOS
1219 SetFlag(Py_RISCOSWimpFlag); 1219 SetFlag(Py_RISCOSWimpFlag);
1220 #endif 1220 #endif
1221 /* SetFlag(saw_unbuffered_flag); */ 1221 /* SetFlag(saw_unbuffered_flag); */
1222 /* SetFlag(skipfirstline); */ 1222 /* SetFlag(skipfirstline); */
1223 SetFlag(Py_BytesWarningFlag); 1223 SetFlag(Py_BytesWarningFlag);
1224 #undef SetFlag 1224 #undef SetFlag
1225 1225
1226 if (PyErr_Occurred()) { 1226 if (PyErr_Occurred()) {
1227 return NULL; 1227 return NULL;
1228 } 1228 }
1229 return seq; 1229 return seq;
1230 } 1230 }
1231 1231
1232 PyDoc_STRVAR(version_info__doc__, 1232 PyDoc_STRVAR(version_info__doc__,
1233 "sys.version_info\n\ 1233 "sys.version_info\n\
1234 \n\ 1234 \n\
1235 Version information as a named tuple."); 1235 Version information as a named tuple.");
1236 1236
1237 static PyTypeObject VersionInfoType; 1237 static PyTypeObject VersionInfoType;
1238 1238
1239 static PyStructSequence_Field version_info_fields[] = { 1239 static PyStructSequence_Field version_info_fields[] = {
1240 {"major", "Major release number"}, 1240 {"major", "Major release number"},
1241 {"minor", "Minor release number"}, 1241 {"minor", "Minor release number"},
1242 {"micro", "Patch release number"}, 1242 {"micro", "Patch release number"},
1243 {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"}, 1243 {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"},
1244 {"serial", "Serial release number"}, 1244 {"serial", "Serial release number"},
1245 {0} 1245 {0}
1246 }; 1246 };
1247 1247
1248 static PyStructSequence_Desc version_info_desc = { 1248 static PyStructSequence_Desc version_info_desc = {
1249 "sys.version_info", /* name */ 1249 "sys.version_info", /* name */
1250 version_info__doc__, /* doc */ 1250 version_info__doc__, /* doc */
1251 version_info_fields, /* fields */ 1251 version_info_fields, /* fields */
1252 5 1252 5
1253 }; 1253 };
1254 1254
1255 static PyObject * 1255 static PyObject *
1256 make_version_info(void) 1256 make_version_info(void)
1257 { 1257 {
1258 PyObject *version_info; 1258 PyObject *version_info;
1259 char *s; 1259 char *s;
1260 int pos = 0; 1260 int pos = 0;
1261 1261
1262 version_info = PyStructSequence_New(&VersionInfoType); 1262 version_info = PyStructSequence_New(&VersionInfoType);
1263 if (version_info == NULL) { 1263 if (version_info == NULL) {
1264 return NULL; 1264 return NULL;
1265 } 1265 }
1266 1266
1267 /* 1267 /*
1268 * These release level checks are mutually exclusive and cover 1268 * These release level checks are mutually exclusive and cover
1269 * the field, so don't get too fancy with the pre-processor! 1269 * the field, so don't get too fancy with the pre-processor!
1270 */ 1270 */
1271 #if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA 1271 #if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1272 s = "alpha"; 1272 s = "alpha";
1273 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA 1273 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1274 s = "beta"; 1274 s = "beta";
1275 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA 1275 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1276 s = "candidate"; 1276 s = "candidate";
1277 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL 1277 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1278 s = "final"; 1278 s = "final";
1279 #endif 1279 #endif
1280 1280
1281 #define SetIntItem(flag) \ 1281 #define SetIntItem(flag) \
1282 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag)) 1282 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
1283 #define SetStrItem(flag) \ 1283 #define SetStrItem(flag) \
1284 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag)) 1284 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
1285 1285
1286 SetIntItem(PY_MAJOR_VERSION); 1286 SetIntItem(PY_MAJOR_VERSION);
1287 SetIntItem(PY_MINOR_VERSION); 1287 SetIntItem(PY_MINOR_VERSION);
1288 SetIntItem(PY_MICRO_VERSION); 1288 SetIntItem(PY_MICRO_VERSION);
1289 SetStrItem(s); 1289 SetStrItem(s);
1290 SetIntItem(PY_RELEASE_SERIAL); 1290 SetIntItem(PY_RELEASE_SERIAL);
1291 #undef SetIntItem 1291 #undef SetIntItem
1292 #undef SetStrItem 1292 #undef SetStrItem
1293 1293
1294 if (PyErr_Occurred()) { 1294 if (PyErr_Occurred()) {
1295 Py_CLEAR(version_info); 1295 Py_CLEAR(version_info);
1296 return NULL; 1296 return NULL;
1297 } 1297 }
1298 return version_info; 1298 return version_info;
1299 } 1299 }
1300 1300
1301 static struct PyModuleDef sysmodule = { 1301 static struct PyModuleDef sysmodule = {
1302 PyModuleDef_HEAD_INIT, 1302 PyModuleDef_HEAD_INIT,
1303 "sys", 1303 "sys",
1304 sys_doc, 1304 sys_doc,
1305 -1, /* multiple "initialization" just copies the module dict. */ 1305 -1, /* multiple "initialization" just copies the module dict. */
1306 sys_methods, 1306 sys_methods,
1307 NULL, 1307 NULL,
1308 NULL, 1308 NULL,
1309 NULL, 1309 NULL,
1310 NULL 1310 NULL
1311 }; 1311 };
1312 1312
1313 PyObject * 1313 PyObject *
1314 _PySys_Init(void) 1314 _PySys_Init(void)
1315 { 1315 {
1316 PyObject *m, *v, *sysdict; 1316 PyObject *m, *v, *sysdict;
1317 char *s; 1317 char *s;
1318 1318
1319 m = PyModule_Create(&sysmodule); 1319 m = PyModule_Create(&sysmodule);
1320 if (m == NULL) 1320 if (m == NULL)
1321 return NULL; 1321 return NULL;
1322 sysdict = PyModule_GetDict(m); 1322 sysdict = PyModule_GetDict(m);
1323 #define SET_SYS_FROM_STRING(key, value) \ 1323 #define SET_SYS_FROM_STRING(key, value) \
1324 v = value; \ 1324 v = value; \
1325 if (v != NULL) \ 1325 if (v != NULL) \
1326 PyDict_SetItemString(sysdict, key, v); \ 1326 PyDict_SetItemString(sysdict, key, v); \
1327 Py_XDECREF(v) 1327 Py_XDECREF(v)
1328 1328
1329 /* Check that stdin is not a directory 1329 /* Check that stdin is not a directory
1330 Using shell redirection, you can redirect stdin to a directory, 1330 Using shell redirection, you can redirect stdin to a directory,
1331 crashing the Python interpreter. Catch this common mistake here 1331 crashing the Python interpreter. Catch this common mistake here
1332 and output a useful error message. Note that under MS Windows, 1332 and output a useful error message. Note that under MS Windows,
1333 the shell already prevents that. */ 1333 the shell already prevents that. */
1334 #if !defined(MS_WINDOWS) 1334 #if !defined(MS_WINDOWS)
1335 { 1335 {
1336 struct stat sb; 1336 struct stat sb;
1337 if (fstat(fileno(stdin), &sb) == 0 && 1337 if (fstat(fileno(stdin), &sb) == 0 &&
1338 S_ISDIR(sb.st_mode)) { 1338 S_ISDIR(sb.st_mode)) {
1339 /* There's nothing more we can do. */ 1339 /* There's nothing more we can do. */
1340 /* Py_FatalError() will core dump, so just exit. */ 1340 /* Py_FatalError() will core dump, so just exit. */
1341 PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n"); 1341 PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1342 exit(EXIT_FAILURE); 1342 exit(EXIT_FAILURE);
1343 } 1343 }
1344 } 1344 }
1345 #endif 1345 #endif
1346 1346
1347 /* stdin/stdout/stderr are now set by pythonrun.c */ 1347 /* stdin/stdout/stderr are now set by pythonrun.c */
1348 1348
1349 PyDict_SetItemString(sysdict, "__displayhook__", 1349 PyDict_SetItemString(sysdict, "__displayhook__",
1350 PyDict_GetItemString(sysdict, "displayhook")); 1350 PyDict_GetItemString(sysdict, "displayhook"));
1351 PyDict_SetItemString(sysdict, "__excepthook__", 1351 PyDict_SetItemString(sysdict, "__excepthook__",
1352 PyDict_GetItemString(sysdict, "excepthook")); 1352 PyDict_GetItemString(sysdict, "excepthook"));
1353 SET_SYS_FROM_STRING("version", 1353 SET_SYS_FROM_STRING("version",
1354 PyUnicode_FromString(Py_GetVersion())); 1354 PyUnicode_FromString(Py_GetVersion()));
1355 SET_SYS_FROM_STRING("hexversion", 1355 SET_SYS_FROM_STRING("hexversion",
1356 PyLong_FromLong(PY_VERSION_HEX)); 1356 PyLong_FromLong(PY_VERSION_HEX));
1357 svnversion_init(); 1357 svnversion_init();
1358 SET_SYS_FROM_STRING("subversion", 1358 SET_SYS_FROM_STRING("subversion",
1359 Py_BuildValue("(UUU)", "CPython", branch, 1359 Py_BuildValue("(UUU)", "CPython", branch,
1360 svn_revision)); 1360 svn_revision));
1361 SET_SYS_FROM_STRING("dont_write_bytecode", 1361 SET_SYS_FROM_STRING("dont_write_bytecode",
1362 PyBool_FromLong(Py_DontWriteBytecodeFlag)); 1362 PyBool_FromLong(Py_DontWriteBytecodeFlag));
1363 SET_SYS_FROM_STRING("api_version", 1363 SET_SYS_FROM_STRING("api_version",
1364 PyLong_FromLong(PYTHON_API_VERSION)); 1364 PyLong_FromLong(PYTHON_API_VERSION));
1365 SET_SYS_FROM_STRING("copyright", 1365 SET_SYS_FROM_STRING("copyright",
1366 PyUnicode_FromString(Py_GetCopyright())); 1366 PyUnicode_FromString(Py_GetCopyright()));
1367 SET_SYS_FROM_STRING("platform", 1367 SET_SYS_FROM_STRING("platform",
1368 PyUnicode_FromString(Py_GetPlatform())); 1368 PyUnicode_FromString(Py_GetPlatform()));
1369 SET_SYS_FROM_STRING("executable", 1369 SET_SYS_FROM_STRING("executable",
1370 PyUnicode_FromWideChar( 1370 PyUnicode_FromWideChar(
1371 Py_GetProgramFullPath(), -1)); 1371 Py_GetProgramFullPath(), -1));
1372 SET_SYS_FROM_STRING("prefix", 1372 SET_SYS_FROM_STRING("prefix",
1373 PyUnicode_FromWideChar(Py_GetPrefix(), -1)); 1373 PyUnicode_FromWideChar(Py_GetPrefix(), -1));
1374 SET_SYS_FROM_STRING("exec_prefix", 1374 SET_SYS_FROM_STRING("exec_prefix",
1375 PyUnicode_FromWideChar(Py_GetExecPrefix(), -1)); 1375 PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
1376 SET_SYS_FROM_STRING("maxsize", 1376 SET_SYS_FROM_STRING("maxsize",
1377 PyLong_FromSsize_t(PY_SSIZE_T_MAX)); 1377 PyLong_FromSsize_t(PY_SSIZE_T_MAX));
1378 SET_SYS_FROM_STRING("float_info", 1378 SET_SYS_FROM_STRING("float_info",
1379 PyFloat_GetInfo()); 1379 PyFloat_GetInfo());
1380 SET_SYS_FROM_STRING("int_info", 1380 SET_SYS_FROM_STRING("int_info",
1381 PyLong_GetInfo()); 1381 PyLong_GetInfo());
1382 SET_SYS_FROM_STRING("maxunicode", 1382 SET_SYS_FROM_STRING("maxunicode",
1383 PyLong_FromLong(PyUnicode_GetMax())); 1383 PyLong_FromLong(PyUnicode_GetMax()));
1384 SET_SYS_FROM_STRING("builtin_module_names", 1384 SET_SYS_FROM_STRING("builtin_module_names",
1385 list_builtin_module_names()); 1385 list_builtin_module_names());
1386 { 1386 {
1387 /* Assumes that longs are at least 2 bytes long. 1387 /* Assumes that longs are at least 2 bytes long.
1388 Should be safe! */ 1388 Should be safe! */
1389 unsigned long number = 1; 1389 unsigned long number = 1;
1390 char *value; 1390 char *value;
1391 1391
1392 s = (char *) &number; 1392 s = (char *) &number;
1393 if (s[0] == 0) 1393 if (s[0] == 0)
1394 value = "big"; 1394 value = "big";
1395 else 1395 else
1396 value = "little"; 1396 value = "little";
1397 SET_SYS_FROM_STRING("byteorder", 1397 SET_SYS_FROM_STRING("byteorder",
1398 PyUnicode_FromString(value)); 1398 PyUnicode_FromString(value));
1399 } 1399 }
1400 #ifdef MS_COREDLL 1400 #ifdef MS_COREDLL
1401 SET_SYS_FROM_STRING("dllhandle", 1401 SET_SYS_FROM_STRING("dllhandle",
1402 PyLong_FromVoidPtr(PyWin_DLLhModule)); 1402 PyLong_FromVoidPtr(PyWin_DLLhModule));
1403 SET_SYS_FROM_STRING("winver", 1403 SET_SYS_FROM_STRING("winver",
1404 PyUnicode_FromString(PyWin_DLLVersionString)); 1404 PyUnicode_FromString(PyWin_DLLVersionString));
1405 #endif 1405 #endif
1406 if (warnoptions == NULL) { 1406 if (warnoptions == NULL) {
1407 warnoptions = PyList_New(0); 1407 warnoptions = PyList_New(0);
1408 } 1408 }
1409 else { 1409 else {
1410 Py_INCREF(warnoptions); 1410 Py_INCREF(warnoptions);
1411 } 1411 }
1412 if (warnoptions != NULL) { 1412 if (warnoptions != NULL) {
1413 PyDict_SetItemString(sysdict, "warnoptions", warnoptions); 1413 PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
1414 } 1414 }
1415 1415
1416 /* version_info */ 1416 /* version_info */
1417 if (VersionInfoType.tp_name == 0) 1417 if (VersionInfoType.tp_name == 0)
1418 PyStructSequence_InitType(&VersionInfoType, &version_info_desc); 1418 PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
1419 SET_SYS_FROM_STRING("version_info", make_version_info()); 1419 SET_SYS_FROM_STRING("version_info", make_version_info());
1420 /* prevent user from creating new instances */ 1420 /* prevent user from creating new instances */
1421 VersionInfoType.tp_init = NULL; 1421 VersionInfoType.tp_init = NULL;
1422 VersionInfoType.tp_new = NULL; 1422 VersionInfoType.tp_new = NULL;
1423 1423
1424 /* flags */ 1424 /* flags */
1425 if (FlagsType.tp_name == 0) 1425 if (FlagsType.tp_name == 0)
1426 PyStructSequence_InitType(&FlagsType, &flags_desc); 1426 PyStructSequence_InitType(&FlagsType, &flags_desc);
1427 SET_SYS_FROM_STRING("flags", make_flags()); 1427 SET_SYS_FROM_STRING("flags", make_flags());
1428 /* prevent user from creating new instances */ 1428 /* prevent user from creating new instances */
1429 FlagsType.tp_init = NULL; 1429 FlagsType.tp_init = NULL;
1430 FlagsType.tp_new = NULL; 1430 FlagsType.tp_new = NULL;
1431 1431
1432 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */ 1432 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
1433 #ifndef PY_NO_SHORT_FLOAT_REPR 1433 #ifndef PY_NO_SHORT_FLOAT_REPR
1434 SET_SYS_FROM_STRING("float_repr_style", 1434 SET_SYS_FROM_STRING("float_repr_style",
1435 PyUnicode_FromString("short")); 1435 PyUnicode_FromString("short"));
1436 #else 1436 #else
1437 SET_SYS_FROM_STRING("float_repr_style", 1437 SET_SYS_FROM_STRING("float_repr_style",
1438 PyUnicode_FromString("legacy")); 1438 PyUnicode_FromString("legacy"));
1439 #endif 1439 #endif
1440 1440
1441 #undef SET_SYS_FROM_STRING 1441 #undef SET_SYS_FROM_STRING
1442 if (PyErr_Occurred()) 1442 if (PyErr_Occurred())
1443 return NULL; 1443 return NULL;
1444 return m; 1444 return m;
1445 } 1445 }
1446 1446
1447 static PyObject * 1447 static PyObject *
1448 makepathobject(const wchar_t *path, wchar_t delim) 1448 makepathobject(const wchar_t *path, wchar_t delim)
1449 { 1449 {
1450 int i, n; 1450 int i, n;
1451 const wchar_t *p; 1451 const wchar_t *p;
1452 PyObject *v, *w; 1452 PyObject *v, *w;
1453 1453
1454 n = 1; 1454 n = 1;
1455 p = path; 1455 p = path;
1456 while ((p = wcschr(p, delim)) != NULL) { 1456 while ((p = wcschr(p, delim)) != NULL) {
1457 n++; 1457 n++;
1458 p++; 1458 p++;
1459 } 1459 }
1460 v = PyList_New(n); 1460 v = PyList_New(n);
1461 if (v == NULL) 1461 if (v == NULL)
1462 return NULL; 1462 return NULL;
1463 for (i = 0; ; i++) { 1463 for (i = 0; ; i++) {
1464 p = wcschr(path, delim); 1464 p = wcschr(path, delim);
1465 if (p == NULL) 1465 if (p == NULL)
1466 p = path + wcslen(path); /* End of string */ 1466 p = path + wcslen(path); /* End of string */
1467 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path)); 1467 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
1468 if (w == NULL) { 1468 if (w == NULL) {
1469 Py_DECREF(v); 1469 Py_DECREF(v);
1470 return NULL; 1470 return NULL;
1471 } 1471 }
1472 PyList_SetItem(v, i, w); 1472 PyList_SetItem(v, i, w);
1473 if (*p == '\0') 1473 if (*p == '\0')
1474 break; 1474 break;
1475 path = p+1; 1475 path = p+1;
1476 } 1476 }
1477 return v; 1477 return v;
1478 } 1478 }
1479 1479
1480 void 1480 void
1481 PySys_SetPath(const wchar_t *path) 1481 PySys_SetPath(const wchar_t *path)
1482 { 1482 {
1483 PyObject *v; 1483 PyObject *v;
1484 if ((v = makepathobject(path, DELIM)) == NULL) 1484 if ((v = makepathobject(path, DELIM)) == NULL)
1485 Py_FatalError("can't create sys.path"); 1485 Py_FatalError("can't create sys.path");
1486 if (PySys_SetObject("path", v) != 0) 1486 if (PySys_SetObject("path", v) != 0)
1487 Py_FatalError("can't assign sys.path"); 1487 Py_FatalError("can't assign sys.path");
1488 Py_DECREF(v); 1488 Py_DECREF(v);
1489 } 1489 }
1490 1490
1491 static PyObject * 1491 static PyObject *
1492 makeargvobject(int argc, wchar_t **argv) 1492 makeargvobject(int argc, wchar_t **argv)
1493 { 1493 {
1494 PyObject *av; 1494 PyObject *av;
1495 if (argc <= 0 || argv == NULL) { 1495 if (argc <= 0 || argv == NULL) {
1496 /* Ensure at least one (empty) argument is seen */ 1496 /* Ensure at least one (empty) argument is seen */
1497 static wchar_t *empty_argv[1] = {L""}; 1497 static wchar_t *empty_argv[1] = {L""};
1498 argv = empty_argv; 1498 argv = empty_argv;
1499 argc = 1; 1499 argc = 1;
1500 } 1500 }
1501 av = PyList_New(argc); 1501 av = PyList_New(argc);
1502 if (av != NULL) { 1502 if (av != NULL) {
1503 int i; 1503 int i;
1504 for (i = 0; i < argc; i++) { 1504 for (i = 0; i < argc; i++) {
1505 #ifdef __VMS 1505 #ifdef __VMS
1506 PyObject *v; 1506 PyObject *v;
1507 1507
1508 /* argv[0] is the script pathname if known */ 1508 /* argv[0] is the script pathname if known */
1509 if (i == 0) { 1509 if (i == 0) {
1510 char* fn = decc$translate_vms(argv[0]); 1510 char* fn = decc$translate_vms(argv[0]);
1511 if ((fn == (char *)0) || fn == (char *)-1) 1511 if ((fn == (char *)0) || fn == (char *)-1)
1512 v = PyUnicode_FromString(argv[0]); 1512 v = PyUnicode_FromString(argv[0]);
1513 else 1513 else
1514 v = PyUnicode_FromString( 1514 v = PyUnicode_FromString(
1515 decc$translate_vms(argv[0])); 1515 decc$translate_vms(argv[0]));
1516 } else 1516 } else
1517 v = PyUnicode_FromString(argv[i]); 1517 v = PyUnicode_FromString(argv[i]);
1518 #else 1518 #else
1519 PyObject *v = PyUnicode_FromWideChar(argv[i], -1); 1519 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
1520 #endif 1520 #endif
1521 if (v == NULL) { 1521 if (v == NULL) {
1522 Py_DECREF(av); 1522 Py_DECREF(av);
1523 av = NULL; 1523 av = NULL;
1524 break; 1524 break;
1525 } 1525 }
1526 PyList_SetItem(av, i, v); 1526 PyList_SetItem(av, i, v);
1527 } 1527 }
1528 } 1528 }
1529 return av; 1529 return av;
1530 } 1530 }
1531 1531
1532 #ifdef HAVE_REALPATH 1532 #ifdef HAVE_REALPATH
1533 static wchar_t* 1533 static wchar_t*
1534 _wrealpath(const wchar_t *path, wchar_t *resolved_path) 1534 _wrealpath(const wchar_t *path, wchar_t *resolved_path)
1535 { 1535 {
1536 char cpath[PATH_MAX]; 1536 char cpath[PATH_MAX];
1537 char cresolved_path[PATH_MAX]; 1537 char cresolved_path[PATH_MAX];
1538 char *res; 1538 char *res;
1539 size_t r; 1539 size_t r;
1540 r = wcstombs(cpath, path, PATH_MAX); 1540 r = wcstombs(cpath, path, PATH_MAX);
1541 if (r == (size_t)-1 || r >= PATH_MAX) { 1541 if (r == (size_t)-1 || r >= PATH_MAX) {
1542 errno = EINVAL; 1542 errno = EINVAL;
1543 return NULL; 1543 return NULL;
1544 } 1544 }
1545 res = realpath(cpath, cresolved_path); 1545 res = realpath(cpath, cresolved_path);
1546 if (res == NULL) 1546 if (res == NULL)
1547 return NULL; 1547 return NULL;
1548 r = mbstowcs(resolved_path, cresolved_path, PATH_MAX); 1548 r = mbstowcs(resolved_path, cresolved_path, PATH_MAX);
1549 if (r == (size_t)-1 || r >= PATH_MAX) { 1549 if (r == (size_t)-1 || r >= PATH_MAX) {
1550 errno = EINVAL; 1550 errno = EINVAL;
1551 return NULL; 1551 return NULL;
1552 } 1552 }
1553 return resolved_path; 1553 return resolved_path;
1554 } 1554 }
1555 #endif 1555 #endif
1556 1556
1557 void 1557 void
1558 PySys_SetArgv(int argc, wchar_t **argv) 1558 PySys_SetArgv(int argc, wchar_t **argv)
1559 { 1559 {
1560 #if defined(HAVE_REALPATH) 1560 #if defined(HAVE_REALPATH)
1561 wchar_t fullpath[MAXPATHLEN]; 1561 wchar_t fullpath[MAXPATHLEN];
1562 #elif defined(MS_WINDOWS) && !defined(MS_WINCE) 1562 #elif defined(MS_WINDOWS) && !defined(MS_WINCE)
1563 wchar_t fullpath[MAX_PATH]; 1563 wchar_t fullpath[MAX_PATH];
1564 #endif 1564 #endif
1565 PyObject *av = makeargvobject(argc, argv); 1565 PyObject *av = makeargvobject(argc, argv);
1566 PyObject *path = PySys_GetObject("path"); 1566 PyObject *path = PySys_GetObject("path");
1567 if (av == NULL) 1567 if (av == NULL)
1568 Py_FatalError("no mem for sys.argv"); 1568 Py_FatalError("no mem for sys.argv");
1569 if (PySys_SetObject("argv", av) != 0) 1569 if (PySys_SetObject("argv", av) != 0)
1570 Py_FatalError("can't assign sys.argv"); 1570 Py_FatalError("can't assign sys.argv");
1571 if (path != NULL) { 1571 if (path != NULL) {
1572 wchar_t *argv0 = argv[0]; 1572 wchar_t *argv0 = argv[0];
1573 wchar_t *p = NULL; 1573 wchar_t *p = NULL;
1574 Py_ssize_t n = 0; 1574 Py_ssize_t n = 0;
1575 PyObject *a; 1575 PyObject *a;
1576 extern int _Py_wreadlink(const wchar_t *, wchar_t *, size_t); 1576 extern int _Py_wreadlink(const wchar_t *, wchar_t *, size_t);
1577 #ifdef HAVE_READLINK 1577 #ifdef HAVE_READLINK
1578 wchar_t link[MAXPATHLEN+1]; 1578 wchar_t link[MAXPATHLEN+1];
1579 wchar_t argv0copy[2*MAXPATHLEN+1]; 1579 wchar_t argv0copy[2*MAXPATHLEN+1];
1580 int nr = 0; 1580 int nr = 0;
1581 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) 1581 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0)
1582 nr = _Py_wreadlink(argv0, link, MAXPATHLEN); 1582 nr = _Py_wreadlink(argv0, link, MAXPATHLEN);
1583 if (nr > 0) { 1583 if (nr > 0) {
1584 /* It's a symlink */ 1584 /* It's a symlink */
1585 link[nr] = '\0'; 1585 link[nr] = '\0';
1586 if (link[0] == SEP) 1586 if (link[0] == SEP)
1587 argv0 = link; /* Link to absolute path */ 1587 argv0 = link; /* Link to absolute path */
1588 else if (wcschr(link, SEP) == NULL) 1588 else if (wcschr(link, SEP) == NULL)
1589 ; /* Link without path */ 1589 ; /* Link without path */
1590 else { 1590 else {
1591 /* Must join(dirname(argv0), link) */ 1591 /* Must join(dirname(argv0), link) */
1592 wchar_t *q = wcsrchr(argv0, SEP); 1592 wchar_t *q = wcsrchr(argv0, SEP);
1593 if (q == NULL) 1593 if (q == NULL)
1594 argv0 = link; /* argv0 without path */ 1594 argv0 = link; /* argv0 without path */
1595 else { 1595 else {
1596 /* Must make a copy */ 1596 /* Must make a copy */
1597 wcscpy(argv0copy, argv0); 1597 wcscpy(argv0copy, argv0);
1598 q = wcsrchr(argv0copy, SEP); 1598 q = wcsrchr(argv0copy, SEP);
1599 wcscpy(q+1, link); 1599 wcscpy(q+1, link);
1600 argv0 = argv0copy; 1600 argv0 = argv0copy;
1601 } 1601 }
1602 } 1602 }
1603 } 1603 }
1604 #endif /* HAVE_READLINK */ 1604 #endif /* HAVE_READLINK */
1605 #if SEP == '\\' /* Special case for MS filename syntax */ 1605 #if SEP == '\\' /* Special case for MS filename syntax */
1606 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) { 1606 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) {
1607 wchar_t *q; 1607 wchar_t *q;
1608 #if defined(MS_WINDOWS) && !defined(MS_WINCE) 1608 #if defined(MS_WINDOWS) && !defined(MS_WINCE)
1609 /* This code here replaces the first element in argv with the full 1609 /* This code here replaces the first element in argv with the full
1610 path that it represents. Under CE, there are no relative paths so 1610 path that it represents. Under CE, there are no relative paths so
1611 the argument must be the full path anyway. */ 1611 the argument must be the full path anyway. */
1612 wchar_t *ptemp; 1612 wchar_t *ptemp;
1613 if (GetFullPathNameW(argv0, 1613 if (GetFullPathNameW(argv0,
1614 sizeof(fullpath)/sizeof(fullpath[0]), 1614 sizeof(fullpath)/sizeof(fullpath[0]),
1615 fullpath, 1615 fullpath,
1616 &ptemp)) { 1616 &ptemp)) {
1617 argv0 = fullpath; 1617 argv0 = fullpath;
1618 } 1618 }
1619 #endif 1619 #endif
1620 p = wcsrchr(argv0, SEP); 1620 p = wcsrchr(argv0, SEP);
1621 /* Test for alternate separator */ 1621 /* Test for alternate separator */
1622 q = wcsrchr(p ? p : argv0, '/'); 1622 q = wcsrchr(p ? p : argv0, '/');
1623 if (q != NULL) 1623 if (q != NULL)
1624 p = q; 1624 p = q;
1625 if (p != NULL) { 1625 if (p != NULL) {
1626 n = p + 1 - argv0; 1626 n = p + 1 - argv0;
1627 if (n > 1 && p[-1] != ':') 1627 if (n > 1 && p[-1] != ':')
1628 n--; /* Drop trailing separator */ 1628 n--; /* Drop trailing separator */
1629 } 1629 }
1630 } 1630 }
1631 #else /* All other filename syntaxes */ 1631 #else /* All other filename syntaxes */
1632 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) { 1632 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) {
1633 #if defined(HAVE_REALPATH) 1633 #if defined(HAVE_REALPATH)
1634 if (_wrealpath(argv0, fullpath)) { 1634 if (_wrealpath(argv0, fullpath)) {
1635 argv0 = fullpath; 1635 argv0 = fullpath;
1636 } 1636 }
1637 #endif 1637 #endif
1638 p = wcsrchr(argv0, SEP); 1638 p = wcsrchr(argv0, SEP);
1639 } 1639 }
1640 if (p != NULL) { 1640 if (p != NULL) {
1641 n = p + 1 - argv0; 1641 n = p + 1 - argv0;
1642 #if SEP == '/' /* Special case for Unix filename syntax */ 1642 #if SEP == '/' /* Special case for Unix filename syntax */
1643 if (n > 1) 1643 if (n > 1)
1644 n--; /* Drop trailing separator */ 1644 n--; /* Drop trailing separator */
1645 #endif /* Unix */ 1645 #endif /* Unix */
1646 } 1646 }
1647 #endif /* All others */ 1647 #endif /* All others */
1648 a = PyUnicode_FromWideChar(argv0, n); 1648 a = PyUnicode_FromWideChar(argv0, n);
1649 if (a == NULL) 1649 if (a == NULL)
1650 Py_FatalError("no mem for sys.path insertion"); 1650 Py_FatalError("no mem for sys.path insertion");
1651 if (PyList_Insert(path, 0, a) < 0) 1651 if (PyList_Insert(path, 0, a) < 0)
1652 Py_FatalError("sys.path.insert(0) failed"); 1652 Py_FatalError("sys.path.insert(0) failed");
1653 Py_DECREF(a); 1653 Py_DECREF(a);
1654 } 1654 }
1655 Py_DECREF(av); 1655 Py_DECREF(av);
1656 } 1656 }
1657 1657
1658 /* Reimplementation of PyFile_WriteString() no calling indirectly 1658 /* Reimplementation of PyFile_WriteString() no calling indirectly
1659 PyErr_CheckSignals(): avoid the call to PyObject_Str(). */ 1659 PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
1660 1660
1661 static int 1661 static int
1662 sys_pyfile_write(const char *text, PyObject *file) 1662 sys_pyfile_write(const char *text, PyObject *file)
1663 { 1663 {
1664 PyObject *unicode = NULL, *writer = NULL, *args = NULL, *result = NULL; 1664 PyObject *unicode = NULL, *writer = NULL, *args = NULL, *result = NULL;
1665 int err; 1665 int err;
1666 1666
1667 unicode = PyUnicode_FromString(text); 1667 unicode = PyUnicode_FromString(text);
1668 if (unicode == NULL) 1668 if (unicode == NULL)
1669 goto error; 1669 goto error;
1670 1670
1671 writer = PyObject_GetAttrString(file, "write"); 1671 writer = PyObject_GetAttrString(file, "write");
1672 if (writer == NULL) 1672 if (writer == NULL)
1673 goto error; 1673 goto error;
1674 1674
1675 args = PyTuple_Pack(1, unicode); 1675 args = PyTuple_Pack(1, unicode);
1676 if (args == NULL) 1676 if (args == NULL)
1677 goto error; 1677 goto error;
1678 1678
1679 result = PyEval_CallObject(writer, args); 1679 result = PyEval_CallObject(writer, args);
1680 if (result == NULL) { 1680 if (result == NULL) {
1681 goto error; 1681 goto error;
1682 } else { 1682 } else {
1683 err = 0; 1683 err = 0;
1684 goto finally; 1684 goto finally;
1685 } 1685 }
1686 1686
1687 error: 1687 error:
1688 err = -1; 1688 err = -1;
1689 finally: 1689 finally:
1690 Py_XDECREF(unicode); 1690 Py_XDECREF(unicode);
1691 Py_XDECREF(writer); 1691 Py_XDECREF(writer);
1692 Py_XDECREF(args); 1692 Py_XDECREF(args);
1693 Py_XDECREF(result); 1693 Py_XDECREF(result);
1694 return err; 1694 return err;
1695 } 1695 }
1696 1696
1697 1697
1698 /* APIs to write to sys.stdout or sys.stderr using a printf-like interface. 1698 /* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1699 Adapted from code submitted by Just van Rossum. 1699 Adapted from code submitted by Just van Rossum.
1724 */ 1724 */
1725 1725
1726 static void 1726 static void
1727 mywrite(char *name, FILE *fp, const char *format, va_list va) 1727 mywrite(char *name, FILE *fp, const char *format, va_list va)
1728 { 1728 {
1729 PyObject *file; 1729 PyObject *file;
1730 PyObject *error_type, *error_value, *error_traceback; 1730 PyObject *error_type, *error_value, *error_traceback;
1731 char buffer[1001]; 1731 char buffer[1001];
1732 int written; 1732 int written;
1733 1733
1734 PyErr_Fetch(&error_type, &error_value, &error_traceback); 1734 PyErr_Fetch(&error_type, &error_value, &error_traceback);
1735 file = PySys_GetObject(name); 1735 file = PySys_GetObject(name);
1736 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); 1736 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
1737 if (sys_pyfile_write(buffer, file) != 0) { 1737 if (sys_pyfile_write(buffer, file) != 0) {
1738 PyErr_Clear(); 1738 PyErr_Clear();
1739 fputs(buffer, fp); 1739 fputs(buffer, fp);
1740 } 1740 }
1741 if (written < 0 || (size_t)written >= sizeof(buffer)) { 1741 if (written < 0 || (size_t)written >= sizeof(buffer)) {
1742 const char *truncated = "... truncated"; 1742 const char *truncated = "... truncated";
1743 if (sys_pyfile_write(truncated, file) != 0) { 1743 if (sys_pyfile_write(truncated, file) != 0) {
1744 PyErr_Clear(); 1744 PyErr_Clear();
1745 fputs(truncated, fp); 1745 fputs(truncated, fp);
1746 } 1746 }
1747 } 1747 }
1748 PyErr_Restore(error_type, error_value, error_traceback); 1748 PyErr_Restore(error_type, error_value, error_traceback);
1749 } 1749 }
1750 1750
1751 void 1751 void
1752 PySys_WriteStdout(const char *format, ...) 1752 PySys_WriteStdout(const char *format, ...)
1753 { 1753 {
1754 va_list va; 1754 va_list va;
1755 1755
1756 va_start(va, format); 1756 va_start(va, format);
1757 mywrite("stdout", stdout, format, va); 1757 mywrite("stdout", stdout, format, va);
1758 va_end(va); 1758 va_end(va);
1759 } 1759 }
1760 1760
1761 void 1761 void
1762 PySys_WriteStderr(const char *format, ...) 1762 PySys_WriteStderr(const char *format, ...)
1763 { 1763 {
1764 va_list va; 1764 va_list va;
1765 1765
1766 va_start(va, format); 1766 va_start(va, format);
1767 mywrite("stderr", stderr, format, va); 1767 mywrite("stderr", stderr, format, va);
1768 va_end(va); 1768 va_end(va);
1769 } 1769 }