PyString_AsStringAndSize(IntPtr strPtr, IntPtr dataPtrPtr, IntPtr sizePtr) { try { if (CPyMarshal.ReadPtrField(strPtr, typeof(PyObject), "ob_type") != this.PyString_Type) { throw PythonOps.TypeError("PyString_AsStringAndSize: not a string"); } IntPtr dataPtr = CPyMarshal.GetField(strPtr, typeof(PyStringObject), "ob_sval"); CPyMarshal.WritePtr(dataPtrPtr, dataPtr); int length = CPyMarshal.ReadIntField(strPtr, typeof(PyStringObject), "ob_size"); if (sizePtr == IntPtr.Zero) { for (int i = 0; i < length; ++i) { if (CPyMarshal.ReadByte(CPyMarshal.Offset(dataPtr, i)) == 0) { throw PythonOps.TypeError("PyString_AsStringAndSize: string contains embedded 0s, but sizePtr is null"); } } } else { CPyMarshal.WriteInt(sizePtr, length); } return(0); } catch (Exception e) { this.LastException = e; return(-1); } }
IC_str_getsegcount(IntPtr strPtr, IntPtr lenPtr) { if (lenPtr != IntPtr.Zero) { CPyMarshal.WriteInt(lenPtr, this.PyString_Size(strPtr)); } return(1); }
PyDict_Next(IntPtr dictPtr, IntPtr posPtr, IntPtr keyPtrPtr, IntPtr valuePtrPtr) { // note: this is not efficient, and assumes constant ordering of results from // KeyCollection.GetEnumerator. Storing an iterator would probably work, // but we can't work out how to not leak it if iteration does not complete. try { IDictionary dict = (IDictionary)this.Retrieve(dictPtr); IEnumerator keys = dict.Keys.GetEnumerator(); int pos = CPyMarshal.ReadInt(posPtr); for (int i = 0; i <= pos; i++) { if (!keys.MoveNext()) { return(0); } } object key = keys.Current; IntPtr keyPtr = this.Store(key); this.DecRefLater(keyPtr); CPyMarshal.WritePtr(keyPtrPtr, keyPtr); IntPtr valuePtr = this.Store(dict[key]); this.DecRefLater(valuePtr); CPyMarshal.WritePtr(valuePtrPtr, valuePtr); CPyMarshal.WriteInt(posPtr, pos + 1); return(1); } catch (Exception e) { this.LastException = e; return(0); } }
Register_Py_OptimizeFlag(IntPtr address) { CPyMarshal.WriteInt(address, 2); }
WriteIntField(IntPtr addr, Type type, string field, int data) { IntPtr writeAddr = CPyMarshal.GetField(addr, type, field); CPyMarshal.WriteInt(writeAddr, data); }