22
22
extern " C" {
23
23
#endif
24
24
25
+ static PyObject* _to_py_value (const union Sass_Value* value);
26
+ static union Sass_Value* _to_sass_value (PyObject* value);
27
+
28
+ static union Sass_Value* _color_to_sass_value (PyObject* value);
29
+ static union Sass_Value* _number_to_sass_value (PyObject* value);
30
+ static union Sass_Value* _list_to_sass_value (PyObject* value);
31
+ static union Sass_Value* _mapping_to_sass_value (PyObject* value);
32
+ static union Sass_Value* _unicode_to_sass_value (PyObject* value);
33
+ static union Sass_Value* _warning_to_sass_value (PyObject* value);
34
+ static union Sass_Value* _error_to_sass_value (PyObject* value);
35
+ static union Sass_Value* _unknown_type_to_sass_error (PyObject* value);
36
+ static union Sass_Value* _exception_to_sass_error ();
37
+
25
38
struct PySass_Pair {
26
39
char *label;
27
40
int value;
@@ -129,6 +142,175 @@ static PyObject* _to_py_value(const union Sass_Value* value) {
129
142
return retv;
130
143
}
131
144
145
+ static union Sass_Value* _color_to_sass_value (PyObject* value) {
146
+ union Sass_Value* retv = NULL ;
147
+ PyObject* r_value = PyObject_GetAttrString (value, " r" );
148
+ PyObject* g_value = PyObject_GetAttrString (value, " g" );
149
+ PyObject* b_value = PyObject_GetAttrString (value, " b" );
150
+ PyObject* a_value = PyObject_GetAttrString (value, " a" );
151
+ retv = sass_make_color (
152
+ PyFloat_AsDouble (r_value),
153
+ PyFloat_AsDouble (g_value),
154
+ PyFloat_AsDouble (b_value),
155
+ PyFloat_AsDouble (a_value)
156
+ );
157
+ Py_DECREF (r_value);
158
+ Py_DECREF (g_value);
159
+ Py_DECREF (b_value);
160
+ Py_DECREF (a_value);
161
+ return retv;
162
+ }
163
+
164
+ static union Sass_Value* _list_to_sass_value (PyObject* value) {
165
+ PyObject* types_mod = PyImport_ImportModule (" sass" );
166
+ PyObject* sass_comma = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_COMMA" );
167
+ PyObject* sass_space = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_SPACE" );
168
+ union Sass_Value* retv = NULL ;
169
+ Py_ssize_t i = 0 ;
170
+ PyObject* items = PyObject_GetAttrString (value, " items" );
171
+ PyObject* separator = PyObject_GetAttrString (value, " separator" );
172
+ Sass_Separator sep = SASS_COMMA;
173
+ if (separator == sass_comma) {
174
+ sep = SASS_COMMA;
175
+ } else if (separator == sass_space) {
176
+ sep = SASS_SPACE;
177
+ } else {
178
+ assert (0 );
179
+ }
180
+ retv = sass_make_list (PyTuple_Size (items), sep);
181
+ for (i = 0 ; i < PyTuple_Size (items); i += 1 ) {
182
+ sass_list_set_value (
183
+ retv, i, _to_sass_value (PyTuple_GET_ITEM (items, i))
184
+ );
185
+ }
186
+ Py_DECREF (types_mod);
187
+ Py_DECREF (sass_comma);
188
+ Py_DECREF (sass_space);
189
+ Py_DECREF (items);
190
+ Py_DECREF (separator);
191
+ return retv;
192
+ }
193
+
194
+ static union Sass_Value* _mapping_to_sass_value (PyObject* value) {
195
+ union Sass_Value* retv = NULL ;
196
+ size_t i = 0 ;
197
+ Py_ssize_t pos = 0 ;
198
+ PyObject* d_key = NULL ;
199
+ PyObject* d_value = NULL ;
200
+ PyObject* dct = PyDict_New ();
201
+ PyDict_Update (dct, value);
202
+ retv = sass_make_map (PyDict_Size (dct));
203
+ while (PyDict_Next (dct, &pos, &d_key, &d_value)) {
204
+ sass_map_set_key (retv, i, _to_sass_value (d_key));
205
+ sass_map_set_value (retv, i, _to_sass_value (d_value));
206
+ i += 1 ;
207
+ }
208
+ Py_DECREF (dct);
209
+ return retv;
210
+ }
211
+
212
+ static union Sass_Value* _number_to_sass_value (PyObject* value) {
213
+ union Sass_Value* retv = NULL ;
214
+ PyObject* d_value = PyObject_GetAttrString (value, " value" );
215
+ PyObject* unit = PyObject_GetAttrString (value, " unit" );
216
+ PyObject* bytes = PyUnicode_AsEncodedString (unit, " UTF-8" , " strict" );
217
+ retv = sass_make_number (
218
+ PyFloat_AsDouble (d_value), PySass_Bytes_AS_STRING (bytes)
219
+ );
220
+ Py_DECREF (d_value);
221
+ Py_DECREF (unit);
222
+ Py_DECREF (bytes);
223
+ return retv;
224
+ }
225
+
226
+ static union Sass_Value* _unicode_to_sass_value (PyObject* value) {
227
+ union Sass_Value* retv = NULL ;
228
+ PyObject* bytes = PyUnicode_AsEncodedString (value, " UTF-8" , " strict" );
229
+ retv = sass_make_string (PySass_Bytes_AS_STRING (bytes));
230
+ Py_DECREF (bytes);
231
+ return retv;
232
+ }
233
+
234
+ static union Sass_Value* _warning_to_sass_value (PyObject* value) {
235
+ union Sass_Value* retv = NULL ;
236
+ PyObject* msg = PyObject_GetAttrString (value, " msg" );
237
+ PyObject* bytes = PyUnicode_AsEncodedString (msg, " UTF-8" , " strict" );
238
+ retv = sass_make_warning (PySass_Bytes_AS_STRING (bytes));
239
+ Py_DECREF (msg);
240
+ Py_DECREF (bytes);
241
+ return retv;
242
+ }
243
+
244
+ static union Sass_Value* _error_to_sass_value (PyObject* value) {
245
+ union Sass_Value* retv = NULL ;
246
+ PyObject* msg = PyObject_GetAttrString (value, " msg" );
247
+ PyObject* bytes = PyUnicode_AsEncodedString (msg, " UTF-8" , " strict" );
248
+ retv = sass_make_error (PySass_Bytes_AS_STRING (bytes));
249
+ Py_DECREF (msg);
250
+ Py_DECREF (bytes);
251
+ return retv;
252
+ }
253
+
254
+ static union Sass_Value* _unknown_type_to_sass_error (PyObject* value) {
255
+ union Sass_Value* retv = NULL ;
256
+ PyObject* type = PyObject_Type (value);
257
+ PyObject* type_name = PyObject_GetAttrString (type, " __name__" );
258
+ PyObject* fmt = PyUnicode_FromString (
259
+ " Unexpected type: `{0}`.\n "
260
+ " Expected one of:\n "
261
+ " - None\n "
262
+ " - bool\n "
263
+ " - str\n "
264
+ " - SassNumber\n "
265
+ " - SassColor\n "
266
+ " - SassList\n "
267
+ " - dict\n "
268
+ " - SassMap\n "
269
+ " - SassWarning\n "
270
+ " - SassError\n "
271
+ );
272
+ PyObject* format_meth = PyObject_GetAttrString (fmt, " format" );
273
+ PyObject* result = PyObject_CallFunctionObjArgs (
274
+ format_meth, type_name, NULL
275
+ );
276
+ PyObject* bytes = PyUnicode_AsEncodedString (result, " UTF-8" , " strict" );
277
+ retv = sass_make_error (PySass_Bytes_AS_STRING (bytes));
278
+ Py_DECREF (type);
279
+ Py_DECREF (type_name);
280
+ Py_DECREF (fmt);
281
+ Py_DECREF (format_meth);
282
+ Py_DECREF (result);
283
+ Py_DECREF (bytes);
284
+ return retv;
285
+ }
286
+
287
+ static union Sass_Value* _exception_to_sass_error () {
288
+ union Sass_Value* retv = NULL ;
289
+ PyObject* etype = NULL ;
290
+ PyObject* evalue = NULL ;
291
+ PyObject* etb = NULL ;
292
+ PyErr_Fetch (&etype, &evalue, &etb);
293
+ {
294
+ PyObject* traceback_mod = PyImport_ImportModule (" traceback" );
295
+ PyObject* traceback_parts = PyObject_CallMethod (
296
+ traceback_mod, " format_exception" , " OOO" , etype, evalue, etb
297
+ );
298
+ PyList_Insert (traceback_parts, 0 , PyUnicode_FromString (" \n " ));
299
+ PyObject* joinstr = PyUnicode_FromString (" " );
300
+ PyObject* result = PyUnicode_Join (joinstr, traceback_parts);
301
+ PyObject* bytes = PyUnicode_AsEncodedString (
302
+ result, " UTF-8" , " strict"
303
+ );
304
+ retv = sass_make_error (PySass_Bytes_AS_STRING (bytes));
305
+ Py_DECREF (traceback_mod);
306
+ Py_DECREF (traceback_parts);
307
+ Py_DECREF (joinstr);
308
+ Py_DECREF (result);
309
+ Py_DECREF (bytes);
310
+ }
311
+ return retv;
312
+ }
313
+
132
314
static union Sass_Value* _to_sass_value (PyObject* value) {
133
315
union Sass_Value* retv = NULL ;
134
316
PyObject* types_mod = PyImport_ImportModule (" sass" );
@@ -137,121 +319,31 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
137
319
PyObject* sass_list_t = PyObject_GetAttrString (types_mod, " SassList" );
138
320
PyObject* sass_warning_t = PyObject_GetAttrString (types_mod, " SassWarning" );
139
321
PyObject* sass_error_t = PyObject_GetAttrString (types_mod, " SassError" );
140
- PyObject* sass_comma = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_COMMA" );
141
- PyObject* sass_space = PyObject_GetAttrString (types_mod, " SASS_SEPARATOR_SPACE" );
142
322
143
323
if (value == Py_None) {
144
324
retv = sass_make_null ();
145
325
} else if (PyBool_Check (value)) {
146
326
retv = sass_make_boolean (value == Py_True);
147
327
} else if (PyUnicode_Check (value)) {
148
- PyObject* bytes = PyUnicode_AsEncodedString (value, " UTF-8" , " strict" );
149
- retv = sass_make_string (PySass_Bytes_AS_STRING (bytes));
150
- Py_DECREF (bytes);
328
+ retv = _unicode_to_sass_value (value);
151
329
} else if (PySass_Bytes_Check (value)) {
152
330
retv = sass_make_string (PySass_Bytes_AS_STRING (value));
153
331
} else if (PyMapping_Check (value)) {
154
- size_t i = 0 ;
155
- Py_ssize_t pos = 0 ;
156
- PyObject* d_key = NULL ;
157
- PyObject* d_value = NULL ;
158
- PyObject* dct = PyDict_New ();
159
- PyDict_Update (dct, value);
160
- retv = sass_make_map (PyDict_Size (dct));
161
- while (PyDict_Next (dct, &pos, &d_key, &d_value)) {
162
- sass_map_set_key (retv, i, _to_sass_value (d_key));
163
- sass_map_set_value (retv, i, _to_sass_value (d_value));
164
- i += 1 ;
165
- }
166
- Py_DECREF (dct);
332
+ retv = _mapping_to_sass_value (value);
167
333
} else if (PyObject_IsInstance (value, sass_number_t )) {
168
- PyObject* d_value = PyObject_GetAttrString (value, " value" );
169
- PyObject* unit = PyObject_GetAttrString (value, " unit" );
170
- PyObject* bytes = PyUnicode_AsEncodedString (unit, " UTF-8" , " strict" );
171
- retv = sass_make_number (
172
- PyFloat_AsDouble (d_value), PySass_Bytes_AS_STRING (bytes)
173
- );
174
- Py_DECREF (d_value);
175
- Py_DECREF (unit);
176
- Py_DECREF (bytes);
334
+ retv = _number_to_sass_value (value);
177
335
} else if (PyObject_IsInstance (value, sass_color_t )) {
178
- PyObject* r_value = PyObject_GetAttrString (value, " r" );
179
- PyObject* g_value = PyObject_GetAttrString (value, " g" );
180
- PyObject* b_value = PyObject_GetAttrString (value, " b" );
181
- PyObject* a_value = PyObject_GetAttrString (value, " a" );
182
- retv = sass_make_color (
183
- PyFloat_AsDouble (r_value),
184
- PyFloat_AsDouble (g_value),
185
- PyFloat_AsDouble (b_value),
186
- PyFloat_AsDouble (a_value)
187
- );
188
- Py_DECREF (r_value);
189
- Py_DECREF (g_value);
190
- Py_DECREF (b_value);
191
- Py_DECREF (a_value);
336
+ retv = _color_to_sass_value (value);
192
337
} else if (PyObject_IsInstance (value, sass_list_t )) {
193
- Py_ssize_t i = 0 ;
194
- PyObject* items = PyObject_GetAttrString (value, " items" );
195
- PyObject* separator = PyObject_GetAttrString (value, " separator" );
196
- Sass_Separator sep = SASS_COMMA;
197
- if (separator == sass_comma) {
198
- sep = SASS_COMMA;
199
- } else if (separator == sass_space) {
200
- sep = SASS_SPACE;
201
- } else {
202
- assert (0 );
203
- }
204
- retv = sass_make_list (PyTuple_Size (items), sep);
205
- for (i = 0 ; i < PyTuple_Size (items); i += 1 ) {
206
- sass_list_set_value (
207
- retv, i, _to_sass_value (PyTuple_GET_ITEM (items, i))
208
- );
209
- }
210
- Py_DECREF (items);
211
- Py_DECREF (separator);
338
+ retv = _list_to_sass_value (value);
212
339
} else if (PyObject_IsInstance (value, sass_warning_t )) {
213
- PyObject* msg = PyObject_GetAttrString (value, " msg" );
214
- PyObject* bytes = PyUnicode_AsEncodedString (msg, " UTF-8" , " strict" );
215
- retv = sass_make_warning (PySass_Bytes_AS_STRING (bytes));
216
- Py_DECREF (msg);
217
- Py_DECREF (bytes);
340
+ retv = _warning_to_sass_value (value);
218
341
} else if (PyObject_IsInstance (value, sass_error_t )) {
219
- PyObject* msg = PyObject_GetAttrString (value, " msg" );
220
- PyObject* bytes = PyUnicode_AsEncodedString (msg, " UTF-8" , " strict" );
221
- retv = sass_make_error (PySass_Bytes_AS_STRING (bytes));
222
- Py_DECREF (msg);
223
- Py_DECREF (bytes);
342
+ retv = _error_to_sass_value (value);
224
343
}
225
344
226
345
if (retv == NULL ) {
227
- PyObject* type = PyObject_Type (value);
228
- PyObject* type_name = PyObject_GetAttrString (type, " __name__" );
229
- PyObject* fmt = PyUnicode_FromString (
230
- " Unexpected type: `{0}`.\n "
231
- " Expected one of:\n "
232
- " - None\n "
233
- " - bool\n "
234
- " - str\n "
235
- " - SassNumber\n "
236
- " - SassColor\n "
237
- " - SassList\n "
238
- " - dict\n "
239
- " - SassMap\n "
240
- " - SassWarning\n "
241
- " - SassError\n "
242
- );
243
- PyObject* format_meth = PyObject_GetAttrString (fmt, " format" );
244
- PyObject* result = PyObject_CallFunctionObjArgs (
245
- format_meth, type_name, NULL
246
- );
247
- PyObject* bytes = PyUnicode_AsEncodedString (result, " UTF-8" , " strict" );
248
- retv = sass_make_error (PySass_Bytes_AS_STRING (bytes));
249
- Py_DECREF (type);
250
- Py_DECREF (type_name);
251
- Py_DECREF (fmt);
252
- Py_DECREF (format_meth);
253
- Py_DECREF (result);
254
- Py_DECREF (bytes);
346
+ retv = _unknown_type_to_sass_error (value);
255
347
}
256
348
257
349
Py_DECREF (types_mod);
@@ -260,8 +352,6 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
260
352
Py_DECREF (sass_list_t );
261
353
Py_DECREF (sass_warning_t );
262
354
Py_DECREF (sass_error_t );
263
- Py_DECREF (sass_comma);
264
- Py_DECREF (sass_space);
265
355
return retv;
266
356
}
267
357
@@ -275,7 +365,7 @@ static union Sass_Value* _call_py_f(
275
365
union Sass_Value* sass_result = NULL ;
276
366
277
367
for (i = 0 ; i < sass_list_get_length (sass_args); i += 1 ) {
278
- union Sass_Value* sass_arg = sass_list_get_value (sass_args, i);
368
+ const union Sass_Value* sass_arg = sass_list_get_value (sass_args, i);
279
369
PyObject* py_arg = NULL ;
280
370
if (!(py_arg = _to_py_value (sass_arg))) goto done;
281
371
PyTuple_SetItem (py_args, i, py_arg);
@@ -286,28 +376,7 @@ static union Sass_Value* _call_py_f(
286
376
287
377
done:
288
378
if (sass_result == NULL ) {
289
- PyObject* etype = NULL ;
290
- PyObject* evalue = NULL ;
291
- PyObject* etb = NULL ;
292
- {
293
- PyErr_Fetch (&etype, &evalue, &etb);
294
- PyObject* traceback_mod = PyImport_ImportModule (" traceback" );
295
- PyObject* traceback_parts = PyObject_CallMethod (
296
- traceback_mod, " format_exception" , " OOO" , etype, evalue, etb
297
- );
298
- PyList_Insert (traceback_parts, 0 , PyUnicode_FromString (" \n " ));
299
- PyObject* joinstr = PyUnicode_FromString (" " );
300
- PyObject* result = PyUnicode_Join (joinstr, traceback_parts);
301
- PyObject* bytes = PyUnicode_AsEncodedString (
302
- result, " UTF-8" , " strict"
303
- );
304
- sass_result = sass_make_error (PySass_Bytes_AS_STRING (bytes));
305
- Py_DECREF (traceback_mod);
306
- Py_DECREF (traceback_parts);
307
- Py_DECREF (joinstr);
308
- Py_DECREF (result);
309
- Py_DECREF (bytes);
310
- }
379
+ sass_result = _exception_to_sass_error ();
311
380
}
312
381
Py_XDECREF (py_args);
313
382
Py_XDECREF (py_result);
0 commit comments