]> git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.2/Python/modsupport.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Python / modsupport.c
1
2 /* Module support implementation */
3
4 #include "Python.h"
5
6 #define FLAG_SIZE_T 1
7 typedef double va_double;
8
9 static PyObject *va_build_value(const char *, va_list, int);
10
11 /* Package context -- the full module name for package imports */
12 char *_Py_PackageContext = NULL;
13
14 /* Py_InitModule4() parameters:
15 - name is the module name
16 - methods is the list of top-level functions
17 - doc is the documentation string
18 - passthrough is passed as self to functions defined in the module
19 - api_version is the value of PYTHON_API_VERSION at the time the
20 module was compiled
21
22 Return value is a borrowed reference to the module object; or NULL
23 if an error occurred (in Python 1.4 and before, errors were fatal).
24 Errors may still leak memory.
25 */
26
27 static char api_version_warning[] =
28 "Python C API version mismatch for module %.100s:\
29 This Python has API version %d, module %.100s has version %d.";
30
31 PyObject *
32 Py_InitModule4(const char *name, PyMethodDef *methods, const char *doc,
33 PyObject *passthrough, int module_api_version)
34 {
35 PyObject *m, *d, *v, *n;
36 PyMethodDef *ml;
37 PyInterpreterState *interp = PyThreadState_Get()->interp;
38 if (interp->modules == NULL)
39 Py_FatalError("Python import machinery not initialized");
40 if (module_api_version != PYTHON_API_VERSION) {
41 char message[512];
42 PyOS_snprintf(message, sizeof(message),
43 api_version_warning, name,
44 PYTHON_API_VERSION, name,
45 module_api_version);
46 if (PyErr_Warn(PyExc_RuntimeWarning, message))
47 return NULL;
48 }
49 /* Make sure name is fully qualified.
50
51 This is a bit of a hack: when the shared library is loaded,
52 the module name is "package.module", but the module calls
53 Py_InitModule*() with just "module" for the name. The shared
54 library loader squirrels away the true name of the module in
55 _Py_PackageContext, and Py_InitModule*() will substitute this
56 (if the name actually matches).
57 */
58 if (_Py_PackageContext != NULL) {
59 char *p = strrchr(_Py_PackageContext, '.');
60 if (p != NULL && strcmp(name, p+1) == 0) {
61 name = _Py_PackageContext;
62 _Py_PackageContext = NULL;
63 }
64 }
65 if ((m = PyImport_AddModule(name)) == NULL)
66 return NULL;
67 d = PyModule_GetDict(m);
68 if (methods != NULL) {
69 n = PyString_FromString(name);
70 if (n == NULL)
71 return NULL;
72 for (ml = methods; ml->ml_name != NULL; ml++) {
73 if ((ml->ml_flags & METH_CLASS) ||
74 (ml->ml_flags & METH_STATIC)) {
75 PyErr_SetString(PyExc_ValueError,
76 "module functions cannot set"
77 " METH_CLASS or METH_STATIC");
78 Py_DECREF(n);
79 return NULL;
80 }
81 v = PyCFunction_NewEx(ml, passthrough, n);
82 if (v == NULL) {
83 Py_DECREF(n);
84 return NULL;
85 }
86 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
87 Py_DECREF(v);
88 Py_DECREF(n);
89 return NULL;
90 }
91 Py_DECREF(v);
92 }
93 Py_DECREF(n);
94 }
95 if (doc != NULL) {
96 v = PyString_FromString(doc);
97 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
98 Py_XDECREF(v);
99 return NULL;
100 }
101 Py_DECREF(v);
102 }
103 return m;
104 }
105
106
107 /* Helper for mkvalue() to scan the length of a format */
108
109 static int
110 countformat(const char *format, int endchar)
111 {
112 int count = 0;
113 int level = 0;
114 while (level > 0 || *format != endchar) {
115 switch (*format) {
116 case '\0':
117 /* Premature end */
118 PyErr_SetString(PyExc_SystemError,
119 "unmatched paren in format");
120 return -1;
121 case '(':
122 case '[':
123 case '{':
124 if (level == 0)
125 count++;
126 level++;
127 break;
128 case ')':
129 case ']':
130 case '}':
131 level--;
132 break;
133 case '#':
134 case '&':
135 case ',':
136 case ':':
137 case ' ':
138 case '\t':
139 break;
140 default:
141 if (level == 0)
142 count++;
143 }
144 format++;
145 }
146 return count;
147 }
148
149
150 /* Generic function to create a value -- the inverse of getargs() */
151 /* After an original idea and first implementation by Steven Miale */
152
153 static PyObject *do_mktuple(const char**, va_list *, int, int, int);
154 static PyObject *do_mklist(const char**, va_list *, int, int, int);
155 static PyObject *do_mkdict(const char**, va_list *, int, int, int);
156 static PyObject *do_mkvalue(const char**, va_list *, int);
157
158
159 static PyObject *
160 do_mkdict(const char **p_format, va_list *p_va, int endchar, int n, int flags)
161 {
162 PyObject *d;
163 int i;
164 int itemfailed = 0;
165 if (n < 0)
166 return NULL;
167 if ((d = PyDict_New()) == NULL)
168 return NULL;
169 /* Note that we can't bail immediately on error as this will leak
170 refcounts on any 'N' arguments. */
171 for (i = 0; i < n; i+= 2) {
172 PyObject *k, *v;
173 int err;
174 k = do_mkvalue(p_format, p_va, flags);
175 if (k == NULL) {
176 itemfailed = 1;
177 Py_INCREF(Py_None);
178 k = Py_None;
179 }
180 v = do_mkvalue(p_format, p_va, flags);
181 if (v == NULL) {
182 itemfailed = 1;
183 Py_INCREF(Py_None);
184 v = Py_None;
185 }
186 err = PyDict_SetItem(d, k, v);
187 Py_DECREF(k);
188 Py_DECREF(v);
189 if (err < 0 || itemfailed) {
190 Py_DECREF(d);
191 return NULL;
192 }
193 }
194 if (d != NULL && **p_format != endchar) {
195 Py_DECREF(d);
196 d = NULL;
197 PyErr_SetString(PyExc_SystemError,
198 "Unmatched paren in format");
199 }
200 else if (endchar)
201 ++*p_format;
202 return d;
203 }
204
205 static PyObject *
206 do_mklist(const char **p_format, va_list *p_va, int endchar, int n, int flags)
207 {
208 PyObject *v;
209 int i;
210 int itemfailed = 0;
211 if (n < 0)
212 return NULL;
213 v = PyList_New(n);
214 if (v == NULL)
215 return NULL;
216 /* Note that we can't bail immediately on error as this will leak
217 refcounts on any 'N' arguments. */
218 for (i = 0; i < n; i++) {
219 PyObject *w = do_mkvalue(p_format, p_va, flags);
220 if (w == NULL) {
221 itemfailed = 1;
222 Py_INCREF(Py_None);
223 w = Py_None;
224 }
225 PyList_SET_ITEM(v, i, w);
226 }
227
228 if (itemfailed) {
229 /* do_mkvalue() should have already set an error */
230 Py_DECREF(v);
231 return NULL;
232 }
233 if (**p_format != endchar) {
234 Py_DECREF(v);
235 PyErr_SetString(PyExc_SystemError,
236 "Unmatched paren in format");
237 return NULL;
238 }
239 if (endchar)
240 ++*p_format;
241 return v;
242 }
243
244 #ifdef Py_USING_UNICODE
245 static int
246 _ustrlen(Py_UNICODE *u)
247 {
248 int i = 0;
249 Py_UNICODE *v = u;
250 while (*v != 0) { i++; v++; }
251 return i;
252 }
253 #endif
254
255 static PyObject *
256 do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)
257 {
258 PyObject *v;
259 int i;
260 int itemfailed = 0;
261 if (n < 0)
262 return NULL;
263 if ((v = PyTuple_New(n)) == NULL)
264 return NULL;
265 /* Note that we can't bail immediately on error as this will leak
266 refcounts on any 'N' arguments. */
267 for (i = 0; i < n; i++) {
268 PyObject *w = do_mkvalue(p_format, p_va, flags);
269 if (w == NULL) {
270 itemfailed = 1;
271 Py_INCREF(Py_None);
272 w = Py_None;
273 }
274 PyTuple_SET_ITEM(v, i, w);
275 }
276 if (itemfailed) {
277 /* do_mkvalue() should have already set an error */
278 Py_DECREF(v);
279 return NULL;
280 }
281 if (**p_format != endchar) {
282 Py_DECREF(v);
283 PyErr_SetString(PyExc_SystemError,
284 "Unmatched paren in format");
285 return NULL;
286 }
287 if (endchar)
288 ++*p_format;
289 return v;
290 }
291
292 static PyObject *
293 do_mkvalue(const char **p_format, va_list *p_va, int flags)
294 {
295 for (;;) {
296 switch (*(*p_format)++) {
297 case '(':
298 return do_mktuple(p_format, p_va, ')',
299 countformat(*p_format, ')'), flags);
300
301 case '[':
302 return do_mklist(p_format, p_va, ']',
303 countformat(*p_format, ']'), flags);
304
305 case '{':
306 return do_mkdict(p_format, p_va, '}',
307 countformat(*p_format, '}'), flags);
308
309 case 'b':
310 case 'B':
311 case 'h':
312 case 'i':
313 return PyInt_FromLong((long)va_arg(*p_va, int));
314
315 case 'H':
316 return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
317
318 case 'I':
319 {
320 unsigned int n;
321 n = va_arg(*p_va, unsigned int);
322 if (n > (unsigned long)PyInt_GetMax())
323 return PyLong_FromUnsignedLong((unsigned long)n);
324 else
325 return PyInt_FromLong(n);
326 }
327
328 case 'n':
329 #if SIZEOF_SIZE_T!=SIZEOF_LONG
330 return PyInt_FromSsize_t(va_arg(*p_va, Py_ssize_t));
331 #endif
332 /* Fall through from 'n' to 'l' if Py_ssize_t is long */
333 case 'l':
334 return PyInt_FromLong(va_arg(*p_va, long));
335
336 case 'k':
337 {
338 unsigned long n;
339 n = va_arg(*p_va, unsigned long);
340 if (n > (unsigned long)PyInt_GetMax())
341 return PyLong_FromUnsignedLong(n);
342 else
343 return PyInt_FromLong(n);
344 }
345
346 #ifdef HAVE_LONG_LONG
347 case 'L':
348 return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG));
349
350 case 'K':
351 return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));
352 #endif
353 #ifdef Py_USING_UNICODE
354 case 'u':
355 {
356 PyObject *v;
357 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
358 Py_ssize_t n;
359 if (**p_format == '#') {
360 ++*p_format;
361 if (flags & FLAG_SIZE_T)
362 n = va_arg(*p_va, Py_ssize_t);
363 else
364 n = va_arg(*p_va, int);
365 }
366 else
367 n = -1;
368 if (u == NULL) {
369 v = Py_None;
370 Py_INCREF(v);
371 }
372 else {
373 if (n < 0)
374 n = _ustrlen(u);
375 v = PyUnicode_FromUnicode(u, n);
376 }
377 return v;
378 }
379 #endif
380 case 'f':
381 case 'd':
382 return PyFloat_FromDouble(
383 (double)va_arg(*p_va, va_double));
384
385 #ifndef WITHOUT_COMPLEX
386 case 'D':
387 return PyComplex_FromCComplex(
388 *((Py_complex *)va_arg(*p_va, Py_complex *)));
389 #endif /* WITHOUT_COMPLEX */
390
391 case 'c':
392 {
393 char p[1];
394 p[0] = (char)va_arg(*p_va, int);
395 return PyString_FromStringAndSize(p, 1);
396 }
397
398 case 's':
399 case 'z':
400 {
401 PyObject *v;
402 char *str = va_arg(*p_va, char *);
403 Py_ssize_t n;
404 if (**p_format == '#') {
405 ++*p_format;
406 if (flags & FLAG_SIZE_T)
407 n = va_arg(*p_va, Py_ssize_t);
408 else
409 n = va_arg(*p_va, int);
410 }
411 else
412 n = -1;
413 if (str == NULL) {
414 v = Py_None;
415 Py_INCREF(v);
416 }
417 else {
418 if (n < 0) {
419 size_t m = strlen(str);
420 if (m > PY_SSIZE_T_MAX) {
421 PyErr_SetString(PyExc_OverflowError,
422 "string too long for Python string");
423 return NULL;
424 }
425 n = (Py_ssize_t)m;
426 }
427 v = PyString_FromStringAndSize(str, n);
428 }
429 return v;
430 }
431
432 case 'N':
433 case 'S':
434 case 'O':
435 if (**p_format == '&') {
436 typedef PyObject *(*converter)(void *);
437 converter func = va_arg(*p_va, converter);
438 void *arg = va_arg(*p_va, void *);
439 ++*p_format;
440 return (*func)(arg);
441 }
442 else {
443 PyObject *v;
444 v = va_arg(*p_va, PyObject *);
445 if (v != NULL) {
446 if (*(*p_format - 1) != 'N')
447 Py_INCREF(v);
448 }
449 else if (!PyErr_Occurred())
450 /* If a NULL was passed
451 * because a call that should
452 * have constructed a value
453 * failed, that's OK, and we
454 * pass the error on; but if
455 * no error occurred it's not
456 * clear that the caller knew
457 * what she was doing. */
458 PyErr_SetString(PyExc_SystemError,
459 "NULL object passed to Py_BuildValue");
460 return v;
461 }
462
463 case ':':
464 case ',':
465 case ' ':
466 case '\t':
467 break;
468
469 default:
470 PyErr_SetString(PyExc_SystemError,
471 "bad format char passed to Py_BuildValue");
472 return NULL;
473
474 }
475 }
476 }
477
478
479 PyObject *
480 Py_BuildValue(const char *format, ...)
481 {
482 va_list va;
483 PyObject* retval;
484 va_start(va, format);
485 retval = va_build_value(format, va, 0);
486 va_end(va);
487 return retval;
488 }
489
490 PyObject *
491 _Py_BuildValue_SizeT(const char *format, ...)
492 {
493 va_list va;
494 PyObject* retval;
495 va_start(va, format);
496 retval = va_build_value(format, va, FLAG_SIZE_T);
497 va_end(va);
498 return retval;
499 }
500
501 PyObject *
502 Py_VaBuildValue(const char *format, va_list va)
503 {
504 return va_build_value(format, va, 0);
505 }
506
507 PyObject *
508 _Py_VaBuildValue_SizeT(const char *format, va_list va)
509 {
510 return va_build_value(format, va, FLAG_SIZE_T);
511 }
512
513 static PyObject *
514 va_build_value(const char *format, va_list va, int flags)
515 {
516 const char *f = format;
517 int n = countformat(f, '\0');
518 va_list lva;
519
520 #ifdef VA_LIST_IS_ARRAY
521 memcpy(lva, va, sizeof(va_list));
522 #else
523 #ifdef __va_copy
524 __va_copy(lva, va);
525 #else
526 lva = va;
527 #endif
528 #endif
529
530 if (n < 0)
531 return NULL;
532 if (n == 0) {
533 Py_INCREF(Py_None);
534 return Py_None;
535 }
536 if (n == 1)
537 return do_mkvalue(&f, &lva, flags);
538 return do_mktuple(&f, &lva, '\0', n, flags);
539 }
540
541
542 PyObject *
543 PyEval_CallFunction(PyObject *obj, const char *format, ...)
544 {
545 va_list vargs;
546 PyObject *args;
547 PyObject *res;
548
549 va_start(vargs, format);
550
551 args = Py_VaBuildValue(format, vargs);
552 va_end(vargs);
553
554 if (args == NULL)
555 return NULL;
556
557 res = PyEval_CallObject(obj, args);
558 Py_DECREF(args);
559
560 return res;
561 }
562
563
564 PyObject *
565 PyEval_CallMethod(PyObject *obj, const char *methodname, const char *format, ...)
566 {
567 va_list vargs;
568 PyObject *meth;
569 PyObject *args;
570 PyObject *res;
571
572 meth = PyObject_GetAttrString(obj, methodname);
573 if (meth == NULL)
574 return NULL;
575
576 va_start(vargs, format);
577
578 args = Py_VaBuildValue(format, vargs);
579 va_end(vargs);
580
581 if (args == NULL) {
582 Py_DECREF(meth);
583 return NULL;
584 }
585
586 res = PyEval_CallObject(meth, args);
587 Py_DECREF(meth);
588 Py_DECREF(args);
589
590 return res;
591 }
592
593 int
594 PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
595 {
596 PyObject *dict;
597 if (!PyModule_Check(m)) {
598 PyErr_SetString(PyExc_TypeError,
599 "PyModule_AddObject() needs module as first arg");
600 return -1;
601 }
602 if (!o) {
603 if (!PyErr_Occurred())
604 PyErr_SetString(PyExc_TypeError,
605 "PyModule_AddObject() needs non-NULL value");
606 return -1;
607 }
608
609 dict = PyModule_GetDict(m);
610 if (dict == NULL) {
611 /* Internal error -- modules must have a dict! */
612 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
613 PyModule_GetName(m));
614 return -1;
615 }
616 if (PyDict_SetItemString(dict, name, o))
617 return -1;
618 Py_DECREF(o);
619 return 0;
620 }
621
622 int
623 PyModule_AddIntConstant(PyObject *m, const char *name, long value)
624 {
625 PyObject *o = PyInt_FromLong(value);
626 if (!o)
627 return -1;
628 if (PyModule_AddObject(m, name, o) == 0)
629 return 0;
630 Py_DECREF(o);
631 return -1;
632 }
633
634 int
635 PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
636 {
637 PyObject *o = PyString_FromString(value);
638 if (!o)
639 return -1;
640 if (PyModule_AddObject(m, name, o) == 0)
641 return 0;
642 Py_DECREF(o);
643 return -1;
644 }