@@ -139,6 +139,8 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
139139 PyObject* sass_error_t = PyObject_GetAttrString (types_mod, " SassError" );
140140 PyObject* sass_comma = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_COMMA" );
141141 PyObject* sass_space = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_SPACE" );
142+ PyObject* collections_mod = PyImport_ImportModule (" collections" );
143+ PyObject* mapping_t = PyObject_GetAttrString (collections_mod, " Mapping" );
142144
143145 if (value == Py_None) {
144146 retv = sass_make_null ();
@@ -150,17 +152,21 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
150152 Py_DECREF (bytes);
151153 } else if (PySass_Bytes_Check (value)) {
152154 retv = sass_make_string (PySass_Bytes_AS_STRING (value));
153- } else if (PyDict_Check (value)) {
155+ /* XXX: PyMapping_Check returns true for lists and tuples in python3 :( */
156+ } else if (PyObject_IsInstance (value, mapping_t )) {
154157 size_t i = 0 ;
155158 Py_ssize_t pos = 0 ;
156159 PyObject* d_key = NULL ;
157160 PyObject* d_value = NULL ;
158- retv = sass_make_map (PyDict_Size (value));
159- while (PyDict_Next (value, &pos, &d_key, &d_value)) {
161+ PyObject* dct = PyDict_New ();
162+ PyDict_Update (dct, value);
163+ retv = sass_make_map (PyDict_Size (dct));
164+ while (PyDict_Next (dct, &pos, &d_key, &d_value)) {
160165 sass_map_set_key (retv, i, _to_sass_value (d_key));
161166 sass_map_set_value (retv, i, _to_sass_value (d_value));
162167 i += 1 ;
163168 }
169+ Py_DECREF (dct);
164170 } else if (PyObject_IsInstance (value, sass_number_t )) {
165171 PyObject* d_value = PyObject_GetAttrString (value, " value" );
166172 PyObject* unit = PyObject_GetAttrString (value, " unit" );
@@ -190,7 +196,6 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
190196 Py_ssize_t i = 0 ;
191197 PyObject* items = PyObject_GetAttrString (value, " items" );
192198 PyObject* separator = PyObject_GetAttrString (value, " separator" );
193- /* TODO: I don't really like this, maybe move types to C */
194199 Sass_Separator sep = SASS_COMMA;
195200 if (separator == sass_comma) {
196201 sep = SASS_COMMA;
@@ -260,6 +265,8 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
260265 Py_DECREF (sass_error_t );
261266 Py_DECREF (sass_comma);
262267 Py_DECREF (sass_space);
268+ Py_DECREF (collections_mod);
269+ Py_DECREF (mapping_t );
263270 return retv;
264271}
265272
0 commit comments