Commit 104793cd by Aaron Leung

Finally figured out a decent method of resolving calls to built-in overloaded functions.

parent cd19a7fc
...@@ -290,10 +290,12 @@ namespace Sass { ...@@ -290,10 +290,12 @@ namespace Sass {
case Node::function_call: { case Node::function_call: {
// TO DO: default-constructed Function should be a generic callback (maybe) // TO DO: default-constructed Function should be a generic callback (maybe)
// eval the function name in case it's interpolated // eval the function name in case it's interpolated
expr[0] = eval(expr[0], prefix, env, f_env, new_Node, ctx); expr[0] = eval(expr[0], prefix, env, f_env, new_Node, ctx);
string name(expr[0].to_string()); string name(expr[0].to_string());
if (!f_env.count(name)) { if (!f_env.count(name)) {
// no definition available; just pass it through (with evaluated args)
Node args(expr[1]); Node args(expr[1]);
for (size_t i = 0, S = args.size(); i < S; ++i) { for (size_t i = 0, S = args.size(); i < S; ++i) {
args[i] = eval(args[i], prefix, env, f_env, new_Node, ctx); args[i] = eval(args[i], prefix, env, f_env, new_Node, ctx);
...@@ -301,7 +303,16 @@ namespace Sass { ...@@ -301,7 +303,16 @@ namespace Sass {
return expr; return expr;
} }
else { else {
return apply_function(f_env[name], expr[1], prefix, env, f_env, new_Node, ctx); // check to see if the function is primitive/built-in
Function f(f_env[name]);
if (f.primitive && f.overloaded) {
stringstream s;
s << name << " " << expr[1].size();
f = f_env[s.str()];
cerr << "applying overloaded primitive [" << s.str() << "]" << endl;
}
cerr << "about to apply function " << f.name << endl;
return apply_function(f, expr[1], prefix, env, f_env, new_Node, ctx);
} }
} break; } break;
......
...@@ -19,6 +19,7 @@ namespace Sass { ...@@ -19,6 +19,7 @@ namespace Sass {
Node parameters; Node parameters;
Node definition; Node definition;
Primitive primitive; Primitive primitive;
bool overloaded;
Function() Function()
{ /* TO DO: set up the generic callback here */ } { /* TO DO: set up the generic callback here */ }
...@@ -27,14 +28,16 @@ namespace Sass { ...@@ -27,14 +28,16 @@ namespace Sass {
: name(def[0].to_string()), : name(def[0].to_string()),
parameters(def[1]), parameters(def[1]),
definition(def), definition(def),
primitive(0) primitive(0),
overloaded(false)
{ } { }
Function(Function_Descriptor d, Primitive ip, Node_Factory& new_Node) Function(Function_Descriptor d, Primitive ip, Node_Factory& new_Node, bool overloaded = false)
: name(d[0]), : name(d[0]),
parameters(new_Node(Node::parameters, "[PRIMITIVE FUNCTIONS]", 0, 0)), parameters(new_Node(Node::parameters, "[PRIMITIVE FUNCTIONS]", 0, 0)),
definition(Node()), definition(Node()),
primitive(ip) primitive(ip),
overloaded(overloaded)
{ {
size_t len = 0; size_t len = 0;
while (d[len+1]) ++len; while (d[len+1]) ++len;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment