Vladimir Marangozov' performance hack: copy f_builtins from ancestor
if the globals are the same.

Also, when creating a dummy builtins dictionary, add "None" to it,
just to be kind.
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 03f54dd..0b9604a 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -164,9 +164,16 @@
 		PyErr_BadInternalCall();
 		return NULL;
 	}
-	builtins = PyDict_GetItem(globals, builtin_object);
-	if (builtins != NULL && PyModule_Check(builtins))
-		builtins = PyModule_GetDict(builtins);
+	if (back == NULL || back->f_globals != globals) {
+		builtins = PyDict_GetItem(globals, builtin_object);
+		if (builtins != NULL && PyModule_Check(builtins))
+			builtins = PyModule_GetDict(builtins);
+	}
+	else {
+		/* If we share the globals, we share the builtins.
+		   Save a lookup and a call. */
+		builtins = back->f_builtins;
+	}
 	if (builtins != NULL && !PyDict_Check(builtins))
 		builtins = NULL;
 	if (free_list == NULL) {
@@ -194,9 +201,13 @@
 		_Py_NewReference(f);
 	}
 	if (builtins == NULL) {
+		/* No builtins!  Make up a minimal one. */
 		builtins = PyDict_New();
 		if (builtins == NULL)
 			return NULL;
+		/* Give them 'None', at least. */
+		if (PyDict_SetItemString(builtins, "None", Py_None) < 0)
+			return NULL;
 	}
 	else
 		Py_XINCREF(builtins);