+void CYContext::NonLocal(CYStatement *&statements) {
+ CYContext &context(*this);
+
+ if (nextlocal_ != NULL && nextlocal_->identifier_ != NULL) {
+ CYIdentifier *cye($I("$cye")->Replace(context));
+ CYIdentifier *unique(nextlocal_->identifier_->Replace(context));
+
+ CYStatement *declare(
+ $ CYVar($L1($L(unique, $ CYObject()))));
+
+ cy::Syntax::Catch *rescue(
+ $ cy::Syntax::Catch(cye, $$->*
+ $ CYIf($ CYIdentical($M($V(cye), $S("$cyk")), $V(unique)), $$->*
+ $ CYReturn($M($V(cye), $S("$cyv"))))->*
+ $ cy::Syntax::Throw($V(cye))));
+
+ context.Replace(declare);
+ rescue->Replace(context);
+
+ statements = $$->*
+ declare->*
+ $ cy::Syntax::Try(statements, rescue, NULL);
+ }
+}
+
+CYIdentifier *CYContext::Unique() {
+ return $ CYIdentifier(apr_psprintf($pool, "$cy%u", unique_++));
+}
+