hgext/fsmonitor/pywatchman/bser.c
changeset 37594 b1f62cd39b5c
parent 30656 16f4b341288d
child 43385 6469c23a40a2
equal deleted inserted replaced
37593:314f39e5fa86 37594:b1f62cd39b5c
   126 static PyObject* bserobj_getattrro(PyObject* o, PyObject* name) {
   126 static PyObject* bserobj_getattrro(PyObject* o, PyObject* name) {
   127   bserObject* obj = (bserObject*)o;
   127   bserObject* obj = (bserObject*)o;
   128   Py_ssize_t i, n;
   128   Py_ssize_t i, n;
   129   PyObject* name_bytes = NULL;
   129   PyObject* name_bytes = NULL;
   130   PyObject* ret = NULL;
   130   PyObject* ret = NULL;
   131   const char* namestr;
   131   const char* namestr = NULL;
   132 
   132 
   133   if (PyIndex_Check(name)) {
   133   if (PyIndex_Check(name)) {
   134     i = PyNumber_AsSsize_t(name, PyExc_IndexError);
   134     i = PyNumber_AsSsize_t(name, PyExc_IndexError);
   135     if (i == -1 && PyErr_Occurred()) {
   135     if (i == -1 && PyErr_Occurred()) {
   136       goto bail;
   136       goto bail;
   137     }
   137     }
   138     ret = PySequence_GetItem(obj->values, i);
   138 
   139     goto bail;
   139     if (i == 8 && PySequence_Size(obj->values) < 9) {
   140   }
   140       // Hack alert: Python 3 removed support for os.stat().st_mtime
   141 
   141       // being an integer.Instead, if you need an integer, you have to
   142   // We can be passed in Unicode objects here -- we don't support anything other
   142       // use os.stat()[stat.ST_MTIME] instead. stat.ST_MTIME is 8, and
   143   // than UTF-8 for keys.
   143       // our stat tuples are shorter than that, so we can detect
   144   if (PyUnicode_Check(name)) {
   144       // requests for index 8 on tuples shorter than that and return
   145     name_bytes = PyUnicode_AsUTF8String(name);
   145       // st_mtime instead.
   146     if (name_bytes == NULL) {
   146       namestr = "st_mtime";
       
   147     } else {
       
   148       ret = PySequence_GetItem(obj->values, i);
   147       goto bail;
   149       goto bail;
   148     }
   150     }
   149     namestr = PyBytes_AsString(name_bytes);
       
   150   } else {
   151   } else {
   151     namestr = PyBytes_AsString(name);
   152     // We can be passed in Unicode objects here -- we don't support anything other
       
   153     // than UTF-8 for keys.
       
   154     if (PyUnicode_Check(name)) {
       
   155       name_bytes = PyUnicode_AsUTF8String(name);
       
   156       if (name_bytes == NULL) {
       
   157         goto bail;
       
   158       }
       
   159       namestr = PyBytes_AsString(name_bytes);
       
   160     } else {
       
   161       namestr = PyBytes_AsString(name);
       
   162     }
   152   }
   163   }
   153 
   164 
   154   if (namestr == NULL) {
   165   if (namestr == NULL) {
   155     goto bail;
   166     goto bail;
   156   }
   167   }