Changes for slice and ellipses
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 3a3fe56..00e02de 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -879,6 +879,28 @@
 	return NULL;
 }
 
+
+static PyObject *
+builtin_slice(self, args)
+     PyObject *self;
+     PyObject *args;
+{
+  PyObject *start, *stop, *step;
+
+  start = stop = step = NULL;
+
+  if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
+    return NULL;
+
+  /*This swapping of stop and start is to maintain compatibility with
+    the range builtin.*/
+  if (stop == NULL) {
+    stop = start;
+    start = NULL;
+  }
+  return PySlice_New(start, stop, step);
+}
+
 static object *
 builtin_locals(self, args)
 	object *self;
@@ -1514,6 +1536,7 @@
 	{"repr",	builtin_repr, 1},
 	{"round",	builtin_round, 1},
 	{"setattr",	builtin_setattr, 1},
+	{"slice",       builtin_slice, 1},
 	{"str",		builtin_str, 1},
 	{"tuple",	builtin_tuple, 1},
 	{"type",	builtin_type, 1},
diff --git a/Python/ceval.c b/Python/ceval.c
index ec26792..d526095 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -87,6 +87,7 @@
 static object *loop_subscript PROTO((object *, object *));
 static int slice_index PROTO((object *, int, int *));
 static object *apply_slice PROTO((object *, object *, object *));
+static object *build_slice PROTO((object *, object *, object *));
 static int assign_subscript PROTO((object *, object *, object *));
 static int assign_slice PROTO((object *, object *, object *, object *));
 static int cmp_exception PROTO((object *, object *));
@@ -187,6 +188,8 @@
    thread (the main thread) ever takes things out of the queue.
 */
 
+static int ticker = 0; /* main loop counter to do periodic things */
+
 #define NPENDINGCALLS 32
 static struct {
 	int (*func) PROTO((ANY *));
@@ -215,6 +218,7 @@
 	pendingcalls[i].func = func;
 	pendingcalls[i].arg = arg;
 	pendinglast = j;
+	ticker = 0; /* Signal main loop */
 	busy = 0;
 	/* XXX End critical section */
 	return 0;
@@ -225,11 +229,15 @@
 {
 	static int busy = 0;
 #ifdef WITH_THREAD
-	if (get_thread_ident() != main_thread)
+	if (get_thread_ident() != main_thread) {
+		ticker = 0; /* We're not done yet */
 		return 0;
+	}
 #endif
-	if (busy)
+	if (busy) {
+		ticker = 0; /* We're not done yet */
 		return 0;
+	}
 	busy = 1;
 	for (;;) {
 		int i;
@@ -243,6 +251,7 @@
 		pendingfirst = (i + 1) % NPENDINGCALLS;
 		if (func(arg) < 0) {
 			busy = 0;
+			ticker = 0; /* We're not done yet */
 			return -1;
 		}
 	}
@@ -281,6 +290,12 @@
 
 /* Interpreter main loop */
 
+#ifndef MAX_RECURSION_DEPTH
+#define MAX_RECURSION_DEPTH 10000
+#endif
+
+static int recursion_depth = 0;
+
 static object *
 eval_code2(co, globals, locals,
 	   args, argcount, kws, kwcount, defs, defcount, owner)
@@ -355,6 +370,13 @@
 #define SETLOCAL(i, value)	do { XDECREF(GETLOCAL(i)); \
 				     GETLOCAL(i) = value; } while (0)
 
+#ifdef USE_STACKCHECK
+	if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
+		err_setstr(MemoryError, "Stack overflow");
+		return NULL;
+	}
+#endif
+
 	if (globals == NULL) {
 		err_setstr(SystemError, "eval_code2: NULL globals");
 		return NULL;
@@ -514,6 +536,14 @@
 		}
 	}
 
+	if (++recursion_depth > MAX_RECURSION_DEPTH) {
+		--recursion_depth;
+		err_setstr(RuntimeError, "Maximum recursion depth exceeded");
+		current_frame = f->f_back;
+		DECREF(f);
+		return NULL;
+	}
+
 	next_instr = GETUSTRINGVALUE(f->f_code->co_code);
 	stack_pointer = f->f_valuestack;
 	
@@ -522,22 +552,23 @@
 	x = None;	/* Not a reference, just anything non-NULL */
 	
 	for (;;) {
-		static int ticker;
-		
 		/* Do periodic things.
 		   Doing this every time through the loop would add
 		   too much overhead (a function call per instruction).
-		   So we do it only every Nth instruction. */
-		
-		if (pendingfirst != pendinglast) {
-			if (Py_MakePendingCalls() < 0) {
-				why = WHY_EXCEPTION;
-				goto on_error;
-			}
-		}
+		   So we do it only every Nth instruction.
+
+		   The ticker is reset to zero if there are pending
+		   calls (see Py_AddPendingCalls() and
+		   Py_MakePendingCalls() above). */
 		
 		if (--ticker < 0) {
 			ticker = sys_checkinterval;
+			if (pendingfirst != pendinglast) {
+				if (Py_MakePendingCalls() < 0) {
+					why = WHY_EXCEPTION;
+					goto on_error;
+				}
+			}
 			if (sigcheck()) {
 				why = WHY_EXCEPTION;
 				goto on_error;
@@ -1630,7 +1661,22 @@
 			}
 			PUSH(x);
 			break;
-		
+
+		case BUILD_SLICE:
+			if (oparg == 3)
+				w = POP();
+			else
+				w = NULL;
+			v = POP();
+			u = POP();
+			x = build_slice(u,v,w);
+			DECREF(u);
+			DECREF(v);
+			XDECREF(w);
+			PUSH(x);
+			break;
+
+
 		default:
 			fprintf(stderr,
 				"XXX lineno: %d, opcode: %d\n",
@@ -1793,6 +1839,7 @@
 
 	current_frame = f->f_back;
 	DECREF(f);
+	--recursion_depth;
 	
 	return retval;
 }
@@ -2549,6 +2596,13 @@
 }
 
 static object *
+build_slice(u, v, w) /* u:v:w */
+	object *u, *v, *w;
+{
+  return PySlice_New(u,v,w);
+}
+
+static object *
 apply_slice(u, v, w) /* return u[v:w] */
 	object *u, *v, *w;
 {
diff --git a/Python/compile.c b/Python/compile.c
index 3299ad9..f20036b 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -47,6 +47,10 @@
 #include <ctype.h>
 #include <errno.h>
 
+#define OP_DELETE 0
+#define OP_ASSIGN 1
+#define OP_APPLY 2
+
 #define OFF(x) offsetof(codeobject, x)
 
 static struct memberlist code_memberlist[] = {
@@ -821,31 +825,6 @@
 	}
 }
 
-static void
-com_apply_subscript(c, n)
-	struct compiling *c;
-	node *n;
-{
-	REQ(n, subscript);
-	if (TYPE(CHILD(n, 0)) == COLON || (NCH(n) > 1 && TYPE(CHILD(n, 1)) == COLON)) {
-		/* It's a slice: [expr] ':' [expr] */
-		com_slice(c, n, SLICE);
-	}
-	else {
-		/* It's a list of subscripts */
-		if (NCH(n) == 1)
-			com_node(c, CHILD(n, 0));
-		else {
-			int i;
-			int len = (NCH(n)+1)/2;
-			for (i = 0; i < NCH(n); i += 2)
-				com_node(c, CHILD(n, i));
-			com_addoparg(c, BUILD_TUPLE, len);
-		}
-		com_addbyte(c, BINARY_SUBSCR);
-	}
-}
-
 static int
 com_argument(c, n, inkeywords)
 	struct compiling *c;
@@ -924,6 +903,107 @@
 }
 
 static void
+com_sliceobj(c, n)
+	struct compiling *c;
+	node *n;
+{
+	int i=0;
+	int ns=2; /* number of slice arguments */
+	int first_missing=0;
+	node *ch;
+
+	/* first argument */
+	if (TYPE(CHILD(n,i)) == COLON) {
+		com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		i++;
+	}
+	else {
+		com_node(c, CHILD(n,i));
+		i++;
+		REQ(CHILD(n,i),COLON);
+		i++;
+	}
+	/* second argument */
+	if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
+		com_node(c, CHILD(n,i));
+		i++;
+	}
+	else com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+	/* remaining arguments */
+	for (; i < NCH(n); i++) {
+		ns++;
+		ch=CHILD(n,i);
+		REQ(ch, sliceop);
+		if (NCH(ch) == 1) {
+			/* right argument of ':' missing */
+			com_addoparg(c, LOAD_CONST, com_addconst(c, None));
+		}
+		else
+			com_node(c, CHILD(ch,1));
+	}
+	com_addoparg(c, BUILD_SLICE, ns);
+}
+
+static void
+com_subscript(c, n)
+	struct compiling *c;
+	node *n;
+{
+	node *ch;
+	REQ(n, subscript);
+	ch = CHILD(n,0);
+	/* check for rubber index */
+	if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT)
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipses));
+	else {
+		/* check for slice */
+		if ((TYPE(ch) == COLON || NCH(n) > 1))
+			com_sliceobj(c, n);
+		else {
+			REQ(ch, test);
+			com_node(c, ch);
+		}
+	}
+}
+
+static void
+com_subscriptlist(c, n, assigning)
+	struct compiling *c;
+	node *n;
+	int assigning;
+{
+	int i, op;
+	REQ(n, subscriptlist);
+	/* Check to make backward compatible slice behavior for '[i:j]' */
+	if (NCH(n) == 1) {
+		node *sub = CHILD(n, 0); /* subscript */
+		/* Make it is a simple slice.
+           should have exactly one colon. */
+        if ((TYPE(CHILD(sub, 0)) == COLON
+             || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
+            && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop)) {
+			if (assigning == OP_APPLY)
+				op = SLICE;
+			else
+				op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
+			com_slice(c, sub, op);
+			return;
+		}
+	}
+	/* Else normal subscriptlist.  Compile each subscript. */
+	for (i = 0; i < NCH(n); i += 2)
+		com_subscript(c, CHILD(n, i));
+	/* Put multiple subscripts into a tuple */
+	if (NCH(n) > 1)
+		com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
+	if (assigning == OP_APPLY)
+		op = BINARY_SUBSCR;
+	else
+		op = ((assigning == OP_ASSIGN) ? STORE_SUBSCR : DELETE_SUBSCR);
+	com_addbyte(c, op);
+}
+
+static void
 com_apply_trailer(c, n)
 	struct compiling *c;
 	node *n;
@@ -937,7 +1017,7 @@
 		com_select_member(c, CHILD(n, 1));
 		break;
 	case LSQB:
-		com_apply_subscript(c, CHILD(n, 1));
+		com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
 		break;
 	default:
 		err_setstr(SystemError,
@@ -970,6 +1050,7 @@
 	struct compiling *c;
 	node *n;
 {
+	int i;
 	REQ(n, factor);
 	if (TYPE(CHILD(n, 0)) == PLUS) {
 		com_factor(c, CHILD(n, 1));
@@ -1365,33 +1446,6 @@
 }
 
 static void
-com_assign_slice(c, n, assigning)
-	struct compiling *c;
-	node *n;
-	int assigning;
-{
-	com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
-}
-
-static void
-com_assign_subscript(c, n, assigning)
-	struct compiling *c;
-	node *n;
-	int assigning;
-{
-	if (NCH(n) == 1)
-		com_node(c, CHILD(n, 0));
-	else {
-		int i;
-		int len = (NCH(n)+1)/2;
-		for (i = 0; i < NCH(n); i += 2)
-			com_node(c, CHILD(n, i));
-		com_addoparg(c, BUILD_TUPLE, len);
-	}
-	com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
-}
-
-static void
 com_assign_trailer(c, n, assigning)
 	struct compiling *c;
 	node *n;
@@ -1406,13 +1460,8 @@
 	case DOT: /* '.' NAME */
 		com_assign_attr(c, CHILD(n, 1), assigning);
 		break;
-	case LSQB: /* '[' subscript ']' */
-		n = CHILD(n, 1);
-		REQ(n, subscript); /* subscript: expr (',' expr)* | [expr] ':' [expr] */
-		if (TYPE(CHILD(n, 0)) == COLON || (NCH(n) > 1 && TYPE(CHILD(n, 1)) == COLON))
-			com_assign_slice(c, n, assigning);
-		else
-			com_assign_subscript(c, n, assigning);
+	case LSQB: /* '[' subscriptlist ']' */
+		com_subscriptlist(c, CHILD(n, 1), assigning);
 		break;
 	default:
 		err_setstr(SystemError, "unknown trailer type");
@@ -1585,7 +1634,7 @@
 		for (i = 0; i < NCH(n)-2; i+=2) {
 			if (i+2 < NCH(n)-2)
 				com_addbyte(c, DUP_TOP);
-			com_assign(c, CHILD(n, i), 1/*assign*/);
+			com_assign(c, CHILD(n, i), OP_ASSIGN);
 		}
 	}
 }
@@ -1896,7 +1945,7 @@
 	c->c_begin = c->c_nexti;
 	com_addoparg(c, SET_LINENO, n->n_lineno);
 	com_addfwref(c, FOR_LOOP, &anchor);
-	com_assign(c, CHILD(n, 1), 1/*assigning*/);
+	com_assign(c, CHILD(n, 1), OP_ASSIGN);
 	c->c_loops++;
 	com_node(c, CHILD(n, 5));
 	c->c_loops--;
@@ -2015,7 +2064,7 @@
 		}
 		com_addbyte(c, POP_TOP);
 		if (NCH(ch) > 3)
-			com_assign(c, CHILD(ch, 3), 1/*assigning*/);
+			com_assign(c, CHILD(ch, 3), OP_ASSIGN);
 		else
 			com_addbyte(c, POP_TOP);
 		com_addbyte(c, POP_TOP);
@@ -2342,7 +2391,7 @@
 		com_print_stmt(c, n);
 		break;
 	case del_stmt: /* 'del' exprlist */
-		com_assign(c, CHILD(n, 1), 0/*delete*/);
+		com_assign(c, CHILD(n, 1), OP_DELETE);
 		break;
 	case pass_stmt:
 		break;
diff --git a/Python/graminit.c b/Python/graminit.c
index f8b76ac..ce8061b 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -1031,169 +1031,204 @@
 	{1, arcs_48_5},
 	{1, arcs_48_6},
 };
-static arc arcs_49_0[2] = {
-	{21, 1},
-	{14, 2},
+static arc arcs_49_0[1] = {
+	{121, 1},
 };
-static arc arcs_49_1[3] = {
-	{22, 3},
-	{14, 2},
+static arc arcs_49_1[2] = {
+	{22, 2},
 	{0, 1},
 };
 static arc arcs_49_2[2] = {
-	{21, 4},
+	{121, 1},
 	{0, 2},
 };
-static arc arcs_49_3[2] = {
-	{21, 5},
-	{0, 3},
-};
-static arc arcs_49_4[1] = {
-	{0, 4},
-};
-static arc arcs_49_5[2] = {
-	{22, 3},
-	{0, 5},
-};
-static state states_49[6] = {
-	{2, arcs_49_0},
-	{3, arcs_49_1},
+static state states_49[3] = {
+	{1, arcs_49_0},
+	{2, arcs_49_1},
 	{2, arcs_49_2},
-	{2, arcs_49_3},
-	{1, arcs_49_4},
-	{2, arcs_49_5},
 };
-static arc arcs_50_0[1] = {
-	{57, 1},
+static arc arcs_50_0[3] = {
+	{52, 1},
+	{21, 2},
+	{14, 3},
 };
-static arc arcs_50_1[2] = {
-	{22, 2},
-	{0, 1},
+static arc arcs_50_1[1] = {
+	{52, 4},
 };
 static arc arcs_50_2[2] = {
-	{57, 1},
+	{14, 3},
 	{0, 2},
 };
-static state states_50[3] = {
-	{1, arcs_50_0},
-	{2, arcs_50_1},
+static arc arcs_50_3[3] = {
+	{21, 5},
+	{122, 6},
+	{0, 3},
+};
+static arc arcs_50_4[1] = {
+	{52, 6},
+};
+static arc arcs_50_5[2] = {
+	{122, 6},
+	{0, 5},
+};
+static arc arcs_50_6[1] = {
+	{0, 6},
+};
+static state states_50[7] = {
+	{3, arcs_50_0},
+	{1, arcs_50_1},
 	{2, arcs_50_2},
+	{3, arcs_50_3},
+	{1, arcs_50_4},
+	{2, arcs_50_5},
+	{1, arcs_50_6},
 };
 static arc arcs_51_0[1] = {
-	{21, 1},
+	{14, 1},
 };
 static arc arcs_51_1[2] = {
-	{22, 2},
+	{21, 2},
 	{0, 1},
 };
-static arc arcs_51_2[2] = {
-	{21, 1},
+static arc arcs_51_2[1] = {
 	{0, 2},
 };
 static state states_51[3] = {
 	{1, arcs_51_0},
 	{2, arcs_51_1},
-	{2, arcs_51_2},
+	{1, arcs_51_2},
 };
 static arc arcs_52_0[1] = {
-	{21, 1},
+	{57, 1},
 };
-static arc arcs_52_1[1] = {
-	{14, 2},
-};
-static arc arcs_52_2[1] = {
-	{21, 3},
-};
-static arc arcs_52_3[2] = {
-	{22, 4},
-	{0, 3},
-};
-static arc arcs_52_4[2] = {
-	{21, 1},
-	{0, 4},
-};
-static state states_52[5] = {
-	{1, arcs_52_0},
-	{1, arcs_52_1},
-	{1, arcs_52_2},
-	{2, arcs_52_3},
-	{2, arcs_52_4},
-};
-static arc arcs_53_0[1] = {
-	{121, 1},
-};
-static arc arcs_53_1[1] = {
-	{12, 2},
-};
-static arc arcs_53_2[2] = {
-	{16, 3},
-	{14, 4},
-};
-static arc arcs_53_3[1] = {
-	{9, 5},
-};
-static arc arcs_53_4[1] = {
-	{15, 6},
-};
-static arc arcs_53_5[1] = {
-	{18, 7},
-};
-static arc arcs_53_6[1] = {
-	{0, 6},
-};
-static arc arcs_53_7[1] = {
-	{14, 4},
-};
-static state states_53[8] = {
-	{1, arcs_53_0},
-	{1, arcs_53_1},
-	{2, arcs_53_2},
-	{1, arcs_53_3},
-	{1, arcs_53_4},
-	{1, arcs_53_5},
-	{1, arcs_53_6},
-	{1, arcs_53_7},
-};
-static arc arcs_54_0[1] = {
-	{122, 1},
-};
-static arc arcs_54_1[2] = {
+static arc arcs_52_1[2] = {
 	{22, 2},
 	{0, 1},
 };
-static arc arcs_54_2[2] = {
-	{122, 1},
+static arc arcs_52_2[2] = {
+	{57, 1},
 	{0, 2},
 };
-static state states_54[3] = {
-	{1, arcs_54_0},
-	{2, arcs_54_1},
-	{2, arcs_54_2},
+static state states_52[3] = {
+	{1, arcs_52_0},
+	{2, arcs_52_1},
+	{2, arcs_52_2},
 };
-static arc arcs_55_0[1] = {
+static arc arcs_53_0[1] = {
 	{21, 1},
 };
-static arc arcs_55_1[2] = {
+static arc arcs_53_1[2] = {
+	{22, 2},
+	{0, 1},
+};
+static arc arcs_53_2[2] = {
+	{21, 1},
+	{0, 2},
+};
+static state states_53[3] = {
+	{1, arcs_53_0},
+	{2, arcs_53_1},
+	{2, arcs_53_2},
+};
+static arc arcs_54_0[1] = {
+	{21, 1},
+};
+static arc arcs_54_1[1] = {
+	{14, 2},
+};
+static arc arcs_54_2[1] = {
+	{21, 3},
+};
+static arc arcs_54_3[2] = {
+	{22, 4},
+	{0, 3},
+};
+static arc arcs_54_4[2] = {
+	{21, 1},
+	{0, 4},
+};
+static state states_54[5] = {
+	{1, arcs_54_0},
+	{1, arcs_54_1},
+	{1, arcs_54_2},
+	{2, arcs_54_3},
+	{2, arcs_54_4},
+};
+static arc arcs_55_0[1] = {
+	{123, 1},
+};
+static arc arcs_55_1[1] = {
+	{12, 2},
+};
+static arc arcs_55_2[2] = {
+	{16, 3},
+	{14, 4},
+};
+static arc arcs_55_3[1] = {
+	{9, 5},
+};
+static arc arcs_55_4[1] = {
+	{15, 6},
+};
+static arc arcs_55_5[1] = {
+	{18, 7},
+};
+static arc arcs_55_6[1] = {
+	{0, 6},
+};
+static arc arcs_55_7[1] = {
+	{14, 4},
+};
+static state states_55[8] = {
+	{1, arcs_55_0},
+	{1, arcs_55_1},
+	{2, arcs_55_2},
+	{1, arcs_55_3},
+	{1, arcs_55_4},
+	{1, arcs_55_5},
+	{1, arcs_55_6},
+	{1, arcs_55_7},
+};
+static arc arcs_56_0[1] = {
+	{124, 1},
+};
+static arc arcs_56_1[2] = {
+	{22, 2},
+	{0, 1},
+};
+static arc arcs_56_2[2] = {
+	{124, 1},
+	{0, 2},
+};
+static state states_56[3] = {
+	{1, arcs_56_0},
+	{2, arcs_56_1},
+	{2, arcs_56_2},
+};
+static arc arcs_57_0[1] = {
+	{21, 1},
+};
+static arc arcs_57_1[2] = {
 	{20, 2},
 	{0, 1},
 };
-static arc arcs_55_2[1] = {
+static arc arcs_57_2[1] = {
 	{21, 3},
 };
-static arc arcs_55_3[1] = {
+static arc arcs_57_3[1] = {
 	{0, 3},
 };
-static state states_55[4] = {
-	{1, arcs_55_0},
-	{2, arcs_55_1},
-	{1, arcs_55_2},
-	{1, arcs_55_3},
+static state states_57[4] = {
+	{1, arcs_57_0},
+	{2, arcs_57_1},
+	{1, arcs_57_2},
+	{1, arcs_57_3},
 };
-static dfa dfas[56] = {
+static dfa dfas[58] = {
 	{256, "single_input", 0, 3, states_0,
-	 "\004\030\001\000\140\341\153\001\071\000\001\000\140\104\171\002"},
+	 "\004\030\001\000\140\341\153\001\071\000\001\000\140\104\171\010"},
 	{257, "file_input", 0, 2, states_1,
-	 "\204\030\001\000\140\341\153\001\071\000\001\000\140\104\171\002"},
+	 "\204\030\001\000\140\341\153\001\071\000\001\000\140\104\171\010"},
 	{258, "eval_input", 0, 3, states_2,
 	 "\000\020\001\000\000\000\000\000\000\000\001\000\140\104\171\000"},
 	{259, "funcdef", 0, 6, states_3,
@@ -1207,7 +1242,7 @@
 	{263, "fplist", 0, 3, states_7,
 	 "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000"},
 	{264, "stmt", 0, 2, states_8,
-	 "\000\030\001\000\140\341\153\001\071\000\001\000\140\104\171\002"},
+	 "\000\030\001\000\140\341\153\001\071\000\001\000\140\104\171\010"},
 	{265, "simple_stmt", 0, 4, states_9,
 	 "\000\020\001\000\140\341\153\001\000\000\001\000\140\104\171\000"},
 	{266, "small_stmt", 0, 2, states_10,
@@ -1243,7 +1278,7 @@
 	{281, "exec_stmt", 0, 7, states_25,
 	 "\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},
 	{282, "compound_stmt", 0, 2, states_26,
-	 "\000\010\000\000\000\000\000\000\071\000\000\000\000\000\000\002"},
+	 "\000\010\000\000\000\000\000\000\071\000\000\000\000\000\000\010"},
 	{283, "if_stmt", 0, 8, states_27,
 	 "\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"},
 	{284, "while_stmt", 0, 8, states_28,
@@ -1288,22 +1323,26 @@
 	 "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100\000"},
 	{304, "trailer", 0, 7, states_48,
 	 "\000\000\001\000\000\000\020\000\000\000\000\000\000\100\000\000"},
-	{305, "subscript", 0, 6, states_49,
-	 "\000\120\001\000\000\000\000\000\000\000\001\000\140\104\171\000"},
-	{306, "exprlist", 0, 3, states_50,
+	{305, "subscriptlist", 0, 3, states_49,
+	 "\000\120\001\000\000\000\020\000\000\000\001\000\140\104\171\000"},
+	{306, "subscript", 0, 7, states_50,
+	 "\000\120\001\000\000\000\020\000\000\000\001\000\140\104\171\000"},
+	{307, "sliceop", 0, 3, states_51,
+	 "\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+	{308, "exprlist", 0, 3, states_52,
 	 "\000\020\001\000\000\000\000\000\000\000\000\000\140\104\071\000"},
-	{307, "testlist", 0, 3, states_51,
+	{309, "testlist", 0, 3, states_53,
 	 "\000\020\001\000\000\000\000\000\000\000\001\000\140\104\171\000"},
-	{308, "dictmaker", 0, 5, states_52,
+	{310, "dictmaker", 0, 5, states_54,
 	 "\000\020\001\000\000\000\000\000\000\000\001\000\140\104\171\000"},
-	{309, "classdef", 0, 8, states_53,
-	 "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002"},
-	{310, "arglist", 0, 3, states_54,
+	{311, "classdef", 0, 8, states_55,
+	 "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010"},
+	{312, "arglist", 0, 3, states_56,
 	 "\000\020\001\000\000\000\000\000\000\000\001\000\140\104\171\000"},
-	{311, "argument", 0, 4, states_55,
+	{313, "argument", 0, 4, states_57,
 	 "\000\020\001\000\000\000\000\000\000\000\001\000\140\104\171\000"},
 };
-static label labels[123] = {
+static label labels[125] = {
 	{0, "EMPTY"},
 	{256, 0},
 	{4, 0},
@@ -1313,7 +1352,7 @@
 	{264, 0},
 	{0, 0},
 	{258, 0},
-	{307, 0},
+	{309, 0},
 	{259, 0},
 	{1, "def"},
 	{1, 0},
@@ -1343,7 +1382,7 @@
 	{281, 0},
 	{1, "print"},
 	{1, "del"},
-	{306, 0},
+	{308, 0},
 	{1, "pass"},
 	{272, 0},
 	{273, 0},
@@ -1367,7 +1406,7 @@
 	{284, 0},
 	{285, 0},
 	{286, 0},
-	{309, 0},
+	{311, 0},
 	{1, "if"},
 	{1, "elif"},
 	{1, "else"},
@@ -1417,20 +1456,22 @@
 	{9, 0},
 	{10, 0},
 	{26, 0},
-	{308, 0},
+	{310, 0},
 	{27, 0},
 	{25, 0},
 	{2, 0},
 	{3, 0},
 	{1, "lambda"},
-	{310, 0},
+	{312, 0},
 	{305, 0},
+	{306, 0},
+	{307, 0},
 	{1, "class"},
-	{311, 0},
+	{313, 0},
 };
 grammar gram = {
-	56,
+	58,
 	dfas,
-	{123, labels},
+	{125, labels},
 	256
 };
diff --git a/Python/import.c b/Python/import.c
index d57b681..5c04f49 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -55,7 +55,7 @@
    Apple MPW compiler swaps their values, botching string constants */
 /* XXX Perhaps the magic number should be frozen and a version field
    added to the .pyc file header? */
-#define MAGIC (1895 | ((long)'\r'<<16) | ((long)'\n'<<24))
+#define MAGIC (5892 | ((long)'\r'<<16) | ((long)'\n'<<24))
 
 object *import_modules; /* This becomes sys.modules */
 
diff --git a/Python/marshal.c b/Python/marshal.c
index 509e303..4a2701a 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -37,6 +37,7 @@
 
 #define TYPE_NULL	'0'
 #define TYPE_NONE	'N'
+#define TYPE_ELLIPSES   '.'
 #define TYPE_INT	'i'
 #define TYPE_FLOAT	'f'
 #define TYPE_COMPLEX	'x'
@@ -129,6 +130,8 @@
 		w_byte(TYPE_NULL, p);
 	else if (v == None)
 		w_byte(TYPE_NONE, p);
+	else if (v == Py_Ellipses)
+	        w_byte(TYPE_ELLIPSES, p);  
 	else if (is_intobject(v)) {
 		w_byte(TYPE_INT, p);
 		w_long(getintvalue(v), p);
@@ -322,6 +325,10 @@
 		INCREF(None);
 		return None;
 	
+	case TYPE_ELLIPSES:
+		INCREF(Py_Ellipses);
+		return Py_Ellipses;
+	
 	case TYPE_INT:
 		return newintobject(r_long(p));