comparison Python/sysmodule.c @ 61465:e38335d4df91 2.6

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 15:15:40 +0000
parents 5bb295a94b0f
children 3f08d98c8fa5
comparison
equal deleted inserted replaced
61461:b6e03ca8a206 61465:e38335d4df91
47 #endif 47 #endif
48 48
49 PyObject * 49 PyObject *
50 PySys_GetObject(char *name) 50 PySys_GetObject(char *name)
51 { 51 {
52 PyThreadState *tstate = PyThreadState_GET(); 52 PyThreadState *tstate = PyThreadState_GET();
53 PyObject *sd = tstate->interp->sysdict; 53 PyObject *sd = tstate->interp->sysdict;
54 if (sd == NULL) 54 if (sd == NULL)
55 return NULL; 55 return NULL;
56 return PyDict_GetItemString(sd, name); 56 return PyDict_GetItemString(sd, name);
57 } 57 }
58 58
59 FILE * 59 FILE *
60 PySys_GetFile(char *name, FILE *def) 60 PySys_GetFile(char *name, FILE *def)
61 { 61 {
62 FILE *fp = NULL; 62 FILE *fp = NULL;
63 PyObject *v = PySys_GetObject(name); 63 PyObject *v = PySys_GetObject(name);
64 if (v != NULL && PyFile_Check(v)) 64 if (v != NULL && PyFile_Check(v))
65 fp = PyFile_AsFile(v); 65 fp = PyFile_AsFile(v);
66 if (fp == NULL) 66 if (fp == NULL)
67 fp = def; 67 fp = def;
68 return fp; 68 return fp;
69 } 69 }
70 70
71 int 71 int
72 PySys_SetObject(char *name, PyObject *v) 72 PySys_SetObject(char *name, PyObject *v)
73 { 73 {
74 PyThreadState *tstate = PyThreadState_GET(); 74 PyThreadState *tstate = PyThreadState_GET();
75 PyObject *sd = tstate->interp->sysdict; 75 PyObject *sd = tstate->interp->sysdict;
76 if (v == NULL) { 76 if (v == NULL) {
77 if (PyDict_GetItemString(sd, name) == NULL) 77 if (PyDict_GetItemString(sd, name) == NULL)
78 return 0; 78 return 0;
79 else 79 else
80 return PyDict_DelItemString(sd, name); 80 return PyDict_DelItemString(sd, name);
81 } 81 }
82 else 82 else
83 return PyDict_SetItemString(sd, name, v); 83 return PyDict_SetItemString(sd, name, v);
84 } 84 }
85 85
86 static PyObject * 86 static PyObject *
87 sys_displayhook(PyObject *self, PyObject *o) 87 sys_displayhook(PyObject *self, PyObject *o)
88 { 88 {
89 PyObject *outf; 89 PyObject *outf;
90 PyInterpreterState *interp = PyThreadState_GET()->interp; 90 PyInterpreterState *interp = PyThreadState_GET()->interp;
91 PyObject *modules = interp->modules; 91 PyObject *modules = interp->modules;
92 PyObject *builtins = PyDict_GetItemString(modules, "__builtin__"); 92 PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
93 93
94 if (builtins == NULL) { 94 if (builtins == NULL) {
95 PyErr_SetString(PyExc_RuntimeError, "lost __builtin__"); 95 PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
96 return NULL; 96 return NULL;
97 } 97 }
98 98
99 /* Print value except if None */ 99 /* Print value except if None */
100 /* After printing, also assign to '_' */ 100 /* After printing, also assign to '_' */
101 /* Before, set '_' to None to avoid recursion */ 101 /* Before, set '_' to None to avoid recursion */
102 if (o == Py_None) { 102 if (o == Py_None) {
103 Py_INCREF(Py_None); 103 Py_INCREF(Py_None);
104 return Py_None; 104 return Py_None;
105 } 105 }
106 if (PyObject_SetAttrString(builtins, "_", Py_None) != 0) 106 if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
107 return NULL; 107 return NULL;
108 if (Py_FlushLine() != 0) 108 if (Py_FlushLine() != 0)
109 return NULL; 109 return NULL;
110 outf = PySys_GetObject("stdout"); 110 outf = PySys_GetObject("stdout");
111 if (outf == NULL) { 111 if (outf == NULL) {
112 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); 112 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
113 return NULL; 113 return NULL;
114 } 114 }
115 if (PyFile_WriteObject(o, outf, 0) != 0) 115 if (PyFile_WriteObject(o, outf, 0) != 0)
116 return NULL; 116 return NULL;
117 PyFile_SoftSpace(outf, 1); 117 PyFile_SoftSpace(outf, 1);
118 if (Py_FlushLine() != 0) 118 if (Py_FlushLine() != 0)
119 return NULL; 119 return NULL;
120 if (PyObject_SetAttrString(builtins, "_", o) != 0) 120 if (PyObject_SetAttrString(builtins, "_", o) != 0)
121 return NULL; 121 return NULL;
122 Py_INCREF(Py_None); 122 Py_INCREF(Py_None);
123 return Py_None; 123 return Py_None;
124 } 124 }
125 125
126 PyDoc_STRVAR(displayhook_doc, 126 PyDoc_STRVAR(displayhook_doc,
127 "displayhook(object) -> None\n" 127 "displayhook(object) -> None\n"
128 "\n" 128 "\n"
130 ); 130 );
131 131
132 static PyObject * 132 static PyObject *
133 sys_excepthook(PyObject* self, PyObject* args) 133 sys_excepthook(PyObject* self, PyObject* args)
134 { 134 {
135 PyObject *exc, *value, *tb; 135 PyObject *exc, *value, *tb;
136 if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb)) 136 if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
137 return NULL; 137 return NULL;
138 PyErr_Display(exc, value, tb); 138 PyErr_Display(exc, value, tb);
139 Py_INCREF(Py_None); 139 Py_INCREF(Py_None);
140 return Py_None; 140 return Py_None;
141 } 141 }
142 142
143 PyDoc_STRVAR(excepthook_doc, 143 PyDoc_STRVAR(excepthook_doc,
144 "excepthook(exctype, value, traceback) -> None\n" 144 "excepthook(exctype, value, traceback) -> None\n"
145 "\n" 145 "\n"
147 ); 147 );
148 148
149 static PyObject * 149 static PyObject *
150 sys_exc_info(PyObject *self, PyObject *noargs) 150 sys_exc_info(PyObject *self, PyObject *noargs)
151 { 151 {
152 PyThreadState *tstate; 152 PyThreadState *tstate;
153 tstate = PyThreadState_GET(); 153 tstate = PyThreadState_GET();
154 return Py_BuildValue( 154 return Py_BuildValue(
155 "(OOO)", 155 "(OOO)",
156 tstate->exc_type != NULL ? tstate->exc_type : Py_None, 156 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
157 tstate->exc_value != NULL ? tstate->exc_value : Py_None, 157 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
158 tstate->exc_traceback != NULL ? 158 tstate->exc_traceback != NULL ?
159 tstate->exc_traceback : Py_None); 159 tstate->exc_traceback : Py_None);
160 } 160 }
161 161
162 PyDoc_STRVAR(exc_info_doc, 162 PyDoc_STRVAR(exc_info_doc,
163 "exc_info() -> (type, value, traceback)\n\ 163 "exc_info() -> (type, value, traceback)\n\
164 \n\ 164 \n\
167 ); 167 );
168 168
169 static PyObject * 169 static PyObject *
170 sys_exc_clear(PyObject *self, PyObject *noargs) 170 sys_exc_clear(PyObject *self, PyObject *noargs)
171 { 171 {
172 PyThreadState *tstate; 172 PyThreadState *tstate;
173 PyObject *tmp_type, *tmp_value, *tmp_tb; 173 PyObject *tmp_type, *tmp_value, *tmp_tb;
174 174
175 if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; " 175 if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; "
176 "use except clauses", 1) < 0) 176 "use except clauses", 1) < 0)
177 return NULL; 177 return NULL;
178 178
179 tstate = PyThreadState_GET(); 179 tstate = PyThreadState_GET();
180 tmp_type = tstate->exc_type; 180 tmp_type = tstate->exc_type;
181 tmp_value = tstate->exc_value; 181 tmp_value = tstate->exc_value;
182 tmp_tb = tstate->exc_traceback; 182 tmp_tb = tstate->exc_traceback;
183 tstate->exc_type = NULL; 183 tstate->exc_type = NULL;
184 tstate->exc_value = NULL; 184 tstate->exc_value = NULL;
185 tstate->exc_traceback = NULL; 185 tstate->exc_traceback = NULL;
186 Py_XDECREF(tmp_type); 186 Py_XDECREF(tmp_type);
187 Py_XDECREF(tmp_value); 187 Py_XDECREF(tmp_value);
188 Py_XDECREF(tmp_tb); 188 Py_XDECREF(tmp_tb);
189 /* For b/w compatibility */ 189 /* For b/w compatibility */
190 PySys_SetObject("exc_type", Py_None); 190 PySys_SetObject("exc_type", Py_None);
191 PySys_SetObject("exc_value", Py_None); 191 PySys_SetObject("exc_value", Py_None);
192 PySys_SetObject("exc_traceback", Py_None); 192 PySys_SetObject("exc_traceback", Py_None);
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(exc_clear_doc, 197 PyDoc_STRVAR(exc_clear_doc,
198 "exc_clear() -> None\n\ 198 "exc_clear() -> None\n\
199 \n\ 199 \n\
204 ); 204 );
205 205
206 static PyObject * 206 static PyObject *
207 sys_exit(PyObject *self, PyObject *args) 207 sys_exit(PyObject *self, PyObject *args)
208 { 208 {
209 PyObject *exit_code = 0; 209 PyObject *exit_code = 0;
210 if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code)) 210 if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
211 return NULL; 211 return NULL;
212 /* Raise SystemExit so callers may catch it or clean up. */ 212 /* Raise SystemExit so callers may catch it or clean up. */
213 PyErr_SetObject(PyExc_SystemExit, exit_code); 213 PyErr_SetObject(PyExc_SystemExit, exit_code);
214 return NULL; 214 return NULL;
215 } 215 }
216 216
217 PyDoc_STRVAR(exit_doc, 217 PyDoc_STRVAR(exit_doc,
218 "exit([status])\n\ 218 "exit([status])\n\
219 \n\ 219 \n\
227 #ifdef Py_USING_UNICODE 227 #ifdef Py_USING_UNICODE
228 228
229 static PyObject * 229 static PyObject *
230 sys_getdefaultencoding(PyObject *self) 230 sys_getdefaultencoding(PyObject *self)
231 { 231 {
232 return PyString_FromString(PyUnicode_GetDefaultEncoding()); 232 return PyString_FromString(PyUnicode_GetDefaultEncoding());
233 } 233 }
234 234
235 PyDoc_STRVAR(getdefaultencoding_doc, 235 PyDoc_STRVAR(getdefaultencoding_doc,
236 "getdefaultencoding() -> string\n\ 236 "getdefaultencoding() -> string\n\
237 \n\ 237 \n\
240 ); 240 );
241 241
242 static PyObject * 242 static PyObject *
243 sys_setdefaultencoding(PyObject *self, PyObject *args) 243 sys_setdefaultencoding(PyObject *self, PyObject *args)
244 { 244 {
245 char *encoding; 245 char *encoding;
246 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding)) 246 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
247 return NULL; 247 return NULL;
248 if (PyUnicode_SetDefaultEncoding(encoding)) 248 if (PyUnicode_SetDefaultEncoding(encoding))
249 return NULL; 249 return NULL;
250 Py_INCREF(Py_None); 250 Py_INCREF(Py_None);
251 return Py_None; 251 return Py_None;
252 } 252 }
253 253
254 PyDoc_STRVAR(setdefaultencoding_doc, 254 PyDoc_STRVAR(setdefaultencoding_doc,
255 "setdefaultencoding(encoding)\n\ 255 "setdefaultencoding(encoding)\n\
256 \n\ 256 \n\
258 ); 258 );
259 259
260 static PyObject * 260 static PyObject *
261 sys_getfilesystemencoding(PyObject *self) 261 sys_getfilesystemencoding(PyObject *self)
262 { 262 {
263 if (Py_FileSystemDefaultEncoding) 263 if (Py_FileSystemDefaultEncoding)
264 return PyString_FromString(Py_FileSystemDefaultEncoding); 264 return PyString_FromString(Py_FileSystemDefaultEncoding);
265 Py_INCREF(Py_None); 265 Py_INCREF(Py_None);
266 return Py_None; 266 return Py_None;
267 } 267 }
268 268
269 PyDoc_STRVAR(getfilesystemencoding_doc, 269 PyDoc_STRVAR(getfilesystemencoding_doc,
270 "getfilesystemencoding() -> string\n\ 270 "getfilesystemencoding() -> string\n\
271 \n\ 271 \n\
282 static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; 282 static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
283 283
284 static int 284 static int
285 trace_init(void) 285 trace_init(void)
286 { 286 {
287 static char *whatnames[7] = {"call", "exception", "line", "return", 287 static char *whatnames[7] = {"call", "exception", "line", "return",
288 "c_call", "c_exception", "c_return"}; 288 "c_call", "c_exception", "c_return"};
289 PyObject *name; 289 PyObject *name;
290 int i; 290 int i;
291 for (i = 0; i < 7; ++i) { 291 for (i = 0; i < 7; ++i) {
292 if (whatstrings[i] == NULL) { 292 if (whatstrings[i] == NULL) {
293 name = PyString_InternFromString(whatnames[i]); 293 name = PyString_InternFromString(whatnames[i]);
294 if (name == NULL) 294 if (name == NULL)
295 return -1; 295 return -1;
296 whatstrings[i] = name; 296 whatstrings[i] = name;
297 } 297 }
298 } 298 }
299 return 0; 299 return 0;
300 } 300 }
301 301
302 302
303 static PyObject * 303 static PyObject *
304 call_trampoline(PyThreadState *tstate, PyObject* callback, 304 call_trampoline(PyThreadState *tstate, PyObject* callback,
305 PyFrameObject *frame, int what, PyObject *arg) 305 PyFrameObject *frame, int what, PyObject *arg)
306 { 306 {
307 PyObject *args = PyTuple_New(3); 307 PyObject *args = PyTuple_New(3);
308 PyObject *whatstr; 308 PyObject *whatstr;
309 PyObject *result; 309 PyObject *result;
310 310
311 if (args == NULL) 311 if (args == NULL)
312 return NULL; 312 return NULL;
313 Py_INCREF(frame); 313 Py_INCREF(frame);
314 whatstr = whatstrings[what]; 314 whatstr = whatstrings[what];
315 Py_INCREF(whatstr); 315 Py_INCREF(whatstr);
316 if (arg == NULL) 316 if (arg == NULL)
317 arg = Py_None; 317 arg = Py_None;
318 Py_INCREF(arg); 318 Py_INCREF(arg);
319 PyTuple_SET_ITEM(args, 0, (PyObject *)frame); 319 PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
320 PyTuple_SET_ITEM(args, 1, whatstr); 320 PyTuple_SET_ITEM(args, 1, whatstr);
321 PyTuple_SET_ITEM(args, 2, arg); 321 PyTuple_SET_ITEM(args, 2, arg);
322 322
323 /* call the Python-level function */ 323 /* call the Python-level function */
324 PyFrame_FastToLocals(frame); 324 PyFrame_FastToLocals(frame);
325 result = PyEval_CallObject(callback, args); 325 result = PyEval_CallObject(callback, args);
326 PyFrame_LocalsToFast(frame, 1); 326 PyFrame_LocalsToFast(frame, 1);
327 if (result == NULL) 327 if (result == NULL)
328 PyTraceBack_Here(frame); 328 PyTraceBack_Here(frame);
329 329
330 /* cleanup */ 330 /* cleanup */
331 Py_DECREF(args); 331 Py_DECREF(args);
332 return result; 332 return result;
333 } 333 }
334 334
335 static int 335 static int
336 profile_trampoline(PyObject *self, PyFrameObject *frame, 336 profile_trampoline(PyObject *self, PyFrameObject *frame,
337 int what, PyObject *arg) 337 int what, PyObject *arg)
338 { 338 {
339 PyThreadState *tstate = frame->f_tstate; 339 PyThreadState *tstate = frame->f_tstate;
340 PyObject *result; 340 PyObject *result;
341 341
342 if (arg == NULL) 342 if (arg == NULL)
343 arg = Py_None; 343 arg = Py_None;
344 result = call_trampoline(tstate, self, frame, what, arg); 344 result = call_trampoline(tstate, self, frame, what, arg);
345 if (result == NULL) { 345 if (result == NULL) {
346 PyEval_SetProfile(NULL, NULL); 346 PyEval_SetProfile(NULL, NULL);
347 return -1; 347 return -1;
348 } 348 }
349 Py_DECREF(result); 349 Py_DECREF(result);
350 return 0; 350 return 0;
351 } 351 }
352 352
353 static int 353 static int
354 trace_trampoline(PyObject *self, PyFrameObject *frame, 354 trace_trampoline(PyObject *self, PyFrameObject *frame,
355 int what, PyObject *arg) 355 int what, PyObject *arg)
356 { 356 {
357 PyThreadState *tstate = frame->f_tstate; 357 PyThreadState *tstate = frame->f_tstate;
358 PyObject *callback; 358 PyObject *callback;
359 PyObject *result; 359 PyObject *result;
360 360
361 if (what == PyTrace_CALL) 361 if (what == PyTrace_CALL)
362 callback = self; 362 callback = self;
363 else 363 else
364 callback = frame->f_trace; 364 callback = frame->f_trace;
365 if (callback == NULL) 365 if (callback == NULL)
366 return 0; 366 return 0;
367 result = call_trampoline(tstate, callback, frame, what, arg); 367 result = call_trampoline(tstate, callback, frame, what, arg);
368 if (result == NULL) { 368 if (result == NULL) {
369 PyEval_SetTrace(NULL, NULL); 369 PyEval_SetTrace(NULL, NULL);
370 Py_XDECREF(frame->f_trace); 370 Py_XDECREF(frame->f_trace);
371 frame->f_trace = NULL; 371 frame->f_trace = NULL;
372 return -1; 372 return -1;
373 } 373 }
374 if (result != Py_None) { 374 if (result != Py_None) {
375 PyObject *temp = frame->f_trace; 375 PyObject *temp = frame->f_trace;
376 frame->f_trace = NULL; 376 frame->f_trace = NULL;
377 Py_XDECREF(temp); 377 Py_XDECREF(temp);
378 frame->f_trace = result; 378 frame->f_trace = result;
379 } 379 }
380 else { 380 else {
381 Py_DECREF(result); 381 Py_DECREF(result);
382 } 382 }
383 return 0; 383 return 0;
384 } 384 }
385 385
386 static PyObject * 386 static PyObject *
387 sys_settrace(PyObject *self, PyObject *args) 387 sys_settrace(PyObject *self, PyObject *args)
388 { 388 {
389 if (trace_init() == -1) 389 if (trace_init() == -1)
390 return NULL; 390 return NULL;
391 if (args == Py_None) 391 if (args == Py_None)
392 PyEval_SetTrace(NULL, NULL); 392 PyEval_SetTrace(NULL, NULL);
393 else 393 else
394 PyEval_SetTrace(trace_trampoline, args); 394 PyEval_SetTrace(trace_trampoline, args);
395 Py_INCREF(Py_None); 395 Py_INCREF(Py_None);
396 return Py_None; 396 return Py_None;
397 } 397 }
398 398
399 PyDoc_STRVAR(settrace_doc, 399 PyDoc_STRVAR(settrace_doc,
400 "settrace(function)\n\ 400 "settrace(function)\n\
401 \n\ 401 \n\
404 ); 404 );
405 405
406 static PyObject * 406 static PyObject *
407 sys_gettrace(PyObject *self, PyObject *args) 407 sys_gettrace(PyObject *self, PyObject *args)
408 { 408 {
409 PyThreadState *tstate = PyThreadState_GET(); 409 PyThreadState *tstate = PyThreadState_GET();
410 PyObject *temp = tstate->c_traceobj; 410 PyObject *temp = tstate->c_traceobj;
411 411
412 if (temp == NULL) 412 if (temp == NULL)
413 temp = Py_None; 413 temp = Py_None;
414 Py_INCREF(temp); 414 Py_INCREF(temp);
415 return temp; 415 return temp;
416 } 416 }
417 417
418 PyDoc_STRVAR(gettrace_doc, 418 PyDoc_STRVAR(gettrace_doc,
419 "gettrace()\n\ 419 "gettrace()\n\
420 \n\ 420 \n\
423 ); 423 );
424 424
425 static PyObject * 425 static PyObject *
426 sys_setprofile(PyObject *self, PyObject *args) 426 sys_setprofile(PyObject *self, PyObject *args)
427 { 427 {
428 if (trace_init() == -1) 428 if (trace_init() == -1)
429 return NULL; 429 return NULL;
430 if (args == Py_None) 430 if (args == Py_None)
431 PyEval_SetProfile(NULL, NULL); 431 PyEval_SetProfile(NULL, NULL);
432 else 432 else
433 PyEval_SetProfile(profile_trampoline, args); 433 PyEval_SetProfile(profile_trampoline, args);
434 Py_INCREF(Py_None); 434 Py_INCREF(Py_None);
435 return Py_None; 435 return Py_None;
436 } 436 }
437 437
438 PyDoc_STRVAR(setprofile_doc, 438 PyDoc_STRVAR(setprofile_doc,
439 "setprofile(function)\n\ 439 "setprofile(function)\n\
440 \n\ 440 \n\
443 ); 443 );
444 444
445 static PyObject * 445 static PyObject *
446 sys_getprofile(PyObject *self, PyObject *args) 446 sys_getprofile(PyObject *self, PyObject *args)
447 { 447 {
448 PyThreadState *tstate = PyThreadState_GET(); 448 PyThreadState *tstate = PyThreadState_GET();
449 PyObject *temp = tstate->c_profileobj; 449 PyObject *temp = tstate->c_profileobj;
450 450
451 if (temp == NULL) 451 if (temp == NULL)
452 temp = Py_None; 452 temp = Py_None;
453 Py_INCREF(temp); 453 Py_INCREF(temp);
454 return temp; 454 return temp;
455 } 455 }
456 456
457 PyDoc_STRVAR(getprofile_doc, 457 PyDoc_STRVAR(getprofile_doc,
458 "getprofile()\n\ 458 "getprofile()\n\
459 \n\ 459 \n\
462 ); 462 );
463 463
464 static PyObject * 464 static PyObject *
465 sys_setcheckinterval(PyObject *self, PyObject *args) 465 sys_setcheckinterval(PyObject *self, PyObject *args)
466 { 466 {
467 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval)) 467 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
468 return NULL; 468 return NULL;
469 Py_INCREF(Py_None); 469 Py_INCREF(Py_None);
470 return Py_None; 470 return Py_None;
471 } 471 }
472 472
473 PyDoc_STRVAR(setcheckinterval_doc, 473 PyDoc_STRVAR(setcheckinterval_doc,
474 "setcheckinterval(n)\n\ 474 "setcheckinterval(n)\n\
475 \n\ 475 \n\
478 ); 478 );
479 479
480 static PyObject * 480 static PyObject *
481 sys_getcheckinterval(PyObject *self, PyObject *args) 481 sys_getcheckinterval(PyObject *self, PyObject *args)
482 { 482 {
483 return PyInt_FromLong(_Py_CheckInterval); 483 return PyInt_FromLong(_Py_CheckInterval);
484 } 484 }
485 485
486 PyDoc_STRVAR(getcheckinterval_doc, 486 PyDoc_STRVAR(getcheckinterval_doc,
487 "getcheckinterval() -> current check interval; see setcheckinterval()." 487 "getcheckinterval() -> current check interval; see setcheckinterval()."
488 ); 488 );
489 489
490 #ifdef WITH_TSC 490 #ifdef WITH_TSC
491 static PyObject * 491 static PyObject *
492 sys_settscdump(PyObject *self, PyObject *args) 492 sys_settscdump(PyObject *self, PyObject *args)
493 { 493 {
494 int bool; 494 int bool;
495 PyThreadState *tstate = PyThreadState_Get(); 495 PyThreadState *tstate = PyThreadState_Get();
496 496
497 if (!PyArg_ParseTuple(args, "i:settscdump", &bool)) 497 if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
498 return NULL; 498 return NULL;
499 if (bool) 499 if (bool)
500 tstate->interp->tscdump = 1; 500 tstate->interp->tscdump = 1;
501 else 501 else
502 tstate->interp->tscdump = 0; 502 tstate->interp->tscdump = 0;
503 Py_INCREF(Py_None); 503 Py_INCREF(Py_None);
504 return Py_None; 504 return Py_None;
505 505
506 } 506 }
507 507
508 PyDoc_STRVAR(settscdump_doc, 508 PyDoc_STRVAR(settscdump_doc,
509 "settscdump(bool)\n\ 509 "settscdump(bool)\n\
515 #endif /* TSC */ 515 #endif /* TSC */
516 516
517 static PyObject * 517 static PyObject *
518 sys_setrecursionlimit(PyObject *self, PyObject *args) 518 sys_setrecursionlimit(PyObject *self, PyObject *args)
519 { 519 {
520 int new_limit; 520 int new_limit;
521 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit)) 521 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
522 return NULL; 522 return NULL;
523 if (new_limit <= 0) { 523 if (new_limit <= 0) {
524 PyErr_SetString(PyExc_ValueError, 524 PyErr_SetString(PyExc_ValueError,
525 "recursion limit must be positive"); 525 "recursion limit must be positive");
526 return NULL; 526 return NULL;
527 } 527 }
528 Py_SetRecursionLimit(new_limit); 528 Py_SetRecursionLimit(new_limit);
529 Py_INCREF(Py_None); 529 Py_INCREF(Py_None);
530 return Py_None; 530 return Py_None;
531 } 531 }
532 532
533 PyDoc_STRVAR(setrecursionlimit_doc, 533 PyDoc_STRVAR(setrecursionlimit_doc,
534 "setrecursionlimit(n)\n\ 534 "setrecursionlimit(n)\n\
535 \n\ 535 \n\
540 ); 540 );
541 541
542 static PyObject * 542 static PyObject *
543 sys_getrecursionlimit(PyObject *self) 543 sys_getrecursionlimit(PyObject *self)
544 { 544 {
545 return PyInt_FromLong(Py_GetRecursionLimit()); 545 return PyInt_FromLong(Py_GetRecursionLimit());
546 } 546 }
547 547
548 PyDoc_STRVAR(getrecursionlimit_doc, 548 PyDoc_STRVAR(getrecursionlimit_doc,
549 "getrecursionlimit()\n\ 549 "getrecursionlimit()\n\
550 \n\ 550 \n\
565 ); 565 );
566 566
567 static PyObject * 567 static PyObject *
568 sys_getwindowsversion(PyObject *self) 568 sys_getwindowsversion(PyObject *self)
569 { 569 {
570 OSVERSIONINFO ver; 570 OSVERSIONINFO ver;
571 ver.dwOSVersionInfoSize = sizeof(ver); 571 ver.dwOSVersionInfoSize = sizeof(ver);
572 if (!GetVersionEx(&ver)) 572 if (!GetVersionEx(&ver))
573 return PyErr_SetFromWindowsErr(0); 573 return PyErr_SetFromWindowsErr(0);
574 return Py_BuildValue("HHHHs", 574 return Py_BuildValue("HHHHs",
575 ver.dwMajorVersion, 575 ver.dwMajorVersion,
576 ver.dwMinorVersion, 576 ver.dwMinorVersion,
577 ver.dwBuildNumber, 577 ver.dwBuildNumber,
578 ver.dwPlatformId, 578 ver.dwPlatformId,
579 ver.szCSDVersion); 579 ver.szCSDVersion);
580 } 580 }
581 581
582 #endif /* MS_WINDOWS */ 582 #endif /* MS_WINDOWS */
583 583
584 #ifdef HAVE_DLOPEN 584 #ifdef HAVE_DLOPEN
585 static PyObject * 585 static PyObject *
586 sys_setdlopenflags(PyObject *self, PyObject *args) 586 sys_setdlopenflags(PyObject *self, PyObject *args)
587 { 587 {
588 int new_val; 588 int new_val;
589 PyThreadState *tstate = PyThreadState_GET(); 589 PyThreadState *tstate = PyThreadState_GET();
590 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val)) 590 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
591 return NULL; 591 return NULL;
592 if (!tstate) 592 if (!tstate)
593 return NULL; 593 return NULL;
594 tstate->interp->dlopenflags = new_val; 594 tstate->interp->dlopenflags = new_val;
595 Py_INCREF(Py_None); 595 Py_INCREF(Py_None);
596 return Py_None; 596 return Py_None;
597 } 597 }
598 598
599 PyDoc_STRVAR(setdlopenflags_doc, 599 PyDoc_STRVAR(setdlopenflags_doc,
600 "setdlopenflags(n) -> None\n\ 600 "setdlopenflags(n) -> None\n\
601 \n\ 601 \n\
607 ); 607 );
608 608
609 static PyObject * 609 static PyObject *
610 sys_getdlopenflags(PyObject *self, PyObject *args) 610 sys_getdlopenflags(PyObject *self, PyObject *args)
611 { 611 {
612 PyThreadState *tstate = PyThreadState_GET(); 612 PyThreadState *tstate = PyThreadState_GET();
613 if (!tstate) 613 if (!tstate)
614 return NULL; 614 return NULL;
615 return PyInt_FromLong(tstate->interp->dlopenflags); 615 return PyInt_FromLong(tstate->interp->dlopenflags);
616 } 616 }
617 617
618 PyDoc_STRVAR(getdlopenflags_doc, 618 PyDoc_STRVAR(getdlopenflags_doc,
619 "getdlopenflags() -> int\n\ 619 "getdlopenflags() -> int\n\
620 \n\ 620 \n\
628 #include <malloc.h> 628 #include <malloc.h>
629 629
630 static PyObject * 630 static PyObject *
631 sys_mdebug(PyObject *self, PyObject *args) 631 sys_mdebug(PyObject *self, PyObject *args)
632 { 632 {
633 int flag; 633 int flag;
634 if (!PyArg_ParseTuple(args, "i:mdebug", &flag)) 634 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
635 return NULL; 635 return NULL;
636 mallopt(M_DEBUG, flag); 636 mallopt(M_DEBUG, flag);
637 Py_INCREF(Py_None); 637 Py_INCREF(Py_None);
638 return Py_None; 638 return Py_None;
639 } 639 }
640 #endif /* USE_MALLOPT */ 640 #endif /* USE_MALLOPT */
641 641
642 static PyObject * 642 static PyObject *
643 sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) 643 sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
644 { 644 {
645 PyObject *res = NULL; 645 PyObject *res = NULL;
646 static PyObject *str__sizeof__, *gc_head_size = NULL; 646 static PyObject *str__sizeof__, *gc_head_size = NULL;
647 static char *kwlist[] = {"object", "default", 0}; 647 static char *kwlist[] = {"object", "default", 0};
648 PyObject *o, *dflt = NULL; 648 PyObject *o, *dflt = NULL;
649 649
650 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", 650 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
651 kwlist, &o, &dflt)) 651 kwlist, &o, &dflt))
652 return NULL; 652 return NULL;
653 653
654 /* Initialize static variable needed by _PyType_Lookup */ 654 /* Initialize static variable needed by _PyType_Lookup */
655 if (str__sizeof__ == NULL) { 655 if (str__sizeof__ == NULL) {
656 str__sizeof__ = PyString_InternFromString("__sizeof__"); 656 str__sizeof__ = PyString_InternFromString("__sizeof__");
657 if (str__sizeof__ == NULL) 657 if (str__sizeof__ == NULL)
658 return NULL; 658 return NULL;
659 } 659 }
660 660
661 /* Initialize static variable for GC head size */ 661 /* Initialize static variable for GC head size */
662 if (gc_head_size == NULL) { 662 if (gc_head_size == NULL) {
663 gc_head_size = PyInt_FromSsize_t(sizeof(PyGC_Head)); 663 gc_head_size = PyInt_FromSsize_t(sizeof(PyGC_Head));
664 if (gc_head_size == NULL) 664 if (gc_head_size == NULL)
665 return NULL; 665 return NULL;
666 } 666 }
667 667
668 /* Make sure the type is initialized. float gets initialized late */ 668 /* Make sure the type is initialized. float gets initialized late */
669 if (PyType_Ready(Py_TYPE(o)) < 0) 669 if (PyType_Ready(Py_TYPE(o)) < 0)
670 return NULL; 670 return NULL;
671 671
672 /* Instance of old-style class */ 672 /* Instance of old-style class */
673 if (PyInstance_Check(o)) 673 if (PyInstance_Check(o))
674 res = PyInt_FromSsize_t(PyInstance_Type.tp_basicsize); 674 res = PyInt_FromSsize_t(PyInstance_Type.tp_basicsize);
675 /* all other objects */ 675 /* all other objects */
676 else { 676 else {
677 PyObject *method = _PyType_Lookup(Py_TYPE(o), 677 PyObject *method = _PyType_Lookup(Py_TYPE(o),
678 str__sizeof__); 678 str__sizeof__);
679 if (method == NULL) 679 if (method == NULL)
680 PyErr_Format(PyExc_TypeError, 680 PyErr_Format(PyExc_TypeError,
681 "Type %.100s doesn't define __sizeof__", 681 "Type %.100s doesn't define __sizeof__",
682 Py_TYPE(o)->tp_name); 682 Py_TYPE(o)->tp_name);
683 else 683 else
684 res = PyObject_CallFunctionObjArgs(method, o, NULL); 684 res = PyObject_CallFunctionObjArgs(method, o, NULL);
685 } 685 }
686 686
687 /* Has a default value been given? */ 687 /* Has a default value been given? */
688 if ((res == NULL) && (dflt != NULL) && 688 if ((res == NULL) && (dflt != NULL) &&
689 PyErr_ExceptionMatches(PyExc_TypeError)) 689 PyErr_ExceptionMatches(PyExc_TypeError))
690 { 690 {
691 PyErr_Clear(); 691 PyErr_Clear();
692 Py_INCREF(dflt); 692 Py_INCREF(dflt);
693 return dflt; 693 return dflt;
694 } 694 }
695 else if (res == NULL) 695 else if (res == NULL)
696 return res; 696 return res;
697 697
698 /* add gc_head size */ 698 /* add gc_head size */
699 if (PyObject_IS_GC(o)) { 699 if (PyObject_IS_GC(o)) {
700 PyObject *tmp = res; 700 PyObject *tmp = res;
701 res = PyNumber_Add(tmp, gc_head_size); 701 res = PyNumber_Add(tmp, gc_head_size);
702 Py_DECREF(tmp); 702 Py_DECREF(tmp);
703 } 703 }
704 return res; 704 return res;
705 } 705 }
706 706
707 PyDoc_STRVAR(getsizeof_doc, 707 PyDoc_STRVAR(getsizeof_doc,
708 "getsizeof(object, default) -> int\n\ 708 "getsizeof(object, default) -> int\n\
709 \n\ 709 \n\
710 Return the size of object in bytes."); 710 Return the size of object in bytes.");
711 711
712 static PyObject * 712 static PyObject *
713 sys_getrefcount(PyObject *self, PyObject *arg) 713 sys_getrefcount(PyObject *self, PyObject *arg)
714 { 714 {
715 return PyInt_FromSsize_t(arg->ob_refcnt); 715 return PyInt_FromSsize_t(arg->ob_refcnt);
716 } 716 }
717 717
718 #ifdef Py_REF_DEBUG 718 #ifdef Py_REF_DEBUG
719 static PyObject * 719 static PyObject *
720 sys_gettotalrefcount(PyObject *self) 720 sys_gettotalrefcount(PyObject *self)
721 { 721 {
722 return PyInt_FromSsize_t(_Py_GetRefTotal()); 722 return PyInt_FromSsize_t(_Py_GetRefTotal());
723 } 723 }
724 #endif /* Py_REF_DEBUG */ 724 #endif /* Py_REF_DEBUG */
725 725
726 PyDoc_STRVAR(getrefcount_doc, 726 PyDoc_STRVAR(getrefcount_doc,
727 "getrefcount(object) -> integer\n\ 727 "getrefcount(object) -> integer\n\
733 733
734 #ifdef COUNT_ALLOCS 734 #ifdef COUNT_ALLOCS
735 static PyObject * 735 static PyObject *
736 sys_getcounts(PyObject *self) 736 sys_getcounts(PyObject *self)
737 { 737 {
738 extern PyObject *get_counts(void); 738 extern PyObject *get_counts(void);
739 739
740 return get_counts(); 740 return get_counts();
741 } 741 }
742 #endif 742 #endif
743 743
744 PyDoc_STRVAR(getframe_doc, 744 PyDoc_STRVAR(getframe_doc,
745 "_getframe([depth]) -> frameobject\n\ 745 "_getframe([depth]) -> frameobject\n\
754 ); 754 );
755 755
756 static PyObject * 756 static PyObject *
757 sys_getframe(PyObject *self, PyObject *args) 757 sys_getframe(PyObject *self, PyObject *args)
758 { 758 {
759 PyFrameObject *f = PyThreadState_GET()->frame; 759 PyFrameObject *f = PyThreadState_GET()->frame;
760 int depth = -1; 760 int depth = -1;
761 761
762 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth)) 762 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
763 return NULL; 763 return NULL;
764 764
765 while (depth > 0 && f != NULL) { 765 while (depth > 0 && f != NULL) {
766 f = f->f_back; 766 f = f->f_back;
767 --depth; 767 --depth;
768 } 768 }
769 if (f == NULL) { 769 if (f == NULL) {
770 PyErr_SetString(PyExc_ValueError, 770 PyErr_SetString(PyExc_ValueError,
771 "call stack is not deep enough"); 771 "call stack is not deep enough");
772 return NULL; 772 return NULL;
773 } 773 }
774 Py_INCREF(f); 774 Py_INCREF(f);
775 return (PyObject*)f; 775 return (PyObject*)f;
776 } 776 }
777 777
778 PyDoc_STRVAR(current_frames_doc, 778 PyDoc_STRVAR(current_frames_doc,
779 "_current_frames() -> dictionary\n\ 779 "_current_frames() -> dictionary\n\
780 \n\ 780 \n\
785 ); 785 );
786 786
787 static PyObject * 787 static PyObject *
788 sys_current_frames(PyObject *self, PyObject *noargs) 788 sys_current_frames(PyObject *self, PyObject *noargs)
789 { 789 {
790 return _PyThread_CurrentFrames(); 790 return _PyThread_CurrentFrames();
791 } 791 }
792 792
793 PyDoc_STRVAR(call_tracing_doc, 793 PyDoc_STRVAR(call_tracing_doc,
794 "call_tracing(func, args) -> object\n\ 794 "call_tracing(func, args) -> object\n\
795 \n\ 795 \n\
799 ); 799 );
800 800
801 static PyObject * 801 static PyObject *
802 sys_call_tracing(PyObject *self, PyObject *args) 802 sys_call_tracing(PyObject *self, PyObject *args)
803 { 803 {
804 PyObject *func, *funcargs; 804 PyObject *func, *funcargs;
805 if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs)) 805 if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
806 return NULL; 806 return NULL;
807 return _PyEval_CallTracing(func, funcargs); 807 return _PyEval_CallTracing(func, funcargs);
808 } 808 }
809 809
810 PyDoc_STRVAR(callstats_doc, 810 PyDoc_STRVAR(callstats_doc,
811 "callstats() -> tuple of integers\n\ 811 "callstats() -> tuple of integers\n\
812 \n\ 812 \n\
849 #endif 849 #endif
850 850
851 static PyObject * 851 static PyObject *
852 sys_clear_type_cache(PyObject* self, PyObject* args) 852 sys_clear_type_cache(PyObject* self, PyObject* args)
853 { 853 {
854 PyType_ClearCache(); 854 PyType_ClearCache();
855 Py_RETURN_NONE; 855 Py_RETURN_NONE;
856 } 856 }
857 857
858 PyDoc_STRVAR(sys_clear_type_cache__doc__, 858 PyDoc_STRVAR(sys_clear_type_cache__doc__,
859 "_clear_type_cache() -> None\n\ 859 "_clear_type_cache() -> None\n\
860 Clear the internal type lookup cache."); 860 Clear the internal type lookup cache.");
861 861
862 862
863 static PyMethodDef sys_methods[] = { 863 static PyMethodDef sys_methods[] = {
864 /* Might as well keep this in alphabetic order */ 864 /* Might as well keep this in alphabetic order */
865 {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS, 865 {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
866 callstats_doc}, 866 callstats_doc},
867 {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS, 867 {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS,
868 sys_clear_type_cache__doc__}, 868 sys_clear_type_cache__doc__},
869 {"_current_frames", sys_current_frames, METH_NOARGS, 869 {"_current_frames", sys_current_frames, METH_NOARGS,
870 current_frames_doc}, 870 current_frames_doc},
871 {"displayhook", sys_displayhook, METH_O, displayhook_doc}, 871 {"displayhook", sys_displayhook, METH_O, displayhook_doc},
872 {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc}, 872 {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc},
873 {"exc_clear", sys_exc_clear, METH_NOARGS, exc_clear_doc}, 873 {"exc_clear", sys_exc_clear, METH_NOARGS, exc_clear_doc},
874 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc}, 874 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
875 {"exit", sys_exit, METH_VARARGS, exit_doc}, 875 {"exit", sys_exit, METH_VARARGS, exit_doc},
876 #ifdef Py_USING_UNICODE 876 #ifdef Py_USING_UNICODE
877 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding, 877 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
878 METH_NOARGS, getdefaultencoding_doc}, 878 METH_NOARGS, getdefaultencoding_doc},
879 #endif 879 #endif
880 #ifdef HAVE_DLOPEN 880 #ifdef HAVE_DLOPEN
881 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS, 881 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
882 getdlopenflags_doc}, 882 getdlopenflags_doc},
883 #endif 883 #endif
884 #ifdef COUNT_ALLOCS 884 #ifdef COUNT_ALLOCS
885 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS}, 885 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS},
886 #endif 886 #endif
887 #ifdef DYNAMIC_EXECUTION_PROFILE 887 #ifdef DYNAMIC_EXECUTION_PROFILE
888 {"getdxp", _Py_GetDXProfile, METH_VARARGS}, 888 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
889 #endif 889 #endif
890 #ifdef Py_USING_UNICODE 890 #ifdef Py_USING_UNICODE
891 {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding, 891 {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
892 METH_NOARGS, getfilesystemencoding_doc}, 892 METH_NOARGS, getfilesystemencoding_doc},
893 #endif 893 #endif
894 #ifdef Py_TRACE_REFS 894 #ifdef Py_TRACE_REFS
895 {"getobjects", _Py_GetObjects, METH_VARARGS}, 895 {"getobjects", _Py_GetObjects, METH_VARARGS},
896 #endif 896 #endif
897 #ifdef Py_REF_DEBUG 897 #ifdef Py_REF_DEBUG
898 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS}, 898 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
899 #endif 899 #endif
900 {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc}, 900 {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
901 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS, 901 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
902 getrecursionlimit_doc}, 902 getrecursionlimit_doc},
903 {"getsizeof", (PyCFunction)sys_getsizeof, 903 {"getsizeof", (PyCFunction)sys_getsizeof,
904 METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, 904 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
905 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc}, 905 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
906 #ifdef MS_WINDOWS 906 #ifdef MS_WINDOWS
907 {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS, 907 {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
908 getwindowsversion_doc}, 908 getwindowsversion_doc},
909 #endif /* MS_WINDOWS */ 909 #endif /* MS_WINDOWS */
910 #ifdef USE_MALLOPT 910 #ifdef USE_MALLOPT
911 {"mdebug", sys_mdebug, METH_VARARGS}, 911 {"mdebug", sys_mdebug, METH_VARARGS},
912 #endif 912 #endif
913 #ifdef Py_USING_UNICODE 913 #ifdef Py_USING_UNICODE
914 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS, 914 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
915 setdefaultencoding_doc}, 915 setdefaultencoding_doc},
916 #endif 916 #endif
917 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS, 917 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
918 setcheckinterval_doc}, 918 setcheckinterval_doc},
919 {"getcheckinterval", sys_getcheckinterval, METH_NOARGS, 919 {"getcheckinterval", sys_getcheckinterval, METH_NOARGS,
920 getcheckinterval_doc}, 920 getcheckinterval_doc},
921 #ifdef HAVE_DLOPEN 921 #ifdef HAVE_DLOPEN
922 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS, 922 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
923 setdlopenflags_doc}, 923 setdlopenflags_doc},
924 #endif 924 #endif
925 {"setprofile", sys_setprofile, METH_O, setprofile_doc}, 925 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
926 {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc}, 926 {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc},
927 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS, 927 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
928 setrecursionlimit_doc}, 928 setrecursionlimit_doc},
929 #ifdef WITH_TSC 929 #ifdef WITH_TSC
930 {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc}, 930 {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
931 #endif 931 #endif
932 {"settrace", sys_settrace, METH_O, settrace_doc}, 932 {"settrace", sys_settrace, METH_O, settrace_doc},
933 {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc}, 933 {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
934 {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, 934 {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
935 {NULL, NULL} /* sentinel */ 935 {NULL, NULL} /* sentinel */
936 }; 936 };
937 937
938 static PyObject * 938 static PyObject *
939 list_builtin_module_names(void) 939 list_builtin_module_names(void)
940 { 940 {
941 PyObject *list = PyList_New(0); 941 PyObject *list = PyList_New(0);
942 int i; 942 int i;
943 if (list == NULL) 943 if (list == NULL)
944 return NULL; 944 return NULL;
945 for (i = 0; PyImport_Inittab[i].name != NULL; i++) { 945 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
946 PyObject *name = PyString_FromString( 946 PyObject *name = PyString_FromString(
947 PyImport_Inittab[i].name); 947 PyImport_Inittab[i].name);
948 if (name == NULL) 948 if (name == NULL)
949 break; 949 break;
950 PyList_Append(list, name); 950 PyList_Append(list, name);
951 Py_DECREF(name); 951 Py_DECREF(name);
952 } 952 }
953 if (PyList_Sort(list) != 0) { 953 if (PyList_Sort(list) != 0) {
954 Py_DECREF(list); 954 Py_DECREF(list);
955 list = NULL; 955 list = NULL;
956 } 956 }
957 if (list) { 957 if (list) {
958 PyObject *v = PyList_AsTuple(list); 958 PyObject *v = PyList_AsTuple(list);
959 Py_DECREF(list); 959 Py_DECREF(list);
960 list = v; 960 list = v;
961 } 961 }
962 return list; 962 return list;
963 } 963 }
964 964
965 static PyObject *warnoptions = NULL; 965 static PyObject *warnoptions = NULL;
966 966
967 void 967 void
968 PySys_ResetWarnOptions(void) 968 PySys_ResetWarnOptions(void)
969 { 969 {
970 if (warnoptions == NULL || !PyList_Check(warnoptions)) 970 if (warnoptions == NULL || !PyList_Check(warnoptions))
971 return; 971 return;
972 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); 972 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
973 } 973 }
974 974
975 void 975 void
976 PySys_AddWarnOption(char *s) 976 PySys_AddWarnOption(char *s)
977 { 977 {
978 PyObject *str; 978 PyObject *str;
979 979
980 if (warnoptions == NULL || !PyList_Check(warnoptions)) { 980 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
981 Py_XDECREF(warnoptions); 981 Py_XDECREF(warnoptions);
982 warnoptions = PyList_New(0); 982 warnoptions = PyList_New(0);
983 if (warnoptions == NULL) 983 if (warnoptions == NULL)
984 return; 984 return;
985 } 985 }
986 str = PyString_FromString(s); 986 str = PyString_FromString(s);
987 if (str != NULL) { 987 if (str != NULL) {
988 PyList_Append(warnoptions, str); 988 PyList_Append(warnoptions, str);
989 Py_DECREF(str); 989 Py_DECREF(str);
990 } 990 }
991 } 991 }
992 992
993 int 993 int
994 PySys_HasWarnOptions(void) 994 PySys_HasWarnOptions(void)
995 { 995 {
1111 static const char *svn_revision; 1111 static const char *svn_revision;
1112 1112
1113 static void 1113 static void
1114 svnversion_init(void) 1114 svnversion_init(void)
1115 { 1115 {
1116 const char *python, *br_start, *br_end, *br_end2, *svnversion; 1116 const char *python, *br_start, *br_end, *br_end2, *svnversion;
1117 Py_ssize_t len; 1117 Py_ssize_t len;
1118 int istag; 1118 int istag;
1119 1119
1120 if (svn_initialized) 1120 if (svn_initialized)
1121 return; 1121 return;
1122 1122
1123 python = strstr(headurl, "/python/"); 1123 python = strstr(headurl, "/python/");
1124 if (!python) { 1124 if (!python) {
1125 /* XXX quick hack to get bzr working */ 1125 /* XXX quick hack to get bzr working */
1126 *patchlevel_revision = '\0'; 1126 *patchlevel_revision = '\0';
1127 strcpy(branch, ""); 1127 strcpy(branch, "");
1128 strcpy(shortbranch, "unknown"); 1128 strcpy(shortbranch, "unknown");
1129 svn_revision = ""; 1129 svn_revision = "";
1130 return; 1130 return;
1131 /* Py_FatalError("subversion keywords missing"); */ 1131 /* Py_FatalError("subversion keywords missing"); */
1132 } 1132 }
1133 1133
1134 br_start = python + 8; 1134 br_start = python + 8;
1135 br_end = strchr(br_start, '/'); 1135 br_end = strchr(br_start, '/');
1136 assert(br_end); 1136 assert(br_end);
1137 1137
1138 /* Works even for trunk, 1138 /* Works even for trunk,
1139 as we are in trunk/Python/sysmodule.c */ 1139 as we are in trunk/Python/sysmodule.c */
1140 br_end2 = strchr(br_end+1, '/'); 1140 br_end2 = strchr(br_end+1, '/');
1141 1141
1142 istag = strncmp(br_start, "tags", 4) == 0; 1142 istag = strncmp(br_start, "tags", 4) == 0;
1143 if (strncmp(br_start, "trunk", 5) == 0) { 1143 if (strncmp(br_start, "trunk", 5) == 0) {
1144 strcpy(branch, "trunk"); 1144 strcpy(branch, "trunk");
1145 strcpy(shortbranch, "trunk"); 1145 strcpy(shortbranch, "trunk");
1146 1146
1147 } 1147 }
1148 else if (istag || strncmp(br_start, "branches", 8) == 0) { 1148 else if (istag || strncmp(br_start, "branches", 8) == 0) {
1149 len = br_end2 - br_start; 1149 len = br_end2 - br_start;
1150 strncpy(branch, br_start, len); 1150 strncpy(branch, br_start, len);
1151 branch[len] = '\0'; 1151 branch[len] = '\0';
1152 1152
1153 len = br_end2 - (br_end + 1); 1153 len = br_end2 - (br_end + 1);
1154 strncpy(shortbranch, br_end + 1, len); 1154 strncpy(shortbranch, br_end + 1, len);
1155 shortbranch[len] = '\0'; 1155 shortbranch[len] = '\0';
1156 } 1156 }
1157 else { 1157 else {
1158 Py_FatalError("bad HeadURL"); 1158 Py_FatalError("bad HeadURL");
1159 return; 1159 return;
1160 } 1160 }
1161 1161
1162 1162
1163 svnversion = _Py_svnversion(); 1163 svnversion = _Py_svnversion();
1164 if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) 1164 if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0)
1165 svn_revision = svnversion; 1165 svn_revision = svnversion;
1166 else if (istag) { 1166 else if (istag) {
1167 len = strlen(_patchlevel_revision); 1167 len = strlen(_patchlevel_revision);
1168 assert(len >= 13); 1168 assert(len >= 13);
1169 assert(len < (sizeof(patchlevel_revision) + 13)); 1169 assert(len < (sizeof(patchlevel_revision) + 13));
1170 strncpy(patchlevel_revision, _patchlevel_revision + 11, 1170 strncpy(patchlevel_revision, _patchlevel_revision + 11,
1171 len - 13); 1171 len - 13);
1172 patchlevel_revision[len - 13] = '\0'; 1172 patchlevel_revision[len - 13] = '\0';
1173 svn_revision = patchlevel_revision; 1173 svn_revision = patchlevel_revision;
1174 } 1174 }
1175 else 1175 else
1176 svn_revision = ""; 1176 svn_revision = "";
1177 1177
1178 svn_initialized = 1; 1178 svn_initialized = 1;
1179 } 1179 }
1180 1180
1181 /* Return svnversion output if available. 1181 /* Return svnversion output if available.
1182 Else return Revision of patchlevel.h if on branch. 1182 Else return Revision of patchlevel.h if on branch.
1183 Else return empty string */ 1183 Else return empty string */
1184 const char* 1184 const char*
1185 Py_SubversionRevision() 1185 Py_SubversionRevision()
1186 { 1186 {
1187 svnversion_init(); 1187 svnversion_init();
1188 return svn_revision; 1188 return svn_revision;
1189 } 1189 }
1190 1190
1191 const char* 1191 const char*
1192 Py_SubversionShortBranch() 1192 Py_SubversionShortBranch()
1193 { 1193 {
1194 svnversion_init(); 1194 svnversion_init();
1195 return shortbranch; 1195 return shortbranch;
1196 } 1196 }
1197 1197
1198 1198
1199 PyDoc_STRVAR(flags__doc__, 1199 PyDoc_STRVAR(flags__doc__,
1200 "sys.flags\n\ 1200 "sys.flags\n\
1202 Flags provided through command line arguments or environment vars."); 1202 Flags provided through command line arguments or environment vars.");
1203 1203
1204 static PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0}; 1204 static PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0};
1205 1205
1206 static PyStructSequence_Field flags_fields[] = { 1206 static PyStructSequence_Field flags_fields[] = {
1207 {"debug", "-d"}, 1207 {"debug", "-d"},
1208 {"py3k_warning", "-3"}, 1208 {"py3k_warning", "-3"},
1209 {"division_warning", "-Q"}, 1209 {"division_warning", "-Q"},
1210 {"division_new", "-Qnew"}, 1210 {"division_new", "-Qnew"},
1211 {"inspect", "-i"}, 1211 {"inspect", "-i"},
1212 {"interactive", "-i"}, 1212 {"interactive", "-i"},
1213 {"optimize", "-O or -OO"}, 1213 {"optimize", "-O or -OO"},
1214 {"dont_write_bytecode", "-B"}, 1214 {"dont_write_bytecode", "-B"},
1215 {"no_user_site", "-s"}, 1215 {"no_user_site", "-s"},
1216 {"no_site", "-S"}, 1216 {"no_site", "-S"},
1217 {"ignore_environment", "-E"}, 1217 {"ignore_environment", "-E"},
1218 {"tabcheck", "-t or -tt"}, 1218 {"tabcheck", "-t or -tt"},
1219 {"verbose", "-v"}, 1219 {"verbose", "-v"},
1220 #ifdef RISCOS 1220 #ifdef RISCOS
1221 {"riscos_wimp", "???"}, 1221 {"riscos_wimp", "???"},
1222 #endif 1222 #endif
1223 /* {"unbuffered", "-u"}, */ 1223 /* {"unbuffered", "-u"}, */
1224 {"unicode", "-U"}, 1224 {"unicode", "-U"},
1225 /* {"skip_first", "-x"}, */ 1225 /* {"skip_first", "-x"}, */
1226 {"bytes_warning", "-b"}, 1226 {"bytes_warning", "-b"},
1227 {0} 1227 {0}
1228 }; 1228 };
1229 1229
1230 static PyStructSequence_Desc flags_desc = { 1230 static PyStructSequence_Desc flags_desc = {
1231 "sys.flags", /* name */ 1231 "sys.flags", /* name */
1232 flags__doc__, /* doc */ 1232 flags__doc__, /* doc */
1233 flags_fields, /* fields */ 1233 flags_fields, /* fields */
1234 #ifdef RISCOS 1234 #ifdef RISCOS
1235 16 1235 16
1236 #else 1236 #else
1237 15 1237 15
1238 #endif 1238 #endif
1239 }; 1239 };
1240 1240
1241 static PyObject* 1241 static PyObject*
1242 make_flags(void) 1242 make_flags(void)
1243 { 1243 {
1244 int pos = 0; 1244 int pos = 0;
1245 PyObject *seq; 1245 PyObject *seq;
1246 1246
1247 seq = PyStructSequence_New(&FlagsType); 1247 seq = PyStructSequence_New(&FlagsType);
1248 if (seq == NULL) 1248 if (seq == NULL)
1249 return NULL; 1249 return NULL;
1250 1250
1251 #define SetFlag(flag) \ 1251 #define SetFlag(flag) \
1252 PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag)) 1252 PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag))
1253 1253
1254 SetFlag(Py_DebugFlag); 1254 SetFlag(Py_DebugFlag);
1255 SetFlag(Py_Py3kWarningFlag); 1255 SetFlag(Py_Py3kWarningFlag);
1256 SetFlag(Py_DivisionWarningFlag); 1256 SetFlag(Py_DivisionWarningFlag);
1257 SetFlag(_Py_QnewFlag); 1257 SetFlag(_Py_QnewFlag);
1258 SetFlag(Py_InspectFlag); 1258 SetFlag(Py_InspectFlag);
1259 SetFlag(Py_InteractiveFlag); 1259 SetFlag(Py_InteractiveFlag);
1260 SetFlag(Py_OptimizeFlag); 1260 SetFlag(Py_OptimizeFlag);
1261 SetFlag(Py_DontWriteBytecodeFlag); 1261 SetFlag(Py_DontWriteBytecodeFlag);
1262 SetFlag(Py_NoUserSiteDirectory); 1262 SetFlag(Py_NoUserSiteDirectory);
1263 SetFlag(Py_NoSiteFlag); 1263 SetFlag(Py_NoSiteFlag);
1264 SetFlag(Py_IgnoreEnvironmentFlag); 1264 SetFlag(Py_IgnoreEnvironmentFlag);
1265 SetFlag(Py_TabcheckFlag); 1265 SetFlag(Py_TabcheckFlag);
1266 SetFlag(Py_VerboseFlag); 1266 SetFlag(Py_VerboseFlag);
1267 #ifdef RISCOS 1267 #ifdef RISCOS
1268 SetFlag(Py_RISCOSWimpFlag); 1268 SetFlag(Py_RISCOSWimpFlag);
1269 #endif 1269 #endif
1270 /* SetFlag(saw_unbuffered_flag); */ 1270 /* SetFlag(saw_unbuffered_flag); */
1271 SetFlag(Py_UnicodeFlag); 1271 SetFlag(Py_UnicodeFlag);
1272 /* SetFlag(skipfirstline); */ 1272 /* SetFlag(skipfirstline); */
1273 SetFlag(Py_BytesWarningFlag); 1273 SetFlag(Py_BytesWarningFlag);
1274 #undef SetFlag 1274 #undef SetFlag
1275 1275
1276 if (PyErr_Occurred()) { 1276 if (PyErr_Occurred()) {
1277 return NULL; 1277 return NULL;
1278 } 1278 }
1279 return seq; 1279 return seq;
1280 } 1280 }
1281 1281
1282 PyObject * 1282 PyObject *
1283 _PySys_Init(void) 1283 _PySys_Init(void)
1284 { 1284 {
1285 PyObject *m, *v, *sysdict; 1285 PyObject *m, *v, *sysdict;
1286 PyObject *sysin, *sysout, *syserr; 1286 PyObject *sysin, *sysout, *syserr;
1287 char *s; 1287 char *s;
1288 1288
1289 m = Py_InitModule3("sys", sys_methods, sys_doc); 1289 m = Py_InitModule3("sys", sys_methods, sys_doc);
1290 if (m == NULL) 1290 if (m == NULL)
1291 return NULL; 1291 return NULL;
1292 sysdict = PyModule_GetDict(m); 1292 sysdict = PyModule_GetDict(m);
1293 #define SET_SYS_FROM_STRING(key, value) \ 1293 #define SET_SYS_FROM_STRING(key, value) \
1294 v = value; \ 1294 v = value; \
1295 if (v != NULL) \ 1295 if (v != NULL) \
1296 PyDict_SetItemString(sysdict, key, v); \ 1296 PyDict_SetItemString(sysdict, key, v); \
1297 Py_XDECREF(v) 1297 Py_XDECREF(v)
1298 1298
1299 /* Check that stdin is not a directory 1299 /* Check that stdin is not a directory
1300 Using shell redirection, you can redirect stdin to a directory, 1300 Using shell redirection, you can redirect stdin to a directory,
1301 crashing the Python interpreter. Catch this common mistake here 1301 crashing the Python interpreter. Catch this common mistake here
1302 and output a useful error message. Note that under MS Windows, 1302 and output a useful error message. Note that under MS Windows,
1303 the shell already prevents that. */ 1303 the shell already prevents that. */
1304 #if !defined(MS_WINDOWS) 1304 #if !defined(MS_WINDOWS)
1305 { 1305 {
1306 struct stat sb; 1306 struct stat sb;
1307 if (fstat(fileno(stdin), &sb) == 0 && 1307 if (fstat(fileno(stdin), &sb) == 0 &&
1308 S_ISDIR(sb.st_mode)) { 1308 S_ISDIR(sb.st_mode)) {
1309 /* There's nothing more we can do. */ 1309 /* There's nothing more we can do. */
1310 /* Py_FatalError() will core dump, so just exit. */ 1310 /* Py_FatalError() will core dump, so just exit. */
1311 PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n"); 1311 PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1312 exit(EXIT_FAILURE); 1312 exit(EXIT_FAILURE);
1313 } 1313 }
1314 } 1314 }
1315 #endif 1315 #endif
1316 1316
1317 /* Closing the standard FILE* if sys.std* goes aways causes problems 1317 /* Closing the standard FILE* if sys.std* goes aways causes problems
1318 * for embedded Python usages. Closing them when somebody explicitly 1318 * for embedded Python usages. Closing them when somebody explicitly
1319 * invokes .close() might be possible, but the FAQ promises they get 1319 * invokes .close() might be possible, but the FAQ promises they get
1320 * never closed. However, we still need to get write errors when 1320 * never closed. However, we still need to get write errors when
1321 * writing fails (e.g. because stdout is redirected), so we flush the 1321 * writing fails (e.g. because stdout is redirected), so we flush the
1322 * streams and check for errors before the file objects are deleted. 1322 * streams and check for errors before the file objects are deleted.
1323 * On OS X, fflush()ing stdin causes an error, so we exempt stdin 1323 * On OS X, fflush()ing stdin causes an error, so we exempt stdin
1324 * from that procedure. 1324 * from that procedure.
1325 */ 1325 */
1326 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL); 1326 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
1327 sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush); 1327 sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush);
1328 syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush); 1328 syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush);
1329 if (PyErr_Occurred()) 1329 if (PyErr_Occurred())
1330 return NULL; 1330 return NULL;
1331 1331
1332 PyDict_SetItemString(sysdict, "stdin", sysin); 1332 PyDict_SetItemString(sysdict, "stdin", sysin);
1333 PyDict_SetItemString(sysdict, "stdout", sysout); 1333 PyDict_SetItemString(sysdict, "stdout", sysout);
1334 PyDict_SetItemString(sysdict, "stderr", syserr); 1334 PyDict_SetItemString(sysdict, "stderr", syserr);
1335 /* Make backup copies for cleanup */ 1335 /* Make backup copies for cleanup */
1336 PyDict_SetItemString(sysdict, "__stdin__", sysin); 1336 PyDict_SetItemString(sysdict, "__stdin__", sysin);
1337 PyDict_SetItemString(sysdict, "__stdout__", sysout); 1337 PyDict_SetItemString(sysdict, "__stdout__", sysout);
1338 PyDict_SetItemString(sysdict, "__stderr__", syserr); 1338 PyDict_SetItemString(sysdict, "__stderr__", syserr);
1339 PyDict_SetItemString(sysdict, "__displayhook__", 1339 PyDict_SetItemString(sysdict, "__displayhook__",
1340 PyDict_GetItemString(sysdict, "displayhook")); 1340 PyDict_GetItemString(sysdict, "displayhook"));
1341 PyDict_SetItemString(sysdict, "__excepthook__", 1341 PyDict_SetItemString(sysdict, "__excepthook__",
1342 PyDict_GetItemString(sysdict, "excepthook")); 1342 PyDict_GetItemString(sysdict, "excepthook"));
1343 Py_XDECREF(sysin); 1343 Py_XDECREF(sysin);
1344 Py_XDECREF(sysout); 1344 Py_XDECREF(sysout);
1345 Py_XDECREF(syserr); 1345 Py_XDECREF(syserr);
1346 1346
1347 SET_SYS_FROM_STRING("version", 1347 SET_SYS_FROM_STRING("version",
1348 PyString_FromString(Py_GetVersion())); 1348 PyString_FromString(Py_GetVersion()));
1349 SET_SYS_FROM_STRING("hexversion", 1349 SET_SYS_FROM_STRING("hexversion",
1350 PyInt_FromLong(PY_VERSION_HEX)); 1350 PyInt_FromLong(PY_VERSION_HEX));
1351 svnversion_init(); 1351 svnversion_init();
1352 SET_SYS_FROM_STRING("subversion", 1352 SET_SYS_FROM_STRING("subversion",
1353 Py_BuildValue("(ssz)", "CPython", branch, 1353 Py_BuildValue("(ssz)", "CPython", branch,
1354 svn_revision)); 1354 svn_revision));
1355 SET_SYS_FROM_STRING("dont_write_bytecode", 1355 SET_SYS_FROM_STRING("dont_write_bytecode",
1356 PyBool_FromLong(Py_DontWriteBytecodeFlag)); 1356 PyBool_FromLong(Py_DontWriteBytecodeFlag));
1357 /* 1357 /*
1358 * These release level checks are mutually exclusive and cover 1358 * These release level checks are mutually exclusive and cover
1359 * the field, so don't get too fancy with the pre-processor! 1359 * the field, so don't get too fancy with the pre-processor!
1360 */ 1360 */
1361 #if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA 1361 #if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1362 s = "alpha"; 1362 s = "alpha";
1363 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA 1363 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1364 s = "beta"; 1364 s = "beta";
1365 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA 1365 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1366 s = "candidate"; 1366 s = "candidate";
1367 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL 1367 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1368 s = "final"; 1368 s = "final";
1369 #endif 1369 #endif
1370 1370
1371 SET_SYS_FROM_STRING("version_info", 1371 SET_SYS_FROM_STRING("version_info",
1372 Py_BuildValue("iiisi", PY_MAJOR_VERSION, 1372 Py_BuildValue("iiisi", PY_MAJOR_VERSION,
1373 PY_MINOR_VERSION, 1373 PY_MINOR_VERSION,
1374 PY_MICRO_VERSION, s, 1374 PY_MICRO_VERSION, s,
1375 PY_RELEASE_SERIAL)); 1375 PY_RELEASE_SERIAL));
1376 SET_SYS_FROM_STRING("api_version", 1376 SET_SYS_FROM_STRING("api_version",
1377 PyInt_FromLong(PYTHON_API_VERSION)); 1377 PyInt_FromLong(PYTHON_API_VERSION));
1378 SET_SYS_FROM_STRING("copyright", 1378 SET_SYS_FROM_STRING("copyright",
1379 PyString_FromString(Py_GetCopyright())); 1379 PyString_FromString(Py_GetCopyright()));
1380 SET_SYS_FROM_STRING("platform", 1380 SET_SYS_FROM_STRING("platform",
1381 PyString_FromString(Py_GetPlatform())); 1381 PyString_FromString(Py_GetPlatform()));
1382 SET_SYS_FROM_STRING("executable", 1382 SET_SYS_FROM_STRING("executable",
1383 PyString_FromString(Py_GetProgramFullPath())); 1383 PyString_FromString(Py_GetProgramFullPath()));
1384 SET_SYS_FROM_STRING("prefix", 1384 SET_SYS_FROM_STRING("prefix",
1385 PyString_FromString(Py_GetPrefix())); 1385 PyString_FromString(Py_GetPrefix()));
1386 SET_SYS_FROM_STRING("exec_prefix", 1386 SET_SYS_FROM_STRING("exec_prefix",
1387 PyString_FromString(Py_GetExecPrefix())); 1387 PyString_FromString(Py_GetExecPrefix()));
1388 SET_SYS_FROM_STRING("maxsize", 1388 SET_SYS_FROM_STRING("maxsize",
1389 PyInt_FromSsize_t(PY_SSIZE_T_MAX)); 1389 PyInt_FromSsize_t(PY_SSIZE_T_MAX));
1390 SET_SYS_FROM_STRING("maxint", 1390 SET_SYS_FROM_STRING("maxint",
1391 PyInt_FromLong(PyInt_GetMax())); 1391 PyInt_FromLong(PyInt_GetMax()));
1392 SET_SYS_FROM_STRING("py3kwarning", 1392 SET_SYS_FROM_STRING("py3kwarning",
1393 PyBool_FromLong(Py_Py3kWarningFlag)); 1393 PyBool_FromLong(Py_Py3kWarningFlag));
1394 SET_SYS_FROM_STRING("float_info", 1394 SET_SYS_FROM_STRING("float_info",
1395 PyFloat_GetInfo()); 1395 PyFloat_GetInfo());
1396 #ifdef Py_USING_UNICODE 1396 #ifdef Py_USING_UNICODE
1397 SET_SYS_FROM_STRING("maxunicode", 1397 SET_SYS_FROM_STRING("maxunicode",
1398 PyInt_FromLong(PyUnicode_GetMax())); 1398 PyInt_FromLong(PyUnicode_GetMax()));
1399 #endif 1399 #endif
1400 SET_SYS_FROM_STRING("builtin_module_names", 1400 SET_SYS_FROM_STRING("builtin_module_names",
1401 list_builtin_module_names()); 1401 list_builtin_module_names());
1402 { 1402 {
1403 /* Assumes that longs are at least 2 bytes long. 1403 /* Assumes that longs are at least 2 bytes long.
1404 Should be safe! */ 1404 Should be safe! */
1405 unsigned long number = 1; 1405 unsigned long number = 1;
1406 char *value; 1406 char *value;
1407 1407
1408 s = (char *) &number; 1408 s = (char *) &number;
1409 if (s[0] == 0) 1409 if (s[0] == 0)
1410 value = "big"; 1410 value = "big";
1411 else 1411 else
1412 value = "little"; 1412 value = "little";
1413 SET_SYS_FROM_STRING("byteorder", 1413 SET_SYS_FROM_STRING("byteorder",
1414 PyString_FromString(value)); 1414 PyString_FromString(value));
1415 } 1415 }
1416 #ifdef MS_COREDLL 1416 #ifdef MS_COREDLL
1417 SET_SYS_FROM_STRING("dllhandle", 1417 SET_SYS_FROM_STRING("dllhandle",
1418 PyLong_FromVoidPtr(PyWin_DLLhModule)); 1418 PyLong_FromVoidPtr(PyWin_DLLhModule));
1419 SET_SYS_FROM_STRING("winver", 1419 SET_SYS_FROM_STRING("winver",
1420 PyString_FromString(PyWin_DLLVersionString)); 1420 PyString_FromString(PyWin_DLLVersionString));
1421 #endif 1421 #endif
1422 if (warnoptions == NULL) { 1422 if (warnoptions == NULL) {
1423 warnoptions = PyList_New(0); 1423 warnoptions = PyList_New(0);
1424 } 1424 }
1425 else { 1425 else {
1426 Py_INCREF(warnoptions); 1426 Py_INCREF(warnoptions);
1427 } 1427 }
1428 if (warnoptions != NULL) { 1428 if (warnoptions != NULL) {
1429 PyDict_SetItemString(sysdict, "warnoptions", warnoptions); 1429 PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
1430 } 1430 }
1431 1431
1432 if (FlagsType.tp_name == 0) 1432 if (FlagsType.tp_name == 0)
1433 PyStructSequence_InitType(&FlagsType, &flags_desc); 1433 PyStructSequence_InitType(&FlagsType, &flags_desc);
1434 SET_SYS_FROM_STRING("flags", make_flags()); 1434 SET_SYS_FROM_STRING("flags", make_flags());
1435 /* prevent user from creating new instances */ 1435 /* prevent user from creating new instances */
1436 FlagsType.tp_init = NULL; 1436 FlagsType.tp_init = NULL;
1437 FlagsType.tp_new = NULL; 1437 FlagsType.tp_new = NULL;
1438 1438
1439 #undef SET_SYS_FROM_STRING 1439 #undef SET_SYS_FROM_STRING
1440 if (PyErr_Occurred()) 1440 if (PyErr_Occurred())
1441 return NULL; 1441 return NULL;
1442 return m; 1442 return m;
1443 } 1443 }
1444 1444
1445 static PyObject * 1445 static PyObject *
1446 makepathobject(char *path, int delim) 1446 makepathobject(char *path, int delim)
1447 { 1447 {
1448 int i, n; 1448 int i, n;
1449 char *p; 1449 char *p;
1450 PyObject *v, *w; 1450 PyObject *v, *w;
1451 1451
1452 n = 1; 1452 n = 1;
1453 p = path; 1453 p = path;
1454 while ((p = strchr(p, delim)) != NULL) { 1454 while ((p = strchr(p, delim)) != NULL) {
1455 n++; 1455 n++;
1456 p++; 1456 p++;
1457 } 1457 }
1458 v = PyList_New(n); 1458 v = PyList_New(n);
1459 if (v == NULL) 1459 if (v == NULL)
1460 return NULL; 1460 return NULL;
1461 for (i = 0; ; i++) { 1461 for (i = 0; ; i++) {
1462 p = strchr(path, delim); 1462 p = strchr(path, delim);
1463 if (p == NULL) 1463 if (p == NULL)
1464 p = strchr(path, '\0'); /* End of string */ 1464 p = strchr(path, '\0'); /* End of string */
1465 w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path)); 1465 w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path));
1466 if (w == NULL) { 1466 if (w == NULL) {
1467 Py_DECREF(v); 1467 Py_DECREF(v);
1468 return NULL; 1468 return NULL;
1469 } 1469 }
1470 PyList_SetItem(v, i, w); 1470 PyList_SetItem(v, i, w);
1471 if (*p == '\0') 1471 if (*p == '\0')
1472 break; 1472 break;
1473 path = p+1; 1473 path = p+1;
1474 } 1474 }
1475 return v; 1475 return v;
1476 } 1476 }
1477 1477
1478 void 1478 void
1479 PySys_SetPath(char *path) 1479 PySys_SetPath(char *path)
1480 { 1480 {
1481 PyObject *v; 1481 PyObject *v;
1482 if ((v = makepathobject(path, DELIM)) == NULL) 1482 if ((v = makepathobject(path, DELIM)) == NULL)
1483 Py_FatalError("can't create sys.path"); 1483 Py_FatalError("can't create sys.path");
1484 if (PySys_SetObject("path", v) != 0) 1484 if (PySys_SetObject("path", v) != 0)
1485 Py_FatalError("can't assign sys.path"); 1485 Py_FatalError("can't assign sys.path");
1486 Py_DECREF(v); 1486 Py_DECREF(v);
1487 } 1487 }
1488 1488
1489 static PyObject * 1489 static PyObject *
1490 makeargvobject(int argc, char **argv) 1490 makeargvobject(int argc, char **argv)
1491 { 1491 {
1492 PyObject *av; 1492 PyObject *av;
1493 if (argc <= 0 || argv == NULL) { 1493 if (argc <= 0 || argv == NULL) {
1494 /* Ensure at least one (empty) argument is seen */ 1494 /* Ensure at least one (empty) argument is seen */
1495 static char *empty_argv[1] = {""}; 1495 static char *empty_argv[1] = {""};
1496 argv = empty_argv; 1496 argv = empty_argv;
1497 argc = 1; 1497 argc = 1;
1498 } 1498 }
1499 av = PyList_New(argc); 1499 av = PyList_New(argc);
1500 if (av != NULL) { 1500 if (av != NULL) {
1501 int i; 1501 int i;
1502 for (i = 0; i < argc; i++) { 1502 for (i = 0; i < argc; i++) {
1503 #ifdef __VMS 1503 #ifdef __VMS
1504 PyObject *v; 1504 PyObject *v;
1505 1505
1506 /* argv[0] is the script pathname if known */ 1506 /* argv[0] is the script pathname if known */
1507 if (i == 0) { 1507 if (i == 0) {
1508 char* fn = decc$translate_vms(argv[0]); 1508 char* fn = decc$translate_vms(argv[0]);
1509 if ((fn == (char *)0) || fn == (char *)-1) 1509 if ((fn == (char *)0) || fn == (char *)-1)
1510 v = PyString_FromString(argv[0]); 1510 v = PyString_FromString(argv[0]);
1511 else 1511 else
1512 v = PyString_FromString( 1512 v = PyString_FromString(
1513 decc$translate_vms(argv[0])); 1513 decc$translate_vms(argv[0]));
1514 } else 1514 } else
1515 v = PyString_FromString(argv[i]); 1515 v = PyString_FromString(argv[i]);
1516 #else 1516 #else
1517 PyObject *v = PyString_FromString(argv[i]); 1517 PyObject *v = PyString_FromString(argv[i]);
1518 #endif 1518 #endif
1519 if (v == NULL) { 1519 if (v == NULL) {
1520 Py_DECREF(av); 1520 Py_DECREF(av);
1521 av = NULL; 1521 av = NULL;
1522 break; 1522 break;
1523 } 1523 }
1524 PyList_SetItem(av, i, v); 1524 PyList_SetItem(av, i, v);
1525 } 1525 }
1526 } 1526 }
1527 return av; 1527 return av;
1528 } 1528 }
1529 1529
1530 void 1530 void
1531 PySys_SetArgv(int argc, char **argv) 1531 PySys_SetArgv(int argc, char **argv)
1532 { 1532 {
1533 #if defined(HAVE_REALPATH) 1533 #if defined(HAVE_REALPATH)
1534 char fullpath[MAXPATHLEN]; 1534 char fullpath[MAXPATHLEN];
1535 #elif defined(MS_WINDOWS) && !defined(MS_WINCE) 1535 #elif defined(MS_WINDOWS) && !defined(MS_WINCE)
1536 char fullpath[MAX_PATH]; 1536 char fullpath[MAX_PATH];
1537 #endif 1537 #endif
1538 PyObject *av = makeargvobject(argc, argv); 1538 PyObject *av = makeargvobject(argc, argv);
1539 PyObject *path = PySys_GetObject("path"); 1539 PyObject *path = PySys_GetObject("path");
1540 if (av == NULL) 1540 if (av == NULL)
1541 Py_FatalError("no mem for sys.argv"); 1541 Py_FatalError("no mem for sys.argv");
1542 if (PySys_SetObject("argv", av) != 0) 1542 if (PySys_SetObject("argv", av) != 0)
1543 Py_FatalError("can't assign sys.argv"); 1543 Py_FatalError("can't assign sys.argv");
1544 if (path != NULL) { 1544 if (path != NULL) {
1545 char *argv0 = argv[0]; 1545 char *argv0 = argv[0];
1546 char *p = NULL; 1546 char *p = NULL;
1547 Py_ssize_t n = 0; 1547 Py_ssize_t n = 0;
1548 PyObject *a; 1548 PyObject *a;
1549 #ifdef HAVE_READLINK 1549 #ifdef HAVE_READLINK
1550 char link[MAXPATHLEN+1]; 1550 char link[MAXPATHLEN+1];
1551 char argv0copy[2*MAXPATHLEN+1]; 1551 char argv0copy[2*MAXPATHLEN+1];
1552 int nr = 0; 1552 int nr = 0;
1553 if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) 1553 if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0)
1554 nr = readlink(argv0, link, MAXPATHLEN); 1554 nr = readlink(argv0, link, MAXPATHLEN);
1555 if (nr > 0) { 1555 if (nr > 0) {
1556 /* It's a symlink */ 1556 /* It's a symlink */
1557 link[nr] = '\0'; 1557 link[nr] = '\0';
1558 if (link[0] == SEP) 1558 if (link[0] == SEP)
1559 argv0 = link; /* Link to absolute path */ 1559 argv0 = link; /* Link to absolute path */
1560 else if (strchr(link, SEP) == NULL) 1560 else if (strchr(link, SEP) == NULL)
1561 ; /* Link without path */ 1561 ; /* Link without path */
1562 else { 1562 else {
1563 /* Must join(dirname(argv0), link) */ 1563 /* Must join(dirname(argv0), link) */
1564 char *q = strrchr(argv0, SEP); 1564 char *q = strrchr(argv0, SEP);
1565 if (q == NULL) 1565 if (q == NULL)
1566 argv0 = link; /* argv0 without path */ 1566 argv0 = link; /* argv0 without path */
1567 else { 1567 else {
1568 /* Must make a copy */ 1568 /* Must make a copy */
1569 strcpy(argv0copy, argv0); 1569 strcpy(argv0copy, argv0);
1570 q = strrchr(argv0copy, SEP); 1570 q = strrchr(argv0copy, SEP);
1571 strcpy(q+1, link); 1571 strcpy(q+1, link);
1572 argv0 = argv0copy; 1572 argv0 = argv0copy;
1573 } 1573 }
1574 } 1574 }
1575 } 1575 }
1576 #endif /* HAVE_READLINK */ 1576 #endif /* HAVE_READLINK */
1577 #if SEP == '\\' /* Special case for MS filename syntax */ 1577 #if SEP == '\\' /* Special case for MS filename syntax */
1578 if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { 1578 if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1579 char *q; 1579 char *q;
1580 #if defined(MS_WINDOWS) && !defined(MS_WINCE) 1580 #if defined(MS_WINDOWS) && !defined(MS_WINCE)
1581 /* This code here replaces the first element in argv with the full 1581 /* This code here replaces the first element in argv with the full
1582 path that it represents. Under CE, there are no relative paths so 1582 path that it represents. Under CE, there are no relative paths so
1583 the argument must be the full path anyway. */ 1583 the argument must be the full path anyway. */
1584 char *ptemp; 1584 char *ptemp;
1585 if (GetFullPathName(argv0, 1585 if (GetFullPathName(argv0,
1586 sizeof(fullpath), 1586 sizeof(fullpath),
1587 fullpath, 1587 fullpath,
1588 &ptemp)) { 1588 &ptemp)) {
1589 argv0 = fullpath; 1589 argv0 = fullpath;
1590 } 1590 }
1591 #endif 1591 #endif
1592 p = strrchr(argv0, SEP); 1592 p = strrchr(argv0, SEP);
1593 /* Test for alternate separator */ 1593 /* Test for alternate separator */
1594 q = strrchr(p ? p : argv0, '/'); 1594 q = strrchr(p ? p : argv0, '/');
1595 if (q != NULL) 1595 if (q != NULL)
1596 p = q; 1596 p = q;
1597 if (p != NULL) { 1597 if (p != NULL) {
1598 n = p + 1 - argv0; 1598 n = p + 1 - argv0;
1599 if (n > 1 && p[-1] != ':') 1599 if (n > 1 && p[-1] != ':')
1600 n--; /* Drop trailing separator */ 1600 n--; /* Drop trailing separator */
1601 } 1601 }
1602 } 1602 }
1603 #else /* All other filename syntaxes */ 1603 #else /* All other filename syntaxes */
1604 if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { 1604 if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1605 #if defined(HAVE_REALPATH) 1605 #if defined(HAVE_REALPATH)
1606 if (realpath(argv0, fullpath)) { 1606 if (realpath(argv0, fullpath)) {
1607 argv0 = fullpath; 1607 argv0 = fullpath;
1608 } 1608 }
1609 #endif 1609 #endif
1610 p = strrchr(argv0, SEP); 1610 p = strrchr(argv0, SEP);
1611 } 1611 }
1612 if (p != NULL) { 1612 if (p != NULL) {
1613 #ifndef RISCOS 1613 #ifndef RISCOS
1614 n = p + 1 - argv0; 1614 n = p + 1 - argv0;
1615 #else /* don't include trailing separator */ 1615 #else /* don't include trailing separator */
1616 n = p - argv0; 1616 n = p - argv0;
1617 #endif /* RISCOS */ 1617 #endif /* RISCOS */
1618 #if SEP == '/' /* Special case for Unix filename syntax */ 1618 #if SEP == '/' /* Special case for Unix filename syntax */
1619 if (n > 1) 1619 if (n > 1)
1620 n--; /* Drop trailing separator */ 1620 n--; /* Drop trailing separator */
1621 #endif /* Unix */ 1621 #endif /* Unix */
1622 } 1622 }
1623 #endif /* All others */ 1623 #endif /* All others */
1624 a = PyString_FromStringAndSize(argv0, n); 1624 a = PyString_FromStringAndSize(argv0, n);
1625 if (a == NULL) 1625 if (a == NULL)
1626 Py_FatalError("no mem for sys.path insertion"); 1626 Py_FatalError("no mem for sys.path insertion");
1627 if (PyList_Insert(path, 0, a) < 0) 1627 if (PyList_Insert(path, 0, a) < 0)
1628 Py_FatalError("sys.path.insert(0) failed"); 1628 Py_FatalError("sys.path.insert(0) failed");
1629 Py_DECREF(a); 1629 Py_DECREF(a);
1630 } 1630 }
1631 Py_DECREF(av); 1631 Py_DECREF(av);
1632 } 1632 }
1633 1633
1634 1634
1635 /* APIs to write to sys.stdout or sys.stderr using a printf-like interface. 1635 /* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1636 Adapted from code submitted by Just van Rossum. 1636 Adapted from code submitted by Just van Rossum.
1657 */ 1657 */
1658 1658
1659 static void 1659 static void
1660 mywrite(char *name, FILE *fp, const char *format, va_list va) 1660 mywrite(char *name, FILE *fp, const char *format, va_list va)
1661 { 1661 {
1662 PyObject *file; 1662 PyObject *file;
1663 PyObject *error_type, *error_value, *error_traceback; 1663 PyObject *error_type, *error_value, *error_traceback;
1664 1664
1665 PyErr_Fetch(&error_type, &error_value, &error_traceback); 1665 PyErr_Fetch(&error_type, &error_value, &error_traceback);
1666 file = PySys_GetObject(name); 1666 file = PySys_GetObject(name);
1667 if (file == NULL || PyFile_AsFile(file) == fp) 1667 if (file == NULL || PyFile_AsFile(file) == fp)
1668 vfprintf(fp, format, va); 1668 vfprintf(fp, format, va);
1669 else { 1669 else {
1670 char buffer[1001]; 1670 char buffer[1001];
1671 const int written = PyOS_vsnprintf(buffer, sizeof(buffer), 1671 const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
1672 format, va); 1672 format, va);
1673 if (PyFile_WriteString(buffer, file) != 0) { 1673 if (PyFile_WriteString(buffer, file) != 0) {
1674 PyErr_Clear(); 1674 PyErr_Clear();
1675 fputs(buffer, fp); 1675 fputs(buffer, fp);
1676 } 1676 }
1677 if (written < 0 || (size_t)written >= sizeof(buffer)) { 1677 if (written < 0 || (size_t)written >= sizeof(buffer)) {
1678 const char *truncated = "... truncated"; 1678 const char *truncated = "... truncated";
1679 if (PyFile_WriteString(truncated, file) != 0) { 1679 if (PyFile_WriteString(truncated, file) != 0) {
1680 PyErr_Clear(); 1680 PyErr_Clear();
1681 fputs(truncated, fp); 1681 fputs(truncated, fp);
1682 } 1682 }
1683 } 1683 }
1684 } 1684 }
1685 PyErr_Restore(error_type, error_value, error_traceback); 1685 PyErr_Restore(error_type, error_value, error_traceback);
1686 } 1686 }
1687 1687
1688 void 1688 void
1689 PySys_WriteStdout(const char *format, ...) 1689 PySys_WriteStdout(const char *format, ...)
1690 { 1690 {
1691 va_list va; 1691 va_list va;
1692 1692
1693 va_start(va, format); 1693 va_start(va, format);
1694 mywrite("stdout", stdout, format, va); 1694 mywrite("stdout", stdout, format, va);
1695 va_end(va); 1695 va_end(va);
1696 } 1696 }
1697 1697
1698 void 1698 void
1699 PySys_WriteStderr(const char *format, ...) 1699 PySys_WriteStderr(const char *format, ...)
1700 { 1700 {
1701 va_list va; 1701 va_list va;
1702 1702
1703 va_start(va, format); 1703 va_start(va, format);
1704 mywrite("stderr", stderr, format, va); 1704 mywrite("stderr", stderr, format, va);
1705 va_end(va); 1705 va_end(va);
1706 } 1706 }