* Changed all copyright messages to include 1993.
* Stubs for faster implementation of local variables (not yet finished)
* Added function name to code object.  Print it for code and function
  objects.  THIS MAKES THE .PYC FILE FORMAT INCOMPATIBLE (the version
  number has changed accordingly)
* Print address of self for built-in methods
* New internal functions getattro and setattro (getattr/setattr with
  string object arg)
* Replaced "dictobject" with more powerful "mappingobject"
* New per-type functio tp_hash to implement arbitrary object hashing,
  and hashobject() to interface to it
* Added built-in functions hash(v) and hasattr(v, 'name')
* classobject: made some functions static that accidentally weren't;
  added __hash__ special instance method to implement hash()
* Added proper comparison for built-in methods and functions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 4213fc3..8fd12e4 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -281,10 +281,28 @@
 	object *args;
 {
 	object *v;
-	char *name;
-	if (!getargs(args, "(Os)", &v, &name))
+	object *name;
+	if (!getargs(args, "(OS)", &v, &name))
 		return NULL;
-	return getattr(v, name);
+	return getattro(v, name);
+}
+
+static object *
+builtin_hasattr(self, args)
+	object *self;
+	object *args;
+{
+	object *v;
+	object *name;
+	if (!getargs(args, "(OS)", &v, &name))
+		return NULL;
+	v = getattro(v, name);
+	if (v == NULL) {
+		err_clear();
+		return newintobject(0L);
+	}
+	DECREF(v);
+	return newintobject(1L);
 }
 
 static object *
@@ -293,17 +311,32 @@
 	object *args;
 {
 	object *v;
-	char *name;
+	object *name;
 	object *value;
-	if (!getargs(args, "(OsO)", &v, &name, &value))
+	if (!getargs(args, "(OSO)", &v, &name, &value))
 		return NULL;
-	if (setattr(v, name, value) != 0)
+	if (setattro(v, name, value) != 0)
 		return NULL;
 	INCREF(None);
 	return None;
 }
 
 static object *
+builtin_hash(self, args)
+	object *self;
+	object *args;
+{
+	object *v;
+	long x;
+	if (!getargs(args, "O", &v))
+		return NULL;
+	x = hashobject(v);
+	if (x == -1)
+		return NULL;
+	return newintobject(x);
+}
+
+static object *
 builtin_hex(self, v)
 	object *self;
 	object *v;
@@ -687,6 +720,8 @@
 	{"execfile",	builtin_execfile},
 	{"float",	builtin_float},
 	{"getattr",	builtin_getattr},
+	{"hasattr",	builtin_hasattr},
+	{"hash",	builtin_hash},
 	{"hex",		builtin_hex},
 	{"input",	builtin_input},
 	{"int",		builtin_int},
diff --git a/Python/ceval.c b/Python/ceval.c
index 97f38ab..64f2429 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -173,6 +173,7 @@
 	register object *u;
 	register object *t;
 	register frameobject *f; /* Current frame */
+	register listobject *fastlocals = NULL;
 	object *trace = NULL;	/* Trace function or NULL */
 	object *retval;		/* Return value iff why == WHY_RETURN */
 	char *name;		/* Name used by some instructions */
@@ -911,19 +912,18 @@
 			break;
 		
 		case STORE_ATTR:
-			name = GETNAME(oparg);
+			w = GETNAMEV(oparg);
 			v = POP();
 			u = POP();
-			err = setattr(v, name, u); /* v.name = u */
+			err = setattro(v, w, u); /* v.w = u */
 			DECREF(v);
 			DECREF(u);
 			break;
 		
 		case DELETE_ATTR:
-			name = GETNAME(oparg);
+			w = GETNAMEV(oparg);
 			v = POP();
-			err = setattr(v, name, (object *)NULL);
-							/* del v.name */
+			err = setattro(v, w, (object *)NULL); /* del v.w */
 			DECREF(v);
 			break;
 		
@@ -992,6 +992,22 @@
 			INCREF(x);
 			PUSH(x);
 			break;
+
+		case RESERVE_FAST:
+			if (oparg > 0) {
+				XDECREF(fastlocals);
+				x = newlistobject(oparg);
+				fastlocals = (listobject *) x;
+			}
+			break;
+
+		case LOAD_FAST:
+			/* NYI */
+			break;
+
+		case STORE_FAST:
+			/* NYI */
+			break;
 		
 		case BUILD_TUPLE:
 			x = newtupleobject(oparg);
@@ -1025,9 +1041,9 @@
 			break;
 		
 		case LOAD_ATTR:
-			name = GETNAME(oparg);
+			w = GETNAMEV(oparg);
 			v = POP();
-			x = getattr(v, name);
+			x = getattro(v, w);
 			DECREF(v);
 			PUSH(x);
 			break;
@@ -1283,6 +1299,8 @@
 	
 	current_frame = f->f_back;
 	DECREF(f);
+
+	XDECREF(fastlocals);
 	
 	return retval;
 }
diff --git a/Python/cgensupport.c b/Python/cgensupport.c
index a3023eb..5dcac86 100644
--- a/Python/cgensupport.c
+++ b/Python/cgensupport.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/compile.c b/Python/compile.c
index 483e524..116b6bb 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -50,6 +50,7 @@
 	{"co_consts",	T_OBJECT,	OFF(co_consts),		READONLY},
 	{"co_names",	T_OBJECT,	OFF(co_names),		READONLY},
 	{"co_filename",	T_OBJECT,	OFF(co_filename),	READONLY},
+	{"co_name",	T_OBJECT,	OFF(co_name),		READONLY},
 	{NULL}	/* Sentinel */
 };
 
@@ -69,6 +70,7 @@
 	XDECREF(co->co_consts);
 	XDECREF(co->co_names);
 	XDECREF(co->co_filename);
+	XDECREF(co->co_name);
 	DEL(co);
 }
 
@@ -80,12 +82,15 @@
 	int lineno = -1;
 	char *p = GETSTRINGVALUE(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);
-	sprintf(buf, "<code object at %lx, file \"%.400s\", line %d>",
-		(long)co, filename, lineno);
+	if (co->co_name && is_stringobject(co->co_name))
+		name = getstringvalue(co->co_name);
+	sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
+		name, (long)co, filename, lineno);
 	return newstringobject(buf);
 }
 
@@ -107,18 +112,20 @@
 };
 
 codeobject *
-newcodeobject(code, consts, names, filename)
+newcodeobject(code, consts, names, filename, name)
 	object *code;
 	object *consts;
 	object *names;
 	object *filename;
+	object *name;
 {
 	codeobject *co;
 	int i;
 	/* Check argument types */
 	if (code == NULL || !is_stringobject(code) ||
 		consts == NULL || !is_listobject(consts) ||
-		names == NULL || !is_listobject(names)) {
+		names == NULL || !is_listobject(names) ||
+		name == NULL || !is_stringobject(name)) {
 		err_badcall();
 		return NULL;
 	}
@@ -140,6 +147,8 @@
 		co->co_names = names;
 		INCREF(filename);
 		co->co_filename = filename;
+		INCREF(name);
+		co->co_name = name;
 	}
 	return co;
 }
@@ -162,6 +171,7 @@
 	int c_block[MAXBLOCKS];	/* stack of block types */
 	int c_nblocks;		/* current block stack level */
 	char *c_filename;	/* filename of current node */
+	char *c_name;		/* name of object (e.g. function) */
 };
 
 
@@ -232,6 +242,7 @@
 	c->c_begin = 0;
 	c->c_nblocks = 0;
 	c->c_filename = filename;
+	c->c_name = "?";
 	return 1;
 	
   fail_0:
@@ -2020,6 +2031,8 @@
 {
 	node *ch;
 	REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
+	c->c_name = STR(CHILD(n, 1));
+	com_addoparg(c, RESERVE_FAST, 0); /* Patched up later */
 	ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
 	ch = CHILD(ch, 1); /* ')' | varargslist */
 	if (TYPE(ch) == RPAR)
@@ -2089,6 +2102,8 @@
 
 /* Optimization for local and global variables.
 
+   XXX Need to update this text for LOAD_FAST stuff...
+
    Attempt to replace all LOAD_NAME instructions that refer to a local
    variable with LOAD_LOCAL instructions, and all that refer to a global
    variable with LOAD_GLOBAL instructions.
@@ -2187,17 +2202,21 @@
 {
 	struct compiling sc;
 	codeobject *co;
-	object *v;
 	if (!com_init(&sc, filename))
 		return NULL;
 	compile_node(&sc, n);
 	com_done(&sc);
-	if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
-		co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
-		DECREF(v);
+	co = NULL;
+	if (sc.c_errors == 0) {
+		object *v, *w;
+		v = newstringobject(sc.c_filename);
+		w = newstringobject(sc.c_name);
+		if (v != NULL && w != NULL)
+			co = newcodeobject(sc.c_code, sc.c_consts,
+					   sc.c_names, v, w);
+		XDECREF(v);
+		XDECREF(w);
 	}
-	else
-		co = NULL;
 	com_free(&sc);
 	if (co != NULL && filename[0] != '<')
 		optimizer(co);
diff --git a/Python/fmod.c b/Python/fmod.c
index 607f6a5..8301b94 100644
--- a/Python/fmod.c
+++ b/Python/fmod.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/getcwd.c b/Python/getcwd.c
index 96c2291..675c4a6 100644
--- a/Python/getcwd.c
+++ b/Python/getcwd.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/import.c b/Python/import.c
index da9422b..4b7ee13 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -52,9 +52,9 @@
 extern char *argv0;
 #endif
 
-/* Magic word to reject pre-0.9.4 .pyc files */
+/* Magic word to reject pre-0.9.9 .pyc files */
 
-#define MAGIC 0x949494L
+#define MAGIC 0x99BE2AL
 
 static object *modules;
 
diff --git a/Python/marshal.c b/Python/marshal.c
index 268db00..65f7f2d 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -195,6 +195,7 @@
 		w_object(co->co_consts, p);
 		w_object(co->co_names, p);
 		w_object(co->co_filename, p);
+		w_object(co->co_name, p);
 	}
 	else {
 		w_byte(TYPE_UNKNOWN, p);
@@ -384,9 +385,10 @@
 			object *consts = r_object(p);
 			object *names = r_object(p);
 			object *filename = r_object(p);
+			object *name = r_object(p);
 			if (!err_occurred()) {
 				v = (object *) newcodeobject(code,
-						consts, names, filename);
+						consts, names, filename, name);
 			}
 			else
 				v = NULL;
diff --git a/Python/pythonmain.c b/Python/pythonmain.c
index 1c64692..1718611 100644
--- a/Python/pythonmain.c
+++ b/Python/pythonmain.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 1bcc083..e59458e 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/strerror.c b/Python/strerror.c
index ce9bd98..a2f3acf 100644
--- a/Python/strerror.c
+++ b/Python/strerror.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/structmember.c b/Python/structmember.c
index e2658a6..6b29c30 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
diff --git a/Python/traceback.c b/Python/traceback.c
index 3c246b5..6ed1917 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved