X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/8d7447c170dd11c91d0a07768f32a2699177fa54..9a98069f5e4cd10c3115bfab077f00c4b40eaa42:/Replace.cpp diff --git a/Replace.cpp b/Replace.cpp index c141e4f..acf4d51 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -155,6 +155,15 @@ CYExpression *CYCompound::Replace(CYContext &context) { return this; } +CYExpression *CYCompound::Primitive(CYContext &context) { + CYExpression *expression(expressions_); + if (expression == NULL) + return NULL; + while (expression->next_ != NULL) + expression = expression->next_; + return expression->Primitive(context); +} + CYFunctionParameter *CYComprehension::Parameters(CYContext &context) const { $T(NULL) CYFunctionParameter *next(next_->Parameters(context)); if (CYFunctionParameter *parameter = Parameter(context)) { @@ -321,6 +330,12 @@ CYString *CYFalse::String(CYContext &context) { return $S("false"); } +CYExpression *CYFatArrow::Replace(CYContext &context) { + CYFunctionExpression *function($ CYFunctionExpression(NULL, parameters_, code_)); + function->this_.SetNext(context.this_); + return function; +} + void CYFinally::Replace(CYContext &context) { $T() code_.Replace(context); } @@ -402,6 +417,9 @@ void CYFunction::Replace_(CYContext &context, bool outer) { if (outer) Inject(context); + CYThisScope *_this(context.this_); + context.this_ = CYGetLast(&this_); + CYNonLocal *nonlocal(context.nonlocal_); CYNonLocal *nextlocal(context.nextlocal_); @@ -423,12 +441,19 @@ void CYFunction::Replace_(CYContext &context, bool outer) { parameters_->Replace(context, code_); code_.Replace(context); + if (CYIdentifier *identifier = this_.identifier_) + code_.statements_ = $$->* + $ CYVar($L1($ CYDeclaration(identifier, $ CYThis())))->* + code_.statements_; + if (localize) context.NonLocal(code_.statements_); context.nextlocal_ = nextlocal; context.nonlocal_ = nonlocal; + context.this_ = _this; + scope.Close(); } @@ -504,7 +529,7 @@ namespace cy { namespace Syntax { CYExpression *New::AddArgument(CYContext &context, CYExpression *value) { - CYSetLast(arguments_, $ CYArgument(value)); + CYSetLast(arguments_) = $ CYArgument(value); return this; } @@ -797,6 +822,8 @@ CYStatement *CYSwitch::Replace(CYContext &context) { } CYExpression *CYThis::Replace(CYContext &context) { + if (context.this_ != NULL) + return $V(context.this_->Identifier(context)); return this; }