diff -r 6e3a5fc4da68 Cython/Compiler/ExprNodes.py
--- a/Cython/Compiler/ExprNodes.py	Sun Feb 21 14:46:16 2010 +0100
+++ b/Cython/Compiler/ExprNodes.py	Mon Feb 22 22:59:13 2010 -0500
@@ -2036,19 +2036,35 @@
                     function = "__Pyx_GetItemInt"
                 code.globalstate.use_utility_code(getitem_int_utility_code)
             else:
-                function = "PyObject_GetItem"
+                if self.base.type is dict_type:
+                    self.put_nonecheck(code)
+                    function = "PyDict_GetItem"
+                else:
+                    function = "PyObject_GetItem"
                 index_code = self.index.py_result()
                 sign_code = ""
             code.putln(
-                "%s = %s(%s, %s%s); if (!%s) %s" % (
+                "%s = %s(%s, %s%s);" % (
                     self.result(),
                     function,
                     self.base.py_result(),
                     index_code,
-                    self.extra_index_params(),
-                    self.result(),
-                    code.error_goto(self.pos)))
-            code.put_gotref(self.py_result())
+                    self.extra_index_params()))
+
+            if self.base.type is dict_type:
+                code.putln(
+                    "if (%s == NULL) {PyErr_SetObject(%s, %s); %s}" % (
+                        self.result(),
+                        'PyExc_KeyError',
+                        index_code,
+                        code.error_goto(self.pos)))
+                code.put_incref(self.py_result(), self.ctype())
+            else:
+                code.putln(
+                    "if (!%s) %s" % (
+                        self.result(),
+                        code.error_goto(self.pos)))
+                code.put_gotref(self.py_result())
             
     def generate_setitem_code(self, value_code, code):
         if self.index.type.is_int:
