diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index da76f18..3fdaac9 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -31,12 +31,10 @@
 
 /* Built-in functions */
 
-#include "allobjects.h"
+#include "Python.h"
 
 #include "node.h"
 #include "graminit.h"
-#include "bltinmodule.h"
-#include "import.h"
 #include "compile.h"
 #include "eval.h"
 
@@ -49,104 +47,106 @@
 #endif
 
 /* Forward */
-static object *filterstring PROTO((object *, object *));
-static object *filtertuple  PROTO((object *, object *));
-static object *int_from_string PROTO((object *));
-static object *long_from_string PROTO((object *));
-static object *float_from_string PROTO((object *));
+static PyObject *filterstring Py_PROTO((PyObject *, PyObject *));
+static PyObject *filtertuple  Py_PROTO((PyObject *, PyObject *));
+static PyObject *int_from_string Py_PROTO((PyObject *));
+static PyObject *long_from_string Py_PROTO((PyObject *));
+static PyObject *float_from_string Py_PROTO((PyObject *));
 
-static object *
+static PyObject *
 builtin___import__(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
-	object *globals = NULL;
-	object *locals = NULL;
-	object *fromlist = NULL;
+	PyObject *globals = NULL;
+	PyObject *locals = NULL;
+	PyObject *fromlist = NULL;
 
-	if (!newgetargs(args, "s|OOO:__import__",
+	if (!PyArg_ParseTuple(args, "s|OOO:__import__",
 			&name, &globals, &locals, &fromlist))
 		return NULL;
-	return import_module(name);
+	return PyImport_ImportModule(name);
 }
 
 
-static object *
+static PyObject *
 builtin_abs(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	number_methods *nm;
+	PyObject *v;
+	PyNumberMethods *nm;
 
-	if (!newgetargs(args, "O:abs", &v))
+	if (!PyArg_ParseTuple(args, "O:abs", &v))
 		return NULL;
 	if ((nm = v->ob_type->tp_as_number) == NULL) {
-		err_setstr(TypeError, "abs() requires numeric argument");
+		PyErr_SetString(PyExc_TypeError,
+				"abs() requires numeric argument");
 		return NULL;
 	}
 	return (*nm->nb_absolute)(v);
 }
 
-static object *
+static PyObject *
 builtin_apply(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *func, *alist = NULL, *kwdict = NULL;
+	PyObject *func, *alist = NULL, *kwdict = NULL;
 
-	if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
+	if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
 		return NULL;
-	if (alist != NULL && !is_tupleobject(alist)) {
-		err_setstr(TypeError, "apply() 2nd argument must be tuple");
+	if (alist != NULL && !PyTuple_Check(alist)) {
+		PyErr_SetString(PyExc_TypeError,
+				"apply() 2nd argument must be tuple");
 		return NULL;
 	}
-	if (kwdict != NULL && !is_dictobject(kwdict)) {
-		err_setstr(TypeError,
+	if (kwdict != NULL && !PyDict_Check(kwdict)) {
+		PyErr_SetString(PyExc_TypeError,
 			   "apply() 3rd argument must be dictionary");
 		return NULL;
 	}
 	return PyEval_CallObjectWithKeywords(func, alist, kwdict);
 }
 
-static object *
+static PyObject *
 builtin_callable(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 
-	if (!newgetargs(args, "O:callable", &v))
+	if (!PyArg_ParseTuple(args, "O:callable", &v))
 		return NULL;
-	return newintobject((long)callable(v));
+	return PyInt_FromLong((long)PyCallable_Check(v));
 }
 
-static object *
+static PyObject *
 builtin_filter(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *func, *seq, *result;
-	sequence_methods *sqf;
+	PyObject *func, *seq, *result;
+	PySequenceMethods *sqf;
 	int len;
 	register int i, j;
 
-	if (!newgetargs(args, "OO:filter", &func, &seq))
+	if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
 		return NULL;
 
-	if (is_stringobject(seq)) {
-		object *r = filterstring(func, seq);
+	if (PyString_Check(seq)) {
+		PyObject *r = filterstring(func, seq);
 		return r;
 	}
 
-	if (is_tupleobject(seq)) {
-		object *r = filtertuple(func, seq);
+	if (PyTuple_Check(seq)) {
+		PyObject *r = filtertuple(func, seq);
 		return r;
 	}
 
 	if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "argument 2 to filter() must be a sequence type");
 		goto Fail_2;
 	}
@@ -154,132 +154,133 @@
 	if ((len = (*sqf->sq_length)(seq)) < 0)
 		goto Fail_2;
 
-	if (is_listobject(seq) && seq->ob_refcnt == 1) {
-		INCREF(seq);
+	if (PyList_Check(seq) && seq->ob_refcnt == 1) {
+		Py_INCREF(seq);
 		result = seq;
 	}
 	else {
-		if ((result = newlistobject(len)) == NULL)
+		if ((result = PyList_New(len)) == NULL)
 			goto Fail_2;
 	}
 
 	for (i = j = 0; ; ++i) {
-		object *item, *good;
+		PyObject *item, *good;
 		int ok;
 
 		if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
 			if (i < len)
 				goto Fail_1;
-			if (err_occurred() == IndexError) {
-				err_clear();
+			if (PyErr_Occurred() == PyExc_IndexError) {
+				PyErr_Clear();
 				break;
 			}
 			goto Fail_1;
 		}
 
-		if (func == None) {
+		if (func == Py_None) {
 			good = item;
-			INCREF(good);
+			Py_INCREF(good);
 		}
 		else {
-			object *arg = mkvalue("(O)", item);
+			PyObject *arg = Py_BuildValue("(O)", item);
 			if (arg == NULL)
 				goto Fail_1;
-			good = call_object(func, arg);
-			DECREF(arg);
+			good = PyEval_CallObject(func, arg);
+			Py_DECREF(arg);
 			if (good == NULL) {
-				DECREF(item);
+				Py_DECREF(item);
 				goto Fail_1;
 			}
 		}
-		ok = testbool(good);
-		DECREF(good);
+		ok = PyObject_IsTrue(good);
+		Py_DECREF(good);
 		if (ok) {
 			if (j < len) {
-				if (setlistitem(result, j++, item) < 0)
+				if (PyList_SetItem(result, j++, item) < 0)
 					goto Fail_1;
 			}
 			else {
 				j++;
-				if (addlistitem(result, item) < 0)
+				if (PyList_Append(result, item) < 0)
 					goto Fail_1;
 			}
 		} else {
-			DECREF(item);
+			Py_DECREF(item);
 		}
 	}
 
 
-	if (j < len && setlistslice(result, j, len, NULL) < 0)
+	if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
 		goto Fail_1;
 
 	return result;
 
 Fail_1:
-	DECREF(result);
+	Py_DECREF(result);
 Fail_2:
 	return NULL;
 }
 
-static object *
+static PyObject *
 builtin_chr(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	long x;
 	char s[1];
 
-	if (!newgetargs(args, "l:chr", &x))
+	if (!PyArg_ParseTuple(args, "l:chr", &x))
 		return NULL;
 	if (x < 0 || x >= 256) {
-		err_setstr(ValueError, "chr() arg not in range(256)");
+		PyErr_SetString(PyExc_ValueError,
+				"chr() arg not in range(256)");
 		return NULL;
 	}
 	s[0] = (char)x;
-	return newsizedstringobject(s, 1);
+	return PyString_FromStringAndSize(s, 1);
 }
 
-static object *
+static PyObject *
 builtin_cmp(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *a, *b;
+	PyObject *a, *b;
 
-	if (!newgetargs(args, "OO:cmp", &a, &b))
+	if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
 		return NULL;
-	return newintobject((long)cmpobject(a, b));
+	return PyInt_FromLong((long)PyObject_Compare(a, b));
 }
 
-static object *
+static PyObject *
 builtin_coerce(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v, *w;
-	object *res;
+	PyObject *v, *w;
+	PyObject *res;
 
-	if (!newgetargs(args, "OO:coerce", &v, &w))
+	if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
 		return NULL;
-	if (coerce(&v, &w) < 0)
+	if (PyNumber_Coerce(&v, &w) < 0)
 		return NULL;
-	res = mkvalue("(OO)", v, w);
-	DECREF(v);
-	DECREF(w);
+	res = Py_BuildValue("(OO)", v, w);
+	Py_DECREF(v);
+	Py_DECREF(w);
 	return res;
 }
 
-static object *
+static PyObject *
 builtin_compile(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *str;
 	char *filename;
 	char *startstr;
 	int start;
 
-	if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
+	if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
 		return NULL;
 	if (strcmp(startstr, "exec") == 0)
 		start = file_input;
@@ -288,122 +289,122 @@
 	else if (strcmp(startstr, "single") == 0)
 		start = single_input;
 	else {
-		err_setstr(ValueError,
+		PyErr_SetString(PyExc_ValueError,
 		   "compile() mode must be 'exec' or 'eval' or 'single'");
 		return NULL;
 	}
-	return compile_string(str, filename, start);
+	return Py_CompileString(str, filename, start);
 }
 
 #ifndef WITHOUT_COMPLEX
 
-static object *
+static PyObject *
 builtin_complex(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *r, *i, *tmp;
-	number_methods *nbr, *nbi = NULL;
+	PyObject *r, *i, *tmp;
+	PyNumberMethods *nbr, *nbi = NULL;
 	Py_complex cr, ci;
 	int own_r = 0;
 
 	i = NULL;
-	if (!newgetargs(args, "O|O:complex", &r, &i))
+	if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
 		return NULL;
 	if ((nbr = r->ob_type->tp_as_number) == NULL ||
 	    nbr->nb_float == NULL ||
 	    (i != NULL &&
 	     ((nbi = i->ob_type->tp_as_number) == NULL ||
 	      nbi->nb_float == NULL))) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "complex() argument can't be converted to complex");
 		return NULL;
 	}
 	/* XXX Hack to support classes with __complex__ method */
-	if (is_instanceobject(r)) {
-		static object *complexstr;
-		object *f;
+	if (PyInstance_Check(r)) {
+		static PyObject *complexstr;
+		PyObject *f;
 		if (complexstr == NULL) {
 			complexstr = PyString_InternFromString("__complex__");
 			if (complexstr == NULL)
 				return NULL;
 		}
-		f = getattro(r, complexstr);
+		f = PyObject_GetAttr(r, complexstr);
 		if (f == NULL)
-			err_clear();
+			PyErr_Clear();
 		else {
-			object *args = mkvalue("()");
+			PyObject *args = Py_BuildValue("()");
 			if (args == NULL)
 				return NULL;
-			r = call_object(f, args);
-			DECREF(args);
+			r = PyEval_CallObject(f, args);
+			Py_DECREF(args);
 			if (r == NULL)
 				return NULL;
 			own_r = 1;
 		}
 	}
-	if (is_complexobject(r)) {
-		cr = ((complexobject*)r)->cval;
+	if (PyComplex_Check(r)) {
+		cr = ((PyComplexObject*)r)->cval;
 		if (own_r)
-			DECREF(r);
+			Py_DECREF(r);
 	}
 	else {
 		tmp = (*nbr->nb_float)(r);
 		if (own_r)
-			DECREF(r);
+			Py_DECREF(r);
 		if (tmp == NULL)
 			return NULL;
-		cr.real = getfloatvalue(tmp);
-		DECREF(tmp);
+		cr.real = PyFloat_AsDouble(tmp);
+		Py_DECREF(tmp);
 		cr.imag = 0.;
 	}
 	if (i == NULL) {
 		ci.real = 0.;
 		ci.imag = 0.;
 	}
-	else if (is_complexobject(i))
-		ci = ((complexobject*)i)->cval;
+	else if (PyComplex_Check(i))
+		ci = ((PyComplexObject*)i)->cval;
 	else {
 		tmp = (*nbi->nb_float)(i);
 		if (tmp == NULL)
 			return NULL;
-		ci.real = getfloatvalue(tmp);
-		DECREF(tmp);
+		ci.real = PyFloat_AsDouble(tmp);
+		Py_DECREF(tmp);
 		ci.imag = 0.;
 	}
 	cr.real -= ci.imag;
 	cr.imag += ci.real;
-	return newcomplexobject(cr);
+	return PyComplex_FromCComplex(cr);
 }
 
 #endif
 
-static object *
+static PyObject *
 builtin_dir(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v = NULL;
-	object *d;
+	PyObject *v = NULL;
+	PyObject *d;
 
-	if (!newgetargs(args, "|O:dir", &v))
+	if (!PyArg_ParseTuple(args, "|O:dir", &v))
 		return NULL;
 	if (v == NULL) {
-		d = getlocals();
-		INCREF(d);
+		d = PyEval_GetLocals();
+		Py_INCREF(d);
 	}
 	else {
-		d = getattr(v, "__dict__");
+		d = PyObject_GetAttrString(v, "__dict__");
 		if (d == NULL) {
-			err_setstr(TypeError,
+			PyErr_SetString(PyExc_TypeError,
 				"dir() argument must have __dict__ attribute");
 			return NULL;
 		}
 	}
-	if (is_dictobject(d)) {
-		v = getdictkeys(d);
-		if (sortlist(v) != 0) {
-			DECREF(v);
+	if (PyDict_Check(d)) {
+		v = PyDict_Keys(d);
+		if (PyList_Sort(v) != 0) {
+			Py_DECREF(v);
 			v = NULL;
 		}
 	}
@@ -411,244 +412,247 @@
 		v = PyObject_CallMethod(d, "keys", NULL);
 		if (v == NULL) {
 			PyErr_Clear();
-			v = newlistobject(0);
+			v = PyList_New(0);
 		}
 	}
-	DECREF(d);
+	Py_DECREF(d);
 	return v;
 }
 
-static object *
+static PyObject *
 do_divmod(v, w)
-	object *v, *w;
+	PyObject *v, *w;
 {
-	object *res;
+	PyObject *res;
 
-	if (is_instanceobject(v) || is_instanceobject(w))
-		return instancebinop(v, w, "__divmod__", "__rdivmod__",
+	if (PyInstance_Check(v) || PyInstance_Check(w))
+		return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
 				     do_divmod);
 	if (v->ob_type->tp_as_number == NULL ||
 				w->ob_type->tp_as_number == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 		    "divmod() requires numeric or class instance arguments");
 		return NULL;
 	}
-	if (coerce(&v, &w) != 0)
+	if (PyNumber_Coerce(&v, &w) != 0)
 		return NULL;
 	res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
-	DECREF(v);
-	DECREF(w);
+	Py_DECREF(v);
+	Py_DECREF(w);
 	return res;
 }
 
-static object *
+static PyObject *
 builtin_divmod(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v, *w;
+	PyObject *v, *w;
 
-	if (!newgetargs(args, "OO:divmod", &v, &w))
+	if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
 		return NULL;
 	return do_divmod(v, w);
 }
 
-static object *
+static PyObject *
 builtin_eval(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *cmd;
-	object *globals = None, *locals = None;
+	PyObject *cmd;
+	PyObject *globals = Py_None, *locals = Py_None;
 	char *str;
 
-	if (!newgetargs(args, "O|O!O!:eval",
+	if (!PyArg_ParseTuple(args, "O|O!O!:eval",
 			&cmd,
-			&Mappingtype, &globals,
-			&Mappingtype, &locals))
+			&PyDict_Type, &globals,
+			&PyDict_Type, &locals))
 		return NULL;
-	if (globals == None) {
-		globals = getglobals();
-		if (locals == None)
-			locals = getlocals();
+	if (globals == Py_None) {
+		globals = PyEval_GetGlobals();
+		if (locals == Py_None)
+			locals = PyEval_GetLocals();
 	}
-	else if (locals == None)
+	else if (locals == Py_None)
 		locals = globals;
-	if (dictlookup(globals, "__builtins__") == NULL) {
-		if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
+	if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
+		if (PyDict_SetItemString(globals, "__builtins__",
+					 PyEval_GetBuiltins()) != 0)
 			return NULL;
 	}
-	if (is_codeobject(cmd))
-		return eval_code((codeobject *) cmd, globals, locals);
-	if (!is_stringobject(cmd)) {
-		err_setstr(TypeError,
+	if (PyCode_Check(cmd))
+		return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
+	if (!PyString_Check(cmd)) {
+		PyErr_SetString(PyExc_TypeError,
 			   "eval() argument 1 must be string or code object");
 		return NULL;
 	}
-	str = getstringvalue(cmd);
-	if ((int)strlen(str) != getstringsize(cmd)) {
-		err_setstr(ValueError,
+	str = PyString_AsString(cmd);
+	if ((int)strlen(str) != PyString_Size(cmd)) {
+		PyErr_SetString(PyExc_ValueError,
 			   "embedded '\\0' in string arg");
 		return NULL;
 	}
 	while (*str == ' ' || *str == '\t')
 		str++;
-	return run_string(str, eval_input, globals, locals);
+	return PyRun_String(str, eval_input, globals, locals);
 }
 
-static object *
+static PyObject *
 builtin_execfile(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *filename;
-	object *globals = None, *locals = None;
-	object *res;
+	PyObject *globals = Py_None, *locals = Py_None;
+	PyObject *res;
 	FILE* fp;
 
-	if (!newgetargs(args, "s|O!O!:execfile",
+	if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
 			&filename,
-			&Mappingtype, &globals,
-			&Mappingtype, &locals))
+			&PyDict_Type, &globals,
+			&PyDict_Type, &locals))
 		return NULL;
-	if (globals == None) {
-		globals = getglobals();
-		if (locals == None)
-			locals = getlocals();
+	if (globals == Py_None) {
+		globals = PyEval_GetGlobals();
+		if (locals == Py_None)
+			locals = PyEval_GetLocals();
 	}
-	else if (locals == None)
+	else if (locals == Py_None)
 		locals = globals;
-	if (dictlookup(globals, "__builtins__") == NULL) {
-		if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
+	if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
+		if (PyDict_SetItemString(globals, "__builtins__",
+					 PyEval_GetBuiltins()) != 0)
 			return NULL;
 	}
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	fp = fopen(filename, "r");
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (fp == NULL) {
-		err_errno(IOError);
+		PyErr_SetFromErrno(PyExc_IOError);
 		return NULL;
 	}
-	res = run_file(fp, filename, file_input, globals, locals);
-	BGN_SAVE
+	res = PyRun_File(fp, filename, file_input, globals, locals);
+	Py_BEGIN_ALLOW_THREADS
 	fclose(fp);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	return res;
 }
 
-static object *
+static PyObject *
 builtin_float(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	number_methods *nb;
+	PyObject *v;
+	PyNumberMethods *nb;
 
-	if (!newgetargs(args, "O:float", &v))
+	if (!PyArg_ParseTuple(args, "O:float", &v))
 		return NULL;
-	if (is_stringobject(v))
+	if (PyString_Check(v))
 		return float_from_string(v);
 	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_float == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "float() argument can't be converted to float");
 		return NULL;
 	}
 	return (*nb->nb_float)(v);
 }
 
-static object *
+static PyObject *
 builtin_getattr(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	object *name;
+	PyObject *v;
+	PyObject *name;
 
-	if (!newgetargs(args, "OS:getattr", &v, &name))
+	if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
 		return NULL;
-	return getattro(v, name);
+	return PyObject_GetAttr(v, name);
 }
 
-static object *
+static PyObject *
 builtin_globals(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *d;
+	PyObject *d;
 
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
-	d = getglobals();
-	INCREF(d);
+	d = PyEval_GetGlobals();
+	Py_INCREF(d);
 	return d;
 }
 
-static object *
+static PyObject *
 builtin_hasattr(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	object *name;
+	PyObject *v;
+	PyObject *name;
 
-	if (!newgetargs(args, "OS:hasattr", &v, &name))
+	if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
 		return NULL;
-	v = getattro(v, name);
+	v = PyObject_GetAttr(v, name);
 	if (v == NULL) {
-		err_clear();
-		return newintobject(0L);
+		PyErr_Clear();
+		return PyInt_FromLong(0L);
 	}
-	DECREF(v);
-	return newintobject(1L);
+	Py_DECREF(v);
+	return PyInt_FromLong(1L);
 }
 
-static object *
+static PyObject *
 builtin_id(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 
-	if (!newgetargs(args, "O:id", &v))
+	if (!PyArg_ParseTuple(args, "O:id", &v))
 		return NULL;
-	return newintobject((long)v);
+	return PyInt_FromLong((long)v);
 }
 
-static object *
+static PyObject *
 builtin_map(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	typedef struct {
-		object *seq;
-		sequence_methods *sqf;
+		PyObject *seq;
+		PySequenceMethods *sqf;
 		int len;
 	} sequence;
 
-	object *func, *result;
+	PyObject *func, *result;
 	sequence *seqs = NULL, *sqp;
 	int n, len;
 	register int i, j;
 
-	n = gettuplesize(args);
+	n = PyTuple_Size(args);
 	if (n < 2) {
-		err_setstr(TypeError, "map() requires at least two args");
+		PyErr_SetString(PyExc_TypeError,
+				"map() requires at least two args");
 		return NULL;
 	}
 
-	func = gettupleitem(args, 0);
+	func = PyTuple_GetItem(args, 0);
 	n--;
 
-	if ((seqs = NEW(sequence, n)) == NULL) {
-		err_nomem();
+	if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
+		PyErr_NoMemory();
 		goto Fail_2;
 	}
 
 	for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
 		int curlen;
 	
-		if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
+		if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
 			goto Fail_2;
 
 		if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
@@ -657,7 +661,7 @@
 			char errbuf[sizeof(errmsg) + 3];
 
 			sprintf(errbuf, errmsg, i+2);
-			err_setstr(TypeError, errbuf);
+			PyErr_SetString(PyExc_TypeError, errbuf);
 			goto Fail_2;
 		}
 
@@ -668,35 +672,36 @@
 			len = curlen;
 	}
 
-	if ((result = (object *) newlistobject(len)) == NULL)
+	if ((result = (PyObject *) PyList_New(len)) == NULL)
 		goto Fail_2;
 
 	/* XXX Special case map(None, single_list) could be more efficient */
 	for (i = 0; ; ++i) {
-		object *alist, *item=NULL, *value;
+		PyObject *alist, *item=NULL, *value;
 		int any = 0;
 
-		if (func == None && n == 1)
+		if (func == Py_None && n == 1)
 			alist = NULL;
 		else {
-			if ((alist = newtupleobject(n)) == NULL)
+			if ((alist = PyTuple_New(n)) == NULL)
 				goto Fail_1;
 		}
 
 		for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
 			if (sqp->len < 0) {
-				INCREF(None);
-				item = None;
+				Py_INCREF(Py_None);
+				item = Py_None;
 			}
 			else {
 				item = (*sqp->sqf->sq_item)(sqp->seq, i);
 				if (item == NULL) {
 					if (i < sqp->len)
 						goto Fail_0;
-					if (err_occurred() == IndexError) {
-						err_clear();
-						INCREF(None);
-						item = None;
+					if (PyErr_Occurred() ==
+					    PyExc_IndexError) {
+						PyErr_Clear();
+						Py_INCREF(Py_None);
+						item = Py_None;
 						sqp->len = -1;
 					}
 					else {
@@ -709,14 +714,14 @@
 			}
 			if (!alist)
 				break;
-			if (settupleitem(alist, j, item) < 0) {
-				DECREF(item);
+			if (PyTuple_SetItem(alist, j, item) < 0) {
+				Py_DECREF(item);
 				goto Fail_0;
 			}
 			continue;
 
 		Fail_0:
-			XDECREF(alist);
+			Py_XDECREF(alist);
 			goto Fail_1;
 		}
 
@@ -724,134 +729,135 @@
 			alist = item;
 
 		if (!any) {
-			DECREF(alist);
+			Py_DECREF(alist);
 			break;
 		}
 
-		if (func == None)
+		if (func == Py_None)
 			value = alist;
 		else {
-			value = call_object(func, alist);
-			DECREF(alist);
+			value = PyEval_CallObject(func, alist);
+			Py_DECREF(alist);
 			if (value == NULL)
 				goto Fail_1;
 		}
 		if (i >= len) {
-			if (addlistitem(result, value) < 0)
+			if (PyList_Append(result, value) < 0)
 				goto Fail_1;
 		}
 		else {
-			if (setlistitem(result, i, value) < 0)
+			if (PyList_SetItem(result, i, value) < 0)
 				goto Fail_1;
 		}
 	}
 
-	DEL(seqs);
+	PyMem_DEL(seqs);
 	return result;
 
 Fail_1:
-	DECREF(result);
+	Py_DECREF(result);
 Fail_2:
-	if (seqs) DEL(seqs);
+	if (seqs) PyMem_DEL(seqs);
 	return NULL;
 }
 
-static object *
+static PyObject *
 builtin_setattr(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	object *name;
-	object *value;
+	PyObject *v;
+	PyObject *name;
+	PyObject *value;
 
-	if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
+	if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
 		return NULL;
-	if (setattro(v, name, value) != 0)
+	if (PyObject_SetAttr(v, name, value) != 0)
 		return NULL;
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 builtin_delattr(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	object *name;
+	PyObject *v;
+	PyObject *name;
 
-	if (!newgetargs(args, "OS:delattr", &v, &name))
+	if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
 		return NULL;
-	if (setattro(v, name, (object *)NULL) != 0)
+	if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
 		return NULL;
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 builtin_hash(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 	long x;
 
-	if (!newgetargs(args, "O:hash", &v))
+	if (!PyArg_ParseTuple(args, "O:hash", &v))
 		return NULL;
-	x = hashobject(v);
+	x = PyObject_Hash(v);
 	if (x == -1)
 		return NULL;
-	return newintobject(x);
+	return PyInt_FromLong(x);
 }
 
-static object *
+static PyObject *
 builtin_hex(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	number_methods *nb;
+	PyObject *v;
+	PyNumberMethods *nb;
 
-	if (!newgetargs(args, "O:hex", &v))
+	if (!PyArg_ParseTuple(args, "O:hex", &v))
 		return NULL;
 	
 	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_hex == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "hex() argument can't be converted to hex");
 		return NULL;
 	}
 	return (*nb->nb_hex)(v);
 }
 
-static object *builtin_raw_input PROTO((object *, object *));
+static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
 
-static object *
+static PyObject *
 builtin_input(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *line;
+	PyObject *line;
 	char *str;
-	object *res;
-	object *globals, *locals;
+	PyObject *res;
+	PyObject *globals, *locals;
 
 	line = builtin_raw_input(self, args);
 	if (line == NULL)
 		return line;
-	if (!getargs(line, "s;embedded '\\0' in input line", &str))
+	if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
 		return NULL;
 	while (*str == ' ' || *str == '\t')
 			str++;
-	globals = getglobals();
-	locals = getlocals();
-	if (dictlookup(globals, "__builtins__") == NULL) {
-		if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
+	globals = PyEval_GetGlobals();
+	locals = PyEval_GetLocals();
+	if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
+		if (PyDict_SetItemString(globals, "__builtins__",
+					 PyEval_GetBuiltins()) != 0)
 			return NULL;
 	}
-	res = run_string(str, eval_input, globals, locals);
-	DECREF(line);
+	res = PyRun_String(str, eval_input, globals, locals);
+	Py_DECREF(line);
 	return res;
 }
 
@@ -868,37 +874,37 @@
 	return s;
 }
 
-static object *
+static PyObject *
 builtin_int(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	number_methods *nb;
+	PyObject *v;
+	PyNumberMethods *nb;
 
-	if (!newgetargs(args, "O:int", &v))
+	if (!PyArg_ParseTuple(args, "O:int", &v))
 		return NULL;
-	if (is_stringobject(v))
+	if (PyString_Check(v))
 		return int_from_string(v);
 	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_int == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "int() argument can't be converted to int");
 		return NULL;
 	}
 	return (*nb->nb_int)(v);
 }
 
-static object *
+static PyObject *
 builtin_len(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 	long len;
-	typeobject *tp;
+	PyTypeObject *tp;
 
-	if (!newgetargs(args, "O:len", &v))
+	if (!PyArg_ParseTuple(args, "O:len", &v))
 		return NULL;
 	tp = v->ob_type;
 	if (tp->tp_as_sequence != NULL) {
@@ -908,47 +914,47 @@
 		len = (*tp->tp_as_mapping->mp_length)(v);
 	}
 	else {
-		err_setstr(TypeError, "len() of unsized object");
+		PyErr_SetString(PyExc_TypeError, "len() of unsized object");
 		return NULL;
 	}
 	if (len < 0)
 		return NULL;
 	else
-		return newintobject(len);
+		return PyInt_FromLong(len);
 }
 
-static object *
+static PyObject *
 builtin_list(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	sequence_methods *sqf;
+	PyObject *v;
+	PySequenceMethods *sqf;
 
-	if (!newgetargs(args, "O:list", &v))
+	if (!PyArg_ParseTuple(args, "O:list", &v))
 		return NULL;
 	if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
 		int n = (*sqf->sq_length)(v);
 		int i;
-		object *l;
+		PyObject *l;
 		if (n < 0)
 			return NULL;
-		l = newlistobject(n);
+		l = PyList_New(n);
 		if (l == NULL)
 			return NULL;
 		for (i = 0; i < n; i++) {
-			object *item = (*sqf->sq_item)(v, i);
+			PyObject *item = (*sqf->sq_item)(v, i);
 			if (item == NULL) {
-				DECREF(l);
+				Py_DECREF(l);
 				l = NULL;
 				break;
 			}
-			setlistitem(l, i, item);
+			PyList_SetItem(l, i, item);
 		}
 		/* XXX Should support indefinite-length sequences */
 		return l;
 	}
-	err_setstr(TypeError, "list() argument must be a sequence");
+	PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
 	return NULL;
 }
 
@@ -974,247 +980,252 @@
   return PySlice_New(start, stop, step);
 }
 
-static object *
+static PyObject *
 builtin_locals(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *d;
+	PyObject *d;
 
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
-	d = getlocals();
-	INCREF(d);
+	d = PyEval_GetLocals();
+	Py_INCREF(d);
 	return d;
 }
 
-static object *
+static PyObject *
 builtin_long(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	number_methods *nb;
+	PyObject *v;
+	PyNumberMethods *nb;
 	
-	if (!newgetargs(args, "O:long", &v))
+	if (!PyArg_ParseTuple(args, "O:long", &v))
 		return NULL;
-	if (is_stringobject(v))
+	if (PyString_Check(v))
 		return long_from_string(v);
 	if ((nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_long == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "long() argument can't be converted to long");
 		return NULL;
 	}
 	return (*nb->nb_long)(v);
 }
 
-static object *
+static PyObject *
 min_max(args, sign)
-	object *args;
+	PyObject *args;
 	int sign;
 {
 	int i;
-	object *v, *w, *x;
-	sequence_methods *sq;
+	PyObject *v, *w, *x;
+	PySequenceMethods *sq;
 
-	if (gettuplesize(args) > 1)
+	if (PyTuple_Size(args) > 1)
 		v = args;
-	else if (!newgetargs(args, "O:min/max", &v))
+	else if (!PyArg_ParseTuple(args, "O:min/max", &v))
 		return NULL;
 	sq = v->ob_type->tp_as_sequence;
 	if (sq == NULL) {
-		err_setstr(TypeError, "min() or max() of non-sequence");
+		PyErr_SetString(PyExc_TypeError,
+				"min() or max() of non-sequence");
 		return NULL;
 	}
 	w = NULL;
 	for (i = 0; ; i++) {
 		x = (*sq->sq_item)(v, i); /* Implies INCREF */
 		if (x == NULL) {
-			if (err_occurred() == IndexError) {
-				err_clear();
+			if (PyErr_Occurred() == PyExc_IndexError) {
+				PyErr_Clear();
 				break;
 			}
-			XDECREF(w);
+			Py_XDECREF(w);
 			return NULL;
 		}
 		if (w == NULL)
 			w = x;
 		else {
-			if (cmpobject(x, w) * sign > 0) {
-				DECREF(w);
+			if (PyObject_Compare(x, w) * sign > 0) {
+				Py_DECREF(w);
 				w = x;
 			}
 			else
-				DECREF(x);
+				Py_DECREF(x);
 		}
 	}
 	if (w == NULL)
-		err_setstr(ValueError, "min() or max() of empty sequence");
+		PyErr_SetString(PyExc_ValueError,
+				"min() or max() of empty sequence");
 	return w;
 }
 
-static object *
+static PyObject *
 builtin_min(self, v)
-	object *self;
-	object *v;
+	PyObject *self;
+	PyObject *v;
 {
 	return min_max(v, -1);
 }
 
-static object *
+static PyObject *
 builtin_max(self, v)
-	object *self;
-	object *v;
+	PyObject *self;
+	PyObject *v;
 {
 	return min_max(v, 1);
 }
 
-static object *
+static PyObject *
 builtin_oct(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	number_methods *nb;
+	PyObject *v;
+	PyNumberMethods *nb;
 
-	if (!newgetargs(args, "O:oct", &v))
+	if (!PyArg_ParseTuple(args, "O:oct", &v))
 		return NULL;
 	if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
 	    nb->nb_oct == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "oct() argument can't be converted to oct");
 		return NULL;
 	}
 	return (*nb->nb_oct)(v);
 }
 
-static object *
+static PyObject *
 builtin_open(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	char *mode = "r";
 	int bufsize = -1;
-	object *f;
+	PyObject *f;
 
-	if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
+	if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
 		return NULL;
-	f = newfileobject(name, mode);
+	f = PyFile_FromString(name, mode);
 	if (f != NULL)
-		setfilebufsize(f, bufsize);
+		PyFile_SetBufSize(f, bufsize);
 	return f;
 }
 
-static object *
+static PyObject *
 builtin_ord(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char c;
 
-	if (!newgetargs(args, "c:ord", &c))
+	if (!PyArg_ParseTuple(args, "c:ord", &c))
 		return NULL;
-	return newintobject((long)(c & 0xff));
+	return PyInt_FromLong((long)(c & 0xff));
 }
 
-static object *
+static PyObject *
 do_pow(v, w)
-	object *v, *w;
+	PyObject *v, *w;
 {
-	object *res;
-	if (is_instanceobject(v) || is_instanceobject(w))
-		return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
+	PyObject *res;
+	if (PyInstance_Check(v) || PyInstance_Check(w))
+		return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
 	if (v->ob_type->tp_as_number == NULL ||
 	    w->ob_type->tp_as_number == NULL) {
-		err_setstr(TypeError, "pow() requires numeric arguments");
+		PyErr_SetString(PyExc_TypeError,
+				"pow() requires numeric arguments");
 		return NULL;
 	}
 	if (
 #ifndef WITHOUT_COMPLEX
-            !is_complexobject(v) && 
+            !PyComplex_Check(v) && 
 #endif
-            is_floatobject(w) && getfloatvalue(v) < 0.0) {
-		if (!err_occurred())
-		    err_setstr(ValueError, "negative number to float power");
+            PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
+		if (!PyErr_Occurred())
+		    PyErr_SetString(PyExc_ValueError,
+				    "negative number to float power");
 		return NULL;
 	}
-	if (coerce(&v, &w) != 0)
+	if (PyNumber_Coerce(&v, &w) != 0)
 		return NULL;
-	res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
-	DECREF(v);
-	DECREF(w);
+	res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
+	Py_DECREF(v);
+	Py_DECREF(w);
 	return res;
 }
 
-static object *
+static PyObject *
 builtin_pow(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v, *w, *z = None, *res;
-	object *v1, *z1, *w2, *z2;
+	PyObject *v, *w, *z = Py_None, *res;
+	PyObject *v1, *z1, *w2, *z2;
 
-	if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
+	if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
 		return NULL;
-	if (z == None)
+	if (z == Py_None)
 		return do_pow(v, w);
 	/* XXX The ternary version doesn't do class instance coercions */
-	if (is_instanceobject(v))
+	if (PyInstance_Check(v))
 		return v->ob_type->tp_as_number->nb_power(v, w, z);
 	if (v->ob_type->tp_as_number == NULL ||
 	    z->ob_type->tp_as_number == NULL ||
 	    w->ob_type->tp_as_number == NULL) {
-		err_setstr(TypeError, "pow() requires numeric arguments");
+		PyErr_SetString(PyExc_TypeError,
+				"pow() requires numeric arguments");
 		return NULL;
 	}
-	if (coerce(&v, &w) != 0)
+	if (PyNumber_Coerce(&v, &w) != 0)
 		return NULL;
 	res = NULL;
 	v1 = v;
 	z1 = z;
-	if (coerce(&v1, &z1) != 0)
+	if (PyNumber_Coerce(&v1, &z1) != 0)
 		goto error2;
 	w2 = w;
 	z2 = z1;
- 	if (coerce(&w2, &z2) != 0)
+ 	if (PyNumber_Coerce(&w2, &z2) != 0)
 		goto error1;
 	res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
-	DECREF(w2);
-	DECREF(z2);
+	Py_DECREF(w2);
+	Py_DECREF(z2);
  error1:
-	DECREF(v1);
-	DECREF(z1);
+	Py_DECREF(v1);
+	Py_DECREF(z1);
  error2:
-	DECREF(v);
-	DECREF(w);
+	Py_DECREF(v);
+	Py_DECREF(w);
 	return res;
 }
 
-static object *
+static PyObject *
 builtin_range(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	long ilow = 0, ihigh = 0, istep = 1;
 	int i, n;
-	object *v;
+	PyObject *v;
 
-	if (gettuplesize(args) <= 1) {
-		if (!newgetargs(args,
+	if (PyTuple_Size(args) <= 1) {
+		if (!PyArg_ParseTuple(args,
 				"l;range() requires 1-3 int arguments",
 				&ihigh))
 			return NULL;
 	}
 	else {
-		if (!newgetargs(args,
+		if (!PyArg_ParseTuple(args,
 				"ll|l;range() requires 1-3 int arguments",
 				&ilow, &ihigh, &istep))
 			return NULL;
 	}
 	if (istep == 0) {
-		err_setstr(ValueError, "zero step for range()");
+		PyErr_SetString(PyExc_ValueError, "zero step for range()");
 		return NULL;
 	}
 	/* XXX ought to check overflow of subtraction */
@@ -1224,43 +1235,43 @@
 		n = (ihigh - ilow + istep + 1) / istep;
 	if (n < 0)
 		n = 0;
-	v = newlistobject(n);
+	v = PyList_New(n);
 	if (v == NULL)
 		return NULL;
 	for (i = 0; i < n; i++) {
-		object *w = newintobject(ilow);
+		PyObject *w = PyInt_FromLong(ilow);
 		if (w == NULL) {
-			DECREF(v);
+			Py_DECREF(v);
 			return NULL;
 		}
-		setlistitem(v, i, w);
+		PyList_SetItem(v, i, w);
 		ilow += istep;
 	}
 	return v;
 }
 
-static object *
+static PyObject *
 builtin_xrange(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	long ilow = 0, ihigh = 0, istep = 1;
 	long n;
 
-	if (gettuplesize(args) <= 1) {
-		if (!newgetargs(args,
+	if (PyTuple_Size(args) <= 1) {
+		if (!PyArg_ParseTuple(args,
 				"l;xrange() requires 1-3 int arguments",
 				&ihigh))
 			return NULL;
 	}
 	else {
-		if (!newgetargs(args,
+		if (!PyArg_ParseTuple(args,
 				"ll|l;xrange() requires 1-3 int arguments",
 				&ilow, &ihigh, &istep))
 			return NULL;
 	}
 	if (istep == 0) {
-		err_setstr(ValueError, "zero step for xrange()");
+		PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
 		return NULL;
 	}
 	/* XXX ought to check overflow of subtraction */
@@ -1270,107 +1281,107 @@
 		n = (ihigh - ilow + istep + 1) / istep;
 	if (n < 0)
 		n = 0;
-	return newrangeobject(ilow, n, istep, 1);
+	return PyRange_New(ilow, n, istep, 1);
 }
 
-extern char *my_readline PROTO((char *));
+extern char *PyOS_Readline Py_PROTO((char *));
 
-static object *
+static PyObject *
 builtin_raw_input(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v = NULL;
-	object *f;
+	PyObject *v = NULL;
+	PyObject *f;
 
-	if (!newgetargs(args, "|O:[raw_]input", &v))
+	if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
 		return NULL;
-	if (getfilefile(sysget("stdin")) == stdin &&
-	    getfilefile(sysget("stdout")) == stdout &&
+	if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
+	    PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
 	    isatty(fileno(stdin)) && isatty(fileno(stdout))) {
-		object *po;
+		PyObject *po;
 		char *prompt;
 		char *s;
-		object *result;
+		PyObject *result;
 		if (v != NULL) {
-			po = strobject(v);
+			po = PyObject_Str(v);
 			if (po == NULL)
 				return NULL;
-			prompt = getstringvalue(po);
+			prompt = PyString_AsString(po);
 		}
 		else {
 			po = NULL;
 			prompt = "";
 		}
-		s = my_readline(prompt);
-		XDECREF(po);
+		s = PyOS_Readline(prompt);
+		Py_XDECREF(po);
 		if (s == NULL) {
-			err_set(KeyboardInterrupt);
+			PyErr_SetNone(PyExc_KeyboardInterrupt);
 			return NULL;
 		}
 		if (*s == '\0') {
-			err_set(EOFError);
+			PyErr_SetNone(PyExc_EOFError);
 			result = NULL;
 		}
 		else { /* strip trailing '\n' */
-			result = newsizedstringobject(s, strlen(s)-1);
+			result = PyString_FromStringAndSize(s, strlen(s)-1);
 		}
 		free(s);
 		return result;
 	}
 	if (v != NULL) {
-		f = sysget("stdout");
+		f = PySys_GetObject("stdout");
 		if (f == NULL) {
-			err_setstr(RuntimeError, "lost sys.stdout");
+			PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
 			return NULL;
 		}
-		flushline();
-		if (writeobject(v, f, PRINT_RAW) != 0)
+		Py_FlushLine();
+		if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
 			return NULL;
 	}
-	f = sysget("stdin");
+	f = PySys_GetObject("stdin");
 	if (f == NULL) {
-		err_setstr(RuntimeError, "lost sys.stdin");
+		PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
 		return NULL;
 	}
-	return filegetline(f, -1);
+	return PyFile_GetLine(f, -1);
 }
 
-static object *
+static PyObject *
 builtin_reduce(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *seq, *func, *result = NULL;
-	sequence_methods *sqf;
+	PyObject *seq, *func, *result = NULL;
+	PySequenceMethods *sqf;
 	register int i;
 
-	if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
+	if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
 		return NULL;
 	if (result != NULL)
-		INCREF(result);
+		Py_INCREF(result);
 
 	if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 		    "2nd argument to reduce() must be a sequence object");
 		return NULL;
 	}
 
-	if ((args = newtupleobject(2)) == NULL)
+	if ((args = PyTuple_New(2)) == NULL)
 		goto Fail;
 
 	for (i = 0; ; ++i) {
-		object *op2;
+		PyObject *op2;
 
 		if (args->ob_refcnt > 1) {
-			DECREF(args);
-			if ((args = newtupleobject(2)) == NULL)
+			Py_DECREF(args);
+			if ((args = PyTuple_New(2)) == NULL)
 				goto Fail;
 		}
 
 		if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
-			if (err_occurred() == IndexError) {
-				err_clear();
+			if (PyErr_Occurred() == PyExc_IndexError) {
+				PyErr_Clear();
 				break;
 			}
 			goto Fail;
@@ -1379,62 +1390,62 @@
 		if (result == NULL)
 			result = op2;
 		else {
-			settupleitem(args, 0, result);
-			settupleitem(args, 1, op2);
-			if ((result = call_object(func, args)) == NULL)
+			PyTuple_SetItem(args, 0, result);
+			PyTuple_SetItem(args, 1, op2);
+			if ((result = PyEval_CallObject(func, args)) == NULL)
 				goto Fail;
 		}
 	}
 
-	DECREF(args);
+	Py_DECREF(args);
 
 	if (result == NULL)
-		err_setstr(TypeError,
+		PyErr_SetString(PyExc_TypeError,
 			   "reduce of empty sequence with no initial value");
 
 	return result;
 
 Fail:
-	XDECREF(args);
-	XDECREF(result);
+	Py_XDECREF(args);
+	Py_XDECREF(result);
 	return NULL;
 }
 
-static object *
+static PyObject *
 builtin_reload(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 
-	if (!newgetargs(args, "O:reload", &v))
+	if (!PyArg_ParseTuple(args, "O:reload", &v))
 		return NULL;
-	return reload_module(v);
+	return PyImport_ReloadModule(v);
 }
 
-static object *
+static PyObject *
 builtin_repr(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 
-	if (!newgetargs(args, "O:repr", &v))
+	if (!PyArg_ParseTuple(args, "O:repr", &v))
 		return NULL;
-	return reprobject(v);
+	return PyObject_Repr(v);
 }
 
-static object *
+static PyObject *
 builtin_round(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	double x;
 	double f;
 	int ndigits = 0;
 	int i;
 
-	if (!newgetargs(args, "d|i:round", &x, &ndigits))
+	if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
 			return NULL;
 	f = 1.0;
 	for (i = ndigits; --i >= 0; )
@@ -1442,53 +1453,54 @@
 	for (i = ndigits; ++i <= 0; )
 		f = f*0.1;
 	if (x >= 0.0)
-		return newfloatobject(floor(x*f + 0.5) / f);
+		return PyFloat_FromDouble(floor(x*f + 0.5) / f);
 	else
-		return newfloatobject(ceil(x*f - 0.5) / f);
+		return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
 }
 
-static object *
+static PyObject *
 builtin_str(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 
-	if (!newgetargs(args, "O:str", &v))
+	if (!PyArg_ParseTuple(args, "O:str", &v))
 		return NULL;
-	return strobject(v);
+	return PyObject_Str(v);
 }
 
-static object *
+static PyObject *
 builtin_tuple(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
-	sequence_methods *sqf;
+	PyObject *v;
+	PySequenceMethods *sqf;
 
-	if (!newgetargs(args, "O:tuple", &v))
+	if (!PyArg_ParseTuple(args, "O:tuple", &v))
 		return NULL;
-	if (is_tupleobject(v)) {
-		INCREF(v);
+	if (PyTuple_Check(v)) {
+		Py_INCREF(v);
 		return v;
 	}
-	if (is_listobject(v))
-		return listtuple(v);
-	if (is_stringobject(v)) {
-		int n = getstringsize(v);
-		object *t = newtupleobject(n);
+	if (PyList_Check(v))
+		return PyList_AsTuple(v);
+	if (PyString_Check(v)) {
+		int n = PyString_Size(v);
+		PyObject *t = PyTuple_New(n);
 		if (t != NULL) {
 			int i;
-			char *p = getstringvalue(v);
+			char *p = PyString_AsString(v);
 			for (i = 0; i < n; i++) {
-				object *item = newsizedstringobject(p+i, 1);
+				PyObject *item =
+					PyString_FromStringAndSize(p+i, 1);
 				if (item == NULL) {
-					DECREF(t);
+					Py_DECREF(t);
 					t = NULL;
 					break;
 				}
-				settupleitem(t, i, item);
+				PyTuple_SetItem(t, i, item);
 			}
 		}
 		return t;
@@ -1497,66 +1509,68 @@
 	if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
 		int n = (*sqf->sq_length)(v);
 		int i;
-		object *t;
+		PyObject *t;
 		if (n < 0)
 			return NULL;
-		t = newtupleobject(n);
+		t = PyTuple_New(n);
 		if (t == NULL)
 			return NULL;
 		for (i = 0; i < n; i++) {
-			object *item = (*sqf->sq_item)(v, i);
+			PyObject *item = (*sqf->sq_item)(v, i);
 			if (item == NULL) {
-				DECREF(t);
+				Py_DECREF(t);
 				t = NULL;
 				break;
 			}
-			settupleitem(t, i, item);
+			PyTuple_SetItem(t, i, item);
 		}
 		/* XXX Should support indefinite-length sequences */
 		return t;
 	}
 	/* None of the above */
-	err_setstr(TypeError, "tuple() argument must be a sequence");
+	PyErr_SetString(PyExc_TypeError,
+			"tuple() argument must be a sequence");
 	return NULL;
 }
 
-static object *
+static PyObject *
 builtin_type(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v;
+	PyObject *v;
 
-	if (!newgetargs(args, "O:type", &v))
+	if (!PyArg_ParseTuple(args, "O:type", &v))
 		return NULL;
-	v = (object *)v->ob_type;
-	INCREF(v);
+	v = (PyObject *)v->ob_type;
+	Py_INCREF(v);
 	return v;
 }
 
-static object *
+static PyObject *
 builtin_vars(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *v = NULL;
-	object *d;
+	PyObject *v = NULL;
+	PyObject *d;
 
-	if (!newgetargs(args, "|O:vars", &v))
+	if (!PyArg_ParseTuple(args, "|O:vars", &v))
 		return NULL;
 	if (v == NULL) {
-		d = getlocals();
+		d = PyEval_GetLocals();
 		if (d == NULL) {
-			if (!err_occurred())
-				err_setstr(SystemError, "no locals!?");
+			if (!PyErr_Occurred())
+				PyErr_SetString(PyExc_SystemError,
+						"no locals!?");
 		}
 		else
-			INCREF(d);
+			Py_INCREF(d);
 	}
 	else {
-		d = getattr(v, "__dict__");
+		d = PyObject_GetAttrString(v, "__dict__");
 		if (d == NULL) {
-			err_setstr(TypeError,
+			PyErr_SetString(PyExc_TypeError,
 			    "vars() argument must have __dict__ attribute");
 			return NULL;
 		}
@@ -1564,7 +1578,7 @@
 	return d;
 }
 
-static struct methodlist builtin_methods[] = {
+static PyMethodDef builtin_methods[] = {
 	{"__import__",	builtin___import__, 1},
 	{"abs",		builtin_abs, 1},
 	{"apply",	builtin_apply, 1},
@@ -1619,201 +1633,202 @@
 	{NULL,		NULL},
 };
 
-static object *builtin_mod;
-static object *builtin_dict;
+static PyObject *builtin_mod;
+static PyObject *builtin_dict;
 
-object *
-getbuiltinmod()
+PyObject *
+PyBuiltin_GetModule()
 {
 	return builtin_mod;
 }
 
-object *
-getbuiltindict()
+PyObject *
+PyBuiltin_GetDict()
 {
 	return builtin_dict;
 }
 
 /* Predefined exceptions */
 
-object *AccessError;
-object *PyExc_AssertionError;
-object *AttributeError;
-object *EOFError;
-object *FloatingPointError;
-object *IOError;
-object *ImportError;
-object *IndexError;
-object *KeyError;
-object *KeyboardInterrupt;
-object *MemoryError;
-object *NameError;
-object *OverflowError;
-object *RuntimeError;
-object *SyntaxError;
-object *SystemError;
-object *SystemExit;
-object *TypeError;
-object *ValueError;
-object *ZeroDivisionError;
+PyObject *PyExc_AccessError;
+PyObject *PyExc_AssertionError;
+PyObject *PyExc_AttributeError;
+PyObject *PyExc_EOFError;
+PyObject *FloatingPointError;
+PyObject *PyExc_IOError;
+PyObject *PyExc_ImportError;
+PyObject *PyExc_IndexError;
+PyObject *PyExc_KeyError;
+PyObject *PyExc_KeyboardInterrupt;
+PyObject *PyExc_MemoryError;
+PyObject *PyExc_NameError;
+PyObject *PyExc_OverflowError;
+PyObject *PyExc_RuntimeError;
+PyObject *PyExc_SyntaxError;
+PyObject *PyExc_SystemError;
+PyObject *PyExc_SystemExit;
+PyObject *PyExc_TypeError;
+PyObject *PyExc_ValueError;
+PyObject *PyExc_ZeroDivisionError;
 
-static object *
+static PyObject *
 newstdexception(name)
 	char *name;
 {
-	object *v = newstringobject(name);
-	if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
-		fatal("no mem for new standard exception");
+	PyObject *v = PyString_FromString(name);
+	if (v == NULL || PyDict_SetItemString(builtin_dict, name, v) != 0)
+		Py_FatalError("no mem for new standard exception");
 	return v;
 }
 
 static void
 initerrors()
 {
-	AccessError = newstdexception("AccessError");
+	PyExc_AccessError = newstdexception("AccessError");
 	PyExc_AssertionError = newstdexception("AssertionError");
-	AttributeError = newstdexception("AttributeError");
-	EOFError = newstdexception("EOFError");
+	PyExc_AttributeError = newstdexception("AttributeError");
+	PyExc_EOFError = newstdexception("EOFError");
 	FloatingPointError = newstdexception("FloatingPointError");
-	IOError = newstdexception("IOError");
-	ImportError = newstdexception("ImportError");
-	IndexError = newstdexception("IndexError");
-	KeyError = newstdexception("KeyError");
-	KeyboardInterrupt = newstdexception("KeyboardInterrupt");
-	MemoryError = newstdexception("MemoryError");
-	NameError = newstdexception("NameError");
-	OverflowError = newstdexception("OverflowError");
-	RuntimeError = newstdexception("RuntimeError");
-	SyntaxError = newstdexception("SyntaxError");
-	SystemError = newstdexception("SystemError");
-	SystemExit = newstdexception("SystemExit");
-	TypeError = newstdexception("TypeError");
-	ValueError = newstdexception("ValueError");
-	ZeroDivisionError = newstdexception("ZeroDivisionError");
+	PyExc_IOError = newstdexception("IOError");
+	PyExc_ImportError = newstdexception("ImportError");
+	PyExc_IndexError = newstdexception("IndexError");
+	PyExc_KeyError = newstdexception("KeyError");
+	PyExc_KeyboardInterrupt = newstdexception("KeyboardInterrupt");
+	PyExc_MemoryError = newstdexception("MemoryError");
+	PyExc_NameError = newstdexception("NameError");
+	PyExc_OverflowError = newstdexception("OverflowError");
+	PyExc_RuntimeError = newstdexception("RuntimeError");
+	PyExc_SyntaxError = newstdexception("SyntaxError");
+	PyExc_SystemError = newstdexception("SystemError");
+	PyExc_SystemExit = newstdexception("SystemExit");
+	PyExc_TypeError = newstdexception("TypeError");
+	PyExc_ValueError = newstdexception("ValueError");
+	PyExc_ZeroDivisionError = newstdexception("ZeroDivisionError");
 }
 
 void
-initbuiltin()
+PyBuiltin_Init()
 {
-	builtin_mod = initmodule("__builtin__", builtin_methods);
-	builtin_dict = getmoduledict(builtin_mod);
-	INCREF(builtin_dict);
+	builtin_mod = Py_InitModule("__builtin__", builtin_methods);
+	builtin_dict = PyModule_GetDict(builtin_mod);
+	Py_INCREF(builtin_dict);
 	initerrors();
-	(void) dictinsert(builtin_dict, "None", None);
-	(void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
-	(void) dictinsert(builtin_dict, "__debug__",
-			  newintobject(Py_OptimizeFlag == 0));
-	if (err_occurred())
-		fatal("error creating None/Ellipsis/__debug__ in __builtin__");
+	(void) PyDict_SetItemString(builtin_dict, "None", Py_None);
+	(void) PyDict_SetItemString(builtin_dict, "Ellipsis", Py_Ellipsis);
+	(void) PyDict_SetItemString(builtin_dict, "__debug__",
+			  PyInt_FromLong(Py_OptimizeFlag == 0));
+	if (PyErr_Occurred())
+		Py_FatalError(
+		  "error creating None/Ellipsis/__debug__ in __builtin__");
 }
 
 
 /* Helper for filter(): filter a tuple through a function */
 
-static object *
+static PyObject *
 filtertuple(func, tuple)
-	object *func;
-	object *tuple;
+	PyObject *func;
+	PyObject *tuple;
 {
-	object *result;
+	PyObject *result;
 	register int i, j;
-	int len = gettuplesize(tuple);
+	int len = PyTuple_Size(tuple);
 
 	if (len == 0) {
-		INCREF(tuple);
+		Py_INCREF(tuple);
 		return tuple;
 	}
 
-	if ((result = newtupleobject(len)) == NULL)
+	if ((result = PyTuple_New(len)) == NULL)
 		return NULL;
 
 	for (i = j = 0; i < len; ++i) {
-		object *item, *good;
+		PyObject *item, *good;
 		int ok;
 
-		if ((item = gettupleitem(tuple, i)) == NULL)
+		if ((item = PyTuple_GetItem(tuple, i)) == NULL)
 			goto Fail_1;
-		if (func == None) {
-			INCREF(item);
+		if (func == Py_None) {
+			Py_INCREF(item);
 			good = item;
 		}
 		else {
-			object *arg = mkvalue("(O)", item);
+			PyObject *arg = Py_BuildValue("(O)", item);
 			if (arg == NULL)
 				goto Fail_1;
-			good = call_object(func, arg);
-			DECREF(arg);
+			good = PyEval_CallObject(func, arg);
+			Py_DECREF(arg);
 			if (good == NULL)
 				goto Fail_1;
 		}
-		ok = testbool(good);
-		DECREF(good);
+		ok = PyObject_IsTrue(good);
+		Py_DECREF(good);
 		if (ok) {
-			INCREF(item);
-			if (settupleitem(result, j++, item) < 0)
+			Py_INCREF(item);
+			if (PyTuple_SetItem(result, j++, item) < 0)
 				goto Fail_1;
 		}
 	}
 
-	if (resizetuple(&result, j, 0) < 0)
+	if (_PyTuple_Resize(&result, j, 0) < 0)
 		return NULL;
 
 	return result;
 
 Fail_1:
-	DECREF(result);
+	Py_DECREF(result);
 	return NULL;
 }
 
 
 /* Helper for filter(): filter a string through a function */
 
-static object *
+static PyObject *
 filterstring(func, strobj)
-	object *func;
-	object *strobj;
+	PyObject *func;
+	PyObject *strobj;
 {
-	object *result;
+	PyObject *result;
 	register int i, j;
-	int len = getstringsize(strobj);
+	int len = PyString_Size(strobj);
 
-	if (func == None) {
+	if (func == Py_None) {
 		/* No character is ever false -- share input string */
-		INCREF(strobj);
+		Py_INCREF(strobj);
 		return strobj;
 	}
-	if ((result = newsizedstringobject(NULL, len)) == NULL)
+	if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
 		return NULL;
 
 	for (i = j = 0; i < len; ++i) {
-		object *item, *arg, *good;
+		PyObject *item, *arg, *good;
 		int ok;
 
 		item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
 		if (item == NULL)
 			goto Fail_1;
-		arg = mkvalue("(O)", item);
-		DECREF(item);
+		arg = Py_BuildValue("(O)", item);
+		Py_DECREF(item);
 		if (arg == NULL)
 			goto Fail_1;
-		good = call_object(func, arg);
-		DECREF(arg);
+		good = PyEval_CallObject(func, arg);
+		Py_DECREF(arg);
 		if (good == NULL)
 			goto Fail_1;
-		ok = testbool(good);
-		DECREF(good);
+		ok = PyObject_IsTrue(good);
+		Py_DECREF(good);
 		if (ok)
-			GETSTRINGVALUE((stringobject *)result)[j++] =
-				GETSTRINGVALUE((stringobject *)item)[0];
+			PyString_AS_STRING((PyStringObject *)result)[j++] =
+				PyString_AS_STRING((PyStringObject *)item)[0];
 	}
 
-	if (j < len && resizestring(&result, j) < 0)
+	if (j < len && _PyString_Resize(&result, j) < 0)
 		return NULL;
 
 	return result;
 
 Fail_1:
-	DECREF(result);
+	Py_DECREF(result);
 	return NULL;
 }
 
diff --git a/Python/compile.c b/Python/compile.c
index 21629ab..9d6d395 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -47,7 +47,7 @@
 #define PRIVATE_NAME_MANGLING
 #endif
 
-#include "allobjects.h"
+#include "Python.h"
 
 #include "node.h"
 #include "token.h"
@@ -57,7 +57,6 @@
 #include "structmember.h"
 
 #include <ctype.h>
-#include <errno.h>
 
 int Py_OptimizeFlag = 0;
 
@@ -65,7 +64,7 @@
 #define OP_ASSIGN 1
 #define OP_APPLY 2
 
-#define OFF(x) offsetof(codeobject, x)
+#define OFF(x) offsetof(PyCodeObject, x)
 
 static struct memberlist code_memberlist[] = {
 	{"co_argcount",	T_INT,		OFF(co_argcount),	READONLY},
@@ -83,50 +82,50 @@
 	{NULL}	/* Sentinel */
 };
 
-static object *
+static PyObject *
 code_getattr(co, name)
-	codeobject *co;
+	PyCodeObject *co;
 	char *name;
 {
-	return getmember((char *)co, code_memberlist, name);
+	return PyMember_Get((char *)co, code_memberlist, name);
 }
 
 static void
 code_dealloc(co)
-	codeobject *co;
+	PyCodeObject *co;
 {
-	XDECREF(co->co_code);
-	XDECREF(co->co_consts);
-	XDECREF(co->co_names);
-	XDECREF(co->co_filename);
-	XDECREF(co->co_name);
-	XDECREF(co->co_varnames);
-	DEL(co);
+	Py_XDECREF(co->co_code);
+	Py_XDECREF(co->co_consts);
+	Py_XDECREF(co->co_names);
+	Py_XDECREF(co->co_filename);
+	Py_XDECREF(co->co_name);
+	Py_XDECREF(co->co_varnames);
+	PyMem_DEL(co);
 }
 
-static object *
+static PyObject *
 code_repr(co)
-	codeobject *co;
+	PyCodeObject *co;
 {
 	char buf[500];
 	int lineno = -1;
-	char *p = GETSTRINGVALUE(co->co_code);
+	char *p = PyString_AS_STRING(co->co_code);
 	char *filename = "???";
 	char *name = "???";
 	if (*p == SET_LINENO)
 		lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
-	if (co->co_filename && is_stringobject(co->co_filename))
-		filename = getstringvalue(co->co_filename);
-	if (co->co_name && is_stringobject(co->co_name))
-		name = getstringvalue(co->co_name);
+	if (co->co_filename && PyString_Check(co->co_filename))
+		filename = PyString_AsString(co->co_filename);
+	if (co->co_name && PyString_Check(co->co_name))
+		name = PyString_AsString(co->co_name);
 	sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
 		name, (long)co, filename, lineno);
-	return newstringobject(buf);
+	return PyString_FromString(buf);
 }
 
 static int
 code_compare(co, cp)
-	codeobject *co, *cp;
+	PyCodeObject *co, *cp;
 {
 	int cmp;
 	cmp = cp->co_argcount - cp->co_argcount;
@@ -135,28 +134,29 @@
 	if (cmp) return cmp;
 	cmp = cp->co_flags - cp->co_flags;
 	if (cmp) return cmp;
-	cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
+	cmp = PyObject_Compare((PyObject *)co->co_code,
+			       (PyObject *)cp->co_code);
 	if (cmp) return cmp;
-	cmp = cmpobject(co->co_consts, cp->co_consts);
+	cmp = PyObject_Compare(co->co_consts, cp->co_consts);
 	if (cmp) return cmp;
-	cmp = cmpobject(co->co_names, cp->co_names);
+	cmp = PyObject_Compare(co->co_names, cp->co_names);
 	if (cmp) return cmp;
-	cmp = cmpobject(co->co_varnames, cp->co_varnames);
+	cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
 	return cmp;
 }
 
 static long
 code_hash(co)
-	codeobject *co;
+	PyCodeObject *co;
 {
 	long h, h1, h2, h3, h4;
-	h1 = hashobject((object *)co->co_code);
+	h1 = PyObject_Hash((PyObject *)co->co_code);
 	if (h1 == -1) return -1;
-	h2 = hashobject(co->co_consts);
+	h2 = PyObject_Hash(co->co_consts);
 	if (h2 == -1) return -1;
-	h3 = hashobject(co->co_names);
+	h3 = PyObject_Hash(co->co_names);
 	if (h3 == -1) return -1;
-	h4 = hashobject(co->co_varnames);
+	h4 = PyObject_Hash(co->co_varnames);
 	if (h4 == -1) return -1;
 	h = h1 ^ h2 ^ h3 ^ h4 ^
 		co->co_argcount ^ co->co_nlocals ^ co->co_flags;
@@ -164,11 +164,11 @@
 	return h;
 }
 
-typeobject Codetype = {
-	OB_HEAD_INIT(&Typetype)
+PyTypeObject PyCode_Type = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"code",
-	sizeof(codeobject),
+	sizeof(PyCodeObject),
 	0,
 	(destructor)code_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
@@ -185,86 +185,86 @@
 #define NAME_CHARS \
 	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
 
-codeobject *
-newcodeobject(argcount, nlocals, stacksize, flags,
+PyCodeObject *
+PyCode_New(argcount, nlocals, stacksize, flags,
 	      code, consts, names, varnames, filename, name,
 	      firstlineno, lnotab)
 	int argcount;
 	int nlocals;
 	int stacksize;
 	int flags;
-	object *code;
-	object *consts;
-	object *names;
-	object *varnames;
-	object *filename;
-	object *name;
+	PyObject *code;
+	PyObject *consts;
+	PyObject *names;
+	PyObject *varnames;
+	PyObject *filename;
+	PyObject *name;
 	int firstlineno;
-	object *lnotab;
+	PyObject *lnotab;
 {
-	codeobject *co;
+	PyCodeObject *co;
 	int i;
 	/* Check argument types */
 	if (argcount < 0 || nlocals < 0 ||
-	    code == NULL || !is_stringobject(code) ||
-	    consts == NULL || !is_tupleobject(consts) ||
-	    names == NULL || !is_tupleobject(names) ||
-	    varnames == NULL || !is_tupleobject(varnames) ||
-	    name == NULL || !is_stringobject(name) ||
-	    filename == NULL || !is_stringobject(filename) ||
-		lnotab == NULL || !is_stringobject(lnotab)) {
-		err_badcall();
+	    code == NULL || !PyString_Check(code) ||
+	    consts == NULL || !PyTuple_Check(consts) ||
+	    names == NULL || !PyTuple_Check(names) ||
+	    varnames == NULL || !PyTuple_Check(varnames) ||
+	    name == NULL || !PyString_Check(name) ||
+	    filename == NULL || !PyString_Check(filename) ||
+		lnotab == NULL || !PyString_Check(lnotab)) {
+		PyErr_BadInternalCall();
 		return NULL;
 	}
 	/* Make sure names and varnames are all strings, & intern them */
-	for (i = gettuplesize(names); --i >= 0; ) {
-		object *v = gettupleitem(names, i);
-		if (v == NULL || !is_stringobject(v)) {
-			err_badcall();
+	for (i = PyTuple_Size(names); --i >= 0; ) {
+		PyObject *v = PyTuple_GetItem(names, i);
+		if (v == NULL || !PyString_Check(v)) {
+			PyErr_BadInternalCall();
 			return NULL;
 		}
 		PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
 	}
-	for (i = gettuplesize(varnames); --i >= 0; ) {
-		object *v = gettupleitem(varnames, i);
-		if (v == NULL || !is_stringobject(v)) {
-			err_badcall();
+	for (i = PyTuple_Size(varnames); --i >= 0; ) {
+		PyObject *v = PyTuple_GetItem(varnames, i);
+		if (v == NULL || !PyString_Check(v)) {
+			PyErr_BadInternalCall();
 			return NULL;
 		}
 		PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
 	}
 	/* Intern selected string constants */
-	for (i = gettuplesize(consts); --i >= 0; ) {
-		object *v = gettupleitem(consts, i);
+	for (i = PyTuple_Size(consts); --i >= 0; ) {
+		PyObject *v = PyTuple_GetItem(consts, i);
 		char *p;
-		if (!is_stringobject(v))
+		if (!PyString_Check(v))
 			continue;
-		p = getstringvalue(v);
+		p = PyString_AsString(v);
 		if ((int)strspn(p, NAME_CHARS)
-		    != getstringsize(v))
+		    != PyString_Size(v))
 			continue;
 		PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
 	}
-	co = NEWOBJ(codeobject, &Codetype);
+	co = PyObject_NEW(PyCodeObject, &PyCode_Type);
 	if (co != NULL) {
 		co->co_argcount = argcount;
 		co->co_nlocals = nlocals;
 		co->co_stacksize = stacksize;
 		co->co_flags = flags;
-		INCREF(code);
-		co->co_code = (stringobject *)code;
-		INCREF(consts);
+		Py_INCREF(code);
+		co->co_code = (PyStringObject *)code;
+		Py_INCREF(consts);
 		co->co_consts = consts;
-		INCREF(names);
+		Py_INCREF(names);
 		co->co_names = names;
-		INCREF(varnames);
+		Py_INCREF(varnames);
 		co->co_varnames = varnames;
-		INCREF(filename);
+		Py_INCREF(filename);
 		co->co_filename = filename;
-		INCREF(name);
+		Py_INCREF(name);
 		co->co_name = name;
 		co->co_firstlineno = firstlineno;
-		INCREF(lnotab);
+		Py_INCREF(lnotab);
 		co->co_lnotab = lnotab;
 	}
 	return co;
@@ -274,12 +274,12 @@
 /* Data structure used internally */
 
 struct compiling {
-	object *c_code;		/* string */
-	object *c_consts;	/* list of objects */
-	object *c_names;	/* list of strings (names) */
-	object *c_globals;	/* dictionary (value=None) */
-	object *c_locals;	/* dictionary (value=localID) */
-	object *c_varnames;	/* list (inverse of c_locals) */
+	PyObject *c_code;		/* string */
+	PyObject *c_consts;	/* list of objects */
+	PyObject *c_names;	/* list of strings (names) */
+	PyObject *c_globals;	/* dictionary (value=None) */
+	PyObject *c_locals;	/* dictionary (value=localID) */
+	PyObject *c_varnames;	/* list (inverse of c_locals) */
 	int c_nlocals;		/* index of next local */
 	int c_argcount;		/* number of top-level arguments */
 	int c_flags;		/* same as co_flags */
@@ -297,7 +297,7 @@
 	int c_stacklevel;	/* Current stack level */
 	int c_maxstacklevel;	/* Maximum stack level */
 	int c_firstlineno;
-	object *c_lnotab;	/* Table mapping address to line number */
+	PyObject *c_lnotab;	/* Table mapping address to line number */
 	int c_last_addr, c_last_line, c_lnotab_next;
 #ifdef PRIVATE_NAME_MANGLING
 	char *c_private;	/* for private name mangling */
@@ -310,28 +310,28 @@
 static void
 com_error(c, exc, msg)
 	struct compiling *c;
-	object *exc;
+	PyObject *exc;
 	char *msg;
 {
 	int n = strlen(msg);
-	object *v;
+	PyObject *v;
 	char buffer[30];
 	char *s;
 	c->c_errors++;
 	if (c->c_lineno <= 1) {
 		/* Unknown line number or single interactive command */
-		err_setstr(exc, msg);
+		PyErr_SetString(exc, msg);
 		return;
 	}
 	sprintf(buffer, " (line %d)", c->c_lineno);
-	v = newsizedstringobject((char *)NULL, n + strlen(buffer));
+	v = PyString_FromStringAndSize((char *)NULL, n + strlen(buffer));
 	if (v == NULL)
 		return; /* MemoryError, too bad */
-	s = GETSTRINGVALUE((stringobject *)v);
+	s = PyString_AS_STRING((PyStringObject *)v);
 	strcpy(s, msg);
 	strcat(s, buffer);
-	err_setval(exc, v);
-	DECREF(v);
+	PyErr_SetObject(exc, v);
+	Py_DECREF(v);
 }
 
 
@@ -343,7 +343,8 @@
 	int type;
 {
 	if (c->c_nblocks >= CO_MAXBLOCKS) {
-		com_error(c, SystemError, "too many statically nested blocks");
+		com_error(c, PyExc_SystemError,
+			  "too many statically nested blocks");
 	}
 	else {
 		c->c_block[c->c_nblocks++] = type;
@@ -358,55 +359,58 @@
 	if (c->c_nblocks > 0)
 		c->c_nblocks--;
 	if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
-		com_error(c, SystemError, "bad block pop");
+		com_error(c, PyExc_SystemError, "bad block pop");
 	}
 }
 
 
 /* Prototype forward declarations */
 
-static int com_init PROTO((struct compiling *, char *));
-static void com_free PROTO((struct compiling *));
-static void com_push PROTO((struct compiling *, int));
-static void com_pop PROTO((struct compiling *, int));
-static void com_done PROTO((struct compiling *));
-static void com_node PROTO((struct compiling *, struct _node *));
-static void com_factor PROTO((struct compiling *, struct _node *));
-static void com_addbyte PROTO((struct compiling *, int));
-static void com_addint PROTO((struct compiling *, int));
-static void com_addoparg PROTO((struct compiling *, int, int));
-static void com_addfwref PROTO((struct compiling *, int, int *));
-static void com_backpatch PROTO((struct compiling *, int));
-static int com_add PROTO((struct compiling *, object *, object *));
-static int com_addconst PROTO((struct compiling *, object *));
-static int com_addname PROTO((struct compiling *, object *));
-static void com_addopname PROTO((struct compiling *, int, node *));
-static void com_list PROTO((struct compiling *, node *, int));
-static int com_argdefs PROTO((struct compiling *, node *));
-static int com_newlocal PROTO((struct compiling *, char *));
-static codeobject *icompile PROTO((struct _node *, struct compiling *));
-static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
-static object *parsestrplus PROTO((node *));
-static object *parsestr PROTO((char *));
+static int com_init Py_PROTO((struct compiling *, char *));
+static void com_free Py_PROTO((struct compiling *));
+static void com_push Py_PROTO((struct compiling *, int));
+static void com_pop Py_PROTO((struct compiling *, int));
+static void com_done Py_PROTO((struct compiling *));
+static void com_node Py_PROTO((struct compiling *, struct _node *));
+static void com_factor Py_PROTO((struct compiling *, struct _node *));
+static void com_addbyte Py_PROTO((struct compiling *, int));
+static void com_addint Py_PROTO((struct compiling *, int));
+static void com_addoparg Py_PROTO((struct compiling *, int, int));
+static void com_addfwref Py_PROTO((struct compiling *, int, int *));
+static void com_backpatch Py_PROTO((struct compiling *, int));
+static int com_add Py_PROTO((struct compiling *, PyObject *, PyObject *));
+static int com_addconst Py_PROTO((struct compiling *, PyObject *));
+static int com_addname Py_PROTO((struct compiling *, PyObject *));
+static void com_addopname Py_PROTO((struct compiling *, int, node *));
+static void com_list Py_PROTO((struct compiling *, node *, int));
+static int com_argdefs Py_PROTO((struct compiling *, node *));
+static int com_newlocal Py_PROTO((struct compiling *, char *));
+static PyCodeObject *icompile Py_PROTO((struct _node *, struct compiling *));
+static PyCodeObject *jcompile Py_PROTO((struct _node *, char *,
+					struct compiling *));
+static PyObject *parsestrplus Py_PROTO((node *));
+static PyObject *parsestr Py_PROTO((char *));
 
 static int
 com_init(c, filename)
 	struct compiling *c;
 	char *filename;
 {
-	if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
+	if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
+						    1000)) == NULL)
 		goto fail_3;
-	if ((c->c_consts = newlistobject(0)) == NULL)
+	if ((c->c_consts = PyList_New(0)) == NULL)
 		goto fail_2;
-	if ((c->c_names = newlistobject(0)) == NULL)
+	if ((c->c_names = PyList_New(0)) == NULL)
 		goto fail_1;
-	if ((c->c_globals = newdictobject()) == NULL)
+	if ((c->c_globals = PyDict_New()) == NULL)
 		goto fail_0;
-	if ((c->c_locals = newdictobject()) == NULL)
+	if ((c->c_locals = PyDict_New()) == NULL)
 		goto fail_00;
-	if ((c->c_varnames = newlistobject(0)) == NULL)
+	if ((c->c_varnames = PyList_New(0)) == NULL)
 		goto fail_000;
-	if ((c->c_lnotab = newsizedstringobject((char *)NULL, 1000)) == NULL)
+	if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
+						      1000)) == NULL)
 		goto fail_0000;
 	c->c_nlocals = 0;
 	c->c_argcount = 0;
@@ -430,17 +434,17 @@
 	return 1;
 	
   fail_0000:
-  	DECREF(c->c_lnotab);
+  	Py_DECREF(c->c_lnotab);
   fail_000:
-  	DECREF(c->c_locals);
+  	Py_DECREF(c->c_locals);
   fail_00:
-  	DECREF(c->c_globals);
+  	Py_DECREF(c->c_globals);
   fail_0:
-  	DECREF(c->c_names);
+  	Py_DECREF(c->c_names);
   fail_1:
-	DECREF(c->c_consts);
+	Py_DECREF(c->c_consts);
   fail_2:
-	DECREF(c->c_code);
+	Py_DECREF(c->c_code);
   fail_3:
  	return 0;
 }
@@ -449,13 +453,13 @@
 com_free(c)
 	struct compiling *c;
 {
-	XDECREF(c->c_code);
-	XDECREF(c->c_consts);
-	XDECREF(c->c_names);
-	XDECREF(c->c_globals);
-	XDECREF(c->c_locals);
-	XDECREF(c->c_varnames);
-	XDECREF(c->c_lnotab);
+	Py_XDECREF(c->c_code);
+	Py_XDECREF(c->c_consts);
+	Py_XDECREF(c->c_names);
+	Py_XDECREF(c->c_globals);
+	Py_XDECREF(c->c_locals);
+	Py_XDECREF(c->c_varnames);
+	Py_XDECREF(c->c_lnotab);
 }
 
 static void
@@ -489,9 +493,9 @@
 	struct compiling *c;
 {
 	if (c->c_code != NULL)
-		resizestring(&c->c_code, c->c_nexti);
+		_PyString_Resize(&c->c_code, c->c_nexti);
 	if (c->c_lnotab != NULL)
-		resizestring(&c->c_lnotab, c->c_lnotab_next);
+		_PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
 }
 
 static void
@@ -506,18 +510,19 @@
 		fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
 		fatal("com_addbyte: byte out of range");
 		*/
-		com_error(c, SystemError, "com_addbyte: byte out of range");
+		com_error(c, PyExc_SystemError,
+			  "com_addbyte: byte out of range");
 	}
 	if (c->c_code == NULL)
 		return;
-	len = getstringsize(c->c_code);
+	len = PyString_Size(c->c_code);
 	if (c->c_nexti >= len) {
-		if (resizestring(&c->c_code, len+1000) != 0) {
+		if (_PyString_Resize(&c->c_code, len+1000) != 0) {
 			c->c_errors++;
 			return;
 		}
 	}
-	getstringvalue(c->c_code)[c->c_nexti++] = byte;
+	PyString_AsString(c->c_code)[c->c_nexti++] = byte;
 }
 
 static void
@@ -539,14 +544,14 @@
 	char *p;
 	if (c->c_lnotab == NULL)
 		return;
-	size = getstringsize(c->c_lnotab);
+	size = PyString_Size(c->c_lnotab);
 	if (c->c_lnotab_next+2 > size) {
-		if (resizestring(&c->c_lnotab, size + 1000) < 0) {
+		if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
 			c->c_errors++;
 			return;
 		}
 	}
-	p = getstringvalue(c->c_lnotab) + c->c_lnotab_next;
+	p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
 	*p++ = addr;
 	*p++ = line;
 	c->c_lnotab_next += 2;
@@ -616,7 +621,7 @@
 	struct compiling *c;
 	int anchor; /* Must be nonzero */
 {
-	unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
+	unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
 	int target = c->c_nexti;
 	int dist;
 	int prev;
@@ -637,17 +642,17 @@
 static int
 com_add(c, list, v)
 	struct compiling *c;
-	object *list;
-	object *v;
+	PyObject *list;
+	PyObject *v;
 {
-	int n = getlistsize(list);
+	int n = PyList_Size(list);
 	int i;
 	for (i = n; --i >= 0; ) {
-		object *w = getlistitem(list, i);
-		if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
+		PyObject *w = PyList_GetItem(list, i);
+		if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
 			return i;
 	}
-	if (addlistitem(list, v) != 0)
+	if (PyList_Append(list, v) != 0)
 		c->c_errors++;
 	return n;
 }
@@ -655,7 +660,7 @@
 static int
 com_addconst(c, v)
 	struct compiling *c;
-	object *v;
+	PyObject *v;
 {
 	return com_add(c, c->c_consts, v);
 }
@@ -663,7 +668,7 @@
 static int
 com_addname(c, v)
 	struct compiling *c;
-	object *v;
+	PyObject *v;
 {
 	return com_add(c, c->c_names, v);
 }
@@ -709,7 +714,7 @@
 	int op;
 	char *name;
 {
-	object *v;
+	PyObject *v;
 	int i;
 #ifdef PRIVATE_NAME_MANGLING
 	char buffer[256];
@@ -724,14 +729,14 @@
 	}
 	else {
 		i = com_addname(c, v);
-		DECREF(v);
+		Py_DECREF(v);
 	}
 	/* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
 	switch (op) {
 	case LOAD_NAME:
 	case STORE_NAME:
 	case DELETE_NAME:
-		if (dictlookup(c->c_globals, name) != NULL) {
+		if (PyDict_GetItemString(c->c_globals, name) != NULL) {
 			switch (op) {
 			case LOAD_NAME:   op = LOAD_GLOBAL;   break;
 			case STORE_NAME:  op = STORE_GLOBAL;  break;
@@ -762,7 +767,7 @@
 		for (i = 0; i < NCH(n); i += 2) {
 			char *s = STR(CHILD(n, i));
 			if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
-				com_error(c, MemoryError,
+				com_error(c, PyExc_MemoryError,
 					  "dotted_name too long");
 				name = NULL;
 				break;
@@ -780,14 +785,15 @@
 	com_addopnamestr(c, op, name);
 }
 
-static object *
+static PyObject *
 parsenumber(co, s)
 	struct compiling *co;
 	char *s;
 {
-	extern long mystrtol PROTO((const char *, char **, int));
-	extern unsigned long mystrtoul PROTO((const char *, char **, int));
-	extern double atof PROTO((const char *));
+	extern long PyOS_strtol Py_PROTO((const char *, char **, int));
+	extern unsigned long PyOS_strtoul Py_PROTO((const char *,
+						    char **, int));
+	extern double atof Py_PROTO((const char *));
 	char *end;
 	long x;
 	double dx;
@@ -802,18 +808,18 @@
 	imflag = *end == 'j' || *end == 'J';
 #endif
 	if (*end == 'l' || *end == 'L')
-		return long_scan(s, 0);
+		return PyLong_FromString(s, (char **)0, 0);
 	if (s[0] == '0')
-		x = (long) mystrtoul(s, &end, 0);
+		x = (long) PyOS_strtoul(s, &end, 0);
 	else
-		x = mystrtol(s, &end, 0);
+		x = PyOS_strtol(s, &end, 0);
 	if (*end == '\0') {
 		if (errno != 0) {
-			com_error(co, OverflowError,
+			com_error(co, PyExc_OverflowError,
 				  "integer literal too large");
 			return NULL;
 		}
-		return newintobject(x);
+		return PyInt_FromLong(x);
 	}
 	/* XXX Huge floats may silently fail */
 #ifndef WITHOUT_COMPLEX
@@ -822,22 +828,22 @@
 		PyFPE_START_PROTECT("atof", return 0)
 		c.imag = atof(s);
 		PyFPE_END_PROTECT(c)
-		return newcomplexobject(c);
+		return PyComplex_FromCComplex(c);
 	}
 	else {
 #endif
 		PyFPE_START_PROTECT("atof", return 0)
 		dx = atof(s);
 		PyFPE_END_PROTECT(dx)
-		return newfloatobject(dx);
+		return PyFloat_FromDouble(dx);
 	}
 }
 
-static object *
+static PyObject *
 parsestr(s)
 	char *s;
 {
-	object *v;
+	PyObject *v;
 	int len;
 	char *buf;
 	char *p;
@@ -848,27 +854,27 @@
 	if (isalpha(quote) || quote == '_')
 		quote = *++s;
 	if (quote != '\'' && quote != '\"') {
-		err_badcall();
+		PyErr_BadInternalCall();
 		return NULL;
 	}
 	s++;
 	len = strlen(s);
 	if (s[--len] != quote) {
-		err_badcall();
+		PyErr_BadInternalCall();
 		return NULL;
 	}
 	if (len >= 4 && s[0] == quote && s[1] == quote) {
 		s += 2;
 		len -= 2;
 		if (s[--len] != quote || s[--len] != quote) {
-			err_badcall();
+			PyErr_BadInternalCall();
 			return NULL;
 		}
 	}
 	if (first != quote || strchr(s, '\\') == NULL)
-		return newsizedstringobject(s, len);
-	v = newsizedstringobject((char *)NULL, len);
-	p = buf = getstringvalue(v);
+		return PyString_FromStringAndSize(s, len);
+	v = PyString_FromStringAndSize((char *)NULL, len);
+	p = buf = PyString_AsString(v);
 	end = s + len;
 	while (s < end) {
 		if (*s != '\\') {
@@ -912,21 +918,21 @@
 		default: *p++ = '\\'; *p++ = s[-1]; break;
 		}
 	}
-	resizestring(&v, (int)(p - buf));
+	_PyString_Resize(&v, (int)(p - buf));
 	return v;
 }
 
-static object *
+static PyObject *
 parsestrplus(n)
 	node *n;
 {
-	object *v;
+	PyObject *v;
 	int i;
 	REQ(CHILD(n, 0), STRING);
 	if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
 		/* String literal concatenation */
 		for (i = 1; i < NCH(n) && v != NULL; i++) {
-			joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
+			PyString_ConcatAndDel(&v, parsestr(STR(CHILD(n, i))));
 		}
 	}
 	return v;
@@ -975,7 +981,7 @@
 	node *n;
 {
 	node *ch;
-	object *v;
+	PyObject *v;
 	int i;
 	REQ(n, atom);
 	ch = CHILD(n, 0);
@@ -1012,7 +1018,7 @@
 		}
 		else {
 			i = com_addconst(c, v);
-			DECREF(v);
+			Py_DECREF(v);
 		}
 		com_addoparg(c, LOAD_CONST, i);
 		com_push(c, 1);
@@ -1025,7 +1031,7 @@
 		}
 		else {
 			i = com_addconst(c, v);
-			DECREF(v);
+			Py_DECREF(v);
 		}
 		com_addoparg(c, LOAD_CONST, i);
 		com_push(c, 1);
@@ -1036,7 +1042,8 @@
 		break;
 	default:
 		/* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
-		com_error(c, SystemError, "com_atom: unexpected node type");
+		com_error(c, PyExc_SystemError,
+			  "com_atom: unexpected node type");
 	}
 }
 
@@ -1072,13 +1079,13 @@
 com_argument(c, n, pkeywords)
 	struct compiling *c;
 	node *n; /* argument */
-	object **pkeywords;
+	PyObject **pkeywords;
 {
 	node *m;
 	REQ(n, argument); /* [test '='] test; really [keyword '='] test */
 	if (NCH(n) == 1) {
 		if (*pkeywords != NULL) {
-			com_error(c, SyntaxError,
+			com_error(c, PyExc_SyntaxError,
 				   "non-keyword arg after keyword arg");
 		}
 		else {
@@ -1091,24 +1098,25 @@
 		m = CHILD(m, 0);
 	} while (NCH(m) == 1);
 	if (TYPE(m) != NAME) {
-		com_error(c, SyntaxError, "keyword can't be an expression");
+		com_error(c, PyExc_SyntaxError,
+			  "keyword can't be an expression");
 	}
 	else {
-		object *v = PyString_InternFromString(STR(m));
+		PyObject *v = PyString_InternFromString(STR(m));
 		if (v != NULL && *pkeywords == NULL)
-			*pkeywords = newdictobject();
+			*pkeywords = PyDict_New();
 		if (v == NULL || *pkeywords == NULL)
 			c->c_errors++;
 		else {
-			if (dict2lookup(*pkeywords, v) != NULL)
-				com_error(c, SyntaxError,
+			if (PyDict_GetItem(*pkeywords, v) != NULL)
+				com_error(c, PyExc_SyntaxError,
 					  "duplicate keyword argument");
 			else
-				if (dict2insert(*pkeywords, v, v) != 0)
+				if (PyDict_SetItem(*pkeywords, v, v) != 0)
 					c->c_errors++;
 			com_addoparg(c, LOAD_CONST, com_addconst(c, v));
 			com_push(c, 1);
-			DECREF(v);
+			Py_DECREF(v);
 		}
 	}
 	com_node(c, CHILD(n, 2));
@@ -1123,7 +1131,7 @@
 		com_addoparg(c, CALL_FUNCTION, 0);
 	}
 	else {
-		object *keywords = NULL;
+		PyObject *keywords = NULL;
 		int i, na, nk;
 		REQ(n, arglist);
 		na = 0;
@@ -1135,9 +1143,10 @@
 			else
 				nk++;
 		}
-		XDECREF(keywords);
+		Py_XDECREF(keywords);
 		if (na > 255 || nk > 255) {
-			com_error(c, SyntaxError, "more than 255 arguments");
+			com_error(c, PyExc_SyntaxError,
+				  "more than 255 arguments");
 		}
 		com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
 		com_pop(c, na + 2*nk);
@@ -1163,7 +1172,7 @@
 
 	/* first argument */
 	if (TYPE(CHILD(n,i)) == COLON) {
-		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 		com_push(c, 1);
 		i++;
 	}
@@ -1179,7 +1188,7 @@
 		i++;
 	}
 	else {
-		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 		com_push(c, 1);
 	}
 	/* remaining arguments */
@@ -1189,7 +1198,7 @@
 		REQ(ch, sliceop);
 		if (NCH(ch) == 1) {
 			/* right argument of ':' missing */
-			com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+			com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 			com_push(c, 1);
 		}
 		else
@@ -1243,7 +1252,8 @@
 			if (assigning == OP_APPLY)
 				op = SLICE;
 			else
-				op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
+				op = ((assigning == OP_ASSIGN) ?
+				      STORE_SLICE : DELETE_SLICE);
 			com_slice(c, sub, op);
 			if (op == STORE_SLICE)
 				com_pop(c, 2);
@@ -1294,7 +1304,7 @@
 		com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
 		break;
 	default:
-		com_error(c, SystemError,
+		com_error(c, PyExc_SystemError,
 			  "com_apply_trailer: unknown trailer type");
 	}
 }
@@ -1364,7 +1374,7 @@
 			op = BINARY_MODULO;
 			break;
 		default:
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_term: operator not *, / or %");
 			op = 255;
 		}
@@ -1392,7 +1402,7 @@
 			op = BINARY_SUBTRACT;
 			break;
 		default:
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_arith_expr: operator not + or -");
 			op = 255;
 		}
@@ -1420,7 +1430,7 @@
 			op = BINARY_RSHIFT;
 			break;
 		default:
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_shift_expr: operator not << or >>");
 			op = 255;
 		}
@@ -1444,7 +1454,7 @@
 			op = BINARY_AND;
 		}
 		else {
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_and_expr: operator not &");
 			op = 255;
 		}
@@ -1468,7 +1478,7 @@
 			op = BINARY_XOR;
 		}
 		else {
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_xor_expr: operator not ^");
 			op = 255;
 		}
@@ -1492,7 +1502,7 @@
 			op = BINARY_OR;
 		}
 		else {
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_expr: expr operator not |");
 			op = 255;
 		}
@@ -1590,7 +1600,7 @@
 		}
 		op = cmp_type(CHILD(n, i-1));
 		if (op == BAD) {
-			com_error(c, SystemError,
+			com_error(c, PyExc_SystemError,
 				  "com_comparison: unknown comparison op");
 		}
 		com_addoparg(c, COMPARE_OP, op);
@@ -1656,17 +1666,17 @@
 {
 	REQ(n, test); /* and_test ('or' and_test)* | lambdef */
 	if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
-		object *v;
+		PyObject *v;
 		int i;
 		int ndefs = com_argdefs(c, CHILD(n, 0));
-		v = (object *) icompile(CHILD(n, 0), c);
+		v = (PyObject *) icompile(CHILD(n, 0), c);
 		if (v == NULL) {
 			c->c_errors++;
 			i = 255;
 		}
 		else {
 			i = com_addconst(c, v);
-			DECREF(v);
+			Py_DECREF(v);
 		}
 		com_addoparg(c, LOAD_CONST, i);
 		com_push(c, 1);
@@ -1713,8 +1723,8 @@
 
 /* Begin of assignment compilation */
 
-static void com_assign_name PROTO((struct compiling *, node *, int));
-static void com_assign PROTO((struct compiling *, node *, int));
+static void com_assign_name Py_PROTO((struct compiling *, node *, int));
+static void com_assign Py_PROTO((struct compiling *, node *, int));
 
 static void
 com_assign_attr(c, n, assigning)
@@ -1735,7 +1745,8 @@
 	REQ(n, trailer);
 	switch (TYPE(CHILD(n, 0))) {
 	case LPAR: /* '(' [exprlist] ')' */
-		com_error(c, SyntaxError, "can't assign to function call");
+		com_error(c, PyExc_SyntaxError,
+			  "can't assign to function call");
 		break;
 	case DOT: /* '.' NAME */
 		com_assign_attr(c, CHILD(n, 1), assigning);
@@ -1744,7 +1755,7 @@
 		com_subscriptlist(c, CHILD(n, 1), assigning);
 		break;
 	default:
-		com_error(c, SystemError, "unknown trailer type");
+		com_error(c, PyExc_SystemError, "unknown trailer type");
 	}
 }
 
@@ -1825,7 +1836,7 @@
 		case term:
 		case factor:
 			if (NCH(n) > 1) {
-				com_error(c, SyntaxError,
+				com_error(c, PyExc_SyntaxError,
 					  "can't assign to operator");
 				return;
 			}
@@ -1835,7 +1846,7 @@
 		case power: /* atom trailer* ('**' power)* */
 /* ('+'|'-'|'~') factor | atom trailer* */
 			if (TYPE(CHILD(n, 0)) != atom) {
-				com_error(c, SyntaxError,
+				com_error(c, PyExc_SyntaxError,
 					  "can't assign to operator");
 				return;
 			}
@@ -1844,7 +1855,7 @@
 				com_node(c, CHILD(n, 0));
 				for (i = 1; i+1 < NCH(n); i++) {
 					if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
-						com_error(c, SyntaxError,
+						com_error(c, PyExc_SyntaxError,
 						  "can't assign to operator");
 						return;
 					}
@@ -1863,7 +1874,7 @@
 				n = CHILD(n, 1);
 				if (TYPE(n) == RPAR) {
 					/* XXX Should allow () = () ??? */
-					com_error(c, SyntaxError,
+					com_error(c, PyExc_SyntaxError,
 						  "can't assign to ()");
 					return;
 				}
@@ -1871,7 +1882,7 @@
 			case LSQB:
 				n = CHILD(n, 1);
 				if (TYPE(n) == RSQB) {
-					com_error(c, SyntaxError,
+					com_error(c, PyExc_SyntaxError,
 						  "can't assign to []");
 					return;
 				}
@@ -1881,26 +1892,28 @@
 				com_assign_name(c, CHILD(n, 0), assigning);
 				return;
 			default:
-				com_error(c, SyntaxError,
+				com_error(c, PyExc_SyntaxError,
 					  "can't assign to literal");
 				return;
 			}
 			break;
 
 		case lambdef:
-			com_error(c, SyntaxError, "can't assign to lambda");
+			com_error(c, PyExc_SyntaxError,
+				  "can't assign to lambda");
 			return;
 		
 		default:
 			/* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
-			com_error(c, SystemError, "com_assign: bad node");
+			com_error(c, PyExc_SystemError,
+				  "com_assign: bad node");
 			return;
 		
 		}
 	}
 }
 
-/* Forward */ static node *get_rawdocstring PROTO((node *));
+/* Forward */ static node *get_rawdocstring Py_PROTO((node *));
 
 static void
 com_expr_stmt(c, n)
@@ -1997,10 +2010,10 @@
 {
 	REQ(n, return_stmt); /* 'return' [testlist] */
 	if (!c->c_infunction) {
-		com_error(c, SyntaxError, "'return' outside function");
+		com_error(c, PyExc_SyntaxError, "'return' outside function");
 	}
 	if (NCH(n) < 2) {
-		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 		com_push(c, 1);
 	}
 	else
@@ -2075,10 +2088,11 @@
 		    com_mangle(c, s, buffer, (int)sizeof(buffer)))
 			s = buffer;
 #endif
-		if (dictlookup(c->c_locals, s) != NULL) {
-			com_error(c, SyntaxError, "name is local and global");
+		if (PyDict_GetItemString(c->c_locals, s) != NULL) {
+			com_error(c, PyExc_SyntaxError,
+				  "name is local and global");
 		}
-		else if (dictinsert(c->c_globals, s, None) != 0)
+		else if (PyDict_SetItemString(c->c_globals, s, Py_None) != 0)
 			c->c_errors++;
 	}
 }
@@ -2086,36 +2100,37 @@
 static int
 com_newlocal_o(c, nameval)
 	struct compiling *c;
-	object *nameval;
+	PyObject *nameval;
 {
 	int i;
-	object *ival;
-	if (getlistsize(c->c_varnames) != c->c_nlocals) {
+	PyObject *ival;
+	if (PyList_Size(c->c_varnames) != c->c_nlocals) {
 		/* This is usually caused by an error on a previous call */
 		if (c->c_errors == 0) {
-			com_error(c, SystemError, "mixed up var name/index");
+			com_error(c, PyExc_SystemError,
+				  "mixed up var name/index");
 		}
 		return 0;
 	}
-	ival = newintobject(i = c->c_nlocals++);
+	ival = PyInt_FromLong(i = c->c_nlocals++);
 	if (ival == NULL)
 		c->c_errors++;
-	else if (mappinginsert(c->c_locals, nameval, ival) != 0)
+	else if (PyDict_SetItem(c->c_locals, nameval, ival) != 0)
 		c->c_errors++;
-	else if (addlistitem(c->c_varnames, nameval) != 0)
+	else if (PyList_Append(c->c_varnames, nameval) != 0)
 		c->c_errors++;
-	XDECREF(ival);
+	Py_XDECREF(ival);
 	return i;
 }
 
 static int
 com_addlocal_o(c, nameval)
 	struct compiling *c;
-	object *nameval;
+	PyObject *nameval;
 {
-	object *ival =  mappinglookup(c->c_locals, nameval);
+	PyObject *ival =  PyDict_GetItem(c->c_locals, nameval);
 	if (ival != NULL)
-		return getintvalue(ival);
+		return PyInt_AsLong(ival);
 	return com_newlocal_o(c, nameval);
 }
 
@@ -2124,14 +2139,14 @@
 	struct compiling *c;
 	char *name;
 {
-	object *nameval = PyString_InternFromString(name);
+	PyObject *nameval = PyString_InternFromString(name);
 	int i;
 	if (nameval == NULL) {
 		c->c_errors++;
 		return 0;
 	}
 	i = com_newlocal_o(c, nameval);
-	DECREF(nameval);
+	Py_DECREF(nameval);
 	return i;
 }
 
@@ -2145,7 +2160,7 @@
 	node *n;
 {
 	int i, j, k, mode, imode;
-	object *vmode;
+	PyObject *vmode;
 	REQ(n, access_stmt);
 	/* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
 	   accesstype: NAME+ */
@@ -2187,9 +2202,9 @@
 			if (w == 1) mode |= AC_W_PRIVATE;
 		}
 	}
-	vmode = newintobject((long)mode);
+	vmode = PyInt_FromLong((long)mode);
 	imode = com_addconst(c, vmode);
-	XDECREF(vmode);
+	Py_XDECREF(vmode);
 	for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
 		com_addoparg(c, LOAD_CONST, imode);
 		com_addopname(c, ACCESS_MODE, CHILD(n, i));
@@ -2208,7 +2223,7 @@
 	if (NCH(n) >= 4)
 		com_node(c, CHILD(n, 3));
 	else {
-		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 		com_push(c, 1);
 	}
 	if (NCH(n) >= 6)
@@ -2226,7 +2241,7 @@
 	struct compiling *c;
 	node *n;
 {
-	object *v;
+	PyObject *v;
 	int i;
 
   /* Label to avoid tail recursion */
@@ -2284,21 +2299,21 @@
 	case NUMBER:
 		v = parsenumber(c, STR(n));
 		if (v == NULL) {
-			err_clear();
+			PyErr_Clear();
 			break;
 		}
-		i = testbool(v);
-		DECREF(v);
+		i = PyObject_IsTrue(v);
+		Py_DECREF(v);
 		return i == 0;
 
 	case STRING:
 		v = parsestr(STR(n));
 		if (v == NULL) {
-			err_clear();
+			PyErr_Clear();
 			break;
 		}
-		i = testbool(v);
-		DECREF(v);
+		i = PyObject_IsTrue(v);
+		Py_DECREF(v);
 		return i == 0;
 
 	}
@@ -2374,7 +2389,7 @@
 	struct compiling *c;
 	node *n;
 {
-	object *v;
+	PyObject *v;
 	int break_anchor = 0;
 	int anchor = 0;
 	int save_begin = c->c_begin;
@@ -2383,12 +2398,12 @@
 	com_addfwref(c, SETUP_LOOP, &break_anchor);
 	block_push(c, SETUP_LOOP);
 	com_node(c, CHILD(n, 3));
-	v = newintobject(0L);
+	v = PyInt_FromLong(0L);
 	if (v == NULL)
 		c->c_errors++;
 	com_addoparg(c, LOAD_CONST, com_addconst(c, v));
 	com_push(c, 1);
-	XDECREF(v);
+	Py_XDECREF(v);
 	c->c_begin = c->c_nexti;
 	com_addoparg(c, SET_LINENO, n->n_lineno);
 	com_addfwref(c, FOR_LOOP, &anchor);
@@ -2497,7 +2512,7 @@
 	     i += 3) {
 		/* except_clause: 'except' [expr [',' var]] */
 		if (except_anchor == 0) {
-			com_error(c, SyntaxError,
+			com_error(c, PyExc_SyntaxError,
 				  "default 'except:' must be last");
 			break;
 		}
@@ -2559,7 +2574,7 @@
 	com_addbyte(c, POP_BLOCK);
 	block_pop(c, SETUP_FINALLY);
 	block_push(c, END_FINALLY);
-	com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 	/* While the generated code pushes only one item,
 	   the try-finally handling can enter here with
 	   up to three items.  OK, here are the details:
@@ -2649,7 +2664,7 @@
 	return NULL;
 }
 
-static object *
+static PyObject *
 get_docstring(n)
 	node *n;
 {
@@ -2690,7 +2705,8 @@
 		com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
 	}
 	else {
-		com_error(c, SyntaxError, "'continue' not properly in loop");
+		com_error(c, PyExc_SyntaxError,
+			  "'continue' not properly in loop");
 	}
 	/* XXX Could allow it inside a 'finally' clause
 	   XXX if we could pop the exception still on the stack */
@@ -2722,7 +2738,8 @@
 	ndefs = 0;
 	for (i = 0; i < nch; i++) {
 		int t;
-		if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
+		if (TYPE(CHILD(n, i)) == STAR ||
+		    TYPE(CHILD(n, i)) == DOUBLESTAR)
 			break;
 		nargs++;
 		i++;
@@ -2743,7 +2760,7 @@
 			/* Treat "(a=1, b)" as "(a=1, b=None)" */
 			if (ndefs) {
 				com_addoparg(c, LOAD_CONST,
-					     com_addconst(c, None));
+					     com_addconst(c, Py_None));
 				com_push(c, 1);
 				ndefs++;
 			}
@@ -2759,9 +2776,9 @@
 	struct compiling *c;
 	node *n;
 {
-	object *v;
+	PyObject *v;
 	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
-	v = (object *)icompile(n, c);
+	v = (PyObject *)icompile(n, c);
 	if (v == NULL)
 		c->c_errors++;
 	else {
@@ -2773,7 +2790,7 @@
 		com_pop(c, ndefs);
 		com_addopname(c, STORE_NAME, CHILD(n, 1));
 		com_pop(c, 1);
-		DECREF(v);
+		Py_DECREF(v);
 	}
 }
 
@@ -2798,7 +2815,7 @@
 	node *n;
 {
 	int i;
-	object *v;
+	PyObject *v;
 	REQ(n, classdef);
 	/* classdef: class NAME ['(' testlist ')'] ':' suite */
 	if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
@@ -2809,7 +2826,7 @@
 	i = com_addconst(c, v);
 	com_addoparg(c, LOAD_CONST, i);
 	com_push(c, 1);
-	DECREF(v);
+	Py_DECREF(v);
 	/* Push the tuple of base classes on the stack */
 	if (TYPE(CHILD(n, 2)) != LPAR) {
 		com_addoparg(c, BUILD_TUPLE, 0);
@@ -2817,7 +2834,7 @@
 	}
 	else
 		com_bases(c, CHILD(n, 3));
-	v = (object *)icompile(n, c);
+	v = (PyObject *)icompile(n, c);
 	if (v == NULL)
 		c->c_errors++;
 	else {
@@ -2829,7 +2846,7 @@
 		com_addbyte(c, BUILD_CLASS);
 		com_pop(c, 2);
 		com_addopname(c, STORE_NAME, CHILD(n, 1));
-		DECREF(v);
+		Py_DECREF(v);
 	}
 }
 
@@ -2887,7 +2904,8 @@
 		break;
 	case break_stmt:
 		if (c->c_loops == 0) {
-			com_error(c, SyntaxError, "'break' outside loop");
+			com_error(c, PyExc_SyntaxError,
+				  "'break' outside loop");
 		}
 		com_addbyte(c, BREAK_LOOP);
 		break;
@@ -2983,11 +3001,12 @@
 	
 	default:
 		/* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
-		com_error(c, SystemError, "com_node: unexpected node type");
+		com_error(c, PyExc_SystemError,
+			  "com_node: unexpected node type");
 	}
 }
 
-static void com_fplist PROTO((struct compiling *, node *));
+static void com_fplist Py_PROTO((struct compiling *, node *));
 
 static void
 com_fpdef(c, n)
@@ -3121,12 +3140,12 @@
 	node *n;
 {
 	int i;
-	object *doc;
+	PyObject *doc;
 	REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
 	doc = get_docstring(n);
 	if (doc != NULL) {
 		int i = com_addconst(c, doc);
-		DECREF(doc);
+		Py_DECREF(doc);
 		com_addoparg(c, LOAD_CONST, i);
 		com_push(c, 1);
 		com_addopnamestr(c, STORE_NAME, "__doc__");
@@ -3146,17 +3165,17 @@
 	struct compiling *c;
 	node *n;
 {
-	object *doc;
+	PyObject *doc;
 	node *ch;
 	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
 	c->c_name = STR(CHILD(n, 1));
 	doc = get_docstring(CHILD(n, 4));
 	if (doc != NULL) {
 		(void) com_addconst(c, doc);
-		DECREF(doc);
+		Py_DECREF(doc);
 	}
 	else
-		(void) com_addconst(c, None); /* No docstring */
+		(void) com_addconst(c, Py_None); /* No docstring */
 	ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
 	ch = CHILD(ch, 1); /* ')' | varargslist */
 	if (TYPE(ch) == varargslist)
@@ -3164,7 +3183,7 @@
 	c->c_infunction = 1;
 	com_node(c, CHILD(n, 4));
 	c->c_infunction = 0;
-	com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 	com_push(c, 1);
 	com_addbyte(c, RETURN_VALUE);
 	com_pop(c, 1);
@@ -3180,7 +3199,7 @@
 	c->c_name = "<lambda>";
 
 	ch = CHILD(n, 1);
-	(void) com_addconst(c, None); /* No docstring */
+	(void) com_addconst(c, Py_None); /* No docstring */
 	if (TYPE(ch) == varargslist) {
 		com_arglist(c, ch);
 		ch = CHILD(n, 3);
@@ -3198,7 +3217,7 @@
 	node *n;
 {
 	node *ch;
-	object *doc;
+	PyObject *doc;
 	REQ(n, classdef);
 	/* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
 	c->c_name = STR(CHILD(n, 1));
@@ -3209,14 +3228,14 @@
 	doc = get_docstring(ch);
 	if (doc != NULL) {
 		int i = com_addconst(c, doc);
-		DECREF(doc);
+		Py_DECREF(doc);
 		com_addoparg(c, LOAD_CONST, i);
 		com_push(c, 1);
 		com_addopnamestr(c, STORE_NAME, "__doc__");
 		com_pop(c, 1);
 	}
 	else
-		(void) com_addconst(c, None);
+		(void) com_addconst(c, Py_None);
 	com_node(c, ch);
 	com_addbyte(c, LOAD_LOCALS);
 	com_push(c, 1);
@@ -3239,7 +3258,7 @@
 		n = CHILD(n, 0);
 		if (TYPE(n) != NEWLINE)
 			com_node(c, n);
-		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 		com_push(c, 1);
 		com_addbyte(c, RETURN_VALUE);
 		com_pop(c, 1);
@@ -3248,7 +3267,7 @@
 	
 	case file_input: /* A whole file, or built-in function exec() */
 		com_file_input(c, n);
-		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
 		com_push(c, 1);
 		com_addbyte(c, RETURN_VALUE);
 		com_pop(c, 1);
@@ -3274,7 +3293,7 @@
 	
 	default:
 		/* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
-		com_error(c, SystemError,
+		com_error(c, PyExc_SystemError,
 			  "compile_node: unexpected node type");
 	}
 }
@@ -3310,19 +3329,19 @@
 	unsigned char *next_instr, *cur_instr;
 	int opcode;
 	int oparg = 0;
-	object *name;
-	object *error_type, *error_value, *error_traceback;
+	PyObject *name;
+	PyObject *error_type, *error_value, *error_traceback;
 	
 #define NEXTOP()	(*next_instr++)
 #define NEXTARG()	(next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
-#define GETITEM(v, i)	(getlistitem((v), (i)))
+#define GETITEM(v, i)	(PyList_GetItem((v), (i)))
 #define GETNAMEOBJ(i)	(GETITEM(c->c_names, (i)))
 	
-	err_fetch(&error_type, &error_value, &error_traceback);
+	PyErr_Fetch(&error_type, &error_value, &error_traceback);
 
 	c->c_flags |= CO_OPTIMIZED;
 	
-	next_instr = (unsigned char *) getstringvalue(c->c_code);
+	next_instr = (unsigned char *) PyString_AsString(c->c_code);
 	for (;;) {
 		opcode = NEXTOP();
 		if (opcode == STOP_CODE)
@@ -3341,10 +3360,10 @@
 		}
 	}
 	
-	if (dictlookup(c->c_locals, "*") != NULL)
+	if (PyDict_GetItemString(c->c_locals, "*") != NULL)
 		c->c_flags &= ~CO_OPTIMIZED;
 	
-	next_instr = (unsigned char *) getstringvalue(c->c_code);
+	next_instr = (unsigned char *) PyString_AsString(c->c_code);
 	for (;;) {
 		cur_instr = next_instr;
 		opcode = NEXTOP();
@@ -3355,18 +3374,18 @@
 		if (opcode == LOAD_NAME ||
 		    opcode == STORE_NAME ||
 		    opcode == DELETE_NAME) {
-			object *v;
+			PyObject *v;
 			int i;
 			name = GETNAMEOBJ(oparg);
-			v = dict2lookup(c->c_locals, name);
+			v = PyDict_GetItem(c->c_locals, name);
 			if (v == NULL) {
-				err_clear();
+				PyErr_Clear();
 				if (opcode == LOAD_NAME &&
 				    (c->c_flags&CO_OPTIMIZED))
 					cur_instr[0] = LOAD_GLOBAL;
 				continue;
 			}
-			i = getintvalue(v);
+			i = PyInt_AsLong(v);
 			switch (opcode) {
 			case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
 			case STORE_NAME: cur_instr[0] = STORE_FAST; break;
@@ -3378,18 +3397,18 @@
 	}
 
 	if (c->c_errors == 0)
-		err_restore(error_type, error_value, error_traceback);
+		PyErr_Restore(error_type, error_value, error_traceback);
 }
 
-codeobject *
-compile(n, filename)
+PyCodeObject *
+PyNode_Compile(n, filename)
 	node *n;
 	char *filename;
 {
 	return jcompile(n, filename, NULL);
 }
 
-static codeobject *
+static PyCodeObject *
 icompile(n, base)
 	node *n;
 	struct compiling *base;
@@ -3397,14 +3416,14 @@
 	return jcompile(n, base->c_filename, base);
 }
 
-static codeobject *
+static PyCodeObject *
 jcompile(n, filename, base)
 	node *n;
 	char *filename;
 	struct compiling *base;
 {
 	struct compiling sc;
-	codeobject *co;
+	PyCodeObject *co;
 	if (!com_init(&sc, filename))
 		return NULL;
 #ifdef PRIVATE_NAME_MANGLING
@@ -3423,14 +3442,14 @@
 		sc.c_flags |= CO_NEWLOCALS;
 	co = NULL;
 	if (sc.c_errors == 0) {
-		object *consts, *names, *varnames, *filename, *name;
-		consts = listtuple(sc.c_consts);
-		names = listtuple(sc.c_names);
-		varnames = listtuple(sc.c_varnames);
+		PyObject *consts, *names, *varnames, *filename, *name;
+		consts = PyList_AsTuple(sc.c_consts);
+		names = PyList_AsTuple(sc.c_names);
+		varnames = PyList_AsTuple(sc.c_varnames);
 		filename = PyString_InternFromString(sc.c_filename);
 		name = PyString_InternFromString(sc.c_name);
-		if (!err_occurred())
-			co = newcodeobject(sc.c_argcount,
+		if (!PyErr_Occurred())
+			co = PyCode_New(sc.c_argcount,
 					   sc.c_nlocals,
 					   sc.c_maxstacklevel,
 					   sc.c_flags,
@@ -3442,11 +3461,11 @@
 					   name,
 					   sc.c_firstlineno,
 					   sc.c_lnotab);
-		XDECREF(consts);
-		XDECREF(names);
-		XDECREF(varnames);
-		XDECREF(filename);
-		XDECREF(name);
+		Py_XDECREF(consts);
+		Py_XDECREF(names);
+		Py_XDECREF(varnames);
+		Py_XDECREF(filename);
+		Py_XDECREF(name);
 	}
 	com_free(&sc);
 	return co;
diff --git a/Python/getargs.c b/Python/getargs.c
index 4ac934d..121b021 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -36,37 +36,38 @@
    XXX Python source (or in an extension) uses ridiculously long names
    XXX or riduculously deep nesting in format strings. */
 
-#include "allobjects.h"
+#include "Python.h"
 
 #include <ctype.h>
 
 
-int getargs PROTO((object *, char *, ...));
-int newgetargs PROTO((object *, char *, ...));
-int vgetargs PROTO((object *, char *, va_list));
+int PyArg_Parse Py_PROTO((PyObject *, char *, ...));
+int PyArg_ParseTuple Py_PROTO((PyObject *, char *, ...));
+int PyArgs_VaParse Py_PROTO((PyObject *, char *, va_list));
 
-int PyArg_ParseTupleAndKeywords PROTO((object *, object *,
+int PyArg_ParseTupleAndKeywords Py_PROTO((PyObject *, PyObject *,
 				       char *, char **, ...));
 
 /* Forward */
-static int vgetargs1 PROTO((object *, char *, va_list *, int));
-static void seterror PROTO((int, char *, int *, char *, char *));
-static char *convertitem PROTO((object *, char **, va_list *, int *, char *));
-static char *converttuple PROTO((object *, char **, va_list *,
+static int vgetargs1 Py_PROTO((PyObject *, char *, va_list *, int));
+static void seterror Py_PROTO((int, char *, int *, char *, char *));
+static char *convertitem Py_PROTO((PyObject *, char **, va_list *,
+				   int *, char *));
+static char *converttuple Py_PROTO((PyObject *, char **, va_list *,
 				 int *, char *, int));
-static char *convertsimple PROTO((object *, char **, va_list *, char *));
-static char *convertsimple1 PROTO((object *, char **, va_list *));
+static char *convertsimple Py_PROTO((PyObject *, char **, va_list *, char *));
+static char *convertsimple1 Py_PROTO((PyObject *, char **, va_list *));
 
-static int vgetargskeywords PROTO((object *, object *,
+static int vgetargskeywords Py_PROTO((PyObject *, PyObject *,
 				   char *, char **, va_list *));
-static char *skipitem PROTO((char **, va_list *));
+static char *skipitem Py_PROTO((char **, va_list *));
 
 #ifdef HAVE_STDARG_PROTOTYPES
 /* VARARGS2 */
-int getargs(object *args, char *format, ...)
+int PyArg_Parse(PyObject *args, char *format, ...)
 #else
 /* VARARGS */
-int getargs(va_alist) va_dcl
+int PyArg_Parse(va_alist) va_dcl
 #endif
 {
 	int retval;
@@ -75,11 +76,11 @@
 	
 	va_start(va, format);
 #else
-	object *args;
+	PyObject *args;
 	char *format;
 	
 	va_start(va);
-	args = va_arg(va, object *);
+	args = va_arg(va, PyObject *);
 	format = va_arg(va, char *);
 #endif
 	retval = vgetargs1(args, format, &va, 1);
@@ -90,10 +91,10 @@
 
 #ifdef HAVE_STDARG_PROTOTYPES
 /* VARARGS2 */
-int newgetargs(object *args, char *format, ...)
+int PyArg_ParseTuple(PyObject *args, char *format, ...)
 #else
 /* VARARGS */
-int newgetargs(va_alist) va_dcl
+int PyArg_ParseTuple(va_alist) va_dcl
 #endif
 {
 	int retval;
@@ -102,11 +103,11 @@
 	
 	va_start(va, format);
 #else
-	object *args;
+	PyObject *args;
 	char *format;
 	
 	va_start(va);
-	args = va_arg(va, object *);
+	args = va_arg(va, PyObject *);
 	format = va_arg(va, char *);
 #endif
 	retval = vgetargs1(args, format, &va, 0);
@@ -116,8 +117,8 @@
 
 
 int
-vgetargs(args, format, va)
-	object *args;
+PyArgs_VaParse(args, format, va)
+	PyObject *args;
 	char *format;
 	va_list va;
 {
@@ -135,7 +136,7 @@
 
 static int
 vgetargs1(args, format, p_va, compat)
-	object *args;
+	PyObject *args;
 	char *format;
 	va_list *p_va;
 	int compat;
@@ -160,7 +161,7 @@
 		}
 		else if (/* '(' */ c == ')') {
 			if (level == 0)
-				fatal(/* '(' */
+				Py_FatalError(/* '(' */
 				      "excess ')' in getargs format");
 			else
 				level--;
@@ -184,7 +185,7 @@
 	}
 	
 	if (level != 0)
-		fatal(/* '(' */ "missing ')' in getargs format");
+		Py_FatalError(/* '(' */ "missing ')' in getargs format");
 	
 	if (min < 0)
 		min = max;
@@ -197,7 +198,7 @@
 				return 1;
 			sprintf(msgbuf, "%s requires no arguments",
 				fname==NULL ? "function" : fname);
-			err_setstr(TypeError, msgbuf);
+			PyErr_SetString(PyExc_TypeError, msgbuf);
 			return 0;
 		}
 		else if (min == 1 && max == 1) {
@@ -205,7 +206,7 @@
 				sprintf(msgbuf,
 					"%s requires at least one argument",
 					fname==NULL ? "function" : fname);
-				err_setstr(TypeError, msgbuf);
+				PyErr_SetString(PyExc_TypeError, msgbuf);
 				return 0;
 			}
 			msg = convertitem(args, &format, p_va, levels, msgbuf);
@@ -215,19 +216,19 @@
 			return 0;
 		}
 		else {
-			err_setstr(SystemError,
+			PyErr_SetString(PyExc_SystemError,
 			    "old style getargs format uses new features");
 			return 0;
 		}
 	}
 	
-	if (!is_tupleobject(args)) {
-		err_setstr(SystemError,
+	if (!PyTuple_Check(args)) {
+		PyErr_SetString(PyExc_SystemError,
 		    "new style getargs format but argument is not a tuple");
 		return 0;
 	}
 	
-	len = gettuplesize(args);
+	len = PyTuple_Size(args);
 	
 	if (len < min || max < len) {
 		if (message == NULL) {
@@ -241,14 +242,14 @@
 				len);
 			message = msgbuf;
 		}
-		err_setstr(TypeError, message);
+		PyErr_SetString(PyExc_TypeError, message);
 		return 0;
 	}
 	
 	for (i = 0; i < len; i++) {
 		if (*format == '|')
 			format++;
-		msg = convertitem(gettupleitem(args, i), &format, p_va,
+		msg = convertitem(PyTuple_GetItem(args, i), &format, p_va,
 				 levels, msgbuf);
 		if (msg) {
 			seterror(i+1, msg, levels, fname, message);
@@ -273,7 +274,7 @@
 	int i;
 	char *p = buf;
 
-	if (err_occurred())
+	if (PyErr_Occurred())
 		return;
 	if (iarg == 0 && message == NULL)
 		message = msg;
@@ -293,7 +294,7 @@
 		sprintf(p, ": expected %s found", msg);
 		message = buf;
 	}
-	err_setstr(TypeError, message);
+	PyErr_SetString(PyExc_TypeError, message);
 }
 
 
@@ -318,7 +319,7 @@
 
 static char *
 converttuple(arg, p_format, p_va, levels, msgbuf, toplevel)
-	object *arg;
+	PyObject *arg;
 	char **p_format;
 	va_list *p_va;
 	int *levels;
@@ -348,15 +349,15 @@
 			n++;
 	}
 	
-	if (!is_tupleobject(arg)) {
+	if (!PyTuple_Check(arg)) {
 		levels[0] = 0;
 		sprintf(msgbuf,
 			toplevel ? "%d arguments, %s" : "%d-tuple, %s",
-			n, arg == None ? "None" : arg->ob_type->tp_name);
+			n, arg == Py_None ? "None" : arg->ob_type->tp_name);
 		return msgbuf;
 	}
 	
-	if ((i = gettuplesize(arg)) != n) {
+	if ((i = PyTuple_Size(arg)) != n) {
 		levels[0] = 0;
 		sprintf(msgbuf,
 			toplevel ? "%d arguments, %d" : "%d-tuple, %d-tuple",
@@ -367,7 +368,7 @@
 	format = *p_format;
 	for (i = 0; i < n; i++) {
 		char *msg;
-		msg = convertitem(gettupleitem(arg, i), &format, p_va,
+		msg = convertitem(PyTuple_GetItem(arg, i), &format, p_va,
 				 levels+1, msgbuf);
 		if (msg != NULL) {
 			levels[0] = i+1;
@@ -384,7 +385,7 @@
 
 static char *
 convertitem(arg, p_format, p_va, levels, msgbuf)
-	object *arg;
+	PyObject *arg;
 	char **p_format;
 	va_list *p_va;
 	int *levels;
@@ -415,7 +416,7 @@
 
 static char *
 convertsimple(arg, p_format, p_va, msgbuf)
-	object *arg;
+	PyObject *arg;
 	char **p_format;
 	va_list *p_va;
 	char *msgbuf;
@@ -423,7 +424,7 @@
 	char *msg = convertsimple1(arg, p_format, p_va);
 	if (msg != NULL) {
 		sprintf(msgbuf, "%.50s, %.50s", msg,
-			arg == None ? "None" : arg->ob_type->tp_name);
+			arg == Py_None ? "None" : arg->ob_type->tp_name);
 		msg = msgbuf;
 	}
 	return msg;
@@ -437,7 +438,7 @@
 
 static char *
 convertsimple1(arg, p_format, p_va)
-	object *arg;
+	PyObject *arg;
 	char **p_format;
 	va_list *p_va;
 {
@@ -449,8 +450,8 @@
 	case 'b': /* byte -- very short int */
 		{
 			char *p = va_arg(*p_va, char *);
-			long ival = getintvalue(arg);
-			if (ival == -1 && err_occurred())
+			long ival = PyInt_AsLong(arg);
+			if (ival == -1 && PyErr_Occurred())
 				return "integer<b>";
 			else
 				*p = (char) ival;
@@ -460,8 +461,8 @@
 	case 'h': /* short int */
 		{
 			short *p = va_arg(*p_va, short *);
-			long ival = getintvalue(arg);
-			if (ival == -1 && err_occurred())
+			long ival = PyInt_AsLong(arg);
+			if (ival == -1 && PyErr_Occurred())
 				return "integer<h>";
 			else
 				*p = (short) ival;
@@ -471,8 +472,8 @@
 	case 'i': /* int */
 		{
 			int *p = va_arg(*p_va, int *);
-			long ival = getintvalue(arg);
-			if (ival == -1 && err_occurred())
+			long ival = PyInt_AsLong(arg);
+			if (ival == -1 && PyErr_Occurred())
 				return "integer<i>";
 			else
 				*p = ival;
@@ -482,8 +483,8 @@
 	case 'l': /* long int */
 		{
 			long *p = va_arg(*p_va, long *);
-			long ival = getintvalue(arg);
-			if (ival == -1 && err_occurred())
+			long ival = PyInt_AsLong(arg);
+			if (ival == -1 && PyErr_Occurred())
 				return "integer<l>";
 			else
 				*p = ival;
@@ -493,8 +494,8 @@
 	case 'f': /* float */
 		{
 			float *p = va_arg(*p_va, float *);
-			double dval = getfloatvalue(arg);
-			if (err_occurred())
+			double dval = PyFloat_AsDouble(arg);
+			if (PyErr_Occurred())
 				return "float<f>";
 			else
 				*p = (float) dval;
@@ -504,8 +505,8 @@
 	case 'd': /* double */
 		{
 			double *p = va_arg(*p_va, double *);
-			double dval = getfloatvalue(arg);
-			if (err_occurred())
+			double dval = PyFloat_AsDouble(arg);
+			if (PyErr_Occurred())
 				return "float<d>";
 			else
 				*p = dval;
@@ -518,7 +519,7 @@
 			Py_complex *p = va_arg(*p_va, Py_complex *);
 			Py_complex cval;
 			cval = PyComplex_AsCComplex(arg);
-			if (err_occurred())
+			if (PyErr_Occurred())
 				return "complex<D>";
 			else
 				*p = cval;
@@ -529,8 +530,8 @@
 	case 'c': /* char */
 		{
 			char *p = va_arg(*p_va, char *);
-			if (is_stringobject(arg) && getstringsize(arg) == 1)
-				*p = getstringvalue(arg)[0];
+			if (PyString_Check(arg) && PyString_Size(arg) == 1)
+				*p = PyString_AsString(arg)[0];
 			else
 				return "char";
 			break;
@@ -539,16 +540,16 @@
 	case 's': /* string */
 		{
 			char **p = va_arg(*p_va, char **);
-			if (is_stringobject(arg))
-				*p = getstringvalue(arg);
+			if (PyString_Check(arg))
+				*p = PyString_AsString(arg);
 			else
 				return "string";
 			if (*format == '#') {
 				int *q = va_arg(*p_va, int *);
-				*q = getstringsize(arg);
+				*q = PyString_Size(arg);
 				format++;
 			}
-			else if ((int)strlen(*p) != getstringsize(arg))
+			else if ((int)strlen(*p) != PyString_Size(arg))
 				return "string without null bytes";
 			break;
 		}
@@ -556,30 +557,30 @@
 	case 'z': /* string, may be NULL (None) */
 		{
 			char **p = va_arg(*p_va, char **);
-			if (arg == None)
+			if (arg == Py_None)
 				*p = 0;
-			else if (is_stringobject(arg))
-				*p = getstringvalue(arg);
+			else if (PyString_Check(arg))
+				*p = PyString_AsString(arg);
 			else
 				return "None or string";
 			if (*format == '#') {
 				int *q = va_arg(*p_va, int *);
-				if (arg == None)
+				if (arg == Py_None)
 					*q = 0;
 				else
-					*q = getstringsize(arg);
+					*q = PyString_Size(arg);
 				format++;
 			}
 			else if (*p != NULL &&
-				 (int)strlen(*p) != getstringsize(arg))
+				 (int)strlen(*p) != PyString_Size(arg))
 				return "None or string without null bytes";
 			break;
 		}
 	
 	case 'S': /* string object */
 		{
-			object **p = va_arg(*p_va, object **);
-			if (is_stringobject(arg))
+			PyObject **p = va_arg(*p_va, PyObject **);
+			if (PyString_Check(arg))
 				*p = arg;
 			else
 				return "string";
@@ -588,15 +589,15 @@
 	
 	case 'O': /* object */
 		{
-			typeobject *type;
-			object **p;
+			PyTypeObject *type;
+			PyObject **p;
 			if (*format == '!') {
 				format++;
-				type = va_arg(*p_va, typeobject*);
+				type = va_arg(*p_va, PyTypeObject*);
 				if (arg->ob_type != type)
 					return type->tp_name;
 				else {
-					p = va_arg(*p_va, object **);
+					p = va_arg(*p_va, PyObject **);
 					*p = arg;
 				}
 			}
@@ -604,13 +605,13 @@
 				inquiry pred = va_arg(*p_va, inquiry);
 				format++;
 				if ((*pred)(arg)) {
-					p = va_arg(*p_va, object **);
+					p = va_arg(*p_va, PyObject **);
 					*p = arg;
 				}
 			}
 			else if (*format == '&') {
 				typedef int (*converter)
-					PROTO((object *, void *));
+					Py_PROTO((PyObject *, void *));
 				converter convert = va_arg(*p_va, converter);
 				void *addr = va_arg(*p_va, void *);
 				format++;
@@ -618,7 +619,7 @@
 					return "(unspecified)";
 			}
 			else {
-				p = va_arg(*p_va, object **);
+				p = va_arg(*p_va, PyObject **);
 				*p = arg;
 			}
 			break;
@@ -639,8 +640,8 @@
 
 #ifdef HAVE_STDARG_PROTOTYPES
 /* VARARGS2 */
-int PyArg_ParseTupleAndKeywords(object *args,
-				object *keywords,
+int PyArg_ParseTupleAndKeywords(PyObject *args,
+				PyObject *keywords,
 				char *format, 
 				char **kwlist, ...)
 #else
@@ -654,14 +655,14 @@
 	
 	va_start(va, kwlist);
 #else
-	object *args;
-	object *keywords;
+	PyObject *args;
+	PyObject *keywords;
 	char *format;
 	char **kwlist;
 	
 	va_start(va);
-	args = va_arg(va, object *);
-	keywords = va_arg(va, object *);
+	args = va_arg(va, PyObject *);
+	keywords = va_arg(va, PyObject *);
 	format = va_arg(va, char *);
 	kwlist = va_arg(va, char **);
 #endif
@@ -673,8 +674,8 @@
 
 static int
 vgetargskeywords(args, keywords, format, kwlist, p_va)
-	object *args;
-	object *keywords;
+	PyObject *args;
+	PyObject *keywords;
 	char *format;
 	char **kwlist;
 	va_list *p_va;
@@ -689,7 +690,7 @@
 	int i, len, tplen, kwlen;
 	char *msg, *ks, **p;
 	int nkwds, pos, match, converted;
-	object *key, *value;
+	PyObject *key, *value;
 	
 	/* nested tuples cannot be parsed when using keyword arguments */
 	
@@ -830,7 +831,7 @@
 	
 	converted = 0;
 	for (i = tplen; i < nkwds; i++) {
-		object *item;
+		PyObject *item;
 		if (*format == '|')
 			format++;
 		item = PyMapping_GetItemString(keywords, kwlist[i]);
@@ -961,7 +962,7 @@
 	
 	case 'S': /* string object */
 		{
-			(void) va_arg(*p_va, object **);
+			(void) va_arg(*p_va, PyObject **);
 			break;
 		}
 	
@@ -969,8 +970,8 @@
 		{
 			if (*format == '!') {
 				format++;
-				(void) va_arg(*p_va, typeobject*);
-				(void) va_arg(*p_va, object **);
+				(void) va_arg(*p_va, PyTypeObject*);
+				(void) va_arg(*p_va, PyObject **);
 			}
 #if 0
 /* I don't know what this is for */
@@ -978,19 +979,19 @@
 				inquiry pred = va_arg(*p_va, inquiry);
 				format++;
 				if ((*pred)(arg)) {
-					(void) va_arg(*p_va, object **);
+					(void) va_arg(*p_va, PyObject **);
 				}
 			}
 #endif
 			else if (*format == '&') {
 				typedef int (*converter)
-					PROTO((object *, void *));
+					Py_PROTO((PyObject *, void *));
 				(void) va_arg(*p_va, converter);
 				(void) va_arg(*p_va, void *);
 				format++;
 			}
 			else {
-				(void) va_arg(*p_va, object **);
+				(void) va_arg(*p_va, PyObject **);
 			}
 			break;
 		}
diff --git a/Python/import.c b/Python/import.c
index 8dadc0e..64f4e29 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -31,17 +31,12 @@
 
 /* Module definition and import implementation */
 
-#include "allobjects.h"
+#include "Python.h"
 
-/* XXX Some of the following are duplicate with allobjects.h... */
 #include "node.h"
 #include "token.h"
 #include "graminit.h"
-#include "import.h"
 #include "errcode.h"
-#include "sysmodule.h"
-#include "bltinmodule.h"
-#include "pythonrun.h"
 #include "marshal.h"
 #include "compile.h"
 #include "eval.h"
@@ -57,7 +52,7 @@
 #include <unistd.h>
 #endif
 
-extern long getmtime(); /* In getmtime.c */
+extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
 
 /* Magic word to reject .pyc files generated by other Python versions */
 /* Change for each incompatible change */
@@ -69,22 +64,22 @@
 /* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
 #define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
 
-object *import_modules; /* This becomes sys.modules */
+PyObject *import_modules; /* This becomes sys.modules */
 
 
 /* Initialize things */
 
 void
-initimport()
+PyImport_Init()
 {
 	if (import_modules != NULL)
-		fatal("duplicate initimport() call");
-	if ((import_modules = newdictobject()) == NULL)
-		fatal("no mem for dictionary of modules");
+		Py_FatalError("duplicate initimport() call");
+	if ((import_modules = PyDict_New()) == NULL)
+		Py_FatalError("no mem for dictionary of modules");
 	if (Py_OptimizeFlag) {
 		/* Replace ".pyc" with ".pyo" in import_filetab */
 		struct filedescr *p;
-		for (p = import_filetab; p->suffix != NULL; p++) {
+		for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
 			if (strcmp(p->suffix, ".pyc") == 0)
 				p->suffix = ".pyo";
 		}
@@ -95,19 +90,19 @@
 /* Un-initialize things, as good as we can */
 
 void
-doneimport()
+PyImport_Cleanup()
 {
 	if (import_modules != NULL) {
-		object *tmp = import_modules;
+		PyObject *tmp = import_modules;
 		import_modules = NULL;
 		/* This deletes all modules from sys.modules.
-		   When a module is deallocated, it in turn clears its dictionary,
-		   thus hopefully breaking any circular references between modules
-		   and between a module's dictionary and its functions.
-		   Note that "import" will fail while we are cleaning up.
-		   */
-		mappingclear(tmp);
-		DECREF(tmp);
+		   When a module is deallocated, it in turn clears its
+		   dictionary, thus hopefully breaking any circular
+		   references between modules and between a module's
+		   dictionary and its functions.  Note that "import"
+		   will fail while we are cleaning up.  */
+		PyDict_Clear(tmp);
+		Py_DECREF(tmp);
 	}
 }
 
@@ -115,7 +110,7 @@
 /* Helper for pythonrun.c -- return magic number */
 
 long
-get_pyc_magic()
+PyImport_GetMagicNumber()
 {
 	return MAGIC;
 }
@@ -123,8 +118,8 @@
 
 /* Helper for sysmodule.c -- return modules dictionary */
 
-object *
-get_modules()
+PyObject *
+PyImport_GetModuleDict()
 {
 	return import_modules;
 }
@@ -136,27 +131,28 @@
    Because the former action is most common, THIS DOES NOT RETURN A
    'NEW' REFERENCE! */
 
-object *
-add_module(name)
+PyObject *
+PyImport_AddModule(name)
 	char *name;
 {
-	object *m;
+	PyObject *m;
 
 	if (import_modules == NULL) {
-		err_setstr(SystemError, "sys.modules has been deleted");
+		PyErr_SetString(PyExc_SystemError,
+				"sys.modules has been deleted");
 		return NULL;
 	}
-	if ((m = dictlookup(import_modules, name)) != NULL &&
-	    is_moduleobject(m))
+	if ((m = PyDict_GetItemString(import_modules, name)) != NULL &&
+	    PyModule_Check(m))
 		return m;
-	m = newmoduleobject(name);
+	m = PyModule_New(name);
 	if (m == NULL)
 		return NULL;
-	if (dictinsert(import_modules, name, m) != 0) {
-		DECREF(m);
+	if (PyDict_SetItemString(import_modules, name, m) != 0) {
+		Py_DECREF(m);
 		return NULL;
 	}
-	DECREF(m); /* Yes, it still exists, in modules! */
+	Py_DECREF(m); /* Yes, it still exists, in modules! */
 
 	return m;
 }
@@ -165,29 +161,31 @@
 /* Execute a code object in a module and return the module object
    WITH INCREMENTED REFERENCE COUNT */
 
-object *
-exec_code_module(name, co)
+PyObject *
+PyImport_ExecCodeModule(name, co)
 	char *name;
-	object *co;
+	PyObject *co;
 {
-	object *m, *d, *v;
+	PyObject *m, *d, *v;
 
-	m = add_module(name);
+	m = PyImport_AddModule(name);
 	if (m == NULL)
 		return NULL;
-	d = getmoduledict(m);
-	if (dictlookup(d, "__builtins__") == NULL) {
-		if (dictinsert(d, "__builtins__", getbuiltins()) != 0)
+	d = PyModule_GetDict(m);
+	if (PyDict_GetItemString(d, "__builtins__") == NULL) {
+		if (PyDict_SetItemString(d, "__builtins__",
+					 PyEval_GetBuiltins()) != 0)
 			return NULL;
 	}
 	/* Remember the filename as the __file__ attribute */
-	if (dictinsert(d, "__file__", ((codeobject *)co)->co_filename) != 0)
-		err_clear(); /* Not important enough to report */
-	v = eval_code((codeobject *)co, d, d); /* XXX owner? */
+	if (PyDict_SetItemString(d, "__file__",
+				 ((PyCodeObject *)co)->co_filename) != 0)
+		PyErr_Clear(); /* Not important enough to report */
+	v = PyEval_EvalCode((PyCodeObject *)co, d, d); /* XXX owner? */
 	if (v == NULL)
 		return NULL;
-	DECREF(v);
-	INCREF(m);
+	Py_DECREF(v);
+	Py_INCREF(m);
 
 	return m;
 }
@@ -236,21 +234,21 @@
 	fp = fopen(cpathname, "rb");
 	if (fp == NULL)
 		return NULL;
-	magic = rd_long(fp);
+	magic = PyMarshal_ReadLongFromFile(fp);
 	if (magic != MAGIC) {
-		if (verbose)
+		if (Py_VerboseFlag)
 			fprintf(stderr, "# %s has bad magic\n", cpathname);
 		fclose(fp);
 		return NULL;
 	}
-	pyc_mtime = rd_long(fp);
+	pyc_mtime = PyMarshal_ReadLongFromFile(fp);
 	if (pyc_mtime != mtime) {
-		if (verbose)
+		if (Py_VerboseFlag)
 			fprintf(stderr, "# %s has bad mtime\n", cpathname);
 		fclose(fp);
 		return NULL;
 	}
-	if (verbose)
+	if (Py_VerboseFlag)
 		fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
 	return fp;
 }
@@ -258,71 +256,72 @@
 
 /* Read a code object from a file and check it for validity */
 
-static codeobject *
+static PyCodeObject *
 read_compiled_module(fp)
 	FILE *fp;
 {
-	object *co;
+	PyObject *co;
 
-	co = rd_object(fp);
+	co = PyMarshal_ReadObjectFromFile(fp);
 	/* Ugly: rd_object() may return NULL with or without error */
-	if (co == NULL || !is_codeobject(co)) {
-		if (!err_occurred())
-			err_setstr(ImportError,
+	if (co == NULL || !PyCode_Check(co)) {
+		if (!PyErr_Occurred())
+			PyErr_SetString(PyExc_ImportError,
 				   "Non-code object in .pyc file");
-		XDECREF(co);
+		Py_XDECREF(co);
 		return NULL;
 	}
-	return (codeobject *)co;
+	return (PyCodeObject *)co;
 }
 
 
 /* Load a module from a compiled file, execute it, and return its
    module object WITH INCREMENTED REFERENCE COUNT */
 
-static object *
+static PyObject *
 load_compiled_module(name, cpathname, fp)
 	char *name;
 	char *cpathname;
 	FILE *fp;
 {
 	long magic;
-	codeobject *co;
-	object *m;
+	PyCodeObject *co;
+	PyObject *m;
 
-	magic = rd_long(fp);
+	magic = PyMarshal_ReadLongFromFile(fp);
 	if (magic != MAGIC) {
-		err_setstr(ImportError, "Bad magic number in .pyc file");
+		PyErr_SetString(PyExc_ImportError,
+				"Bad magic number in .pyc file");
 		return NULL;
 	}
-	(void) rd_long(fp);
+	(void) PyMarshal_ReadLongFromFile(fp);
 	co = read_compiled_module(fp);
 	if (co == NULL)
 		return NULL;
-	if (verbose)
+	if (Py_VerboseFlag)
 		fprintf(stderr, "import %s # precompiled from %s\n",
 			name, cpathname);
-	m = exec_code_module(name, (object *)co);
-	DECREF(co);
+	m = PyImport_ExecCodeModule(name, (PyObject *)co);
+	Py_DECREF(co);
 
 	return m;
 }
 
 /* Parse a source file and return the corresponding code object */
 
-static codeobject *
+static PyCodeObject *
 parse_source_module(pathname, fp)
 	char *pathname;
 	FILE *fp;
 {
-	codeobject *co;
+	PyCodeObject *co;
 	node *n;
 
-	n = parse_file(fp, pathname, file_input);
+	n = PyParser_SimpleParseFile(fp, pathname, file_input);
 	if (n == NULL)
 		return NULL;
-	co = compile(n, pathname);
-	freetree(n);
+	co = PyNode_Compile(n, pathname);
+	PyNode_Free(n);
 
 	return co;
 }
@@ -335,7 +334,7 @@
 
 static void
 write_compiled_module(co, cpathname, mtime)
-	codeobject *co;
+	PyCodeObject *co;
 	char *cpathname;
 	long mtime;
 {
@@ -343,17 +342,17 @@
 
 	fp = fopen(cpathname, "wb");
 	if (fp == NULL) {
-		if (verbose)
+		if (Py_VerboseFlag)
 			fprintf(stderr,
 				"# can't create %s\n", cpathname);
 		return;
 	}
-	wr_long(MAGIC, fp);
+	PyMarshal_WriteLongToFile(MAGIC, fp);
 	/* First write a 0 for mtime */
-	wr_long(0L, fp);
-	wr_object((object *)co, fp);
+	PyMarshal_WriteLongToFile(0L, fp);
+	PyMarshal_WriteObjectToFile((PyObject *)co, fp);
 	if (ferror(fp)) {
-		if (verbose)
+		if (Py_VerboseFlag)
 			fprintf(stderr, "# can't write %s\n", cpathname);
 		/* Don't keep partial file */
 		fclose(fp);
@@ -362,10 +361,10 @@
 	}
 	/* Now write the true mtime */
 	fseek(fp, 4L, 0);
-	wr_long(mtime, fp);
+	PyMarshal_WriteLongToFile(mtime, fp);
 	fflush(fp);
 	fclose(fp);
-	if (verbose)
+	if (Py_VerboseFlag)
 		fprintf(stderr, "# wrote %s\n", cpathname);
 #ifdef macintosh
 	setfiletype(cpathname, 'Pyth', 'PYC ');
@@ -377,7 +376,7 @@
    object WITH INCREMENTED REFERENCE COUNT.  If there's a matching
    byte-compiled file, use that instead. */
 
-static object *
+static PyObject *
 load_source_module(name, pathname, fp)
 	char *name;
 	char *pathname;
@@ -387,10 +386,10 @@
 	FILE *fpc;
 	char buf[MAXPATHLEN+1];
 	char *cpathname;
-	codeobject *co;
-	object *m;
+	PyCodeObject *co;
+	PyObject *m;
 
-	mtime = getmtime(pathname);
+	mtime = PyOS_GetLastModificationTime(pathname);
 	cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
 	if (cpathname != NULL &&
 	    (fpc = check_compiled_module(pathname, mtime, cpathname))) {
@@ -398,7 +397,7 @@
 		fclose(fpc);
 		if (co == NULL)
 			return NULL;
-		if (verbose)
+		if (Py_VerboseFlag)
 			fprintf(stderr, "import %s # precompiled from %s\n",
 				name, cpathname);
 	}
@@ -406,13 +405,13 @@
 		co = parse_source_module(pathname, fp);
 		if (co == NULL)
 			return NULL;
-		if (verbose)
+		if (Py_VerboseFlag)
 			fprintf(stderr, "import %s # from %s\n",
 				name, pathname);
 		write_compiled_module(co, cpathname, mtime);
 	}
-	m = exec_code_module(name, (object *)co);
-	DECREF(co);
+	m = PyImport_ExecCodeModule(name, (PyObject *)co);
+	Py_DECREF(co);
 
 	return m;
 }
@@ -425,7 +424,7 @@
 static struct filedescr *
 find_module(name, path, buf, buflen, p_fp)
 	char *name;
-	object *path;
+	PyObject *path;
 	/* Output parameters: */
 	char *buf;
 	int buflen;
@@ -445,27 +444,28 @@
 
 
 	if (path == NULL)
-		path = sysget("path");
-	if (path == NULL || !is_listobject(path)) {
-		err_setstr(ImportError,
+		path = PySys_GetObject("path");
+	if (path == NULL || !PyList_Check(path)) {
+		PyErr_SetString(PyExc_ImportError,
 			   "sys.path must be a list of directory names");
 		return NULL;
 	}
-	npath = getlistsize(path);
+	npath = PyList_Size(path);
 	namelen = strlen(name);
 	for (i = 0; i < npath; i++) {
-		object *v = getlistitem(path, i);
-		if (!is_stringobject(v))
+		PyObject *v = PyList_GetItem(path, i);
+		if (!PyString_Check(v))
 			continue;
-		len = getstringsize(v);
-		if (len + 2 + namelen + import_maxsuffixsize >= buflen)
+		len = PyString_Size(v);
+		if (len + 2 + namelen + _PyImport_MaxSuffixSize >= buflen)
 			continue; /* Too long */
-		strcpy(buf, getstringvalue(v));
+		strcpy(buf, PyString_AsString(v));
 		if ((int)strlen(buf) != len)
 			continue; /* v contains '\0' */
 #ifdef macintosh
 		if ( PyMac_FindResourceModule(name, buf) ) {
-			static struct filedescr resfiledescr = { "", "", PY_RESOURCE};
+			static struct filedescr resfiledescr =
+				{"", "", PY_RESOURCE};
 			
 			return &resfiledescr;
 		}
@@ -476,7 +476,7 @@
 		/* see if we are searching in directory dos_8x3 */
 		if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
 			int j;
-			char ch;  /* limit name to eight lower-case characters */
+			char ch;  /* limit name to 8 lower-case characters */
 			for (j = 0; (ch = name[j]) && j < 8; j++)
 				if (isupper(ch))
 					buf[len++] = tolower(ch);
@@ -489,9 +489,9 @@
 			strcpy(buf+len, name);
 			len += namelen;
 		}
-		for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
+		for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
 			strcpy(buf+len, fdp->suffix);
-			if (verbose > 1)
+			if (Py_VerboseFlag > 1)
 				fprintf(stderr, "# trying %s\n", buf);
 			fp = fopen(buf, fdp->mode);
 			if (fp != NULL)
@@ -503,7 +503,7 @@
 	if (fp == NULL) {
 		char buf[256];
 		sprintf(buf, "No module named %.200s", name);
-		err_setstr(ImportError, buf);
+		PyErr_SetString(PyExc_ImportError, buf);
 		return NULL;
 	}
 
@@ -515,16 +515,16 @@
 /* Load an external module using the default search path and return
    its module object WITH INCREMENTED REFERENCE COUNT */
 
-static object *
+static PyObject *
 load_module(name)
 	char *name;
 {
 	char buf[MAXPATHLEN+1];
 	struct filedescr *fdp;
 	FILE *fp = NULL;
-	object *m;
+	PyObject *m;
 
-	fdp = find_module(name, (object *)NULL, buf, MAXPATHLEN+1, &fp);
+	fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
 	if (fdp == NULL)
 		return NULL;
 
@@ -539,7 +539,7 @@
 		break;
 
 	case C_EXTENSION:
-		m = load_dynamic_module(name, buf, fp);
+		m = _PyImport_LoadDynamicModule(name, buf, fp);
 		break;
 
 #ifdef macintosh
@@ -549,7 +549,7 @@
 #endif
 
 	default:
-		err_setstr(SystemError,
+		PyErr_SetString(PyExc_SystemError,
 			   "find_module returned unexpected result");
 		m = NULL;
 
@@ -573,15 +573,15 @@
 	for (i = 0; inittab[i].name != NULL; i++) {
 		if (strcmp(name, inittab[i].name) == 0) {
 			if (inittab[i].initfunc == NULL) {
-				err_setstr(ImportError,
+				PyErr_SetString(PyExc_ImportError,
 					   "Cannot re-init internal module");
 				return -1;
 			}
-			if (verbose)
+			if (Py_VerboseFlag)
 				fprintf(stderr, "import %s # builtin\n",
 					name);
 			(*inittab[i].initfunc)();
-			if (err_occurred())
+			if (PyErr_Occurred())
 				return -1;
 			return 1;
 		}
@@ -598,7 +598,7 @@
 {
 	struct _frozen *p;
 
-	for (p = frozen_modules; ; p++) {
+	for (p = PyImport_FrozenModules; ; p++) {
 		if (p->name == NULL)
 			return NULL;
 		if (strcmp(p->name, name) == 0)
@@ -607,17 +607,17 @@
 	return p;
 }
 
-static object *
+static PyObject *
 get_frozen_object(name)
 	char *name;
 {
 	struct _frozen *p = find_frozen(name);
 
 	if (p == NULL) {
-		err_setstr(ImportError, "No such frozen object");
+		PyErr_SetString(PyExc_ImportError, "No such frozen object");
 		return NULL;
 	}
-	return rds_object((char *)p->code, p->size);
+	return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
 }
 
 /* Initialize a frozen module.
@@ -626,30 +626,31 @@
    This function is also used from frozenmain.c */
 
 int
-init_frozen(name)
+PyImport_ImportFrozenModule(name)
 	char *name;
 {
 	struct _frozen *p = find_frozen(name);
-	object *co;
-	object *m;
+	PyObject *co;
+	PyObject *m;
 
 	if (p == NULL)
 		return 0;
-	if (verbose)
+	if (Py_VerboseFlag)
 		fprintf(stderr, "import %s # frozen\n", name);
-	co = rds_object((char *)p->code, p->size);
+	co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
 	if (co == NULL)
 		return -1;
-	if (!is_codeobject(co)) {
-		DECREF(co);
-		err_setstr(TypeError, "frozen object is not a code object");
+	if (!PyCode_Check(co)) {
+		Py_DECREF(co);
+		PyErr_SetString(PyExc_TypeError,
+				"frozen object is not a code object");
 		return -1;
 	}
-	m = exec_code_module(name, co);
-	DECREF(co);
+	m = PyImport_ExecCodeModule(name, co);
+	Py_DECREF(co);
 	if (m == NULL)
 		return -1;
-	DECREF(m);
+	Py_DECREF(m);
 	return 1;
 }
 
@@ -657,31 +658,34 @@
 /* Import a module, either built-in, frozen, or external, and return
    its module object WITH INCREMENTED REFERENCE COUNT */
 
-object *
-import_module(name)
+PyObject *
+PyImport_ImportModule(name)
 	char *name;
 {
-	object *m;
+	PyObject *m;
 
 	if (import_modules == NULL) {
-		err_setstr(SystemError, "sys.modules has been deleted");
+		PyErr_SetString(PyExc_SystemError,
+				"sys.modules has been deleted");
 		return NULL;
 	}
-	if ((m = dictlookup(import_modules, name)) != NULL) {
-		INCREF(m);
+	if ((m = PyDict_GetItemString(import_modules, name)) != NULL) {
+		Py_INCREF(m);
 	}
 	else {
 		int i;
-		if ((i = init_builtin(name)) || (i = init_frozen(name))) {
+		if ((i = init_builtin(name)) ||
+		    (i = PyImport_ImportFrozenModule(name))) {
 			if (i < 0)
 				return NULL;
-			if ((m = dictlookup(import_modules, name)) == NULL) {
-			    if (err_occurred() == NULL)
-			        err_setstr(SystemError,
+			if ((m = PyDict_GetItemString(import_modules,
+						      name)) == NULL) {
+			    if (PyErr_Occurred() == NULL)
+			        PyErr_SetString(PyExc_SystemError,
 				 "built-in module not initialized properly");
 			}
 			else
-				INCREF(m);
+				Py_INCREF(m);
 		}
 		else
 			m = load_module(name);
@@ -694,33 +698,37 @@
 /* Re-import a module of any kind and return its module object, WITH
    INCREMENTED REFERENCE COUNT */
 
-object *
-reload_module(m)
-	object *m;
+PyObject *
+PyImport_ReloadModule(m)
+	PyObject *m;
 {
 	char *name;
 	int i;
 
-	if (m == NULL || !is_moduleobject(m)) {
-		err_setstr(TypeError, "reload() argument must be module");
+	if (m == NULL || !PyModule_Check(m)) {
+		PyErr_SetString(PyExc_TypeError,
+				"reload() argument must be module");
 		return NULL;
 	}
-	name = getmodulename(m);
+	name = PyModule_GetName(m);
 	if (name == NULL)
 		return NULL;
 	if (import_modules == NULL) {
-		err_setstr(SystemError, "sys.modules has been deleted");
+		PyErr_SetString(PyExc_SystemError,
+				"sys.modules has been deleted");
 		return NULL;
 	}
-	if (m != dictlookup(import_modules, name)) {
-		err_setstr(ImportError, "reload() module not in sys.modules");
+	if (m != PyDict_GetItemString(import_modules, name)) {
+		PyErr_SetString(PyExc_ImportError,
+				"reload() module not in sys.modules");
 		return NULL;
 	}
 	/* Check for built-in and frozen modules */
-	if ((i = init_builtin(name)) || (i = init_frozen(name))) {
+	if ((i = init_builtin(name)) ||
+	    (i = PyImport_ImportFrozenModule(name))) {
 		if (i < 0)
 			return NULL;
-		INCREF(m);
+		Py_INCREF(m);
 	}
 	else
 		m = load_module(name);
@@ -732,206 +740,208 @@
    importing modules.
 */
 
-static object *
+static PyObject *
 imp_get_magic(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char buf[4];
 
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	buf[0] = (char) ((MAGIC >>  0) & 0xff);
 	buf[1] = (char) ((MAGIC >>  8) & 0xff);
 	buf[2] = (char) ((MAGIC >> 16) & 0xff);
 	buf[3] = (char) ((MAGIC >> 24) & 0xff);
 
-	return newsizedstringobject(buf, 4);
+	return PyString_FromStringAndSize(buf, 4);
 }
 
-static object *
+static PyObject *
 imp_get_suffixes(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *list;
+	PyObject *list;
 	struct filedescr *fdp;
 
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
-	list = newlistobject(0);
+	list = PyList_New(0);
 	if (list == NULL)
 		return NULL;
-	for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
-		object *item = mkvalue("ssi",
+	for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
+		PyObject *item = Py_BuildValue("ssi",
 				       fdp->suffix, fdp->mode, fdp->type);
 		if (item == NULL) {
-			DECREF(list);
+			Py_DECREF(list);
 			return NULL;
 		}
-		if (addlistitem(list, item) < 0) {
-			DECREF(list);
-			DECREF(item);
+		if (PyList_Append(list, item) < 0) {
+			Py_DECREF(list);
+			Py_DECREF(item);
 			return NULL;
 		}
-		DECREF(item);
+		Py_DECREF(item);
 	}
 	return list;
 }
 
-static object *
+static PyObject *
 imp_find_module(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	extern int fclose PROTO((FILE *));
+	extern int fclose Py_PROTO((FILE *));
 	char *name;
-	object *path = NULL;
-	object *fob, *ret;
+	PyObject *path = NULL;
+	PyObject *fob, *ret;
 	struct filedescr *fdp;
 	char pathname[MAXPATHLEN+1];
 	FILE *fp;
-	if (!newgetargs(args, "s|O!", &name, &Listtype, &path))
+	if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
 		return NULL;
 	fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
 	if (fdp == NULL)
 		return NULL;
-	fob = newopenfileobject(fp, pathname, fdp->mode, fclose);
+	fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
 	if (fob == NULL) {
 		fclose(fp);
 		return NULL;
 	}
-	ret = mkvalue("Os(ssi)",
+	ret = Py_BuildValue("Os(ssi)",
 		      fob, pathname, fdp->suffix, fdp->mode, fdp->type);
-	DECREF(fob);
+	Py_DECREF(fob);
 	return ret;
 }
 
-static object *
+static PyObject *
 imp_init_builtin(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	int ret;
-	object *m;
-	if (!newgetargs(args, "s", &name))
+	PyObject *m;
+	if (!PyArg_ParseTuple(args, "s", &name))
 		return NULL;
 	ret = init_builtin(name);
 	if (ret < 0)
 		return NULL;
 	if (ret == 0) {
-		INCREF(None);
-		return None;
+		Py_INCREF(Py_None);
+		return Py_None;
 	}
-	m = add_module(name);
-	XINCREF(m);
+	m = PyImport_AddModule(name);
+	Py_XINCREF(m);
 	return m;
 }
 
-static object *
+static PyObject *
 imp_init_frozen(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	int ret;
-	object *m;
-	if (!newgetargs(args, "s", &name))
+	PyObject *m;
+	if (!PyArg_ParseTuple(args, "s", &name))
 		return NULL;
-	ret = init_frozen(name);
+	ret = PyImport_ImportFrozenModule(name);
 	if (ret < 0)
 		return NULL;
 	if (ret == 0) {
-		INCREF(None);
-		return None;
+		Py_INCREF(Py_None);
+		return Py_None;
 	}
-	m = add_module(name);
-	XINCREF(m);
+	m = PyImport_AddModule(name);
+	Py_XINCREF(m);
 	return m;
 }
 
-static object *
+static PyObject *
 imp_get_frozen_object(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 
-	if (!newgetargs(args, "s", &name))
+	if (!PyArg_ParseTuple(args, "s", &name))
 		return NULL;
 	return get_frozen_object(name);
 }
 
-static object *
+static PyObject *
 imp_is_builtin(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int i;
 	char *name;
-	if (!newgetargs(args, "s", &name))
+	if (!PyArg_ParseTuple(args, "s", &name))
 		return NULL;
 	for (i = 0; inittab[i].name != NULL; i++) {
 		if (strcmp(name, inittab[i].name) == 0) {
 			if (inittab[i].initfunc == NULL)
-				return newintobject(-1);
+				return PyInt_FromLong(-1);
 			else
-				return newintobject(1);
+				return PyInt_FromLong(1);
 		}
 	}
-	return newintobject(0);
+	return PyInt_FromLong(0);
 }
 
-static object *
+static PyObject *
 imp_is_frozen(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	struct _frozen *p;
 	char *name;
-	if (!newgetargs(args, "s", &name))
+	if (!PyArg_ParseTuple(args, "s", &name))
 		return NULL;
-	for (p = frozen_modules; ; p++) {
+	for (p = PyImport_FrozenModules; ; p++) {
 		if (p->name == NULL)
 			break;
 		if (strcmp(p->name, name) == 0)
-			return newintobject(1);
+			return PyInt_FromLong(1);
 	}
-	return newintobject(0);
+	return PyInt_FromLong(0);
 }
 
 static FILE *
 get_file(pathname, fob, mode)
 	char *pathname;
-	object *fob;
+	PyObject *fob;
 	char *mode;
 {
 	FILE *fp;
 	if (fob == NULL) {
 		fp = fopen(pathname, mode);
 		if (fp == NULL)
-			err_errno(IOError);
+			PyErr_SetFromErrno(PyExc_IOError);
 	}
 	else {
-		fp = getfilefile(fob);
+		fp = PyFile_AsFile(fob);
 		if (fp == NULL)
-			err_setstr(ValueError, "bad/closed file object");
+			PyErr_SetString(PyExc_ValueError,
+					"bad/closed file object");
 	}
 	return fp;
 }
 
-static object *
+static PyObject *
 imp_load_compiled(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	char *pathname;
-	object *fob = NULL;
-	object *m;
+	PyObject *fob = NULL;
+	PyObject *m;
 	FILE *fp;
-	if (!newgetargs(args, "ssO!", &name, &pathname, &Filetype, &fob))
+	if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
+			      &PyFile_Type, &fob))
 		return NULL;
 	fp = get_file(pathname, fob, "rb");
 	if (fp == NULL)
@@ -940,35 +950,37 @@
 	return m;
 }
 
-static object *
+static PyObject *
 imp_load_dynamic(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	char *pathname;
-	object *fob = NULL;
-	object *m;
+	PyObject *fob = NULL;
+	PyObject *m;
 	FILE *fp = NULL;
-	if (!newgetargs(args, "ss|O!", &name, &pathname, &Filetype, &fob))
+	if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
+			      &PyFile_Type, &fob))
 		return NULL;
 	if (fob)
 		fp = get_file(pathname, fob, "r");
-	m = load_dynamic_module(name, pathname, fp);
+	m = _PyImport_LoadDynamicModule(name, pathname, fp);
 	return m;
 }
 
-static object *
+static PyObject *
 imp_load_source(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	char *pathname;
-	object *fob = NULL;
-	object *m;
+	PyObject *fob = NULL;
+	PyObject *m;
 	FILE *fp;
-	if (!newgetargs(args, "ssO!", &name, &pathname, &Filetype, &fob))
+	if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
+			      &PyFile_Type, &fob))
 		return NULL;
 	fp = get_file(pathname, fob, "r");
 	if (fp == NULL)
@@ -978,34 +990,34 @@
 }
 
 #ifdef macintosh
-static object *
+static PyObject *
 imp_load_resource(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
 	char *pathname;
-	object *m;
+	PyObject *m;
 
-	if (!newgetargs(args, "ss", &name, &pathname))
+	if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
 		return NULL;
 	m = PyMac_LoadResourceModule(name, pathname);
 	return m;
 }
 #endif /* macintosh */
 
-static object *
+static PyObject *
 imp_new_module(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
-	if (!newgetargs(args, "s", &name))
+	if (!PyArg_ParseTuple(args, "s", &name))
 		return NULL;
-	return newmoduleobject(name);
+	return PyModule_New(name);
 }
 
-static struct methodlist imp_methods[] = {
+static PyMethodDef imp_methods[] = {
 	{"get_frozen_object",	imp_get_frozen_object,	1},
 	{"get_magic",		imp_get_magic,		1},
 	{"get_suffixes",	imp_get_suffixes,	1},
@@ -1027,34 +1039,34 @@
 void
 initimp()
 {
-	object *m, *d, *v;
+	PyObject *m, *d, *v;
 
-	m = initmodule("imp", imp_methods);
-	d = getmoduledict(m);
+	m = Py_InitModule("imp", imp_methods);
+	d = PyModule_GetDict(m);
 
-	v = newintobject(SEARCH_ERROR);
-	dictinsert(d, "SEARCH_ERROR", v);
-	XDECREF(v);
+	v = PyInt_FromLong(SEARCH_ERROR);
+	PyDict_SetItemString(d, "SEARCH_ERROR", v);
+	Py_XDECREF(v);
 
-	v = newintobject(PY_SOURCE);
-	dictinsert(d, "PY_SOURCE", v);
-	XDECREF(v);
+	v = PyInt_FromLong(PY_SOURCE);
+	PyDict_SetItemString(d, "PY_SOURCE", v);
+	Py_XDECREF(v);
 
-	v = newintobject(PY_COMPILED);
-	dictinsert(d, "PY_COMPILED", v);
-	XDECREF(v);
+	v = PyInt_FromLong(PY_COMPILED);
+	PyDict_SetItemString(d, "PY_COMPILED", v);
+	Py_XDECREF(v);
 
-	v = newintobject(C_EXTENSION);
-	dictinsert(d, "C_EXTENSION", v);
-	XDECREF(v);
+	v = PyInt_FromLong(C_EXTENSION);
+	PyDict_SetItemString(d, "C_EXTENSION", v);
+	Py_XDECREF(v);
 
 #ifdef macintosh
-	v = newintobject(PY_RESOURCE);
-	dictinsert(d, "PY_RESOURCE", v);
-	XDECREF(v);
+	v = PyInt_FromLong(PY_RESOURCE);
+	PyDict_SetItemString(d, "PY_RESOURCE", v);
+	Py_XDECREF(v);
 #endif
 
 
-	if (err_occurred())
-		fatal("imp module initialization failed");
+	if (PyErr_Occurred())
+		Py_FatalError("imp module initialization failed");
 }
diff --git a/Python/importdl.c b/Python/importdl.c
index 6541e09..16271d6 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -32,7 +32,7 @@
 /* Support for dynamic loading of extension modules */
 /* If no dynamic linking is supported, this file still generates some code! */
 
-#include "allobjects.h"
+#include "Python.h"
 #include "osdefs.h"
 #include "importdl.h"
 
@@ -167,7 +167,7 @@
 #ifdef USE_MAC_DYNAMIC_LOADING
 #include <Aliases.h>
 #include <CodeFragments.h>
-#ifdef SYMANTEC__CFM68K__ /* Really just an older version of Universal Headers */
+#ifdef SYMANTEC__CFM68K__ /* Really an older version of Universal Headers */
 #define CFragConnectionID ConnectionID
 #define kLoadCFrag 0x01
 #endif
@@ -184,7 +184,7 @@
 #endif
 #endif /* USE_RLD */
 
-extern char *getprogramname();
+extern char *Py_GetProgramName();
 
 #ifndef FUNCNAME_PATTERN
 #if defined(__hp9000s300) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__BORLANDC__)
@@ -207,9 +207,9 @@
 #endif
 
 /* Pass it on to import.c */
-int import_maxsuffixsize = MAXSUFFIXSIZE;
+int _PyImport_MaxSuffixSize = MAXSUFFIXSIZE;
 
-struct filedescr import_filetab[] = {
+struct filedescr _PyImport_Filetab[] = {
 #ifdef SHORT_EXT
 	{SHORT_EXT, "rb", C_EXTENSION},
 #endif /* !SHORT_EXT */
@@ -225,17 +225,18 @@
 #undef DYNAMIC_LINK
 #endif
 
-object *
-load_dynamic_module(name, pathname, fp)
+PyObject *
+_PyImport_LoadDynamicModule(name, pathname, fp)
 	char *name;
 	char *pathname;
 	FILE *fp;
 {
 #ifndef DYNAMIC_LINK
-	err_setstr(ImportError, "dynamically linked modules not supported");
+	PyErr_SetString(PyExc_ImportError,
+			"dynamically linked modules not supported");
 	return NULL;
 #else
-	object *m, *d, *s;
+	PyObject *m, *d, *s;
 	char funcname[258];
 	dl_funcptr p = NULL;
 #ifdef USE_SHLIB
@@ -274,11 +275,12 @@
 #endif /* USE_SHLIB */
 #ifdef USE_MAC_DYNAMIC_LOADING
 	/*
-	** Dynamic loading of CFM shared libraries on the Mac.
-	** The code has become more convoluted than it was, because we want to be able
-	** to put multiple modules in a single file. For this reason, we have to determine
-	** the fragment name, and we cannot use the library entry point but we have to locate
-	** the correct init routine "by hand".
+	** Dynamic loading of CFM shared libraries on the Mac.  The
+	** code has become more convoluted than it was, because we
+	** want to be able to put multiple modules in a single
+	** file. For this reason, we have to determine the fragment
+	** name, and we cannot use the library entry point but we have
+	** to locate the correct init routine "by hand".
 	*/
 	{
 		FSSpec libspec;
@@ -297,30 +299,35 @@
 		err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
 		if ( err ) {
 			sprintf(buf, "%s: %s", pathname, PyMac_StrError(err));
-			err_setstr(ImportError, buf);
+			PyErr_SetString(PyExc_ImportError, buf);
 			return NULL;
 		}
-		/* Next, determine the fragment name, by stripping '.slb' and 'module' */
+		/* Next, determine the fragment name,
+		   by stripping '.slb' and 'module' */
 		memcpy(fragname+1, libspec.name+1, libspec.name[0]);
 		fragname[0] = libspec.name[0];
-		if( strncmp((char *)(fragname+1+fragname[0]-4), ".slb", 4) == 0 )
+		if( strncmp((char *)(fragname+1+fragname[0]-4),
+			    ".slb", 4) == 0 )
 			fragname[0] -= 4;
-		if ( strncmp((char *)(fragname+1+fragname[0]-6), "module", 6) == 0 )
+		if ( strncmp((char *)(fragname+1+fragname[0]-6),
+			     "module", 6) == 0 )
 			fragname[0] -= 6;
-		/* Load the fragment (or return the connID if it is already loaded */
+		/* Load the fragment
+		   (or return the connID if it is already loaded */
 		err = GetDiskFragment(&libspec, 0, 0, fragname, 
 				      kLoadCFrag, &connID, &mainAddr,
 				      errMessage);
 		if ( err ) {
-			sprintf(buf, "%.*s: %s", errMessage[0], errMessage+1, PyMac_StrError(err));
-			err_setstr(ImportError, buf);
+			sprintf(buf, "%.*s: %s", errMessage[0], errMessage+1,
+				PyMac_StrError(err));
+			PyErr_SetString(PyExc_ImportError, buf);
 			return NULL;
 		}
 		/* Locate the address of the correct init function */
 		err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
 		if ( err ) {
 			sprintf(buf, "%s: %s", funcname, PyMac_StrError(err));
-			err_setstr(ImportError, buf);
+			PyErr_SetString(PyExc_ImportError, buf);
 			return NULL;
 		}
 		p = (dl_funcptr)symAddr;
@@ -334,12 +341,12 @@
 		void *handle = dlopen(pathname, RTLD_NOW);
 #else
 		void *handle;
-		if (verbose)
+		if (Py_VerboseFlag)
 			printf("dlopen(\"%s\", %d);\n", pathname, RTLD_LAZY);
 		handle = dlopen(pathname, RTLD_LAZY);
 #endif /* RTLD_NOW */
 		if (handle == NULL) {
-			err_setstr(ImportError, dlerror());
+			PyErr_SetString(PyExc_ImportError, dlerror());
 			return NULL;
 		}
 		if (fp != NULL && nhandles < 128)
@@ -382,35 +389,44 @@
 			unsigned int errorCode;
 
 			/* Get an error string from Win32 error code */
-			char theInfo[256];           /* Pointer to error text from system */
-			int theLength;               /* Length of error text */
+			char theInfo[256]; /* Pointer to error text
+					      from system */
+			int theLength; /* Length of error text */
 
 			errorCode = GetLastError();
 
-			theLength = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
-				NULL,                              /* message source */
-				errorCode,                         /* the message (error) ID */
-				0,                                 /* default language environment */
-				(LPTSTR) theInfo,                  /* the buffer */
-				sizeof(theInfo),                   /* the buffer size */
-				NULL);                             /* no additional format args. */
+			theLength = FormatMessage(
+				FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
+				NULL, /* message source */
+				errorCode, /* the message (error) ID */
+				0, /* default language environment */
+				(LPTSTR) theInfo, /* the buffer */
+				sizeof(theInfo), /* the buffer size */
+				NULL); /* no additional format args. */
 
-			/* Problem: could not get the error message. This should not happen if called correctly. */
+			/* Problem: could not get the error message.
+			   This should not happen if called correctly. */
 			if (theLength == 0) {
-				sprintf(errBuf, "DLL load failed with error code %d", errorCode);
+				sprintf(errBuf,
+					"DLL load failed with error code %d",
+					errorCode);
 			} else {
 				int len;
-				/* For some reason a \r\n is appended to the text */
-				if (theLength >= 2 && theInfo[theLength-2] == '\r' && theInfo[theLength-1] == '\n') {
+				/* For some reason a \r\n
+				   is appended to the text */
+				if (theLength >= 2 &&
+				    theInfo[theLength-2] == '\r' &&
+				    theInfo[theLength-1] == '\n') {
 					theLength -= 2;
 					theInfo[theLength] = '\0';
 				}
 				strcpy(errBuf, "DLL load failed: ");
 				len = strlen(errBuf);
-				strncpy(errBuf+len, theInfo, sizeof(errBuf)-len);
+				strncpy(errBuf+len, theInfo,
+					sizeof(errBuf)-len);
 				errBuf[sizeof(errBuf)-1] = '\0';
 			}
-			err_setstr(ImportError, errBuf);
+			PyErr_SetString(PyExc_ImportError, errBuf);
 		return NULL;
 		}
 		p = GetProcAddress(hDLL, funcname);
@@ -422,15 +438,16 @@
 		hDLL = LoadLibrary(pathname);
 		if (hDLL < HINSTANCE_ERROR){
 			char errBuf[256];
-			sprintf(errBuf, "DLL load failed with error code %d", hDLL);
-			err_setstr(ImportError, errBuf);
+			sprintf(errBuf,
+				"DLL load failed with error code %d", hDLL);
+			PyErr_SetString(PyExc_ImportError, errBuf);
 			return NULL;
 		}
 		p = GetProcAddress(hDLL, funcname);
 	}
 #endif /* MS_WIN16 */
 #ifdef USE_DL
-	p =  dl_loadmod(getprogramname(), pathname, funcname);
+	p =  dl_loadmod(Py_GetProgramName(), pathname, funcname);
 #endif /* USE_DL */
 #ifdef USE_RLD
 	{
@@ -455,7 +472,7 @@
 
 			NXGetMemoryBuffer(errorStream,
 				&streamBuf, &len, &maxLen);
-			err_setstr(ImportError, streamBuf);
+			PyErr_SetString(PyExc_ImportError, streamBuf);
 		}
 
 		if(ret && rld_lookup(errorStream, funcname, &ptr))
@@ -473,25 +490,26 @@
 		int flags;
 
 		flags = BIND_FIRST | BIND_DEFERRED;
-		if (verbose)
+		if (Py_VerboseFlag)
                 {
-                        flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE;
+                        flags = DYNAMIC_PATH | BIND_FIRST | BIND_IMMEDIATE |
+				BIND_NONFATAL | BIND_VERBOSE;
                         printf("shl_load %s\n",pathname);
                 }
                 lib = shl_load(pathname, flags, 0);
                 if (lib == NULL)
                 {
                         char buf[256];
-                        if (verbose)
+                        if (Py_VerboseFlag)
                                 perror(pathname);
                         sprintf(buf, "Failed to load %.200s", pathname);
-                        err_setstr(ImportError, buf);
+                        PyErr_SetString(PyExc_ImportError, buf);
                         return NULL;
                 }
-                if (verbose)
+                if (Py_VerboseFlag)
                         printf("shl_findsym %s\n", funcname);
                 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
-                if (p == NULL && verbose)
+                if (p == NULL && Py_VerboseFlag)
                         perror(funcname);
 	}
 #endif /* hpux */
@@ -499,31 +517,31 @@
   got_it:
 #endif
 	if (p == NULL) {
-		err_setstr(ImportError,
+		PyErr_SetString(PyExc_ImportError,
 		   "dynamic module does not define init function");
 		return NULL;
 	}
 	(*p)();
 	/* XXX Need check for err_occurred() here */
 
-	m = dictlookup(import_modules, name);
+	m = PyDict_GetItemString(import_modules, name);
 	if (m == NULL) {
-		if (err_occurred() == NULL)
-			err_setstr(SystemError,
+		if (PyErr_Occurred() == NULL)
+			PyErr_SetString(PyExc_SystemError,
 				   "dynamic module not initialized properly");
 		return NULL;
 	}
 	/* Remember the filename as the __file__ attribute */
-	d = getmoduledict(m);
-	s = newstringobject(pathname);
-	if (s == NULL || dictinsert(d, "__file__", s) != 0)
-		err_clear(); /* Not important enough to report */
-	XDECREF(s);
-	if (verbose)
+	d = PyModule_GetDict(m);
+	s = PyString_FromString(pathname);
+	if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0)
+		PyErr_Clear(); /* Not important enough to report */
+	Py_XDECREF(s);
+	if (Py_VerboseFlag)
 		fprintf(stderr,
 			"import %s # dynamically loaded from %s\n",
 			name, pathname);
-	INCREF(m);
+	Py_INCREF(m);
 	return m;
 #endif /* DYNAMIC_LINK */
 }
@@ -555,7 +573,7 @@
 	-- Get the list of loaded modules into ld_info structures.
 	*/
 	if ((ldibuf = malloc(bufsize)) == NULL) {
-		err_setstr(ImportError, strerror(errno));
+		PyErr_SetString(PyExc_ImportError, strerror(errno));
 		return -1;
 	}
 	while ((errflag = loadquery(L_GETINFO, ldibuf, bufsize)) == -1
@@ -563,12 +581,12 @@
 		free(ldibuf);
 		bufsize += 1024;
 		if ((ldibuf = malloc(bufsize)) == NULL) {
-			err_setstr(ImportError, strerror(errno));
+			PyErr_SetString(PyExc_ImportError, strerror(errno));
 			return -1;
 		}
 	}
 	if (errflag == -1) {
-		err_setstr(ImportError, strerror(errno));
+		PyErr_SetString(PyExc_ImportError, strerror(errno));
 		return -1;
 	}
 	/*
@@ -578,7 +596,7 @@
 	prevmodptr = NULL;
 	do {
 		if ((modptr = (ModulePtr)malloc(sizeof(Module))) == NULL) {
-			err_setstr(ImportError, strerror(errno));
+			PyErr_SetString(PyExc_ImportError, strerror(errno));
 			while (*modlistptr) {
 				modptr = (ModulePtr)*modlistptr;
 				*modlistptr = (void *)modptr->next;
@@ -662,7 +680,7 @@
 		ERRBUF_APPEND("\n");
 	}
 	errbuf[strlen(errbuf)-1] = '\0';	/* trim off last newline */
-	err_setstr(ImportError, errbuf); 
+	PyErr_SetString(PyExc_ImportError, errbuf); 
 	return; 
 }
 
diff --git a/Python/importdl.h b/Python/importdl.h
index 24f061d..48aa1a4 100644
--- a/Python/importdl.h
+++ b/Python/importdl.h
@@ -40,10 +40,11 @@
 	char *suffix;
 	char *mode;
 	enum filetype type;
-} import_filetab[];
+} _PyImport_Filetab[];
 
-extern object *import_modules;
+extern PyObject *import_modules;
 
-extern object *load_dynamic_module PROTO((char *name, char *pathname, FILE *));
+extern PyObject *_PyImport_LoadDynamicModule
+	Py_PROTO((char *name, char *pathname, FILE *));
 
-extern int import_maxsuffixsize;
+extern int _PyImport_MaxSuffixSize;
diff --git a/Python/marshal.c b/Python/marshal.c
index 22d0242..6880bdf 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -34,14 +34,11 @@
    a true persistent storage facility would be much harder, since
    it would have to take circular links and sharing into account. */
 
-#include "allobjects.h"
-#include "modsupport.h"
+#include "Python.h"
 #include "longintrepr.h"
 #include "compile.h"
 #include "marshal.h"
 
-#include <errno.h>
-
 #define TYPE_NULL	'0'
 #define TYPE_NONE	'N'
 #define TYPE_ELLIPSIS   '.'
@@ -61,7 +58,7 @@
 	FILE *fp;
 	int error;
 	/* If fp == NULL, the following are valid: */
-	object *str;
+	PyObject *str;
 	char *ptr;
 	char *end;
 } WFILE;
@@ -78,14 +75,15 @@
 	int size, newsize;
 	if (p->str == NULL)
 		return; /* An error already occurred */
-	size = getstringsize(p->str);
+	size = PyString_Size(p->str);
 	newsize = size + 1024;
-	if (resizestring(&p->str, newsize) != 0) {
+	if (_PyString_Resize(&p->str, newsize) != 0) {
 		p->ptr = p->end = NULL;
 	}
 	else {
-		p->ptr = GETSTRINGVALUE((stringobject *)p->str) + size;
-		p->end = GETSTRINGVALUE((stringobject *)p->str) + newsize;
+		p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
+		p->end =
+			PyString_AS_STRING((PyStringObject *)p->str) + newsize;
 		*p->ptr++ = c;
 	}
 }
@@ -140,19 +138,19 @@
 
 static void
 w_object(v, p)
-	object *v;
+	PyObject *v;
 	WFILE *p;
 {
 	int i, n;
 	
 	if (v == NULL)
 		w_byte(TYPE_NULL, p);
-	else if (v == None)
+	else if (v == Py_None)
 		w_byte(TYPE_NONE, p);
 	else if (v == Py_Ellipsis)
 	        w_byte(TYPE_ELLIPSIS, p);  
-	else if (is_intobject(v)) {
-		long x = GETINTVALUE((intobject *)v);
+	else if (PyInt_Check(v)) {
+		long x = PyInt_AS_LONG((PyIntObject *)v);
 #if SIZEOF_LONG > 4
 		long y = x>>31;
 		if (y && y != -1) {
@@ -166,8 +164,8 @@
 			w_long(x, p);
 		}
 	}
-	else if (is_longobject(v)) {
-		longobject *ob = (longobject *)v;
+	else if (PyLong_Check(v)) {
+		PyLongObject *ob = (PyLongObject *)v;
 		w_byte(TYPE_LONG, p);
 		n = ob->ob_size;
 		w_long((long)n, p);
@@ -176,77 +174,81 @@
 		for (i = 0; i < n; i++)
 			w_short(ob->ob_digit[i], p);
 	}
-	else if (is_floatobject(v)) {
-		extern void float_buf_repr PROTO((char *, floatobject *));
+	else if (PyFloat_Check(v)) {
+		extern void PyFloat_AsString
+			Py_PROTO((char *, PyFloatObject *));
 		char buf[256]; /* Plenty to format any double */
-		float_buf_repr(buf, (floatobject *)v);
+		PyFloat_AsString(buf, (PyFloatObject *)v);
 		n = strlen(buf);
 		w_byte(TYPE_FLOAT, p);
 		w_byte(n, p);
 		w_string(buf, n, p);
 	}
 #ifndef WITHOUT_COMPLEX
-	else if (is_complexobject(v)) {
-		extern void float_buf_repr PROTO((char *, floatobject *));
+	else if (PyComplex_Check(v)) {
+		extern void PyFloat_AsString
+			Py_PROTO((char *, PyFloatObject *));
 		char buf[256]; /* Plenty to format any double */
-		floatobject *temp;
+		PyFloatObject *temp;
 		w_byte(TYPE_COMPLEX, p);
-		temp = (floatobject*)newfloatobject(PyComplex_RealAsDouble(v));
-		float_buf_repr(buf, temp);
-		DECREF(temp);
+		temp = (PyFloatObject*)PyFloat_FromDouble(
+			PyComplex_RealAsDouble(v));
+		PyFloat_AsString(buf, temp);
+		Py_DECREF(temp);
 		n = strlen(buf);
 		w_byte(n, p);
 		w_string(buf, n, p);
-		temp = (floatobject*)newfloatobject(PyComplex_ImagAsDouble(v));
-		float_buf_repr(buf, temp);
-		DECREF(temp);
+		temp = (PyFloatObject*)PyFloat_FromDouble(
+			PyComplex_ImagAsDouble(v));
+		PyFloat_AsString(buf, temp);
+		Py_DECREF(temp);
 		n = strlen(buf);
 		w_byte(n, p);
 		w_string(buf, n, p);
 	}
 #endif
-	else if (is_stringobject(v)) {
+	else if (PyString_Check(v)) {
 		w_byte(TYPE_STRING, p);
-		n = getstringsize(v);
+		n = PyString_Size(v);
 		w_long((long)n, p);
-		w_string(getstringvalue(v), n, p);
+		w_string(PyString_AsString(v), n, p);
 	}
-	else if (is_tupleobject(v)) {
+	else if (PyTuple_Check(v)) {
 		w_byte(TYPE_TUPLE, p);
-		n = gettuplesize(v);
+		n = PyTuple_Size(v);
 		w_long((long)n, p);
 		for (i = 0; i < n; i++) {
-			w_object(GETTUPLEITEM(v, i), p);
+			w_object(PyTuple_GET_ITEM(v, i), p);
 		}
 	}
-	else if (is_listobject(v)) {
+	else if (PyList_Check(v)) {
 		w_byte(TYPE_LIST, p);
-		n = getlistsize(v);
+		n = PyList_Size(v);
 		w_long((long)n, p);
 		for (i = 0; i < n; i++) {
-			w_object(getlistitem(v, i), p);
+			w_object(PyList_GetItem(v, i), p);
 		}
 	}
-	else if (is_dictobject(v)) {
+	else if (PyDict_Check(v)) {
 		int pos;
-		object *key, *value;
+		PyObject *key, *value;
 		w_byte(TYPE_DICT, p);
 		/* This one is NULL object terminated! */
 		pos = 0;
-		while (mappinggetnext(v, &pos, &key, &value)) {
+		while (PyDict_Next(v, &pos, &key, &value)) {
 			w_object(key, p);
 			w_object(value, p);
 		}
-		w_object((object *)NULL, p);
+		w_object((PyObject *)NULL, p);
 	}
-	else if (is_codeobject(v)) {
-		codeobject *co = (codeobject *)v;
+	else if (PyCode_Check(v)) {
+		PyCodeObject *co = (PyCodeObject *)v;
 		w_byte(TYPE_CODE, p);
 		w_short(co->co_argcount, p);
 		w_short(co->co_nlocals, p);
 		w_short(co->co_stacksize, p);
 		w_short(co->co_flags, p);
-		w_object((object *)co->co_code, p);
+		w_object((PyObject *)co->co_code, p);
 		w_object(co->co_consts, p);
 		w_object(co->co_names, p);
 		w_object(co->co_varnames, p);
@@ -262,7 +264,7 @@
 }
 
 void
-wr_long(x, fp)
+PyMarshal_WriteLongToFile(x, fp)
 	long x;
 	FILE *fp;
 {
@@ -273,8 +275,8 @@
 }
 
 void
-wr_object(x, fp)
-	object *x;
+PyMarshal_WriteObjectToFile(x, fp)
+	PyObject *x;
 	FILE *fp;
 {
 	WFILE wf;
@@ -351,10 +353,10 @@
 	x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
 #else
 	if (r_long(p) != 0) {
-		object *f = sysget("stderr");
-		err_clear();
+		PyObject *f = PySys_GetObject("stderr");
+		PyErr_Clear();
 		if (f != NULL)
-			writestring(
+			PyFile_WriteString(
 			    "Warning: un-marshal 64-bit int in 32-bit mode\n",
 			    f);
 	}
@@ -362,60 +364,61 @@
 	return x;
 }
 
-static object *
+static PyObject *
 r_object(p)
 	RFILE *p;
 {
-	object *v, *v2;
+	PyObject *v, *v2;
 	long i, n;
 	int type = r_byte(p);
 	
 	switch (type) {
 	
 	case EOF:
-		err_setstr(EOFError, "EOF read where object expected");
+		PyErr_SetString(PyExc_EOFError,
+				"EOF read where object expected");
 		return NULL;
 	
 	case TYPE_NULL:
 		return NULL;
 	
 	case TYPE_NONE:
-		INCREF(None);
-		return None;
+		Py_INCREF(Py_None);
+		return Py_None;
 	
 	case TYPE_ELLIPSIS:
-		INCREF(Py_Ellipsis);
+		Py_INCREF(Py_Ellipsis);
 		return Py_Ellipsis;
 	
 	case TYPE_INT:
-		return newintobject(r_long(p));
+		return PyInt_FromLong(r_long(p));
 	
 	case TYPE_INT64:
-		return newintobject(r_long64(p));
+		return PyInt_FromLong(r_long64(p));
 	
 	case TYPE_LONG:
 		{
 			int size;
-			longobject *ob;
+			PyLongObject *ob;
 			n = r_long(p);
 			size = n<0 ? -n : n;
-			ob = alloclongobject(size);
+			ob = _PyLong_New(size);
 			if (ob == NULL)
 				return NULL;
 			ob->ob_size = n;
 			for (i = 0; i < size; i++)
 				ob->ob_digit[i] = r_short(p);
-			return (object *)ob;
+			return (PyObject *)ob;
 		}
 	
 	case TYPE_FLOAT:
 		{
-			extern double atof PROTO((const char *));
+			extern double atof Py_PROTO((const char *));
 			char buf[256];
 			double dx;
 			n = r_byte(p);
 			if (r_string(buf, (int)n, p) != n) {
-				err_setstr(EOFError,
+				PyErr_SetString(PyExc_EOFError,
 					"EOF read where object expected");
 				return NULL;
 			}
@@ -423,18 +426,18 @@
 			PyFPE_START_PROTECT("atof", return 0)
 			dx = atof(buf);
 			PyFPE_END_PROTECT(dx)
-			return newfloatobject(dx);
+			return PyFloat_FromDouble(dx);
 		}
 	
 #ifndef WITHOUT_COMPLEX
 	case TYPE_COMPLEX:
 		{
-			extern double atof PROTO((const char *));
+			extern double atof Py_PROTO((const char *));
 			char buf[256];
 			Py_complex c;
 			n = r_byte(p);
 			if (r_string(buf, (int)n, p) != n) {
-				err_setstr(EOFError,
+				PyErr_SetString(PyExc_EOFError,
 					"EOF read where object expected");
 				return NULL;
 			}
@@ -444,7 +447,7 @@
 			PyFPE_END_PROTECT(c)
 			n = r_byte(p);
 			if (r_string(buf, (int)n, p) != n) {
-				err_setstr(EOFError,
+				PyErr_SetString(PyExc_EOFError,
 					"EOF read where object expected");
 				return NULL;
 			}
@@ -452,18 +455,18 @@
 			PyFPE_START_PROTECT("atof", return 0)
 			c.imag = atof(buf);
 			PyFPE_END_PROTECT(c)
-			return newcomplexobject(c);
+			return PyComplex_FromCComplex(c);
 		}
 #endif
 	
 	case TYPE_STRING:
 		n = r_long(p);
-		v = newsizedstringobject((char *)NULL, n);
+		v = PyString_FromStringAndSize((char *)NULL, n);
 		if (v != NULL) {
-			if (r_string(getstringvalue(v), (int)n, p) != n) {
-				DECREF(v);
+			if (r_string(PyString_AsString(v), (int)n, p) != n) {
+				Py_DECREF(v);
 				v = NULL;
-				err_setstr(EOFError,
+				PyErr_SetString(PyExc_EOFError,
 					"EOF read where object expected");
 			}
 		}
@@ -471,50 +474,50 @@
 	
 	case TYPE_TUPLE:
 		n = r_long(p);
-		v = newtupleobject((int)n);
+		v = PyTuple_New((int)n);
 		if (v == NULL)
 			return v;
 		for (i = 0; i < n; i++) {
 			v2 = r_object(p);
 			if ( v2 == NULL ) {
-				DECREF(v);
+				Py_DECREF(v);
 				v = NULL;
 				break;
 			}
-			SETTUPLEITEM(v, (int)i, v2);
+			PyTuple_SET_ITEM(v, (int)i, v2);
 		}
 		return v;
 	
 	case TYPE_LIST:
 		n = r_long(p);
-		v = newlistobject((int)n);
+		v = PyList_New((int)n);
 		if (v == NULL)
 			return v;
 		for (i = 0; i < n; i++) {
 			v2 = r_object(p);
 			if ( v2 == NULL ) {
-				DECREF(v);
+				Py_DECREF(v);
 				v = NULL;
 				break;
 			}
-			setlistitem(v, (int)i, v2);
+			PyList_SetItem(v, (int)i, v2);
 		}
 		return v;
 	
 	case TYPE_DICT:
-		v = newdictobject();
+		v = PyDict_New();
 		if (v == NULL)
 			return NULL;
 		for (;;) {
-			object *key, *val;
+			PyObject *key, *val;
 			key = r_object(p);
 			if (key == NULL)
 				break; /* XXX Assume TYPE_NULL, not an error */
 			val = r_object(p);
 			if (val != NULL)
-				dict2insert(v, key, val);
-			DECREF(key);
-			XDECREF(val);
+				PyDict_SetItem(v, key, val);
+			Py_DECREF(key);
+			Py_XDECREF(val);
 		}
 		return v;
 	
@@ -524,14 +527,14 @@
 			int nlocals = r_short(p);
 			int stacksize = r_short(p);
 			int flags = r_short(p);
-			object *code = NULL;
-			object *consts = NULL;
-			object *names = NULL;
-			object *varnames = NULL;
-			object *filename = NULL;
-			object *name = NULL;
+			PyObject *code = NULL;
+			PyObject *consts = NULL;
+			PyObject *names = NULL;
+			PyObject *varnames = NULL;
+			PyObject *filename = NULL;
+			PyObject *name = NULL;
 			int firstlineno = 0;
-			object *lnotab = NULL;
+			PyObject *lnotab = NULL;
 			
 			code = r_object(p);
 			if (code) consts = r_object(p);
@@ -544,20 +547,20 @@
 				lnotab = r_object(p);
 			}
 			
-			if (!err_occurred()) {
-				v = (object *) newcodeobject(
+			if (!PyErr_Occurred()) {
+				v = (PyObject *) PyCode_New(
 					argcount, nlocals, stacksize, flags, 
 					code, consts, names, varnames,
 					filename, name, firstlineno, lnotab);
 			}
 			else
 				v = NULL;
-			XDECREF(code);
-			XDECREF(consts);
-			XDECREF(names);
-			XDECREF(varnames);
-			XDECREF(filename);
-			XDECREF(name);
+			Py_XDECREF(code);
+			Py_XDECREF(consts);
+			Py_XDECREF(names);
+			Py_XDECREF(varnames);
+			Py_XDECREF(filename);
+			Py_XDECREF(name);
 
 		}
 		return v;
@@ -565,14 +568,14 @@
 	default:
 		/* Bogus data got written, which isn't ideal.
 		   This will let you keep working and recover. */
-		INCREF(None);
-		return None;
+		Py_INCREF(Py_None);
+		return Py_None;
 	
 	}
 }
 
 long
-rd_long(fp)
+PyMarshal_ReadLongFromFile(fp)
 	FILE *fp;
 {
 	RFILE rf;
@@ -580,13 +583,12 @@
 	return r_long(&rf);
 }
 
-object *
-rd_object(fp)
+PyObject *
+PyMarshal_ReadObjectFromFile(fp)
 	FILE *fp;
 {
 	RFILE rf;
-	if (err_occurred()) {
-		fatal("XXX rd_object called with exception set"); /* tmp */
+	if (PyErr_Occurred()) {
 		fprintf(stderr, "XXX rd_object called with exception set\n");
 		return NULL;
 	}
@@ -594,13 +596,13 @@
 	return r_object(&rf);
 }
 
-object *
-rds_object(str, len)
+PyObject *
+PyMarshal_ReadObjectFromString(str, len)
 	char *str;
 	int len;
 {
 	RFILE rf;
-	if (err_occurred()) {
+	if (PyErr_Occurred()) {
 		fprintf(stderr, "XXX rds_object called with exception set\n");
 		return NULL;
 	}
@@ -611,25 +613,26 @@
 	return r_object(&rf);
 }
 
-object *
+PyObject *
 PyMarshal_WriteObjectToString(x) /* wrs_object() */
-	object *x;
+	PyObject *x;
 {
 	WFILE wf;
 	wf.fp = NULL;
-	wf.str = newsizedstringobject((char *)NULL, 50);
+	wf.str = PyString_FromStringAndSize((char *)NULL, 50);
 	if (wf.str == NULL)
 		return NULL;
-	wf.ptr = GETSTRINGVALUE((stringobject *)wf.str);
-	wf.end = wf.ptr + getstringsize(wf.str);
+	wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
+	wf.end = wf.ptr + PyString_Size(wf.str);
 	wf.error = 0;
 	w_object(x, &wf);
 	if (wf.str != NULL)
-		resizestring(&wf.str,
-		    (int) (wf.ptr - GETSTRINGVALUE((stringobject *)wf.str)));
+		_PyString_Resize(&wf.str,
+		    (int) (wf.ptr -
+			   PyString_AS_STRING((PyStringObject *)wf.str)));
 	if (wf.error) {
-		XDECREF(wf.str);
-		err_setstr(ValueError, "unmarshallable object");
+		Py_XDECREF(wf.str);
+		PyErr_SetString(PyExc_ValueError, "unmarshallable object");
 		return NULL;
 	}
 	return wf.str;
@@ -637,95 +640,97 @@
 
 /* And an interface for Python programs... */
 
-static object *
+static PyObject *
 marshal_dump(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	WFILE wf;
-	object *x;
-	object *f;
-	if (!getargs(args, "(OO)", &x, &f))
+	PyObject *x;
+	PyObject *f;
+	if (!PyArg_Parse(args, "(OO)", &x, &f))
 		return NULL;
-	if (!is_fileobject(f)) {
-		err_setstr(TypeError, "marshal.dump() 2nd arg must be file");
+	if (!PyFile_Check(f)) {
+		PyErr_SetString(PyExc_TypeError,
+				"marshal.dump() 2nd arg must be file");
 		return NULL;
 	}
-	wf.fp = getfilefile(f);
+	wf.fp = PyFile_AsFile(f);
 	wf.str = NULL;
 	wf.ptr = wf.end = NULL;
 	wf.error = 0;
 	w_object(x, &wf);
 	if (wf.error) {
-		err_setstr(ValueError, "unmarshallable object");
+		PyErr_SetString(PyExc_ValueError, "unmarshallable object");
 		return NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 marshal_load(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	RFILE rf;
-	object *f;
-	object *v;
-	if (!getargs(args, "O", &f))
+	PyObject *f;
+	PyObject *v;
+	if (!PyArg_Parse(args, "O", &f))
 		return NULL;
-	if (!is_fileobject(f)) {
-		err_setstr(TypeError, "marshal.load() arg must be file");
+	if (!PyFile_Check(f)) {
+		PyErr_SetString(PyExc_TypeError,
+				"marshal.load() arg must be file");
 		return NULL;
 	}
-	rf.fp = getfilefile(f);
+	rf.fp = PyFile_AsFile(f);
 	rf.str = NULL;
 	rf.ptr = rf.end = NULL;
-	err_clear();
+	PyErr_Clear();
 	v = r_object(&rf);
-	if (err_occurred()) {
-		XDECREF(v);
+	if (PyErr_Occurred()) {
+		Py_XDECREF(v);
 		v = NULL;
 	}
 	return v;
 }
 
-static object *
+static PyObject *
 marshal_dumps(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	object *x;
-	if (!getargs(args, "O", &x))
+	PyObject *x;
+	if (!PyArg_Parse(args, "O", &x))
 		return NULL;
 	return PyMarshal_WriteObjectToString(x);
 }
 
-static object *
+static PyObject *
 marshal_loads(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	RFILE rf;
-	object *v;
+	PyObject *v;
 	char *s;
 	int n;
-	if (!getargs(args, "s#", &s, &n))
+	if (!PyArg_Parse(args, "s#", &s, &n))
 		return NULL;
 	rf.fp = NULL;
 	rf.str = args;
 	rf.ptr = s;
 	rf.end = s + n;
-	err_clear();
+	PyErr_Clear();
 	v = r_object(&rf);
-	if (err_occurred()) {
-		XDECREF(v);
+	if (PyErr_Occurred()) {
+		Py_XDECREF(v);
 		v = NULL;
 	}
 	return v;
 }
 
-static struct methodlist marshal_methods[] = {
+static PyMethodDef marshal_methods[] = {
 	{"dump",	marshal_dump},
 	{"load",	marshal_load},
 	{"dumps",	marshal_dumps},
@@ -734,7 +739,7 @@
 };
 
 void
-initmarshal()
+PyMarshal_Init()
 {
-	(void) initmodule("marshal", marshal_methods);
+	(void) Py_InitModule("marshal", marshal_methods);
 }
diff --git a/Python/modsupport.c b/Python/modsupport.c
index 6538323..df5ebfa 100644
--- a/Python/modsupport.c
+++ b/Python/modsupport.c
@@ -31,8 +31,7 @@
 
 /* Module support implementation */
 
-#include "allobjects.h"
-#include "import.h"
+#include "Python.h"
 
 #ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
 typedef extended va_double;
@@ -53,37 +52,39 @@
 "WARNING: Python C API version mismatch for module %s:\n\
   This Python has API version %d, module %s has version %d.\n";
 
-object *
-initmodule4(name, methods, doc, passthrough, module_api_version)
+PyObject *
+Py_InitModule4(name, methods, doc, passthrough, module_api_version)
 	char *name;
-	struct methodlist *methods;
+	PyMethodDef *methods;
 	char *doc;
-	object *passthrough;
+	PyObject *passthrough;
 	int module_api_version;
 {
-	object *m, *d, *v;
-	struct methodlist *ml;
+	PyObject *m, *d, *v;
+	PyMethodDef *ml;
 	if (module_api_version != PYTHON_API_VERSION)
 		fprintf(stderr, api_version_warning,
 			name, PYTHON_API_VERSION, name, module_api_version);
-	if ((m = add_module(name)) == NULL) {
+	if ((m = PyImport_AddModule(name)) == NULL) {
 		fprintf(stderr, "initializing module: %s\n", name);
-		fatal("can't create a module");
+		Py_FatalError("can't create a module");
 	}
-	d = getmoduledict(m);
+	d = PyModule_GetDict(m);
 	for (ml = methods; ml->ml_name != NULL; ml++) {
-		v = newmethodobject(ml, passthrough);
-		if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
+		v = PyCFunction_New(ml, passthrough);
+		if (v == NULL ||
+		    PyDict_SetItemString(d, ml->ml_name, v) != 0)
+		{
 			fprintf(stderr, "initializing module: %s\n", name);
-			fatal("can't initialize module");
+			Py_FatalError("can't initialize module");
 		}
-		DECREF(v);
+		Py_DECREF(v);
 	}
 	if (doc != NULL) {
-		v = newstringobject(doc);
-		if (v == NULL || dictinsert(d, "__doc__", v) != 0)
-			fatal("can't add doc string");
-		DECREF(v);
+		v = PyString_FromString(doc);
+		if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
+			Py_FatalError("can't add doc string");
+		Py_DECREF(v);
 	}
 	return m;
 }
@@ -91,7 +92,7 @@
 
 /* Helper for mkvalue() to scan the length of a format */
 
-static int countformat PROTO((char *format, int endchar));
+static int countformat Py_PROTO((char *format, int endchar));
 static int countformat(format, endchar)
 	char *format;
 	int endchar;
@@ -102,7 +103,8 @@
 		switch (*format) {
 		case '\0':
 			/* Premature end */
-			err_setstr(SystemError, "unmatched paren in format");
+			PyErr_SetString(PyExc_SystemError,
+					"unmatched paren in format");
 			return -1;
 		case '(':
 		case '[':
@@ -136,118 +138,121 @@
 /* Generic function to create a value -- the inverse of getargs() */
 /* After an original idea and first implementation by Steven Miale */
 
-static object *do_mktuple PROTO((char**, va_list *, int, int));
-static object *do_mklist PROTO((char**, va_list *, int, int));
-static object *do_mkdict PROTO((char**, va_list *, int, int));
-static object *do_mkvalue PROTO((char**, va_list *));
+static PyObject *do_mktuple Py_PROTO((char**, va_list *, int, int));
+static PyObject *do_mklist Py_PROTO((char**, va_list *, int, int));
+static PyObject *do_mkdict Py_PROTO((char**, va_list *, int, int));
+static PyObject *do_mkvalue Py_PROTO((char**, va_list *));
 
 
-static object *
+static PyObject *
 do_mkdict(p_format, p_va, endchar, n)
 	char **p_format;
 	va_list *p_va;
 	int endchar;
 	int n;
 {
-	object *d;
+	PyObject *d;
 	int i;
 	if (n < 0)
 		return NULL;
-	if ((d = newdictobject()) == NULL)
+	if ((d = PyDict_New()) == NULL)
 		return NULL;
 	for (i = 0; i < n; i+= 2) {
-		object *k, *v;
+		PyObject *k, *v;
 		k = do_mkvalue(p_format, p_va);
 		if (k == NULL) {
-			DECREF(d);
+			Py_DECREF(d);
 			return NULL;
 		}
 		v = do_mkvalue(p_format, p_va);
 		if (v == NULL) {
-			DECREF(k);
-			DECREF(d);
+			Py_DECREF(k);
+			Py_DECREF(d);
 			return NULL;
 		}
-		if (dict2insert(d, k, v) < 0) {
-			DECREF(k);
-			DECREF(v);
-			DECREF(d);
+		if (PyDict_SetItem(d, k, v) < 0) {
+			Py_DECREF(k);
+			Py_DECREF(v);
+			Py_DECREF(d);
 			return NULL;
 		}
 	}
 	if (d != NULL && **p_format != endchar) {
-		DECREF(d);
+		Py_DECREF(d);
 		d = NULL;
-		err_setstr(SystemError, "Unmatched paren in format");
+		PyErr_SetString(PyExc_SystemError,
+				"Unmatched paren in format");
 	}
 	else if (endchar)
 		++*p_format;
 	return d;
 }
 
-static object *
+static PyObject *
 do_mklist(p_format, p_va, endchar, n)
 	char **p_format;
 	va_list *p_va;
 	int endchar;
 	int n;
 {
-	object *v;
+	PyObject *v;
 	int i;
 	if (n < 0)
 		return NULL;
-	if ((v = newlistobject(n)) == NULL)
+	if ((v = PyList_New(n)) == NULL)
 		return NULL;
 	for (i = 0; i < n; i++) {
-		object *w = do_mkvalue(p_format, p_va);
+		PyObject *w = do_mkvalue(p_format, p_va);
 		if (w == NULL) {
-			DECREF(v);
+			Py_DECREF(v);
 			return NULL;
 		}
-		setlistitem(v, i, w);
+		PyList_SetItem(v, i, w);
 	}
 	if (v != NULL && **p_format != endchar) {
-		DECREF(v);
+		Py_DECREF(v);
 		v = NULL;
-		err_setstr(SystemError, "Unmatched paren in format");
+		PyErr_SetString(PyExc_SystemError,
+				"Unmatched paren in format");
 	}
 	else if (endchar)
 		++*p_format;
 	return v;
 }
 
-static object *
+static PyObject *
 do_mktuple(p_format, p_va, endchar, n)
 	char **p_format;
 	va_list *p_va;
 	int endchar;
 	int n;
 {
-	object *v;
+	PyObject *v;
 	int i;
 	if (n < 0)
 		return NULL;
-	if ((v = newtupleobject(n)) == NULL)
+	if ((v = PyTuple_New(n)) == NULL)
 		return NULL;
 	for (i = 0; i < n; i++) {
-		object *w = do_mkvalue(p_format, p_va);
+		PyObject *w = do_mkvalue(p_format, p_va);
 		if (w == NULL) {
-			DECREF(v);
+			Py_DECREF(v);
 			return NULL;
 		}
-		settupleitem(v, i, w);
+		PyTuple_SetItem(v, i, w);
 	}
 	if (v != NULL && **p_format != endchar) {
-		DECREF(v);
+		Py_DECREF(v);
 		v = NULL;
-		err_setstr(SystemError, "Unmatched paren in format");
+		PyErr_SetString(PyExc_SystemError,
+				"Unmatched paren in format");
 	}
 	else if (endchar)
 		++*p_format;
 	return v;
 }
 
-static object *
+static PyObject *
 do_mkvalue(p_format, p_va)
 	char **p_format;
 	va_list *p_va;
@@ -269,26 +274,27 @@
 		case 'b':
 		case 'h':
 		case 'i':
-			return newintobject((long)va_arg(*p_va, int));
+			return PyInt_FromLong((long)va_arg(*p_va, int));
 
 		case 'l':
-			return newintobject((long)va_arg(*p_va, long));
+			return PyInt_FromLong((long)va_arg(*p_va, long));
 
 		case 'f':
 		case 'd':
-			return newfloatobject((double)va_arg(*p_va, va_double));
+			return PyFloat_FromDouble(
+				(double)va_arg(*p_va, va_double));
 
 		case 'c':
 		{
 			char p[1];
 			p[0] = va_arg(*p_va, int);
-			return newsizedstringobject(p, 1);
+			return PyString_FromStringAndSize(p, 1);
 		}
 
 		case 's':
 		case 'z':
 		{
-			object *v;
+			PyObject *v;
 			char *str = va_arg(*p_va, char *);
 			int n;
 			if (**p_format == '#') {
@@ -298,13 +304,13 @@
 			else
 				n = -1;
 			if (str == NULL) {
-				v = None;
-				INCREF(v);
+				v = Py_None;
+				Py_INCREF(v);
 			}
 			else {
 				if (n < 0)
 					n = strlen(str);
-				v = newsizedstringobject(str, n);
+				v = PyString_FromStringAndSize(str, n);
 			}
 			return v;
 		}
@@ -312,18 +318,18 @@
 		case 'S':
 		case 'O':
 		if (**p_format == '&') {
-			typedef object *(*converter) PROTO((void *));
+			typedef PyObject *(*converter) Py_PROTO((void *));
 			converter func = va_arg(*p_va, converter);
 			void *arg = va_arg(*p_va, void *);
 			++*p_format;
 			return (*func)(arg);
 		}
 		else {
-			object *v;
-			v = va_arg(*p_va, object *);
+			PyObject *v;
+			v = va_arg(*p_va, PyObject *);
 			if (v != NULL)
-				INCREF(v);
-			else if (!err_occurred())
+				Py_INCREF(v);
+			else if (!PyErr_Occurred())
 				/* If a NULL was passed
 				 * because a call that should
 				 * have constructed a value
@@ -332,7 +338,7 @@
 				 * no error occurred it's not
 				 * clear that the caller knew
 				 * what she was doing. */
-				err_setstr(SystemError,
+				PyErr_SetString(PyExc_SystemError,
 					   "NULL object passed to mkvalue");
 			return v;
 		}
@@ -344,7 +350,7 @@
 			break;
 
 		default:
-			err_setstr(SystemError,
+			PyErr_SetString(PyExc_SystemError,
 				   "bad format char passed to mkvalue");
 			return NULL;
 
@@ -355,14 +361,14 @@
 
 #ifdef HAVE_STDARG_PROTOTYPES
 /* VARARGS 2 */
-object *mkvalue(char *format, ...)
+PyObject *Py_BuildValue(char *format, ...)
 #else
 /* VARARGS */
-object *mkvalue(va_alist) va_dcl
+PyObject *Py_BuildValue(va_alist) va_dcl
 #endif
 {
 	va_list va;
-	object* retval;
+	PyObject* retval;
 #ifdef HAVE_STDARG_PROTOTYPES
 	va_start(va, format);
 #else
@@ -370,13 +376,13 @@
 	va_start(va);
 	format = va_arg(va, char *);
 #endif
-	retval = vmkvalue(format, va);
+	retval = Py_VaBuildValue(format, va);
 	va_end(va);
 	return retval;
 }
 
-object *
-vmkvalue(format, va)
+PyObject *
+Py_VaBuildValue(format, va)
 	char *format;
 	va_list va;
 {
@@ -393,8 +399,8 @@
 	if (n < 0)
 		return NULL;
 	if (n == 0) {
-		INCREF(None);
-		return None;
+		Py_INCREF(Py_None);
+		return Py_None;
 	}
 	if (n == 1)
 		return do_mkvalue(&f, &lva);
@@ -403,19 +409,19 @@
 
 
 #ifdef HAVE_STDARG_PROTOTYPES
-object *
-PyEval_CallFunction(object *obj, char *format, ...)
+PyObject *
+PyEval_CallFunction(PyObject *obj, char *format, ...)
 #else
-object *
+PyObject *
 PyEval_CallFunction(obj, format, va_alist)
-	object *obj;
+	PyObject *obj;
 	char *format;
 	va_dcl
 #endif
 {
 	va_list vargs;
-	object *args;
-	object *res;
+	PyObject *args;
+	PyObject *res;
 
 #ifdef HAVE_STDARG_PROTOTYPES
 	va_start(vargs, format);
@@ -423,37 +429,37 @@
 	va_start(vargs);
 #endif
 
-	args = vmkvalue(format, vargs);
+	args = Py_VaBuildValue(format, vargs);
 	va_end(vargs);
 
 	if (args == NULL)
 		return NULL;
 
-	res = call_object(obj, args);
-	DECREF(args);
+	res = PyEval_CallObject(obj, args);
+	Py_DECREF(args);
 
 	return res;
 }
 
 
 #ifdef HAVE_STDARG_PROTOTYPES
-object *
-PyEval_CallMethod(object *obj, char *methonname, char *format, ...)
+PyObject *
+PyEval_CallMethod(PyObject *obj, char *methonname, char *format, ...)
 #else
-object *
+PyObject *
 PyEval_CallMethod(obj, methonname, format, va_alist)
-	object *obj;
+	PyObject *obj;
 	char *methonname;
 	char *format;
 	va_dcl
 #endif
 {
 	va_list vargs;
-	object *meth;
-	object *args;
-	object *res;
+	PyObject *meth;
+	PyObject *args;
+	PyObject *res;
 
-	meth = getattr(obj, methonname);
+	meth = PyObject_GetAttrString(obj, methonname);
 	if (meth == NULL)
 		return NULL;
 
@@ -463,17 +469,17 @@
 	va_start(vargs);
 #endif
 
-	args = vmkvalue(format, vargs);
+	args = Py_VaBuildValue(format, vargs);
 	va_end(vargs);
 
 	if (args == NULL) {
-		DECREF(meth);
+		Py_DECREF(meth);
 		return NULL;
 	}
 
-	res = call_object(meth, args);
-	DECREF(meth);
-	DECREF(args);
+	res = PyEval_CallObject(meth, args);
+	Py_DECREF(meth);
+	Py_DECREF(args);
 
 	return res;
 }
diff --git a/Python/sigcheck.c b/Python/sigcheck.c
index a0f8179..81785ef 100644
--- a/Python/sigcheck.c
+++ b/Python/sigcheck.c
@@ -36,15 +36,14 @@
    overridden (at link time) by a more powerful version implemented in
    signalmodule.c. */
 
-#include "allobjects.h"
-#include "intrcheck.h"
+#include "Python.h"
 
 /* ARGSUSED */
 int
-sigcheck()
+PyErr_CheckSignals()
 {
-	if (!intrcheck())
+	if (!PyOS_InterruptOccurred())
 		return 0;
-	err_set(KeyboardInterrupt);
+	PyErr_SetNone(PyExc_KeyboardInterrupt);
 	return -1;
 }
diff --git a/Python/structmember.c b/Python/structmember.c
index f5cca97..02464c6 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -31,35 +31,36 @@
 
 /* Map C struct members to Python object attributes */
 
-#include "allobjects.h"
+#include "Python.h"
 
 #include "structmember.h"
 
-static object *
+static PyObject *
 listmembers(mlist)
 	struct memberlist *mlist;
 {
 	int i, n;
-	object *v;
+	PyObject *v;
 	for (n = 0; mlist[n].name != NULL; n++)
 		;
-	v = newlistobject(n);
+	v = PyList_New(n);
 	if (v != NULL) {
 		for (i = 0; i < n; i++)
-			setlistitem(v, i, newstringobject(mlist[i].name));
-		if (err_occurred()) {
-			DECREF(v);
+			PyList_SetItem(v, i,
+				       PyString_FromString(mlist[i].name));
+		if (PyErr_Occurred()) {
+			Py_DECREF(v);
 			v = NULL;
 		}
 		else {
-			sortlist(v);
+			PyList_Sort(v);
 		}
 	}
 	return v;
 }
 
-object *
-getmember(addr, mlist, name)
+PyObject *
+PyMember_Get(addr, mlist, name)
 	char *addr;
 	struct memberlist *mlist;
 	char *name;
@@ -70,111 +71,118 @@
 		return listmembers(mlist);
 	for (l = mlist; l->name != NULL; l++) {
 		if (strcmp(l->name, name) == 0) {
-			object *v;
+			PyObject *v;
 			addr += l->offset;
 			switch (l->type) {
 			case T_BYTE:
-				v = newintobject((long)
+				v = PyInt_FromLong((long)
 						 (((*(char*)addr & 0xff)
 						   ^ 0x80) - 0x80));
 				break;
 			case T_UBYTE:
-				v = newintobject((long) *(char*)addr & 0xff);
+				v = PyInt_FromLong((long) *(char*)addr & 0xff);
 				break;
 			case T_SHORT:
-				v = newintobject((long) *(short*)addr);
+				v = PyInt_FromLong((long) *(short*)addr);
 				break;
 			case T_USHORT:
-				v = newintobject((long)
+				v = PyInt_FromLong((long)
 						 *(unsigned short*)addr);
 				break;
 			case T_INT:
-				v = newintobject((long) *(int*)addr);
+				v = PyInt_FromLong((long) *(int*)addr);
 				break;
 			case T_UINT:
-				v = newintobject((long) *(unsigned int*)addr);
+				v = PyInt_FromLong((long)
+						   *(unsigned int*)addr);
 				break;
 			case T_LONG:
-				v = newintobject(*(long*)addr);
+				v = PyInt_FromLong(*(long*)addr);
 				break;
 			case T_ULONG:
-				v = dnewlongobject((double)
+				v = PyLong_FromDouble((double)
 						   *(unsigned long*)addr);
 				break;
 			case T_FLOAT:
-				v = newfloatobject((double)*(float*)addr);
+				v = PyFloat_FromDouble((double)*(float*)addr);
 				break;
 			case T_DOUBLE:
-				v = newfloatobject(*(double*)addr);
+				v = PyFloat_FromDouble(*(double*)addr);
 				break;
 			case T_STRING:
 				if (*(char**)addr == NULL) {
-					INCREF(None);
-					v = None;
+					Py_INCREF(Py_None);
+					v = Py_None;
 				}
 				else
-					v = newstringobject(*(char**)addr);
+					v = PyString_FromString(*(char**)addr);
 				break;
 			case T_STRING_INPLACE:
-				v = newstringobject((char*)addr);
+				v = PyString_FromString((char*)addr);
 				break;
 #ifdef macintosh
 			case T_PSTRING:
 				if (*(char**)addr == NULL) {
-					INCREF(None);
-					v = None;
+					Py_INCREF(Py_None);
+					v = Py_None;
 				}
 				else
-					v = newsizedstringobject((*(char**)addr)+1,
-											**(unsigned char**)addr);
+					v = PyString_FromStringAndSize(
+						(*(char**)addr)+1,
+						**(unsigned char**)addr);
 				break;
 			case T_PSTRING_INPLACE:
-				v = newsizedstringobject(((char*)addr)+1,
-											*(unsigned char*)addr);
+				v = PyString_FromStringAndSize(
+					((char*)addr)+1,
+					*(unsigned char*)addr);
 				break;
 #endif /* macintosh */
 			case T_CHAR:
-				v = newsizedstringobject((char*)addr, 1);
+				v = PyString_FromStringAndSize((char*)addr, 1);
 				break;
 			case T_OBJECT:
-				v = *(object **)addr;
+				v = *(PyObject **)addr;
 				if (v == NULL)
-					v = None;
-				INCREF(v);
+					v = Py_None;
+				Py_INCREF(v);
 				break;
 			default:
-				err_setstr(SystemError, "bad memberlist type");
+				PyErr_SetString(PyExc_SystemError,
+						"bad memberlist type");
 				v = NULL;
 			}
 			return v;
 		}
 	}
 	
-	err_setstr(AttributeError, name);
+	PyErr_SetString(PyExc_AttributeError, name);
 	return NULL;
 }
 
 int
-setmember(addr, mlist, name, v)
+PyMember_Set(addr, mlist, name, v)
 	char *addr;
 	struct memberlist *mlist;
 	char *name;
-	object *v;
+	PyObject *v;
 {
 	struct memberlist *l;
 	
 	for (l = mlist; l->name != NULL; l++) {
 		if (strcmp(l->name, name) == 0) {
 #ifdef macintosh
-			if (l->readonly || l->type == T_STRING || l->type == T_PSTRING) {
+			if (l->readonly || l->type == T_STRING ||
+			    l->type == T_PSTRING)
+			{
 #else
 			if (l->readonly || l->type == T_STRING ) {
 #endif /* macintosh */
-				err_setstr(TypeError, "readonly attribute");
+				PyErr_SetString(PyExc_TypeError,
+						"readonly attribute");
 				return -1;
 			}
 			if (v == NULL && l->type != T_OBJECT) {
-				err_setstr(TypeError,
+				PyErr_SetString(PyExc_TypeError,
 				  "can't delete numeric/char attribute");
 				return -1;
 			}
@@ -182,90 +190,92 @@
 			switch (l->type) {
 			case T_BYTE:
 			case T_UBYTE:
-				if (!is_intobject(v)) {
-					err_badarg();
+				if (!PyInt_Check(v)) {
+					PyErr_BadArgument();
 					return -1;
 				}
-				*(char*)addr = (char) getintvalue(v);
+				*(char*)addr = (char) PyInt_AsLong(v);
 				break;
 			case T_SHORT:
 			case T_USHORT:
-				if (!is_intobject(v)) {
-					err_badarg();
+				if (!PyInt_Check(v)) {
+					PyErr_BadArgument();
 					return -1;
 				}
-				*(short*)addr = (short) getintvalue(v);
+				*(short*)addr = (short) PyInt_AsLong(v);
 				break;
 			case T_UINT:
 			case T_INT:
-				if (!is_intobject(v)) {
-					err_badarg();
+				if (!PyInt_Check(v)) {
+					PyErr_BadArgument();
 					return -1;
 				}
-				*(int*)addr = (int) getintvalue(v);
+				*(int*)addr = (int) PyInt_AsLong(v);
 				break;
 			case T_LONG:
-				if (!is_intobject(v)) {
-					err_badarg();
+				if (!PyInt_Check(v)) {
+					PyErr_BadArgument();
 					return -1;
 				}
-				*(long*)addr = getintvalue(v);
+				*(long*)addr = PyInt_AsLong(v);
 				break;
 			case T_ULONG:
-				if (is_intobject(v))
-					*(long*)addr = getintvalue(v);
-				else if (is_longobject(v))
-					*(long*)addr = getlongvalue(v);
+				if (PyInt_Check(v))
+					*(long*)addr = PyInt_AsLong(v);
+				else if (PyLong_Check(v))
+					*(long*)addr = PyLong_AsLong(v);
 				else {
-					err_badarg();
+					PyErr_BadArgument();
 					return -1;
 				}
 				break;
 			case T_FLOAT:
-				if (is_intobject(v))
-					*(float*)addr = (float) getintvalue(v);
-				else if (is_floatobject(v))
+				if (PyInt_Check(v))
 					*(float*)addr =
-						(float) getfloatvalue(v);
+						(float) PyInt_AsLong(v);
+				else if (PyFloat_Check(v))
+					*(float*)addr =
+						(float) PyFloat_AsDouble(v);
 				else {
-					err_badarg();
+					PyErr_BadArgument();
 					return -1;
 				}
 				break;
 			case T_DOUBLE:
-				if (is_intobject(v))
+				if (PyInt_Check(v))
 					*(double*)addr =
-						(double) getintvalue(v);
-				else if (is_floatobject(v))
-					*(double*)addr = getfloatvalue(v);
+						(double) PyInt_AsLong(v);
+				else if (PyFloat_Check(v))
+					*(double*)addr = PyFloat_AsDouble(v);
 				else {
-					err_badarg();
+					PyErr_BadArgument();
 					return -1;
 				}
 				break;
 			case T_OBJECT:
-				XDECREF(*(object **)addr);
-				XINCREF(v);
-				*(object **)addr = v;
+				Py_XDECREF(*(PyObject **)addr);
+				Py_XINCREF(v);
+				*(PyObject **)addr = v;
 				break;
 			case T_CHAR:
-				if (is_stringobject(v) &&
-				    getstringsize(v) == 1) {
+				if (PyString_Check(v) &&
+				    PyString_Size(v) == 1) {
 					*(char*)addr =
-						getstringvalue(v)[0];
+						PyString_AsString(v)[0];
 				}
 				else {
-					err_badarg();
+					PyErr_BadArgument();
 					return -1;
 				}
 			default:
-				err_setstr(SystemError, "bad memberlist type");
+				PyErr_SetString(PyExc_SystemError,
+						"bad memberlist type");
 				return -1;
 			}
 			return 0;
 		}
 	}
 	
-	err_setstr(AttributeError, name);
+	PyErr_SetString(PyExc_AttributeError, name);
 	return -1;
 }
