@@ -139,6 +139,8 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
139
139
PyObject* sass_error_t = PyObject_GetAttrString (types_mod, " SassError" );
140
140
PyObject* sass_comma = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_COMMA" );
141
141
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" );
142
144
143
145
if (value == Py_None) {
144
146
retv = sass_make_null ();
@@ -150,17 +152,21 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
150
152
Py_DECREF (bytes);
151
153
} else if (PySass_Bytes_Check (value)) {
152
154
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 )) {
154
157
size_t i = 0 ;
155
158
Py_ssize_t pos = 0 ;
156
159
PyObject* d_key = NULL ;
157
160
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)) {
160
165
sass_map_set_key (retv, i, _to_sass_value (d_key));
161
166
sass_map_set_value (retv, i, _to_sass_value (d_value));
162
167
i += 1 ;
163
168
}
169
+ Py_DECREF (dct);
164
170
} else if (PyObject_IsInstance (value, sass_number_t )) {
165
171
PyObject* d_value = PyObject_GetAttrString (value, " value" );
166
172
PyObject* unit = PyObject_GetAttrString (value, " unit" );
@@ -190,7 +196,6 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
190
196
Py_ssize_t i = 0 ;
191
197
PyObject* items = PyObject_GetAttrString (value, " items" );
192
198
PyObject* separator = PyObject_GetAttrString (value, " separator" );
193
- /* TODO: I don't really like this, maybe move types to C */
194
199
Sass_Separator sep = SASS_COMMA;
195
200
if (separator == sass_comma) {
196
201
sep = SASS_COMMA;
@@ -260,6 +265,8 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
260
265
Py_DECREF (sass_error_t );
261
266
Py_DECREF (sass_comma);
262
267
Py_DECREF (sass_space);
268
+ Py_DECREF (collections_mod);
269
+ Py_DECREF (mapping_t );
263
270
return retv;
264
271
}
265
272
0 commit comments