You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

665 lines
17 KiB

36 years ago
36 years ago
  1. /* Module support implementation */
  2. #include "Python.h"
  3. #define FLAG_SIZE_T 1
  4. typedef double va_double;
  5. static PyObject *va_build_value(const char *, va_list, int);
  6. static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, const char *, va_list, int, Py_ssize_t*);
  7. /* Package context -- the full module name for package imports */
  8. const char *_Py_PackageContext = NULL;
  9. int
  10. _Py_convert_optional_to_ssize_t(PyObject *obj, void *result)
  11. {
  12. Py_ssize_t limit;
  13. if (obj == Py_None) {
  14. return 1;
  15. }
  16. else if (PyIndex_Check(obj)) {
  17. limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
  18. if (limit == -1 && PyErr_Occurred()) {
  19. return 0;
  20. }
  21. }
  22. else {
  23. PyErr_Format(PyExc_TypeError,
  24. "argument should be integer or None, not '%.200s'",
  25. Py_TYPE(obj)->tp_name);
  26. return 0;
  27. }
  28. *((Py_ssize_t *)result) = limit;
  29. return 1;
  30. }
  31. /* Helper for mkvalue() to scan the length of a format */
  32. static Py_ssize_t
  33. countformat(const char *format, char endchar)
  34. {
  35. Py_ssize_t count = 0;
  36. int level = 0;
  37. while (level > 0 || *format != endchar) {
  38. switch (*format) {
  39. case '\0':
  40. /* Premature end */
  41. PyErr_SetString(PyExc_SystemError,
  42. "unmatched paren in format");
  43. return -1;
  44. case '(':
  45. case '[':
  46. case '{':
  47. if (level == 0) {
  48. count++;
  49. }
  50. level++;
  51. break;
  52. case ')':
  53. case ']':
  54. case '}':
  55. level--;
  56. break;
  57. case '#':
  58. case '&':
  59. case ',':
  60. case ':':
  61. case ' ':
  62. case '\t':
  63. break;
  64. default:
  65. if (level == 0) {
  66. count++;
  67. }
  68. }
  69. format++;
  70. }
  71. return count;
  72. }
  73. /* Generic function to create a value -- the inverse of getargs() */
  74. /* After an original idea and first implementation by Steven Miale */
  75. static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int);
  76. static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int);
  77. static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int);
  78. static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int);
  79. static PyObject *do_mkvalue(const char**, va_list *, int);
  80. static void
  81. do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
  82. {
  83. PyObject *v;
  84. Py_ssize_t i;
  85. assert(PyErr_Occurred());
  86. v = PyTuple_New(n);
  87. for (i = 0; i < n; i++) {
  88. PyObject *exception, *value, *tb, *w;
  89. PyErr_Fetch(&exception, &value, &tb);
  90. w = do_mkvalue(p_format, p_va, flags);
  91. PyErr_Restore(exception, value, tb);
  92. if (w != NULL) {
  93. if (v != NULL) {
  94. PyTuple_SET_ITEM(v, i, w);
  95. }
  96. else {
  97. Py_DECREF(w);
  98. }
  99. }
  100. }
  101. Py_XDECREF(v);
  102. if (**p_format != endchar) {
  103. PyErr_SetString(PyExc_SystemError,
  104. "Unmatched paren in format");
  105. return;
  106. }
  107. if (endchar) {
  108. ++*p_format;
  109. }
  110. }
  111. static PyObject *
  112. do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
  113. {
  114. PyObject *d;
  115. Py_ssize_t i;
  116. if (n < 0)
  117. return NULL;
  118. if (n % 2) {
  119. PyErr_SetString(PyExc_SystemError,
  120. "Bad dict format");
  121. do_ignore(p_format, p_va, endchar, n, flags);
  122. return NULL;
  123. }
  124. /* Note that we can't bail immediately on error as this will leak
  125. refcounts on any 'N' arguments. */
  126. if ((d = PyDict_New()) == NULL) {
  127. do_ignore(p_format, p_va, endchar, n, flags);
  128. return NULL;
  129. }
  130. for (i = 0; i < n; i+= 2) {
  131. PyObject *k, *v;
  132. k = do_mkvalue(p_format, p_va, flags);
  133. if (k == NULL) {
  134. do_ignore(p_format, p_va, endchar, n - i - 1, flags);
  135. Py_DECREF(d);
  136. return NULL;
  137. }
  138. v = do_mkvalue(p_format, p_va, flags);
  139. if (v == NULL || PyDict_SetItem(d, k, v) < 0) {
  140. do_ignore(p_format, p_va, endchar, n - i - 2, flags);
  141. Py_DECREF(k);
  142. Py_XDECREF(v);
  143. Py_DECREF(d);
  144. return NULL;
  145. }
  146. Py_DECREF(k);
  147. Py_DECREF(v);
  148. }
  149. if (**p_format != endchar) {
  150. Py_DECREF(d);
  151. PyErr_SetString(PyExc_SystemError,
  152. "Unmatched paren in format");
  153. return NULL;
  154. }
  155. if (endchar)
  156. ++*p_format;
  157. return d;
  158. }
  159. static PyObject *
  160. do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
  161. {
  162. PyObject *v;
  163. Py_ssize_t i;
  164. if (n < 0)
  165. return NULL;
  166. /* Note that we can't bail immediately on error as this will leak
  167. refcounts on any 'N' arguments. */
  168. v = PyList_New(n);
  169. if (v == NULL) {
  170. do_ignore(p_format, p_va, endchar, n, flags);
  171. return NULL;
  172. }
  173. for (i = 0; i < n; i++) {
  174. PyObject *w = do_mkvalue(p_format, p_va, flags);
  175. if (w == NULL) {
  176. do_ignore(p_format, p_va, endchar, n - i - 1, flags);
  177. Py_DECREF(v);
  178. return NULL;
  179. }
  180. PyList_SET_ITEM(v, i, w);
  181. }
  182. if (**p_format != endchar) {
  183. Py_DECREF(v);
  184. PyErr_SetString(PyExc_SystemError,
  185. "Unmatched paren in format");
  186. return NULL;
  187. }
  188. if (endchar)
  189. ++*p_format;
  190. return v;
  191. }
  192. static int
  193. do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
  194. char endchar, Py_ssize_t n, int flags)
  195. {
  196. Py_ssize_t i;
  197. if (n < 0) {
  198. return -1;
  199. }
  200. /* Note that we can't bail immediately on error as this will leak
  201. refcounts on any 'N' arguments. */
  202. for (i = 0; i < n; i++) {
  203. PyObject *w = do_mkvalue(p_format, p_va, flags);
  204. if (w == NULL) {
  205. do_ignore(p_format, p_va, endchar, n - i - 1, flags);
  206. goto error;
  207. }
  208. stack[i] = w;
  209. }
  210. if (**p_format != endchar) {
  211. PyErr_SetString(PyExc_SystemError,
  212. "Unmatched paren in format");
  213. goto error;
  214. }
  215. if (endchar) {
  216. ++*p_format;
  217. }
  218. return 0;
  219. error:
  220. n = i;
  221. for (i=0; i < n; i++) {
  222. Py_DECREF(stack[i]);
  223. }
  224. return -1;
  225. }
  226. static PyObject *
  227. do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
  228. {
  229. PyObject *v;
  230. Py_ssize_t i;
  231. if (n < 0)
  232. return NULL;
  233. /* Note that we can't bail immediately on error as this will leak
  234. refcounts on any 'N' arguments. */
  235. if ((v = PyTuple_New(n)) == NULL) {
  236. do_ignore(p_format, p_va, endchar, n, flags);
  237. return NULL;
  238. }
  239. for (i = 0; i < n; i++) {
  240. PyObject *w = do_mkvalue(p_format, p_va, flags);
  241. if (w == NULL) {
  242. do_ignore(p_format, p_va, endchar, n - i - 1, flags);
  243. Py_DECREF(v);
  244. return NULL;
  245. }
  246. PyTuple_SET_ITEM(v, i, w);
  247. }
  248. if (**p_format != endchar) {
  249. Py_DECREF(v);
  250. PyErr_SetString(PyExc_SystemError,
  251. "Unmatched paren in format");
  252. return NULL;
  253. }
  254. if (endchar)
  255. ++*p_format;
  256. return v;
  257. }
  258. static PyObject *
  259. do_mkvalue(const char **p_format, va_list *p_va, int flags)
  260. {
  261. for (;;) {
  262. switch (*(*p_format)++) {
  263. case '(':
  264. return do_mktuple(p_format, p_va, ')',
  265. countformat(*p_format, ')'), flags);
  266. case '[':
  267. return do_mklist(p_format, p_va, ']',
  268. countformat(*p_format, ']'), flags);
  269. case '{':
  270. return do_mkdict(p_format, p_va, '}',
  271. countformat(*p_format, '}'), flags);
  272. case 'b':
  273. case 'B':
  274. case 'h':
  275. case 'i':
  276. return PyLong_FromLong((long)va_arg(*p_va, int));
  277. case 'H':
  278. return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
  279. case 'I':
  280. {
  281. unsigned int n;
  282. n = va_arg(*p_va, unsigned int);
  283. return PyLong_FromUnsignedLong(n);
  284. }
  285. case 'n':
  286. #if SIZEOF_SIZE_T!=SIZEOF_LONG
  287. return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
  288. #endif
  289. /* Fall through from 'n' to 'l' if Py_ssize_t is long */
  290. case 'l':
  291. return PyLong_FromLong(va_arg(*p_va, long));
  292. case 'k':
  293. {
  294. unsigned long n;
  295. n = va_arg(*p_va, unsigned long);
  296. return PyLong_FromUnsignedLong(n);
  297. }
  298. case 'L':
  299. return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
  300. case 'K':
  301. return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
  302. case 'u':
  303. {
  304. PyObject *v;
  305. Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
  306. Py_ssize_t n;
  307. if (**p_format == '#') {
  308. ++*p_format;
  309. if (flags & FLAG_SIZE_T)
  310. n = va_arg(*p_va, Py_ssize_t);
  311. else
  312. n = va_arg(*p_va, int);
  313. }
  314. else
  315. n = -1;
  316. if (u == NULL) {
  317. v = Py_None;
  318. Py_INCREF(v);
  319. }
  320. else {
  321. if (n < 0)
  322. n = wcslen(u);
  323. v = PyUnicode_FromWideChar(u, n);
  324. }
  325. return v;
  326. }
  327. case 'f':
  328. case 'd':
  329. return PyFloat_FromDouble(
  330. (double)va_arg(*p_va, va_double));
  331. case 'D':
  332. return PyComplex_FromCComplex(
  333. *((Py_complex *)va_arg(*p_va, Py_complex *)));
  334. case 'c':
  335. {
  336. char p[1];
  337. p[0] = (char)va_arg(*p_va, int);
  338. return PyBytes_FromStringAndSize(p, 1);
  339. }
  340. case 'C':
  341. {
  342. int i = va_arg(*p_va, int);
  343. return PyUnicode_FromOrdinal(i);
  344. }
  345. case 's':
  346. case 'z':
  347. case 'U': /* XXX deprecated alias */
  348. {
  349. PyObject *v;
  350. const char *str = va_arg(*p_va, const char *);
  351. Py_ssize_t n;
  352. if (**p_format == '#') {
  353. ++*p_format;
  354. if (flags & FLAG_SIZE_T)
  355. n = va_arg(*p_va, Py_ssize_t);
  356. else
  357. n = va_arg(*p_va, int);
  358. }
  359. else
  360. n = -1;
  361. if (str == NULL) {
  362. v = Py_None;
  363. Py_INCREF(v);
  364. }
  365. else {
  366. if (n < 0) {
  367. size_t m = strlen(str);
  368. if (m > PY_SSIZE_T_MAX) {
  369. PyErr_SetString(PyExc_OverflowError,
  370. "string too long for Python string");
  371. return NULL;
  372. }
  373. n = (Py_ssize_t)m;
  374. }
  375. v = PyUnicode_FromStringAndSize(str, n);
  376. }
  377. return v;
  378. }
  379. case 'y':
  380. {
  381. PyObject *v;
  382. const char *str = va_arg(*p_va, const char *);
  383. Py_ssize_t n;
  384. if (**p_format == '#') {
  385. ++*p_format;
  386. if (flags & FLAG_SIZE_T)
  387. n = va_arg(*p_va, Py_ssize_t);
  388. else
  389. n = va_arg(*p_va, int);
  390. }
  391. else
  392. n = -1;
  393. if (str == NULL) {
  394. v = Py_None;
  395. Py_INCREF(v);
  396. }
  397. else {
  398. if (n < 0) {
  399. size_t m = strlen(str);
  400. if (m > PY_SSIZE_T_MAX) {
  401. PyErr_SetString(PyExc_OverflowError,
  402. "string too long for Python bytes");
  403. return NULL;
  404. }
  405. n = (Py_ssize_t)m;
  406. }
  407. v = PyBytes_FromStringAndSize(str, n);
  408. }
  409. return v;
  410. }
  411. case 'N':
  412. case 'S':
  413. case 'O':
  414. if (**p_format == '&') {
  415. typedef PyObject *(*converter)(void *);
  416. converter func = va_arg(*p_va, converter);
  417. void *arg = va_arg(*p_va, void *);
  418. ++*p_format;
  419. return (*func)(arg);
  420. }
  421. else {
  422. PyObject *v;
  423. v = va_arg(*p_va, PyObject *);
  424. if (v != NULL) {
  425. if (*(*p_format - 1) != 'N')
  426. Py_INCREF(v);
  427. }
  428. else if (!PyErr_Occurred())
  429. /* If a NULL was passed
  430. * because a call that should
  431. * have constructed a value
  432. * failed, that's OK, and we
  433. * pass the error on; but if
  434. * no error occurred it's not
  435. * clear that the caller knew
  436. * what she was doing. */
  437. PyErr_SetString(PyExc_SystemError,
  438. "NULL object passed to Py_BuildValue");
  439. return v;
  440. }
  441. case ':':
  442. case ',':
  443. case ' ':
  444. case '\t':
  445. break;
  446. default:
  447. PyErr_SetString(PyExc_SystemError,
  448. "bad format char passed to Py_BuildValue");
  449. return NULL;
  450. }
  451. }
  452. }
  453. PyObject *
  454. Py_BuildValue(const char *format, ...)
  455. {
  456. va_list va;
  457. PyObject* retval;
  458. va_start(va, format);
  459. retval = va_build_value(format, va, 0);
  460. va_end(va);
  461. return retval;
  462. }
  463. PyObject *
  464. _Py_BuildValue_SizeT(const char *format, ...)
  465. {
  466. va_list va;
  467. PyObject* retval;
  468. va_start(va, format);
  469. retval = va_build_value(format, va, FLAG_SIZE_T);
  470. va_end(va);
  471. return retval;
  472. }
  473. PyObject *
  474. Py_VaBuildValue(const char *format, va_list va)
  475. {
  476. return va_build_value(format, va, 0);
  477. }
  478. PyObject *
  479. _Py_VaBuildValue_SizeT(const char *format, va_list va)
  480. {
  481. return va_build_value(format, va, FLAG_SIZE_T);
  482. }
  483. static PyObject *
  484. va_build_value(const char *format, va_list va, int flags)
  485. {
  486. const char *f = format;
  487. Py_ssize_t n = countformat(f, '\0');
  488. va_list lva;
  489. PyObject *retval;
  490. if (n < 0)
  491. return NULL;
  492. if (n == 0) {
  493. Py_RETURN_NONE;
  494. }
  495. va_copy(lva, va);
  496. if (n == 1) {
  497. retval = do_mkvalue(&f, &lva, flags);
  498. } else {
  499. retval = do_mktuple(&f, &lva, '\0', n, flags);
  500. }
  501. va_end(lva);
  502. return retval;
  503. }
  504. PyObject **
  505. _Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
  506. const char *format, va_list va, Py_ssize_t *p_nargs)
  507. {
  508. return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
  509. }
  510. PyObject **
  511. _Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
  512. const char *format, va_list va, Py_ssize_t *p_nargs)
  513. {
  514. return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
  515. }
  516. static PyObject **
  517. va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
  518. const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
  519. {
  520. const char *f;
  521. Py_ssize_t n;
  522. va_list lva;
  523. PyObject **stack;
  524. int res;
  525. n = countformat(format, '\0');
  526. if (n < 0) {
  527. *p_nargs = 0;
  528. return NULL;
  529. }
  530. if (n == 0) {
  531. *p_nargs = 0;
  532. return small_stack;
  533. }
  534. if (n <= small_stack_len) {
  535. stack = small_stack;
  536. }
  537. else {
  538. stack = PyMem_Malloc(n * sizeof(stack[0]));
  539. if (stack == NULL) {
  540. PyErr_NoMemory();
  541. return NULL;
  542. }
  543. }
  544. va_copy(lva, va);
  545. f = format;
  546. res = do_mkstack(stack, &f, &lva, '\0', n, flags);
  547. va_end(lva);
  548. if (res < 0) {
  549. return NULL;
  550. }
  551. *p_nargs = n;
  552. return stack;
  553. }
  554. int
  555. PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
  556. {
  557. PyObject *dict;
  558. if (!PyModule_Check(m)) {
  559. PyErr_SetString(PyExc_TypeError,
  560. "PyModule_AddObject() needs module as first arg");
  561. return -1;
  562. }
  563. if (!o) {
  564. if (!PyErr_Occurred())
  565. PyErr_SetString(PyExc_TypeError,
  566. "PyModule_AddObject() needs non-NULL value");
  567. return -1;
  568. }
  569. dict = PyModule_GetDict(m);
  570. if (dict == NULL) {
  571. /* Internal error -- modules must have a dict! */
  572. PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
  573. PyModule_GetName(m));
  574. return -1;
  575. }
  576. if (PyDict_SetItemString(dict, name, o))
  577. return -1;
  578. Py_DECREF(o);
  579. return 0;
  580. }
  581. int
  582. PyModule_AddIntConstant(PyObject *m, const char *name, long value)
  583. {
  584. PyObject *o = PyLong_FromLong(value);
  585. if (!o)
  586. return -1;
  587. if (PyModule_AddObject(m, name, o) == 0)
  588. return 0;
  589. Py_DECREF(o);
  590. return -1;
  591. }
  592. int
  593. PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
  594. {
  595. PyObject *o = PyUnicode_FromString(value);
  596. if (!o)
  597. return -1;
  598. if (PyModule_AddObject(m, name, o) == 0)
  599. return 0;
  600. Py_DECREF(o);
  601. return -1;
  602. }