modsupport.c 9.41 KB
Newer Older
1

Guido van Rossum's avatar
Guido van Rossum committed
2 3
/* Module support implementation */

4
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
5

6 7
#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
typedef extended va_double;
8
#else
9 10 11
typedef double va_double;
#endif

12 13 14
/* Package context -- the full module name for package imports */
char *_Py_PackageContext = NULL;

15
/* Py_InitModule4() parameters:
Guido van Rossum's avatar
Guido van Rossum committed
16 17 18 19 20 21
   - name is the module name
   - methods is the list of top-level functions
   - doc is the documentation string
   - passthrough is passed as self to functions defined in the module
   - api_version is the value of PYTHON_API_VERSION at the time the
     module was compiled
22 23 24 25

   Return value is a borrowed reference to the module object; or NULL
   if an error occurred (in Python 1.4 and before, errors were fatal).
   Errors may still leak memory.
26
*/
27

Guido van Rossum's avatar
Guido van Rossum committed
28 29
static char api_version_warning[] =
"WARNING: Python C API version mismatch for module %s:\n\
30
  This Python has API version %d, module %s has version %d.\n";
Guido van Rossum's avatar
Guido van Rossum committed
31

32
PyObject *
33 34
Py_InitModule4(char *name, PyMethodDef *methods, char *doc,
	       PyObject *passthrough, int module_api_version)
Guido van Rossum's avatar
Guido van Rossum committed
35
{
36 37
	PyObject *m, *d, *v;
	PyMethodDef *ml;
38 39
	if (!Py_IsInitialized())
	    Py_FatalError("Interpreter not initialized (version mismatch?)");
Guido van Rossum's avatar
Guido van Rossum committed
40 41 42
	if (module_api_version != PYTHON_API_VERSION)
		fprintf(stderr, api_version_warning,
			name, PYTHON_API_VERSION, name, module_api_version);
43 44 45 46 47 48 49
	if (_Py_PackageContext != NULL) {
		char *p = strrchr(_Py_PackageContext, '.');
		if (p != NULL && strcmp(name, p+1) == 0) {
			name = _Py_PackageContext;
			_Py_PackageContext = NULL;
		}
	}
50 51
	if ((m = PyImport_AddModule(name)) == NULL)
		return NULL;
52
	d = PyModule_GetDict(m);
Guido van Rossum's avatar
Guido van Rossum committed
53
	for (ml = methods; ml->ml_name != NULL; ml++) {
54
		v = PyCFunction_New(ml, passthrough);
55 56 57 58
		if (v == NULL)
			return NULL;
		if (PyDict_SetItemString(d, ml->ml_name, v) != 0)
			return NULL;
59
		Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
60
	}
61
	if (doc != NULL) {
62 63
		v = PyString_FromString(doc);
		if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
64
			return NULL;
65
		Py_DECREF(v);
66
	}
Guido van Rossum's avatar
Guido van Rossum committed
67
	return m;
Guido van Rossum's avatar
Guido van Rossum committed
68 69 70
}


71
/* Helper for mkvalue() to scan the length of a format */
72

73
static int countformat(char *format, int endchar)
74 75 76 77
{
	int count = 0;
	int level = 0;
	while (level > 0 || *format != endchar) {
78 79
		switch (*format) {
		case '\0':
80
			/* Premature end */
81 82
			PyErr_SetString(PyExc_SystemError,
					"unmatched paren in format");
83
			return -1;
84 85 86
		case '(':
		case '[':
		case '{':
87 88 89
			if (level == 0)
				count++;
			level++;
90 91 92 93
			break;
		case ')':
		case ']':
		case '}':
94
			level--;
95 96
			break;
		case '#':
97
		case '&':
98 99 100 101 102 103 104 105 106
		case ',':
		case ':':
		case ' ':
		case '\t':
			break;
		default:
			if (level == 0)
				count++;
		}
107 108 109 110 111 112 113 114 115
		format++;
	}
	return count;
}


/* Generic function to create a value -- the inverse of getargs() */
/* After an original idea and first implementation by Steven Miale */

116 117 118 119
static PyObject *do_mktuple(char**, va_list *, int, int);
static PyObject *do_mklist(char**, va_list *, int, int);
static PyObject *do_mkdict(char**, va_list *, int, int);
static PyObject *do_mkvalue(char**, va_list *);
120

121

122
static PyObject *
123
do_mkdict(char **p_format, va_list *p_va, int endchar, int n)
124
{
125
	PyObject *d;
126 127 128
	int i;
	if (n < 0)
		return NULL;
129
	if ((d = PyDict_New()) == NULL)
130 131
		return NULL;
	for (i = 0; i < n; i+= 2) {
132
		PyObject *k, *v;
133
		int err;
134 135
		k = do_mkvalue(p_format, p_va);
		if (k == NULL) {
136
			Py_DECREF(d);
137 138 139 140
			return NULL;
		}
		v = do_mkvalue(p_format, p_va);
		if (v == NULL) {
141 142
			Py_DECREF(k);
			Py_DECREF(d);
143 144
			return NULL;
		}
145 146 147 148
		err = PyDict_SetItem(d, k, v);
		Py_DECREF(k);
		Py_DECREF(v);
		if (err < 0) {
149
			Py_DECREF(d);
150 151 152 153
			return NULL;
		}
	}
	if (d != NULL && **p_format != endchar) {
154
		Py_DECREF(d);
155
		d = NULL;
156 157
		PyErr_SetString(PyExc_SystemError,
				"Unmatched paren in format");
158 159 160 161 162 163
	}
	else if (endchar)
		++*p_format;
	return d;
}

164
static PyObject *
165
do_mklist(char **p_format, va_list *p_va, int endchar, int n)
166
{
167
	PyObject *v;
168 169 170
	int i;
	if (n < 0)
		return NULL;
171
	if ((v = PyList_New(n)) == NULL)
172 173
		return NULL;
	for (i = 0; i < n; i++) {
174
		PyObject *w = do_mkvalue(p_format, p_va);
175
		if (w == NULL) {
176
			Py_DECREF(v);
177 178
			return NULL;
		}
179
		PyList_SetItem(v, i, w);
180 181
	}
	if (v != NULL && **p_format != endchar) {
182
		Py_DECREF(v);
183
		v = NULL;
184 185
		PyErr_SetString(PyExc_SystemError,
				"Unmatched paren in format");
186 187 188 189 190 191
	}
	else if (endchar)
		++*p_format;
	return v;
}

192 193 194 195 196 197 198 199 200
static int
_ustrlen(Py_UNICODE *u)
{
	int i = 0;
	Py_UNICODE *v = u;
	while (*v != 0) { i++; v++; } 
	return i;
}

201
static PyObject *
202
do_mktuple(char **p_format, va_list *p_va, int endchar, int n)
203
{
204
	PyObject *v;
205 206 207
	int i;
	if (n < 0)
		return NULL;
208
	if ((v = PyTuple_New(n)) == NULL)
209 210
		return NULL;
	for (i = 0; i < n; i++) {
211
		PyObject *w = do_mkvalue(p_format, p_va);
212
		if (w == NULL) {
213
			Py_DECREF(v);
214 215
			return NULL;
		}
216
		PyTuple_SetItem(v, i, w);
217 218
	}
	if (v != NULL && **p_format != endchar) {
219
		Py_DECREF(v);
220
		v = NULL;
221 222
		PyErr_SetString(PyExc_SystemError,
				"Unmatched paren in format");
223 224 225 226 227 228
	}
	else if (endchar)
		++*p_format;
	return v;
}

229
static PyObject *
230
do_mkvalue(char **p_format, va_list *p_va)
231
{
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
	for (;;) {
		switch (*(*p_format)++) {
		case '(':
			return do_mktuple(p_format, p_va, ')',
					  countformat(*p_format, ')'));

		case '[':
			return do_mklist(p_format, p_va, ']',
					 countformat(*p_format, ']'));

		case '{':
			return do_mkdict(p_format, p_va, '}',
					 countformat(*p_format, '}'));

		case 'b':
247
		case 'B':
248 249
		case 'h':
		case 'i':
250
			return PyInt_FromLong((long)va_arg(*p_va, int));
251 252 253
			
		case 'H':
			return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
254 255

		case 'l':
256
			return PyInt_FromLong((long)va_arg(*p_va, long));
257

258
#ifdef HAVE_LONG_LONG
259
		case 'L':
260
			return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
261
#endif
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
		case 'u':
		{
			PyObject *v;
			Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
			int n;
			if (**p_format == '#') {
				++*p_format;
				n = va_arg(*p_va, int);
			}
			else
				n = -1;
			if (u == NULL) {
				v = Py_None;
				Py_INCREF(v);
			}
			else {
				if (n < 0)
					n = _ustrlen(u);
				v = PyUnicode_FromUnicode(u, n);
			}
			return v;
		}
284 285
		case 'f':
		case 'd':
286 287
			return PyFloat_FromDouble(
				(double)va_arg(*p_va, va_double));
288 289

		case 'c':
290 291 292
		{
			char p[1];
			p[0] = va_arg(*p_va, int);
293
			return PyString_FromStringAndSize(p, 1);
294
		}
295 296 297

		case 's':
		case 'z':
298
		{
299
			PyObject *v;
300 301 302 303 304 305 306 307 308
			char *str = va_arg(*p_va, char *);
			int n;
			if (**p_format == '#') {
				++*p_format;
				n = va_arg(*p_va, int);
			}
			else
				n = -1;
			if (str == NULL) {
309 310
				v = Py_None;
				Py_INCREF(v);
311 312
			}
			else {
313 314 315 316 317 318 319 320 321
				if (n < 0) {
					size_t m = strlen(str);
					if (m > INT_MAX) {
						PyErr_SetString(PyExc_OverflowError,
							"string too long for Python string");
						return NULL;
					}
					n = (int)m;
				}
322
				v = PyString_FromStringAndSize(str, n);
323
			}
324
			return v;
325
		}
326

327
		case 'N':
328 329
		case 'S':
		case 'O':
330
		if (**p_format == '&') {
331
			typedef PyObject *(*converter)(void *);
332 333 334 335 336 337
			converter func = va_arg(*p_va, converter);
			void *arg = va_arg(*p_va, void *);
			++*p_format;
			return (*func)(arg);
		}
		else {
338 339
			PyObject *v;
			v = va_arg(*p_va, PyObject *);
340
			if (v != NULL) {
341 342
				if (*(*p_format - 1) != 'N')
					Py_INCREF(v);
343
			}
344
			else if (!PyErr_Occurred())
345 346 347 348 349 350 351 352
				/* If a NULL was passed
				 * because a call that should
				 * have constructed a value
				 * failed, that's OK, and we
				 * pass the error on; but if
				 * no error occurred it's not
				 * clear that the caller knew
				 * what she was doing. */
353
				PyErr_SetString(PyExc_SystemError,
354
					"NULL object passed to Py_BuildValue");
355
			return v;
356
		}
357 358 359 360 361 362 363 364

		case ':':
		case ',':
		case ' ':
		case '\t':
			break;

		default:
365
			PyErr_SetString(PyExc_SystemError,
366
				"bad format char passed to Py_BuildValue");
367 368 369
			return NULL;

		}
370 371 372
	}
}

373

374
PyObject *Py_BuildValue(char *format, ...)
375
{
376
	va_list va;
377
	PyObject* retval;
378
	va_start(va, format);
379
	retval = Py_VaBuildValue(format, va);
380 381
	va_end(va);
	return retval;
382
}
383

384
PyObject *
385
Py_VaBuildValue(char *format, va_list va)
386 387 388
{
	char *f = format;
	int n = countformat(f, '\0');
389 390 391 392 393 394 395 396
	va_list lva;

#ifdef VA_LIST_IS_ARRAY
	memcpy(lva, va, sizeof(va_list));
#else
	lva = va;
#endif

397 398 399
	if (n < 0)
		return NULL;
	if (n == 0) {
400 401
		Py_INCREF(Py_None);
		return Py_None;
402 403
	}
	if (n == 1)
404 405 406 407 408
		return do_mkvalue(&f, &lva);
	return do_mktuple(&f, &lva, '\0', n);
}


409 410
PyObject *
PyEval_CallFunction(PyObject *obj, char *format, ...)
411 412
{
	va_list vargs;
413 414
	PyObject *args;
	PyObject *res;
415 416 417

	va_start(vargs, format);

418
	args = Py_VaBuildValue(format, vargs);
419 420 421 422 423
	va_end(vargs);

	if (args == NULL)
		return NULL;

424 425
	res = PyEval_CallObject(obj, args);
	Py_DECREF(args);
426 427 428 429 430

	return res;
}


431
PyObject *
432
PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
433 434
{
	va_list vargs;
435 436 437
	PyObject *meth;
	PyObject *args;
	PyObject *res;
438

439
	meth = PyObject_GetAttrString(obj, methodname);
440 441 442 443 444
	if (meth == NULL)
		return NULL;

	va_start(vargs, format);

445
	args = Py_VaBuildValue(format, vargs);
446 447 448
	va_end(vargs);

	if (args == NULL) {
449
		Py_DECREF(meth);
450 451 452
		return NULL;
	}

453 454 455
	res = PyEval_CallObject(meth, args);
	Py_DECREF(meth);
	Py_DECREF(args);
456 457

	return res;
458
}
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485

int
PyModule_AddObject(PyObject *m, char *name, PyObject *o)
{
	PyObject *dict;
        if (!PyModule_Check(m) || o == NULL)
                return -1;
	dict = PyModule_GetDict(m);
	if (dict == NULL)
		return -1;
        if (PyDict_SetItemString(dict, name, o))
                return -1;
        Py_DECREF(o);
        return 0;
}

int 
PyModule_AddIntConstant(PyObject *m, char *name, long value)
{
	return PyModule_AddObject(m, name, PyInt_FromLong(value));
}

int 
PyModule_AddStringConstant(PyObject *m, char *name, char *value)
{
	return PyModule_AddObject(m, name, PyString_FromString(value));
}