14
14
#include "marshal.h"
15
15
#include "../Modules/hashtable.h"
16
16
17
+ /*[clinic input]
18
+ module marshal
19
+ [clinic start generated code]*/
20
+ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=c982b7930dee17db]*/
21
+
22
+ #include "clinic/marshal.c.h"
23
+
17
24
/* High water mark to determine when the marshalled object is dangerously deep
18
25
* and risks coring the interpreter. When the object stack gets this deep,
19
26
* raise an exception instead of continuing.
@@ -1632,42 +1639,62 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)
1632
1639
}
1633
1640
1634
1641
/* And an interface for Python programs... */
1642
+ /*[clinic input]
1643
+ marshal.dump
1644
+
1645
+ value: object
1646
+ Must be a supported type.
1647
+ file: object
1648
+ Must be a writeable binary file.
1649
+ version: int(c_default="Py_MARSHAL_VERSION") = version
1650
+ Indicates the data format that dump should use.
1651
+ /
1652
+
1653
+ Write the value on the open file.
1654
+
1655
+ If the value has (or contains an object that has) an unsupported type, a
1656
+ ValueError exception is raised - but garbage data will also be written
1657
+ to the file. The object will not be properly read back by load().
1658
+ [clinic start generated code]*/
1635
1659
1636
1660
static PyObject *
1637
- marshal_dump (PyObject * self , PyObject * args )
1661
+ marshal_dump_impl (PyObject * module , PyObject * value , PyObject * file ,
1662
+ int version )
1663
+ /*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
1638
1664
{
1639
1665
/* XXX Quick hack -- need to do this differently */
1640
- PyObject * x ;
1641
- PyObject * f ;
1642
- int version = Py_MARSHAL_VERSION ;
1643
1666
PyObject * s ;
1644
1667
PyObject * res ;
1645
1668
_Py_IDENTIFIER (write );
1646
1669
1647
- if (!PyArg_ParseTuple (args , "OO|i:dump" , & x , & f , & version ))
1648
- return NULL ;
1649
- s = PyMarshal_WriteObjectToString (x , version );
1670
+ s = PyMarshal_WriteObjectToString (value , version );
1650
1671
if (s == NULL )
1651
1672
return NULL ;
1652
- res = _PyObject_CallMethodIdObjArgs (f , & PyId_write , s , NULL );
1673
+ res = _PyObject_CallMethodIdObjArgs (file , & PyId_write , s , NULL );
1653
1674
Py_DECREF (s );
1654
1675
return res ;
1655
1676
}
1656
1677
1657
- PyDoc_STRVAR (dump_doc ,
1658
- "dump(value, file[, version])\n\
1659
- \n\
1660
- Write the value on the open file. The value must be a supported type.\n\
1661
- The file must be a writeable binary file.\n\
1662
- \n\
1663
- If the value has (or contains an object that has) an unsupported type, a\n\
1664
- ValueError exception is raised - but garbage data will also be written\n\
1665
- to the file. The object will not be properly read back by load()\n\
1666
- \n\
1667
- The version argument indicates the data format that dump should use." );
1678
+ /*[clinic input]
1679
+ marshal.load
1680
+
1681
+ file: object
1682
+ Must be readable binary file.
1683
+ /
1684
+
1685
+ Read one value from the open file and return it.
1686
+
1687
+ If no valid value is read (e.g. because the data has a different Python
1688
+ version's incompatible marshal format), raise EOFError, ValueError or
1689
+ TypeError.
1690
+
1691
+ Note: If an object containing an unsupported type was marshalled with
1692
+ dump(), load() will substitute None for the unmarshallable type.
1693
+ [clinic start generated code]*/
1668
1694
1669
1695
static PyObject *
1670
- marshal_load (PyObject * self , PyObject * f )
1696
+ marshal_load (PyObject * module , PyObject * file )
1697
+ /*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
1671
1698
{
1672
1699
PyObject * data , * result ;
1673
1700
_Py_IDENTIFIER (read );
@@ -1680,19 +1707,19 @@ marshal_load(PyObject *self, PyObject *f)
1680
1707
* This can be removed if we guarantee good error handling
1681
1708
* for r_string()
1682
1709
*/
1683
- data = _PyObject_CallMethodId (f , & PyId_read , "i" , 0 );
1710
+ data = _PyObject_CallMethodId (file , & PyId_read , "i" , 0 );
1684
1711
if (data == NULL )
1685
1712
return NULL ;
1686
1713
if (!PyBytes_Check (data )) {
1687
1714
PyErr_Format (PyExc_TypeError ,
1688
- "f .read() returned not bytes but %.100s" ,
1715
+ "file .read() returned not bytes but %.100s" ,
1689
1716
data -> ob_type -> tp_name );
1690
1717
result = NULL ;
1691
1718
}
1692
1719
else {
1693
1720
rf .depth = 0 ;
1694
1721
rf .fp = NULL ;
1695
- rf .readable = f ;
1722
+ rf .readable = file ;
1696
1723
rf .current_filename = NULL ;
1697
1724
rf .ptr = rf .end = NULL ;
1698
1725
rf .buf = NULL ;
@@ -1708,50 +1735,48 @@ marshal_load(PyObject *self, PyObject *f)
1708
1735
return result ;
1709
1736
}
1710
1737
1711
- PyDoc_STRVAR (load_doc ,
1712
- "load(file)\n\
1713
- \n\
1714
- Read one value from the open file and return it. If no valid value is\n\
1715
- read (e.g. because the data has a different Python version's\n\
1716
- incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1717
- The file must be a readable binary file.\n\
1718
- \n\
1719
- Note: If an object containing an unsupported type was marshalled with\n\
1720
- dump(), load() will substitute None for the unmarshallable type." );
1738
+ /*[clinic input]
1739
+ marshal.dumps
1740
+
1741
+ value: object
1742
+ Must be a supported type.
1743
+ version: int(c_default="Py_MARSHAL_VERSION") = version
1744
+ Indicates the data format that dumps should use.
1745
+ /
1721
1746
1747
+ Return the bytes object that would be written to a file by dump(value, file).
1748
+
1749
+ Raise a ValueError exception if value has (or contains an object that has) an
1750
+ unsupported type.
1751
+ [clinic start generated code]*/
1722
1752
1723
1753
static PyObject *
1724
- marshal_dumps (PyObject * self , PyObject * args )
1754
+ marshal_dumps_impl (PyObject * module , PyObject * value , int version )
1755
+ /*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
1725
1756
{
1726
- PyObject * x ;
1727
- int version = Py_MARSHAL_VERSION ;
1728
- if (!PyArg_ParseTuple (args , "O|i:dumps" , & x , & version ))
1729
- return NULL ;
1730
- return PyMarshal_WriteObjectToString (x , version );
1757
+ return PyMarshal_WriteObjectToString (value , version );
1731
1758
}
1732
1759
1733
- PyDoc_STRVAR (dumps_doc ,
1734
- "dumps(value[, version])\n\
1735
- \n\
1736
- Return the bytes object that would be written to a file by dump(value, file).\n\
1737
- The value must be a supported type. Raise a ValueError exception if\n\
1738
- value has (or contains an object that has) an unsupported type.\n\
1739
- \n\
1740
- The version argument indicates the data format that dumps should use." );
1760
+ /*[clinic input]
1761
+ marshal.loads
1762
+
1763
+ bytes: Py_buffer
1764
+ /
1765
+
1766
+ Convert the bytes-like object to a value.
1741
1767
1768
+ If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1769
+ bytes in the input are ignored.
1770
+ [clinic start generated code]*/
1742
1771
1743
1772
static PyObject *
1744
- marshal_loads (PyObject * self , PyObject * args )
1773
+ marshal_loads_impl (PyObject * module , Py_buffer * bytes )
1774
+ /*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
1745
1775
{
1746
1776
RFILE rf ;
1747
- Py_buffer p ;
1748
- char * s ;
1749
- Py_ssize_t n ;
1777
+ char * s = bytes -> buf ;
1778
+ Py_ssize_t n = bytes -> len ;
1750
1779
PyObject * result ;
1751
- if (!PyArg_ParseTuple (args , "y*:loads" , & p ))
1752
- return NULL ;
1753
- s = p .buf ;
1754
- n = p .len ;
1755
1780
rf .fp = NULL ;
1756
1781
rf .readable = NULL ;
1757
1782
rf .current_filename = NULL ;
@@ -1761,23 +1786,15 @@ marshal_loads(PyObject *self, PyObject *args)
1761
1786
if ((rf .refs = PyList_New (0 )) == NULL )
1762
1787
return NULL ;
1763
1788
result = read_object (& rf );
1764
- PyBuffer_Release (& p );
1765
1789
Py_DECREF (rf .refs );
1766
1790
return result ;
1767
1791
}
1768
1792
1769
- PyDoc_STRVAR (loads_doc ,
1770
- "loads(bytes)\n\
1771
- \n\
1772
- Convert the bytes-like object to a value. If no valid value is found,\n\
1773
- raise EOFError, ValueError or TypeError. Extra bytes in the input are\n\
1774
- ignored." );
1775
-
1776
1793
static PyMethodDef marshal_methods [] = {
1777
- { "dump" , marshal_dump , METH_VARARGS , dump_doc },
1778
- { "load" , marshal_load , METH_O , load_doc },
1779
- { "dumps" , marshal_dumps , METH_VARARGS , dumps_doc },
1780
- { "loads" , marshal_loads , METH_VARARGS , loads_doc },
1794
+ MARSHAL_DUMP_METHODDEF
1795
+ MARSHAL_LOAD_METHODDEF
1796
+ MARSHAL_DUMPS_METHODDEF
1797
+ MARSHAL_LOADS_METHODDEF
1781
1798
{NULL , NULL } /* sentinel */
1782
1799
};
1783
1800
0 commit comments