Skip to content

Commit 0a9e498

Browse files
committed
Split things into functions
1 parent 15102a0 commit 0a9e498

File tree

1 file changed

+192
-123
lines changed

1 file changed

+192
-123
lines changed

pysass.cpp

Lines changed: 192 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@
2222
extern "C" {
2323
#endif
2424

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+
2538
struct PySass_Pair {
2639
char *label;
2740
int value;
@@ -129,6 +142,175 @@ static PyObject* _to_py_value(const union Sass_Value* value) {
129142
return retv;
130143
}
131144

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+
132314
static union Sass_Value* _to_sass_value(PyObject* value) {
133315
union Sass_Value* retv = NULL;
134316
PyObject* types_mod = PyImport_ImportModule("sass");
@@ -137,121 +319,31 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
137319
PyObject* sass_list_t = PyObject_GetAttrString(types_mod, "SassList");
138320
PyObject* sass_warning_t = PyObject_GetAttrString(types_mod, "SassWarning");
139321
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");
142322

143323
if (value == Py_None) {
144324
retv = sass_make_null();
145325
} else if (PyBool_Check(value)) {
146326
retv = sass_make_boolean(value == Py_True);
147327
} 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);
151329
} else if (PySass_Bytes_Check(value)) {
152330
retv = sass_make_string(PySass_Bytes_AS_STRING(value));
153331
} 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);
167333
} 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);
177335
} 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);
192337
} 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);
212339
} 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);
218341
} 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);
224343
}
225344

226345
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);
255347
}
256348

257349
Py_DECREF(types_mod);
@@ -260,8 +352,6 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
260352
Py_DECREF(sass_list_t);
261353
Py_DECREF(sass_warning_t);
262354
Py_DECREF(sass_error_t);
263-
Py_DECREF(sass_comma);
264-
Py_DECREF(sass_space);
265355
return retv;
266356
}
267357

@@ -275,7 +365,7 @@ static union Sass_Value* _call_py_f(
275365
union Sass_Value* sass_result = NULL;
276366

277367
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);
279369
PyObject* py_arg = NULL;
280370
if (!(py_arg = _to_py_value(sass_arg))) goto done;
281371
PyTuple_SetItem(py_args, i, py_arg);
@@ -286,28 +376,7 @@ static union Sass_Value* _call_py_f(
286376

287377
done:
288378
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();
311380
}
312381
Py_XDECREF(py_args);
313382
Py_XDECREF(py_result);

0 commit comments

Comments
 (0)