#include <iomanip>
+CYFunctionExpression *CYNonLocalize(CYContext &context, CYFunctionExpression *function) {
+ function->nonlocal_ = context.nextlocal_;
+ return function;
+}
+
CYExpression *CYAdd::Replace(CYContext &context) {
CYInfix::Replace(context);
namespace Syntax {
void Catch::Replace(CYContext &context) { $T()
- CYScope scope(CYScopeCatch, context, code_.statements_);
+ CYScope scope(true, context, code_.statements_);
context.Replace(name_);
context.scope_->Declare(context, name_, CYIdentifierCatch);
if (outer)
Inject(context);
- CYScope scope(CYScopeFunction, context, code_.statements_);
-
CYNonLocal *nonlocal(context.nonlocal_);
CYNonLocal *nextlocal(context.nextlocal_);
context.nextlocal_ = nonlocal_;
}
+ CYScope scope(!localize, context, code_.statements_);
+
if (!outer && name_ != NULL)
Inject(context);
}
CYStatement *CYLet::Replace(CYContext &context) {
- return $E($ CYCall($ CYFunctionExpression(NULL, declarations_->Parameter(context), code_), declarations_->Argument(context)));
+ return $E($ CYCall(CYNonLocalize(context, $ CYFunctionExpression(NULL, declarations_->Parameter(context), code_)), declarations_->Argument(context)));
}
namespace cy {
}
void CYProgram::Replace(CYContext &context) {
- CYScope scope(CYScopeProgram, context, statements_);
+ CYScope scope(true, context, statements_);
context.nextlocal_ = $ CYNonLocal();
context.ReplaceAll(statements_);
}
CYExpression *CYRubyProc::Replace(CYContext &context) {
- CYFunctionExpression *function($ CYFunctionExpression(NULL, parameters_, code_));
- function->nonlocal_ = context.nextlocal_;
- return function;
+ return CYNonLocalize(context, $ CYFunctionExpression(NULL, parameters_, code_));
}
-CYScope::CYScope(CYScopeType type, CYContext &context, CYStatement *&statements) :
- type_(type),
+CYScope::CYScope(bool transparent, CYContext &context, CYStatement *&statements) :
+ transparent_(transparent),
context_(context),
statements_(statements),
parent_(context.scope_)
}
void CYScope::Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags) {
- if (type_ == CYScopeCatch && flags != CYIdentifierCatch)
- parent_->Declare(context, identifier, flags);
- else
+ if (!transparent_ || flags == CYIdentifierArgument || flags == CYIdentifierCatch)
internal_.insert(CYIdentifierAddressFlagsMap::value_type(identifier, flags));
+ else if (parent_ != NULL)
+ parent_->Declare(context, identifier, flags);
}
CYIdentifier *CYScope::Lookup(CYContext &context, CYIdentifier *identifier) {