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.

680 lines
18 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. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  313. "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
  314. return NULL;
  315. }
  316. n = va_arg(*p_va, int);
  317. }
  318. }
  319. else
  320. n = -1;
  321. if (u == NULL) {
  322. v = Py_None;
  323. Py_INCREF(v);
  324. }
  325. else {
  326. if (n < 0)
  327. n = wcslen(u);
  328. v = PyUnicode_FromWideChar(u, n);
  329. }
  330. return v;
  331. }
  332. case 'f':
  333. case 'd':
  334. return PyFloat_FromDouble(
  335. (double)va_arg(*p_va, va_double));
  336. case 'D':
  337. return PyComplex_FromCComplex(
  338. *((Py_complex *)va_arg(*p_va, Py_complex *)));
  339. case 'c':
  340. {
  341. char p[1];
  342. p[0] = (char)va_arg(*p_va, int);
  343. return PyBytes_FromStringAndSize(p, 1);
  344. }
  345. case 'C':
  346. {
  347. int i = va_arg(*p_va, int);
  348. return PyUnicode_FromOrdinal(i);
  349. }
  350. case 's':
  351. case 'z':
  352. case 'U': /* XXX deprecated alias */
  353. {
  354. PyObject *v;
  355. const char *str = va_arg(*p_va, const char *);
  356. Py_ssize_t n;
  357. if (**p_format == '#') {
  358. ++*p_format;
  359. if (flags & FLAG_SIZE_T)
  360. n = va_arg(*p_va, Py_ssize_t);
  361. else {
  362. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  363. "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
  364. return NULL;
  365. }
  366. n = va_arg(*p_va, int);
  367. }
  368. }
  369. else
  370. n = -1;
  371. if (str == NULL) {
  372. v = Py_None;
  373. Py_INCREF(v);
  374. }
  375. else {
  376. if (n < 0) {
  377. size_t m = strlen(str);
  378. if (m > PY_SSIZE_T_MAX) {
  379. PyErr_SetString(PyExc_OverflowError,
  380. "string too long for Python string");
  381. return NULL;
  382. }
  383. n = (Py_ssize_t)m;
  384. }
  385. v = PyUnicode_FromStringAndSize(str, n);
  386. }
  387. return v;
  388. }
  389. case 'y':
  390. {
  391. PyObject *v;
  392. const char *str = va_arg(*p_va, const char *);
  393. Py_ssize_t n;
  394. if (**p_format == '#') {
  395. ++*p_format;
  396. if (flags & FLAG_SIZE_T)
  397. n = va_arg(*p_va, Py_ssize_t);
  398. else {
  399. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  400. "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
  401. return NULL;
  402. }
  403. n = va_arg(*p_va, int);
  404. }
  405. }
  406. else
  407. n = -1;
  408. if (str == NULL) {
  409. v = Py_None;
  410. Py_INCREF(v);
  411. }
  412. else {
  413. if (n < 0) {
  414. size_t m = strlen(str);
  415. if (m > PY_SSIZE_T_MAX) {
  416. PyErr_SetString(PyExc_OverflowError,
  417. "string too long for Python bytes");
  418. return NULL;
  419. }
  420. n = (Py_ssize_t)m;
  421. }
  422. v = PyBytes_FromStringAndSize(str, n);
  423. }
  424. return v;
  425. }
  426. case 'N':
  427. case 'S':
  428. case 'O':
  429. if (**p_format == '&') {
  430. typedef PyObject *(*converter)(void *);
  431. converter func = va_arg(*p_va, converter);
  432. void *arg = va_arg(*p_va, void *);
  433. ++*p_format;
  434. return (*func)(arg);
  435. }
  436. else {
  437. PyObject *v;
  438. v = va_arg(*p_va, PyObject *);
  439. if (v != NULL) {
  440. if (*(*p_format - 1) != 'N')
  441. Py_INCREF(v);
  442. }
  443. else if (!PyErr_Occurred())
  444. /* If a NULL was passed
  445. * because a call that should
  446. * have constructed a value
  447. * failed, that's OK, and we
  448. * pass the error on; but if
  449. * no error occurred it's not
  450. * clear that the caller knew
  451. * what she was doing. */
  452. PyErr_SetString(PyExc_SystemError,
  453. "NULL object passed to Py_BuildValue");
  454. return v;
  455. }
  456. case ':':
  457. case ',':
  458. case ' ':
  459. case '\t':
  460. break;
  461. default:
  462. PyErr_SetString(PyExc_SystemError,
  463. "bad format char passed to Py_BuildValue");
  464. return NULL;
  465. }
  466. }
  467. }
  468. PyObject *
  469. Py_BuildValue(const char *format, ...)
  470. {
  471. va_list va;
  472. PyObject* retval;
  473. va_start(va, format);
  474. retval = va_build_value(format, va, 0);
  475. va_end(va);
  476. return retval;
  477. }
  478. PyObject *
  479. _Py_BuildValue_SizeT(const char *format, ...)
  480. {
  481. va_list va;
  482. PyObject* retval;
  483. va_start(va, format);
  484. retval = va_build_value(format, va, FLAG_SIZE_T);
  485. va_end(va);
  486. return retval;
  487. }
  488. PyObject *
  489. Py_VaBuildValue(const char *format, va_list va)
  490. {
  491. return va_build_value(format, va, 0);
  492. }
  493. PyObject *
  494. _Py_VaBuildValue_SizeT(const char *format, va_list va)
  495. {
  496. return va_build_value(format, va, FLAG_SIZE_T);
  497. }
  498. static PyObject *
  499. va_build_value(const char *format, va_list va, int flags)
  500. {
  501. const char *f = format;
  502. Py_ssize_t n = countformat(f, '\0');
  503. va_list lva;
  504. PyObject *retval;
  505. if (n < 0)
  506. return NULL;
  507. if (n == 0) {
  508. Py_RETURN_NONE;
  509. }
  510. va_copy(lva, va);
  511. if (n == 1) {
  512. retval = do_mkvalue(&f, &lva, flags);
  513. } else {
  514. retval = do_mktuple(&f, &lva, '\0', n, flags);
  515. }
  516. va_end(lva);
  517. return retval;
  518. }
  519. PyObject **
  520. _Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
  521. const char *format, va_list va, Py_ssize_t *p_nargs)
  522. {
  523. return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
  524. }
  525. PyObject **
  526. _Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
  527. const char *format, va_list va, Py_ssize_t *p_nargs)
  528. {
  529. return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
  530. }
  531. static PyObject **
  532. va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
  533. const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
  534. {
  535. const char *f;
  536. Py_ssize_t n;
  537. va_list lva;
  538. PyObject **stack;
  539. int res;
  540. n = countformat(format, '\0');
  541. if (n < 0) {
  542. *p_nargs = 0;
  543. return NULL;
  544. }
  545. if (n == 0) {
  546. *p_nargs = 0;
  547. return small_stack;
  548. }
  549. if (n <= small_stack_len) {
  550. stack = small_stack;
  551. }
  552. else {
  553. stack = PyMem_Malloc(n * sizeof(stack[0]));
  554. if (stack == NULL) {
  555. PyErr_NoMemory();
  556. return NULL;
  557. }
  558. }
  559. va_copy(lva, va);
  560. f = format;
  561. res = do_mkstack(stack, &f, &lva, '\0', n, flags);
  562. va_end(lva);
  563. if (res < 0) {
  564. return NULL;
  565. }
  566. *p_nargs = n;
  567. return stack;
  568. }
  569. int
  570. PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
  571. {
  572. PyObject *dict;
  573. if (!PyModule_Check(m)) {
  574. PyErr_SetString(PyExc_TypeError,
  575. "PyModule_AddObject() needs module as first arg");
  576. return -1;
  577. }
  578. if (!o) {
  579. if (!PyErr_Occurred())
  580. PyErr_SetString(PyExc_TypeError,
  581. "PyModule_AddObject() needs non-NULL value");
  582. return -1;
  583. }
  584. dict = PyModule_GetDict(m);
  585. if (dict == NULL) {
  586. /* Internal error -- modules must have a dict! */
  587. PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
  588. PyModule_GetName(m));
  589. return -1;
  590. }
  591. if (PyDict_SetItemString(dict, name, o))
  592. return -1;
  593. Py_DECREF(o);
  594. return 0;
  595. }
  596. int
  597. PyModule_AddIntConstant(PyObject *m, const char *name, long value)
  598. {
  599. PyObject *o = PyLong_FromLong(value);
  600. if (!o)
  601. return -1;
  602. if (PyModule_AddObject(m, name, o) == 0)
  603. return 0;
  604. Py_DECREF(o);
  605. return -1;
  606. }
  607. int
  608. PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
  609. {
  610. PyObject *o = PyUnicode_FromString(value);
  611. if (!o)
  612. return -1;
  613. if (PyModule_AddObject(m, name, o) == 0)
  614. return 0;
  615. Py_DECREF(o);
  616. return -1;
  617. }