@@ -216,19 +216,56 @@ namespace Sass {
216
216
string var (a->variable ());
217
217
Selector* p = selector_stack.size () <= 1 ? 0 : selector_stack.back ();
218
218
if (a->is_global ()) {
219
- env->set_global (var, a->value ()->perform (eval->with (p, env, backtrace)));
220
- }
221
- else if (a->is_default ()) {
222
- if (env->has_lexical (var)) return 0 ;
223
- if (env->has_global (var)) {
224
- Expression* e = static_cast <Expression*>(env->get_global (var));
225
- if (e->concrete_type () == Expression::NULL_VAL) {
219
+ if (a->is_default ()) {
220
+ if (env->has_global (var)) {
221
+ Expression* e = dynamic_cast <Expression*>(env->get_global (var));
222
+ if (!e || e->concrete_type () == Expression::NULL_VAL) {
223
+ env->set_global (var, a->value ()->perform (eval->with (p, env, backtrace)));
224
+ }
225
+ }
226
+ else {
226
227
env->set_global (var, a->value ()->perform (eval->with (p, env, backtrace)));
227
228
}
228
- } else {
229
+ }
230
+ else {
229
231
env->set_global (var, a->value ()->perform (eval->with (p, env, backtrace)));
230
232
}
231
233
}
234
+ else if (a->is_default ()) {
235
+ if (env->has_lexical (var)) {
236
+ auto cur = env;
237
+ while (cur && cur->is_lexical ()) {
238
+ if (cur->has_local (var)) {
239
+ if (AST_Node* node = cur->get_local (var)) {
240
+ Expression* e = dynamic_cast <Expression*>(node);
241
+ if (!e || e->concrete_type () == Expression::NULL_VAL) {
242
+ cur->set_local (var, a->value ()->perform (eval->with (p, env, backtrace)));
243
+ }
244
+ }
245
+ else {
246
+ throw runtime_error (" Env not in sync" );
247
+ }
248
+ return 0 ;
249
+ }
250
+ cur = cur->parent ();
251
+ }
252
+ throw runtime_error (" Env not in sync" );
253
+ }
254
+ else if (env->has_global (var)) {
255
+ if (AST_Node* node = env->get_global (var)) {
256
+ Expression* e = dynamic_cast <Expression*>(node);
257
+ if (!e || e->concrete_type () == Expression::NULL_VAL) {
258
+ env->set_global (var, a->value ()->perform (eval->with (p, env, backtrace)));
259
+ }
260
+ }
261
+ }
262
+ else if (env->is_lexical ()) {
263
+ env->set_local (var, a->value ()->perform (eval->with (p, env, backtrace)));
264
+ }
265
+ else {
266
+ env->set_local (var, a->value ()->perform (eval->with (p, env, backtrace)));
267
+ }
268
+ }
232
269
else {
233
270
env->set_lexical (var, a->value ()->perform (eval->with (p, env, backtrace)));
234
271
}
@@ -315,7 +352,7 @@ namespace Sass {
315
352
double end = sass_end->value ();
316
353
// only create iterator once in this environment
317
354
Number* it = new (env->mem ) Number (low->pstate (), start, sass_end->unit ());
318
- AST_Node* old_var = env->get_local (variable);
355
+ AST_Node* old_var = env->has_local (variable) ? env-> get_local (variable) : 0 ;
319
356
env->set_local (variable, it);
320
357
Block* body = f->block ();
321
358
if (start < end) {
@@ -364,7 +401,7 @@ namespace Sass {
364
401
// remember variables and then reset them
365
402
vector<AST_Node*> old_vars (variables.size ());
366
403
for (size_t i = 0 , L = variables.size (); i < L; ++i) {
367
- old_vars[i] = env->get_local (variables[i]);
404
+ old_vars[i] = env->has_local (variables[i]) ? env-> get_local (variables[i]) : 0 ;
368
405
env->set_local (variables[i], 0 );
369
406
}
370
407
Block* body = e->block ();
0 commit comments