Fix memory leak in dict_to_map(), SF bug [ #485152 ] memory leak in test_scope.

PyCell_Set() incremenets the reference count, so the earlier XINCREF
causes a leak.

Also make a number of small performance improvements to the code on
the assumption that most of the time variables are not rebound across
a FastToLocals() / LocalsToFast() pair.

Replace uses of PyCell_Set() and PyCell_Get() with PyCell_SET() and
PyCell_GET(), since the frame is guaranteed to contain cells.
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index e092ce6..cf3d73a 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -345,12 +345,11 @@
 {
 	int j;
 	for (j = nmap; --j >= 0; ) {
-		PyObject *key = PyTuple_GetItem(map, j);
+		PyObject *key = PyTuple_GET_ITEM(map, j);
 		PyObject *value = values[j];
 		if (deref)
 			value = PyCell_GET(value);
 		if (value == NULL) {
-			PyErr_Clear();
 			if (PyDict_DelItem(dict, key) != 0)
 				PyErr_Clear();
 		}
@@ -367,17 +366,21 @@
 {
 	int j;
 	for (j = nmap; --j >= 0; ) {
-		PyObject *key = PyTuple_GetItem(map, j);
+		PyObject *key = PyTuple_GET_ITEM(map, j);
 		PyObject *value = PyDict_GetItem(dict, key);
-		Py_XINCREF(value);
 		if (deref) {
 			if (value || clear) {
-				if (PyCell_Set(values[j], value) < 0)
-					PyErr_Clear();
+				if (PyCell_GET(values[j]) != value) {
+					if (PyCell_Set(values[j], value) < 0)
+						PyErr_Clear();
+				}
 			}
 		} else if (value != NULL || clear) {
-			Py_XDECREF(values[j]);
-			values[j] = value;
+			if (values[j] != value) {
+				Py_XINCREF(value);
+				Py_XDECREF(values[j]);
+				values[j] = value;
+			}
 		}
 	}
 }