X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/ae65d5948102335fae8a1fb7ca82e4acab81466f..ca0f097f7dc607b35506501cec9b5871ebdfd617:/Replace.cpp diff --git a/Replace.cpp b/Replace.cpp index 3818c0b..5ec0b93 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -55,7 +55,6 @@ CYExpression *CYAdd::Replace(CYContext &context) { } CYExpression *CYAddressOf::Replace(CYContext &context) { - CYPrefix::Replace(context); return $C0($M(rhs_, $S("$cya"))); } @@ -196,8 +195,16 @@ CYStatement *CYContinue::Replace(CYContext &context) { } CYAssignment *CYDeclaration::Assignment(CYContext &context) { - CYExpression *variable(Replace(context)); - return initialiser_ == NULL ? NULL : $ CYAssign(variable, initialiser_); + if (initialiser_ == NULL) + return NULL; + + CYAssignment *value($ CYAssign(Variable(context), initialiser_)); + initialiser_ = NULL; + return value; +} + +CYVariable *CYDeclaration::Variable(CYContext &context) { + return $V(identifier_); } CYStatement *CYDeclaration::ForEachIn(CYContext &context, CYExpression *value) { @@ -207,22 +214,36 @@ CYStatement *CYDeclaration::ForEachIn(CYContext &context, CYExpression *value) { CYExpression *CYDeclaration::Replace(CYContext &context) { context.Replace(identifier_); context.scope_->Declare(context, identifier_, CYIdentifierVariable); - return $V(identifier_); + return Variable(context); +} + +void CYDeclarations::Replace(CYContext &context) { $T() + declaration_->Replace(context); + next_->Replace(context); } CYProperty *CYDeclarations::Property(CYContext &context) { $T(NULL) return $ CYProperty(declaration_->identifier_, declaration_->initialiser_ ?: $U, next_->Property(context)); } -CYCompound *CYDeclarations::Replace(CYContext &context) { - CYCompound *compound(next_ == NULL ? $ CYCompound() : next_->Replace(context)); +CYFunctionParameter *CYDeclarations::Parameter(CYContext &context) { $T(NULL) + return $ CYFunctionParameter(declaration_->identifier_, next_->Parameter(context)); +} + +CYArgument *CYDeclarations::Argument(CYContext &context) { $T(NULL) + return $ CYArgument(declaration_->initialiser_ ?: $U, next_->Argument(context)); +} + +CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL) + CYCompound *compound(next_->Compound(context) ?: $ CYCompound()); if (CYAssignment *assignment = declaration_->Assignment(context)) compound->AddPrev(assignment); return compound; } CYExpression *CYDirectMember::Replace(CYContext &context) { - Replace_(context); + context.Replace(object_); + context.Replace(property_); return this; } @@ -294,20 +315,23 @@ CYStatement *CYFor::Replace(CYContext &context) { return this; } +CYCompound *CYForDeclarations::Replace(CYContext &context) { + declarations_->Replace(context); + return declarations_->Compound(context); +} + +// XXX: this still feels highly suboptimal CYStatement *CYForIn::Replace(CYContext &context) { - CYAssignment *assignment(initialiser_->Assignment(context)); + if (CYAssignment *assignment = initialiser_->Assignment(context)) + return $ CYBlock($$->* + $E(assignment)->* + this + ); context.Replace(initialiser_); context.Replace(set_); context.Replace(code_); - - if (assignment == NULL) - return this; - - return $ CYBlock($$->* - $E(assignment)->* - this - ); + return this; } CYFunctionParameter *CYForInComprehension::Parameter(CYContext &context) const { @@ -427,12 +451,10 @@ CYStatement *CYIfComprehension::Replace(CYContext &context, CYStatement *stateme } CYExpression *CYIndirect::Replace(CYContext &context) { - CYPrefix::Replace(context); return $M(rhs_, $S("$cyi")); } CYExpression *CYIndirectMember::Replace(CYContext &context) { - Replace_(context); return $M($ CYIndirect(object_), property_); } @@ -448,12 +470,7 @@ CYStatement *CYLabel::Replace(CYContext &context) { } CYStatement *CYLet::Replace(CYContext &context) { - return $ CYWith($ CYObject(declarations_->Property(context)), &code_); -} - -void CYMember::Replace_(CYContext &context) { - context.Replace(object_); - context.Replace(property_); + return $E($ CYCall($ CYFunctionExpression(NULL, declarations_->Parameter(context), code_), declarations_->Argument(context))); } namespace cy { @@ -804,7 +821,8 @@ CYStatement *Try::Replace(CYContext &context) { } } CYStatement *CYVar::Replace(CYContext &context) { - return $E(declarations_->Replace(context)); + declarations_->Replace(context); + return $E(declarations_->Compound(context)); } CYExpression *CYVariable::Replace(CYContext &context) {