Skip to content

Commit cc7136c

Browse files
committed
Add declaration for sass operators into Eval header
Change parameters to more specialized types when possible!
1 parent 484b338 commit cc7136c

File tree

3 files changed

+51
-44
lines changed

3 files changed

+51
-44
lines changed

eval.cpp

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -440,16 +440,6 @@ namespace Sass {
440440
return mm;
441441
}
442442

443-
// -- only need to define two comparisons, and the rest can be implemented in terms of them
444-
bool eq(Expression*, Expression*, Context&, Eval*);
445-
bool lt(Expression*, Expression*, Context&);
446-
// -- arithmetic on the combinations that matter
447-
Expression* op_numbers(Context&, Binary_Expression*, Expression*, Expression*);
448-
Expression* op_number_color(Context&, enum Sass_OP, Expression*, Expression*);
449-
Expression* op_color_number(Context&, enum Sass_OP, Expression*, Expression*);
450-
Expression* op_colors(Context&, enum Sass_OP, Expression*, Expression*);
451-
Expression* op_strings(Context&, enum Sass_OP, Expression*, Expression*);
452-
453443
Expression* Eval::operator()(Binary_Expression* b)
454444
{
455445
enum Sass_OP op_type = b->type();
@@ -520,16 +510,24 @@ namespace Sass {
520510
Expression::Concrete_Type r_type = rhs->concrete_type();
521511

522512
if (l_type == Expression::NUMBER && r_type == Expression::NUMBER) {
523-
return op_numbers(ctx, b, lhs, rhs);
513+
Number* l_n = static_cast<Number*>(lhs);
514+
Number* r_n = static_cast<Number*>(rhs);
515+
return op_numbers(ctx, op_type, l_n, r_n);
524516
}
525517
if (l_type == Expression::NUMBER && r_type == Expression::COLOR) {
526-
return op_number_color(ctx, op_type, lhs, rhs);
518+
Number* l_n = static_cast<Number*>(lhs);
519+
Color* r_c = static_cast<Color*>(rhs);
520+
return op_number_color(ctx, op_type, l_n, r_c);
527521
}
528522
if (l_type == Expression::COLOR && r_type == Expression::NUMBER) {
529-
return op_color_number(ctx, op_type, lhs, rhs);
523+
Color* l_c = static_cast<Color*>(lhs);
524+
Number* r_n = static_cast<Number*>(rhs);
525+
return op_color_number(ctx, op_type, l_c, r_n);
530526
}
531527
if (l_type == Expression::COLOR && r_type == Expression::COLOR) {
532-
return op_colors(ctx, op_type, lhs, rhs);
528+
Color* l_c = static_cast<Color*>(lhs);
529+
Color* r_c = static_cast<Color*>(rhs);
530+
return op_colors(ctx, op_type, l_c, r_c);
533531
}
534532

535533
Expression* ex = op_strings(ctx, op_type, lhs, rhs);
@@ -1066,7 +1064,7 @@ namespace Sass {
10661064

10671065
// All the binary helpers.
10681066

1069-
bool eq(Expression* lhs, Expression* rhs, Context& ctx)
1067+
bool Eval::eq(Expression* lhs, Expression* rhs, Context& ctx)
10701068
{
10711069
Expression::Concrete_Type ltype = lhs->concrete_type();
10721070
Expression::Concrete_Type rtype = rhs->concrete_type();
@@ -1130,7 +1128,7 @@ namespace Sass {
11301128
return false;
11311129
}
11321130

1133-
bool lt(Expression* lhs, Expression* rhs, Context& ctx)
1131+
bool Eval::lt(Expression* lhs, Expression* rhs, Context& ctx)
11341132
{
11351133
if (lhs->concrete_type() != Expression::NUMBER ||
11361134
rhs->concrete_type() != Expression::NUMBER)
@@ -1147,13 +1145,10 @@ namespace Sass {
11471145
return l->value() < tmp_r.value();
11481146
}
11491147

1150-
Expression* op_numbers(Context& ctx, Binary_Expression* b, Expression* lhs, Expression* rhs)
1148+
Expression* Eval::op_numbers(Context& ctx, enum Sass_OP op, Number* l, Number* r)
11511149
{
1152-
Number* l = static_cast<Number*>(lhs);
1153-
Number* r = static_cast<Number*>(rhs);
11541150
double lv = l->value();
11551151
double rv = r->value();
1156-
enum Sass_OP op = b->type();
11571152
if (op == Sass_OP::DIV && !rv) {
11581153
return new (ctx.mem) String_Quoted(l->pstate(), "Infinity");
11591154
}
@@ -1170,7 +1165,7 @@ namespace Sass {
11701165
error("Incompatible units: '"+r_unit+"' and '"+l_unit+"'.", l->pstate());
11711166
}
11721167
Number* v = new (ctx.mem) Number(*l);
1173-
v->pstate(b->pstate());
1168+
v->pstate(l->pstate());
11741169
if (l_unit.empty() && (op == Sass_OP::ADD || op == Sass_OP::SUB || op == Sass_OP::MOD)) {
11751170
v->numerator_units() = r->numerator_units();
11761171
v->denominator_units() = r->denominator_units();
@@ -1200,10 +1195,8 @@ namespace Sass {
12001195
return v;
12011196
}
12021197

1203-
Expression* op_number_color(Context& ctx, enum Sass_OP op, Expression* lhs, Expression* rhs)
1198+
Expression* Eval::op_number_color(Context& ctx, enum Sass_OP op, Number* l, Color* r)
12041199
{
1205-
Number* l = static_cast<Number*>(lhs);
1206-
Color* r = static_cast<Color*>(rhs);
12071200
// TODO: currently SASS converts colors to standard form when adding to strings;
12081201
// when https://github.com/nex3/sass/issues/363 is added this can be removed to
12091202
// preserve the original value
@@ -1239,10 +1232,8 @@ namespace Sass {
12391232
return l;
12401233
}
12411234

1242-
Expression* op_color_number(Context& ctx, enum Sass_OP op, Expression* lhs, Expression* rhs)
1235+
Expression* Eval::op_color_number(Context& ctx, enum Sass_OP op, Color* l, Number* r)
12431236
{
1244-
Color* l = static_cast<Color*>(lhs);
1245-
Number* r = static_cast<Number*>(rhs);
12461237
double rv = r->value();
12471238
if (op == Sass_OP::DIV && !rv) error("division by zero", r->pstate());
12481239
return new (ctx.mem) Color(l->pstate(),
@@ -1252,10 +1243,8 @@ namespace Sass {
12521243
l->a());
12531244
}
12541245

1255-
Expression* op_colors(Context& ctx, enum Sass_OP op, Expression* lhs, Expression* rhs)
1246+
Expression* Eval::op_colors(Context& ctx, enum Sass_OP op, Color* l, Color* r)
12561247
{
1257-
Color* l = static_cast<Color*>(lhs);
1258-
Color* r = static_cast<Color*>(rhs);
12591248
if (l->a() != r->a()) {
12601249
error("alpha channels must be equal when combining colors", r->pstate());
12611250
}
@@ -1270,7 +1259,7 @@ namespace Sass {
12701259
l->a());
12711260
}
12721261

1273-
Expression* op_strings(Context& ctx, enum Sass_OP op, Expression* lhs, Expression*rhs)
1262+
Expression* Eval::op_strings(Context& ctx, enum Sass_OP op, Expression* lhs, Expression*rhs)
12741263
{
12751264
To_String to_string(&ctx);
12761265
Expression::Concrete_Type ltype = lhs->concrete_type();
@@ -1285,19 +1274,29 @@ namespace Sass {
12851274
bool r_str_color = rtype == Expression::STRING && ctx.names_to_colors.count(rstr) && !r_str_quoted;
12861275

12871276
if (l_str_color && r_str_color) {
1288-
return op_colors(ctx, op, ctx.names_to_colors[lstr], ctx.names_to_colors[rstr]);
1277+
Color* l_c = ctx.names_to_colors[lstr];
1278+
Color* r_c = ctx.names_to_colors[rstr];
1279+
return op_colors(ctx, op, l_c, r_c);
12891280
}
12901281
else if (l_str_color && rtype == Expression::COLOR) {
1291-
return op_colors(ctx, op, ctx.names_to_colors[lstr], rhs);
1292-
}
1293-
else if (l_str_color && rtype == Expression::NUMBER) {
1294-
return op_color_number(ctx, op, ctx.names_to_colors[lstr], rhs);
1282+
Color* l_c = ctx.names_to_colors[lstr];
1283+
Color* r_c = dynamic_cast<Color*>(rhs);
1284+
return op_colors(ctx, op, l_c, r_c);
12951285
}
12961286
else if (ltype == Expression::COLOR && r_str_color) {
1297-
return op_number_color(ctx, op, lhs, ctx.names_to_colors[rstr]);
1287+
Color* l_c = dynamic_cast<Color*>(lhs);
1288+
Color* r_c = ctx.names_to_colors[rstr];
1289+
return op_colors(ctx, op, l_c, r_c);
1290+
}
1291+
else if (l_str_color && rtype == Expression::NUMBER) {
1292+
Color* l_c = ctx.names_to_colors[lstr];
1293+
Number* r_n = dynamic_cast<Number*>(rhs);
1294+
return op_color_number(ctx, op, l_c, r_n);
12981295
}
12991296
else if (ltype == Expression::NUMBER && r_str_color) {
1300-
return op_number_color(ctx, op, lhs, ctx.names_to_colors[rstr]);
1297+
Number* l_n = dynamic_cast<Number*>(lhs);
1298+
Color* r_c = ctx.names_to_colors[rstr];
1299+
return op_number_color(ctx, op, l_n, r_c);
13011300
}
13021301
if (op == Sass_OP::MUL) error("invalid operands for multiplication", lhs->pstate());
13031302
if (op == Sass_OP::MOD) error("invalid operands for modulo", lhs->pstate());

eval.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,23 @@ namespace Sass {
8585
template <typename U>
8686
Expression* fallback(U x) { return fallback_impl(x); }
8787

88+
// -- only need to define two comparisons, and the rest can be implemented in terms of them
89+
static bool eq(Expression*, Expression*, Context&);
90+
static bool lt(Expression*, Expression*, Context&);
91+
// -- arithmetic on the combinations that matter
92+
static Expression* op_numbers(Context&, enum Sass_OP, Number*, Number*);
93+
static Expression* op_number_color(Context&, enum Sass_OP, Number*, Color*);
94+
static Expression* op_color_number(Context&, enum Sass_OP, Color*, Number*);
95+
static Expression* op_colors(Context&, enum Sass_OP, Color*, Color*);
96+
static Expression* op_strings(Context&, enum Sass_OP, Expression*, Expression*);
97+
8898
private:
8999
string interpolation(Expression* s);
90100

91101
};
92102

93103
Expression* cval_to_astnode(Sass_Value* v, Context& ctx, Backtrace* backtrace, ParserState pstate = ParserState("[AST]"));
94104

95-
bool eq(Expression*, Expression*, Context&);
96-
bool lt(Expression*, Expression*, Context&);
97105
}
98106

99107
#endif

functions.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ namespace Sass {
10771077
Number* xi = dynamic_cast<Number*>(arglist->value_at_index(i));
10781078
if (!xi) error("`" + string(sig) + "` only takes numeric arguments", pstate);
10791079
if (least) {
1080-
if (lt(xi, least, ctx)) least = xi;
1080+
if (Eval::lt(xi, least, ctx)) least = xi;
10811081
} else least = xi;
10821082
}
10831083
return least;
@@ -1092,7 +1092,7 @@ namespace Sass {
10921092
Number* xi = dynamic_cast<Number*>(arglist->value_at_index(i));
10931093
if (!xi) error("`" + string(sig) + "` only takes numeric arguments", pstate);
10941094
if (greatest) {
1095-
if (lt(greatest, xi, ctx)) greatest = xi;
1095+
if (Eval::lt(greatest, xi, ctx)) greatest = xi;
10961096
} else greatest = xi;
10971097
}
10981098
return greatest;
@@ -1202,7 +1202,7 @@ namespace Sass {
12021202
*l << ARG("$list", Expression);
12031203
}
12041204
for (size_t i = 0, L = l->length(); i < L; ++i) {
1205-
if (eq(l->value_at_index(i), v, ctx)) return new (ctx.mem) Number(pstate, i+1);
1205+
if (Eval::eq(l->value_at_index(i), v, ctx)) return new (ctx.mem) Number(pstate, i+1);
12061206
}
12071207
return new (ctx.mem) Null(pstate);
12081208
}
@@ -1377,7 +1377,7 @@ namespace Sass {
13771377
for (auto key : m->keys()) {
13781378
remove = false;
13791379
for (size_t j = 0, K = arglist->length(); j < K && !remove; ++j) {
1380-
remove = eq(key, arglist->value_at_index(j), ctx);
1380+
remove = Eval::eq(key, arglist->value_at_index(j), ctx);
13811381
}
13821382
if (!remove) *result << make_pair(key, m->at(key));
13831383
}

0 commit comments

Comments
 (0)