@@ -359,51 +359,66 @@ extern "C" {
359359
360360 Sass::Value* rv = 0 ;
361361 Memory_Manager<AST_Node> mem;
362- Value* lhs = sass_value_to_ast_node (mem, a);
363- Value* rhs = sass_value_to_ast_node (mem, b);
364-
365- // see if it's a relational expression
366- switch (op) {
367- case Sass_OP::EQ: return sass_make_boolean (Eval::eq (lhs, rhs));
368- case Sass_OP::NEQ: return sass_make_boolean (!Eval::eq (lhs, rhs));
369- case Sass_OP::GT: return sass_make_boolean (!Eval::lt (lhs, rhs) && !Eval::eq (lhs, rhs));
370- case Sass_OP::GTE: return sass_make_boolean (!Eval::lt (lhs, rhs));
371- case Sass_OP::LT: return sass_make_boolean (Eval::lt (lhs, rhs));
372- case Sass_OP::LTE: return sass_make_boolean (Eval::lt (lhs, rhs) || Eval::eq (lhs, rhs));
373- default : break ;
374- }
375362
376- if (sass_value_is_number (a) && sass_value_is_number (b)) {
377- const Number* l_n = dynamic_cast <const Number*>(lhs);
378- const Number* r_n = dynamic_cast <const Number*>(rhs);
379- rv = Eval::op_numbers (mem, op, *l_n, *r_n);
380- }
381- else if (sass_value_is_number (a) && sass_value_is_color (a)) {
382- const Number* l_n = dynamic_cast <const Number*>(lhs);
383- const Color* r_c = dynamic_cast <const Color*>(rhs);
384- rv = Eval::op_number_color (mem, op, *l_n, *r_c);
385- }
386- else if (sass_value_is_color (a) && sass_value_is_number (b)) {
387- const Color* l_c = dynamic_cast <const Color*>(lhs);
388- const Number* r_n = dynamic_cast <const Number*>(rhs);
389- rv = Eval::op_color_number (mem, op, *l_c, *r_n);
390- }
391- else if (sass_value_is_color (a) && sass_value_is_color (b)) {
392- const Color* l_c = dynamic_cast <const Color*>(lhs);
393- const Color* r_c = dynamic_cast <const Color*>(rhs);
394- rv = Eval::op_colors (mem, op, *l_c, *r_c);
395- }
396- else /* convert other stuff to string and apply operation */ {
397- Value* l_v = dynamic_cast <Value*>(lhs);
398- Value* r_v = dynamic_cast <Value*>(rhs);
399- rv = Eval::op_strings (mem, op, *l_v, *r_v);
363+ try {
364+
365+ Value* lhs = sass_value_to_ast_node (mem, a);
366+ Value* rhs = sass_value_to_ast_node (mem, b);
367+
368+ // see if it's a relational expression
369+ switch (op) {
370+ case Sass_OP::EQ: return sass_make_boolean (Eval::eq (lhs, rhs));
371+ case Sass_OP::NEQ: return sass_make_boolean (!Eval::eq (lhs, rhs));
372+ case Sass_OP::GT: return sass_make_boolean (!Eval::lt (lhs, rhs) && !Eval::eq (lhs, rhs));
373+ case Sass_OP::GTE: return sass_make_boolean (!Eval::lt (lhs, rhs));
374+ case Sass_OP::LT: return sass_make_boolean (Eval::lt (lhs, rhs));
375+ case Sass_OP::LTE: return sass_make_boolean (Eval::lt (lhs, rhs) || Eval::eq (lhs, rhs));
376+ default : break ;
377+ }
378+
379+ if (sass_value_is_number (a) && sass_value_is_number (b)) {
380+ const Number* l_n = dynamic_cast <const Number*>(lhs);
381+ const Number* r_n = dynamic_cast <const Number*>(rhs);
382+ rv = Eval::op_numbers (mem, op, *l_n, *r_n);
383+ }
384+ else if (sass_value_is_number (a) && sass_value_is_color (a)) {
385+ const Number* l_n = dynamic_cast <const Number*>(lhs);
386+ const Color* r_c = dynamic_cast <const Color*>(rhs);
387+ rv = Eval::op_number_color (mem, op, *l_n, *r_c);
388+ }
389+ else if (sass_value_is_color (a) && sass_value_is_number (b)) {
390+ const Color* l_c = dynamic_cast <const Color*>(lhs);
391+ const Number* r_n = dynamic_cast <const Number*>(rhs);
392+ rv = Eval::op_color_number (mem, op, *l_c, *r_n);
393+ }
394+ else if (sass_value_is_color (a) && sass_value_is_color (b)) {
395+ const Color* l_c = dynamic_cast <const Color*>(lhs);
396+ const Color* r_c = dynamic_cast <const Color*>(rhs);
397+ rv = Eval::op_colors (mem, op, *l_c, *r_c);
398+ }
399+ else /* convert other stuff to string and apply operation */ {
400+ Value* l_v = dynamic_cast <Value*>(lhs);
401+ Value* r_v = dynamic_cast <Value*>(rhs);
402+ rv = Eval::op_strings (mem, op, *l_v, *r_v);
403+ }
404+
405+ // ToDo: maybe we should should return null value?
406+ if (!rv) return sass_make_error (" invalid return value" );
407+
408+ // convert result back to ast node
409+ return ast_node_to_sass_value (rv);
410+
400411 }
401412
402- // ToDo: maybe we should should return null value?
403- if (!rv) return sass_make_error (" invalid return value" );
413+ // simply pass the error message back to the caller for now
414+ catch (Error_Invalid& e) { return sass_make_error (e.message .c_str ()); }
415+ catch (std::bad_alloc& ba) { return sass_make_error (" memory exhausted" ); }
416+ catch (std::exception& e) { return sass_make_error (e.what ()); }
417+ catch (std::string& e) { return sass_make_error (e.c_str ()); }
418+ catch (const char * e) { return sass_make_error (e); }
419+ catch (...) { return sass_make_error (" unknown" ); }
404420
405- // convert result back to ast node
406- return ast_node_to_sass_value (rv);
421+ return 0 ;
407422
408423 }
409424
0 commit comments