From 5192746c7c96294e6dc6261b78d4091c98f71ec8 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Tue, 5 Jun 2012 04:57:33 -0700 Subject: [PATCH] Prune undefined arguments in final position of calls. --- Parser.hpp | 2 +- Replace.cpp | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Parser.hpp b/Parser.hpp index 5e3bfed..3860caa 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -1069,7 +1069,7 @@ struct CYArgument : { } - void Replace(CYContext &context); + CYArgument *Replace(CYContext &context); void Output(CYOutput &out) const; }; diff --git a/Replace.cpp b/Replace.cpp index 3565f66..d508db0 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -63,9 +63,18 @@ CYExpression *CYAddressOf::Replace(CYContext &context) { return $C0($M(rhs_, $S("$cya"))); } -void CYArgument::Replace(CYContext &context) { $T() +CYArgument *CYArgument::Replace(CYContext &context) { $T(NULL) context.Replace(value_); - next_->Replace(context); + next_ = next_->Replace(context); + + if (value_ == NULL) { + if (next_ == NULL) + return NULL; + else + value_ = $U; + } + + return this; } CYExpression *CYArray::Replace(CYContext &context) { @@ -228,7 +237,7 @@ void CYDeclarations::Replace(CYContext &context) { $T() } CYProperty *CYDeclarations::Property(CYContext &context) { $T(NULL) - return $ CYProperty(declaration_->identifier_, declaration_->initialiser_ ?: $U, next_->Property(context)); + return $ CYProperty(declaration_->identifier_, declaration_->initialiser_, next_->Property(context)); } CYFunctionParameter *CYDeclarations::Parameter(CYContext &context) { $T(NULL) @@ -236,7 +245,7 @@ CYFunctionParameter *CYDeclarations::Parameter(CYContext &context) { $T(NULL) } CYArgument *CYDeclarations::Argument(CYContext &context) { $T(NULL) - return $ CYArgument(declaration_->initialiser_ ?: $U, next_->Argument(context)); + return $ CYArgument(declaration_->initialiser_, next_->Argument(context)); } CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL) @@ -616,6 +625,8 @@ void CYProgram::Replace(CYContext &context) { void CYProperty::Replace(CYContext &context) { $T() context.Replace(value_); next_->Replace(context); + if (value_ == NULL) + value_ = $U; } CYStatement *CYReturn::Replace(CYContext &context) { -- 2.47.2