diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 9445255..dca31ac 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -281,6 +281,51 @@
 	return compile_string(str, filename, start);
 }
 
+#ifndef WITHOUT_COMPLEX
+
+static object *
+builtin_complex(self, args)
+	object *self;
+	object *args;
+{
+	object *r, *i;
+	number_methods *nbr, *nbi;
+	complex cr, ci;
+
+	i = NULL;
+	if (!newgetargs(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,
+			   "complex() argument can't be converted to complex");
+		return NULL;
+	}
+	if (is_complexobject(r))
+		cr = ((complexobject*)r)->cval;
+	else {
+		cr.real = getfloatvalue((*nbr->nb_float)(r));
+		cr.imag = 0.;
+	}
+	if (i == NULL) {
+		ci.real = 0.;
+		ci.imag = 0.;
+	}
+	else if (is_complexobject(i))
+		ci = ((complexobject*)i)->cval;
+	else {
+		ci.real = getfloatvalue((*nbi->nb_float)(i));
+		ci.imag = 0.;
+	}
+	cr.real -= ci.imag;
+	cr.imag += ci.real;
+	return newcomplexobject(cr);
+}
+
+#endif
+
 static object *
 builtin_dir(self, args)
 	object *self;
@@ -954,7 +999,11 @@
 		err_setstr(TypeError, "pow() requires numeric arguments");
 		return NULL;
 	}
-	if (is_floatobject(w) && getfloatvalue(v) < 0.0) {
+	if (
+#ifndef WITHOUT_COMPLEX
+            !is_complexobject(v) && 
+#endif
+            is_floatobject(w) && getfloatvalue(v) < 0.0) {
 		if (!err_occurred())
 		    err_setstr(ValueError, "negative number to float power");
 		return NULL;
@@ -1394,6 +1443,9 @@
 	{"cmp",		builtin_cmp, 1},
 	{"coerce",	builtin_coerce, 1},
 	{"compile",	builtin_compile, 1},
+#ifndef WITHOUT_COMPLEX
+	{"complex",	builtin_complex, 1},
+#endif
 	{"delattr",	builtin_delattr, 1},
 	{"dir",		builtin_dir, 1},
 	{"divmod",	builtin_divmod, 1},
diff --git a/Python/getargs.c b/Python/getargs.c
index cd3ff6d..7ec31c3 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -498,6 +498,17 @@
 			break;
 		}
 	
+	case 'D': /* complex double */
+		{
+			complex *p = va_arg(*p_va, complex *);
+			complex cval = PyComplex_AsCComplex(arg);
+			if (err_occurred())
+				return "complex<D>";
+			else
+				*p = cval;
+			break;
+		}
+	
 	case 'c': /* char */
 		{
 			char *p = va_arg(*p_va, char *);
diff --git a/Python/marshal.c b/Python/marshal.c
index 15c02c3..f3d7b5c 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -39,6 +39,7 @@
 #define TYPE_NONE	'N'
 #define TYPE_INT	'i'
 #define TYPE_FLOAT	'f'
+#define TYPE_COMPLEX	'x'
 #define TYPE_LONG	'l'
 #define TYPE_STRING	's'
 #define TYPE_TUPLE	'('
@@ -150,6 +151,26 @@
 		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 *));
+		char buf[256]; /* Plenty to format any double */
+		floatobject *temp;
+		w_byte(TYPE_COMPLEX, p);
+		temp = (floatobject*)newfloatobject(PyComplex_RealAsDouble(v));
+		float_buf_repr(buf, temp);
+		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);
+		n = strlen(buf);
+		w_byte(n, p);
+		w_string(buf, n, p);
+	}
+#endif
 	else if (is_stringobject(v)) {
 		w_byte(TYPE_STRING, p);
 		n = getstringsize(v);
@@ -329,6 +350,32 @@
 			return newfloatobject(atof(buf));
 		}
 	
+#ifndef WITHOUT_COMPLEX
+	case TYPE_COMPLEX:
+		{
+			extern double atof PROTO((const char *));
+			char buf[256];
+			complex c;
+			n = r_byte(p);
+			if (r_string(buf, (int)n, p) != n) {
+				err_setstr(EOFError,
+					"EOF read where object expected");
+				return NULL;
+			}
+			buf[n] = '\0';
+			c.real = atof(buf);
+			n = r_byte(p);
+			if (r_string(buf, (int)n, p) != n) {
+				err_setstr(EOFError,
+					"EOF read where object expected");
+				return NULL;
+			}
+			buf[n] = '\0';
+			c.imag = atof(buf);
+			return newcomplexobject(c);
+		}
+#endif
+	
 	case TYPE_STRING:
 		n = r_long(p);
 		v = newsizedstringobject((char *)NULL, n);
