Skip to content

Commit

Permalink
Showing 4 changed files with 30 additions and 5 deletions.
17 changes: 17 additions & 0 deletions environment.hpp
Original file line number Diff line number Diff line change
@@ -37,12 +37,29 @@ namespace Sass {
bool current_frame_has(const string key) const
{ return !!current_frame_.count(key); }

void current_frame_set(const string key, T val)
{ current_frame_[key] = val; }

void global_frame_set(const string key, T val)
{ global_frame()->current_frame_[key] = val; }

Environment* grandparent() const
{
if(parent_ && parent_->parent_) return parent_->parent_;
else return 0;
}

Environment* global_frame()
{
Environment* cur = this;
// looks like global variables
// are in the second last parent
while (cur->grandparent()) {
cur = cur->parent_;
}
return cur;
}

bool global_frame_has(const string key) const
{
if(parent_ && !grandparent()) {
7 changes: 5 additions & 2 deletions eval.cpp
Original file line number Diff line number Diff line change
@@ -64,12 +64,15 @@ namespace Sass {
Expression* Eval::operator()(Assignment* a)
{
string var(a->variable());
if (env->has(var)) {
if (a->is_global()) {
env->global_frame_set(var, a->value()->perform(this));
}
else if (env->has(var)) {
Expression* v = static_cast<Expression*>((*env)[var]);
if (!a->is_guarded() || v->concrete_type() == Expression::NULL_VAL) (*env)[var] = a->value()->perform(this);
}
else {
env->current_frame()[var] = a->value()->perform(this);
env->current_frame_set(var, a->value()->perform(this));
}
return 0;
}
7 changes: 5 additions & 2 deletions expand.cpp
Original file line number Diff line number Diff line change
@@ -219,12 +219,15 @@ namespace Sass {
{
string var(a->variable());
Selector* p = selector_stack.size() <= 1 ? 0 : selector_stack.back();
if (env->has(var)) {
if (a->is_global()) {
env->global_frame_set(var, a->value()->perform(eval->with(p, env, backtrace)));
}
else if (env->has(var)) {
Expression* v = static_cast<Expression*>((*env)[var]);
if (!a->is_guarded() || v->concrete_type() == Expression::NULL_VAL) (*env)[var] = a->value()->perform(eval->with(p, env, backtrace));
}
else {
env->current_frame()[var] = a->value()->perform(eval->with(p, env, backtrace));
env->current_frame_set(var, a->value()->perform(eval->with(p, env, backtrace)));
}
return 0;
}
4 changes: 3 additions & 1 deletion functions.cpp
Original file line number Diff line number Diff line change
@@ -145,7 +145,9 @@ namespace Sass {
static mt19937 rand(static_cast<unsigned int>(GetSeed()));

// features
static set<string> features;
static set<string> features {
"global-variable-shadowing"
};

////////////////
// RGB FUNCTIONS

0 comments on commit b221b40

Please sign in to comment.