@@ -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