Example #1
0
        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);
            }
        }
Example #2
0
 IC_str_getsegcount(IntPtr strPtr, IntPtr lenPtr)
 {
     if (lenPtr != IntPtr.Zero)
     {
         CPyMarshal.WriteInt(lenPtr, this.PyString_Size(strPtr));
     }
     return(1);
 }
Example #3
0
        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);
            }
        }
Example #4
0
 Register_Py_OptimizeFlag(IntPtr address)
 {
     CPyMarshal.WriteInt(address, 2);
 }
Example #5
0
        WriteIntField(IntPtr addr, Type type, string field, int data)
        {
            IntPtr writeAddr = CPyMarshal.GetField(addr, type, field);

            CPyMarshal.WriteInt(writeAddr, data);
        }