Skip to content
This repository was archived by the owner on Oct 24, 2025. It is now read-only.

Commit 9e4c12d

Browse files
author
Aaron Leung
committed
Refactoring a bit.
1 parent 2dbc45a commit 9e4c12d

File tree

1 file changed

+54
-154
lines changed

1 file changed

+54
-154
lines changed

eval_apply.cpp

Lines changed: 54 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,58 @@ namespace Sass {
624624
}
625625
}
626626

627+
Node eval_arguments(Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx)
628+
{
629+
Node evaluated_args(new_Node(Node::arguments, args.path(), args.line(), args.size()));
630+
for (size_t i = 0, S = args.size(); i < S; ++i) {
631+
if (args[i].type() != Node::assignment) {
632+
evaluated_args << eval(args[i], prefix, env, f_env, new_Node, ctx);
633+
if (evaluated_args.back().type() == Node::list) {
634+
Node arg_list(evaluated_args.back());
635+
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
636+
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
637+
}
638+
}
639+
}
640+
else {
641+
Node kwdarg(new_Node(Node::assignment, args[i].path(), args[i].line(), 2));
642+
kwdarg << args[i][0];
643+
kwdarg << eval(args[i][1], prefix, env, f_env, new_Node, ctx);
644+
if (kwdarg.back().type() == Node::list) {
645+
Node arg_list(kwdarg.back());
646+
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
647+
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
648+
}
649+
}
650+
evaluated_args << kwdarg;
651+
}
652+
}
653+
// eval twice because args may be delayed
654+
for (size_t i = 0, S = evaluated_args.size(); i < S; ++i) {
655+
if (evaluated_args[i].type() != Node::assignment) {
656+
evaluated_args[i] = eval(evaluated_args[i], prefix, env, f_env, new_Node, ctx);
657+
if (evaluated_args[i].type() == Node::list) {
658+
Node arg_list(evaluated_args[i]);
659+
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
660+
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
661+
}
662+
}
663+
}
664+
else {
665+
Node kwdarg(evaluated_args[i]);
666+
kwdarg[1] = eval(kwdarg[1], prefix, env, f_env, new_Node, ctx);
667+
if (kwdarg[1].type() == Node::list) {
668+
Node arg_list(kwdarg[1]);
669+
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
670+
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
671+
}
672+
}
673+
evaluated_args[i] = kwdarg;
674+
}
675+
}
676+
return evaluated_args;
677+
}
678+
627679
// Helper function for binding arguments in function and mixin calls.
628680
// Needs the environment containing the bindings to be passed in by the
629681
// caller. Also expects the caller to have pre-evaluated the arguments.
@@ -685,76 +737,7 @@ namespace Sass {
685737
{
686738
Node params(mixin[1]);
687739
Node body(new_Node(mixin[2])); // clone the body
688-
// evaluate arguments in the current environment
689-
// Node evaluated_args = new_Node(args);
690-
// for (size_t i = 0, S = evaluated_args.size(); i < S; ++i) {
691-
// if (evaluated_args[i].type() != Node::assignment) {
692-
// evaluated_args[i] = eval(evaluated_args[i], prefix, env, f_env, new_Node, ctx);
693-
// }
694-
// else {
695-
// evaluated_args[i][1] = eval(evaluated_args[i][1], prefix, env, f_env, new_Node, ctx);
696-
// }
697-
// }
698-
// // need to eval twice because some expressions get delayed
699-
// for (size_t i = 0, S = args.size(); i < S; ++i) {
700-
// if (args[i].type() != Node::assignment) {
701-
// args[i].should_eval() = true;
702-
// args[i] = eval(args[i], prefix, env, f_env, new_Node, ctx);
703-
// }
704-
// else {
705-
// args[i][1].should_eval() = true;
706-
// args[i][1] = eval(args[i][1], prefix, env, f_env, new_Node, ctx);
707-
// }
708-
// }
709-
710-
Node evaluated_args(new_Node(Node::arguments, args.path(), args.line(), args.size()));
711-
for (size_t i = 0, S = args.size(); i < S; ++i) {
712-
if (args[i].type() != Node::assignment) {
713-
evaluated_args << eval(args[i], prefix, env, f_env, new_Node, ctx);
714-
if (evaluated_args.back().type() == Node::list) {
715-
Node arg_list(evaluated_args.back());
716-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
717-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
718-
}
719-
}
720-
}
721-
else {
722-
Node kwdarg(new_Node(Node::assignment, args[i].path(), args[i].line(), 2));
723-
kwdarg << args[i][0];
724-
kwdarg << eval(args[i][1], prefix, env, f_env, new_Node, ctx);
725-
if (kwdarg.back().type() == Node::list) {
726-
Node arg_list(kwdarg.back());
727-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
728-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
729-
}
730-
}
731-
evaluated_args << kwdarg;
732-
}
733-
}
734-
// eval twice because args maybe delayed
735-
for (size_t i = 0, S = evaluated_args.size(); i < S; ++i) {
736-
if (evaluated_args[i].type() != Node::assignment) {
737-
evaluated_args[i] = eval(evaluated_args[i], prefix, env, f_env, new_Node, ctx);
738-
if (evaluated_args[i].type() == Node::list) {
739-
Node arg_list(evaluated_args[i]);
740-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
741-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
742-
}
743-
}
744-
}
745-
else {
746-
Node kwdarg(evaluated_args[i]);
747-
kwdarg[1] = eval(kwdarg[1], prefix, env, f_env, new_Node, ctx);
748-
if (kwdarg[1].type() == Node::list) {
749-
Node arg_list(kwdarg[1]);
750-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
751-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
752-
}
753-
}
754-
evaluated_args[i] = kwdarg;
755-
}
756-
}
757-
740+
Node evaluated_args(eval_arguments(args, prefix, env, f_env, new_Node, ctx));
758741
// Create a new environment for the mixin and link it to the appropriate parent
759742
Environment bindings;
760743
if (dynamic_scope) {
@@ -783,76 +766,7 @@ namespace Sass {
783766
// primitive function implementation, then return its value.
784767
Node apply_function(const Function& f, const Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, string& path, size_t line)
785768
{
786-
// Node args = new_Node(aargs);
787-
// // evaluate arguments in the current environment
788-
// for (size_t i = 0, S = args.size(); i < S; ++i) {
789-
// if (args[i].type() != Node::assignment) {
790-
// args[i] = eval(args[i], prefix, env, f_env, new_Node, ctx);
791-
// }
792-
// else {
793-
// args[i][1] = eval(args[i][1], prefix, env, f_env, new_Node, ctx);
794-
// }
795-
// }
796-
// // need to eval twice because some expressions get delayed
797-
// for (size_t i = 0, S = args.size(); i < S; ++i) {
798-
// if (args[i].type() != Node::assignment) {
799-
// args[i].should_eval() = true;
800-
// args[i] = eval(args[i], prefix, env, f_env, new_Node, ctx);
801-
// }
802-
// else {
803-
// args[i][1].should_eval() = true;
804-
// args[i][1] = eval(args[i][1], prefix, env, f_env, new_Node, ctx);
805-
// }
806-
// }
807-
Node evaluated_args(new_Node(Node::arguments, args.path(), args.line(), args.size()));
808-
for (size_t i = 0, S = args.size(); i < S; ++i) {
809-
if (args[i].type() != Node::assignment) {
810-
evaluated_args << eval(args[i], prefix, env, f_env, new_Node, ctx);
811-
if (evaluated_args.back().type() == Node::list) {
812-
Node arg_list(evaluated_args.back());
813-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
814-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
815-
}
816-
}
817-
}
818-
else {
819-
Node kwdarg(new_Node(Node::assignment, args[i].path(), args[i].line(), 2));
820-
kwdarg << args[i][0];
821-
kwdarg << eval(args[i][1], prefix, env, f_env, new_Node, ctx);
822-
if (kwdarg.back().type() == Node::list) {
823-
Node arg_list(kwdarg.back());
824-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
825-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
826-
}
827-
}
828-
evaluated_args << kwdarg;
829-
}
830-
}
831-
// eval twice because args maybe delayed
832-
for (size_t i = 0, S = evaluated_args.size(); i < S; ++i) {
833-
if (evaluated_args[i].type() != Node::assignment) {
834-
evaluated_args[i] = eval(evaluated_args[i], prefix, env, f_env, new_Node, ctx);
835-
if (evaluated_args[i].type() == Node::list) {
836-
Node arg_list(evaluated_args[i]);
837-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
838-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
839-
}
840-
}
841-
}
842-
else {
843-
Node kwdarg(evaluated_args[i]);
844-
kwdarg[1] = eval(kwdarg[1], prefix, env, f_env, new_Node, ctx);
845-
if (kwdarg[1].type() == Node::list) {
846-
Node arg_list(kwdarg[1]);
847-
for (size_t j = 0, S = arg_list.size(); j < S; ++j) {
848-
if (arg_list[j].should_eval()) arg_list[j] = eval(arg_list[j], prefix, env, f_env, new_Node, ctx);
849-
}
850-
}
851-
evaluated_args[i] = kwdarg;
852-
}
853-
}
854-
855-
769+
Node evaluated_args(eval_arguments(args, prefix, env, f_env, new_Node, ctx));
856770
// bind arguments
857771
Environment bindings;
858772
Node params(f.primitive ? f.parameters : f.definition[1]);
@@ -872,7 +786,6 @@ namespace Sass {
872786
// algorithm is different in this case because the body needs to be
873787
// executed and a single value needs to be returned directly, rather than
874788
// styles being expanded and spliced in place.
875-
876789
Node function_eval(string name, Node body, Environment& bindings, Node_Factory& new_Node, Context& ctx, bool at_toplevel)
877790
{
878791
for (size_t i = 0, S = body.size(); i < S; ++i) {
@@ -890,14 +803,10 @@ namespace Sass {
890803
val = eval(val, Node(), bindings, ctx.function_env, new_Node, ctx);
891804
}
892805
Node var(stm[0]);
893-
// cerr << "ASSIGNMENT IN FUNCTION: " << var.to_string() << ": " << val.to_string() << endl;
894806
if (stm.is_guarded() && bindings.query(var.token())) continue;
895807
// If a binding exists (possibly upframe), then update it.
896808
// Otherwise, make a new one in the current frame.
897809
if (bindings.query(var.token())) {
898-
// cerr << "MODIFYING EXISTING BINDING FOR " << var.token().to_string() << endl;
899-
// cerr << "CURRENT VALUE: " << bindings[var.token()].to_string() << endl;
900-
// cerr << "NEW VALUE: " << val.to_string() << endl;
901810
bindings[var.token()] = val;
902811
}
903812
else {
@@ -954,11 +863,7 @@ namespace Sass {
954863
each_env.link(bindings);
955864
for (size_t j = 0, T = list.size(); j < T; ++j) {
956865
each_env.current_frame[iter_var.token()] = eval(list[j], Node(), bindings, ctx.function_env, new_Node, ctx);
957-
// cerr << "EACH with " << iter_var.token().to_string() << ": " << each_env[iter_var.token()].to_string() << endl;
958866
Node v(function_eval(name, each_body, each_env, new_Node, ctx));
959-
// cerr << endl << "*** ENV DUMP ***" << endl;
960-
// each_env.print();
961-
// cerr << "*** END ENV ***" << endl << endl;
962867
if (v.is_null()) continue;
963868
else return v;
964869
}
@@ -1021,7 +926,6 @@ namespace Sass {
1021926
// of a backref. When the selector doesn't have backrefs, just prepend the
1022927
// prefix. This function needs multiple subsidiary cases in order to properly
1023928
// combine the various kinds of selectors.
1024-
1025929
Node expand_selector(Node sel, Node pre, Node_Factory& new_Node)
1026930
{
1027931
if (pre.type() == Node::none) return sel;
@@ -1106,7 +1010,6 @@ namespace Sass {
11061010
}
11071011

11081012
// Helper for expanding selectors with backrefs.
1109-
11101013
Node expand_backref(Node sel, Node pre)
11111014
{
11121015
switch (sel.type())
@@ -1132,7 +1035,6 @@ namespace Sass {
11321035
}
11331036

11341037
// Resolve selector extensions.
1135-
11361038
void extend_selectors(vector<pair<Node, Node> >& pending, multimap<Node, Node>& extension_table, Node_Factory& new_Node)
11371039
{
11381040
for (size_t i = 0, S = pending.size(); i < S; ++i) {
@@ -1307,7 +1209,6 @@ namespace Sass {
13071209

13081210
// Helper for generating selector extensions; called for each extendee and
13091211
// extender in a pair of selector groups.
1310-
13111212
Node generate_extension(Node extendee, Node extender, Node_Factory& new_Node)
13121213
{
13131214
Node new_group(new_Node(Node::selector_group, extendee.path(), extendee.line(), 1));
@@ -1363,7 +1264,6 @@ namespace Sass {
13631264
}
13641265

13651266
// Helpers for extracting subsets of selectors
1366-
13671267
Node selector_prefix(Node sel, Node_Factory& new_Node)
13681268
{
13691269
switch (sel.type())

0 commit comments

Comments
 (0)