[Patch][ObjC][Proposal] NSValue literals
jahanian
fjahanian at apple.com
Mon Dec 1 10:43:02 PST 2014
This looks like a reasonable refactoring which you can check in independent of everything else if you see no clang test regressions.
- Fariborz
> On Nov 23, 2014, at 8:09 AM, AlexDenisov <1101.debian at gmail.com> wrote:
>
> Finally, the problem is solved.
> I’ve found that EmitObjCBoxedExpr uses EmitAnyExpr to handle SubExpr (which might be treated as a method call' argument), while EmitObjCMessageExpr uses EmitCallArgs.
> To solve the problem I just unified a bit EmitObjCBoxedExpr, so now it also uses EmitCallArgs.
>
> Here is the part of the full diff, which illustrates unification of EmitObjCBoxedExpr and EmitObjCMessageExpr:
> diff --git a/include/clang/AST/ExprObjC.h b/include/clang/AST/ExprObjC.h
> index 817c0cc..82738da 100644
> --- a/include/clang/AST/ExprObjC.h
> +++ b/include/clang/AST/ExprObjC.h
> @@ -124,6 +124,15 @@ class ObjCBoxedExpr : public Expr {
>
> // Iterators
> child_range children() { return child_range(&SubExpr, &SubExpr+1); }
> +
> + typedef ConstExprIterator const_arg_iterator;
> +
> + const_arg_iterator arg_begin() const {
> + return reinterpret_cast<Stmt const * const*>(&SubExpr);
> + }
> + const_arg_iterator arg_end() const {
> + return reinterpret_cast<Stmt const * const*>(&SubExpr + 1);
> + }
>
> friend class ASTStmtReader;
> };
> diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
> index ca67c4b..d2975b8 100644
> --- a/lib/CodeGen/CGObjC.cpp
> +++ b/lib/CodeGen/CGObjC.cpp
> @@ -55,12 +55,12 @@ llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E)
> /// EmitObjCBoxedExpr - This routine generates code to call
> /// the appropriate expression boxing method. This will either be
> -/// one of +[NSNumber numberWith<Type>:], or +[NSString stringWithUTF8String:].
> +/// one of +[NSNumber numberWith<Type>:], or +[NSString stringWithUTF8String:],
> +/// or [NSValue valueWith<Type>:].
> ///
> llvm::Value *
> CodeGenFunction::EmitObjCBoxedExpr(const ObjCBoxedExpr *E) {
> // Generate the correct selector for this literal's concrete type.
> - const Expr *SubExpr = E->getSubExpr();
> // Get the method.
> const ObjCMethodDecl *BoxingMethod = E->getBoxingMethod();
> assert(BoxingMethod && "BoxingMethod is null");
> @@ -73,12 +73,9 @@ CodeGenFunction::EmitObjCBoxedExpr(const ObjCBoxedExpr *E) {
> CGObjCRuntime &Runtime = CGM.getObjCRuntime();
> const ObjCInterfaceDecl *ClassDecl = BoxingMethod->getClassInterface();
> llvm::Value *Receiver = Runtime.GetClass(*this, ClassDecl);
> -
> - const ParmVarDecl *argDecl = *BoxingMethod->param_begin();
> - QualType ArgQT = argDecl->getType().getUnqualifiedType();
> - RValue RV = EmitAnyExpr(SubExpr);
> +
> CallArgList Args;
> - Args.add(RV, ArgQT);
> + EmitCallArgs(Args, BoxingMethod, E->arg_begin(), E->arg_end());
>
> RValue result = Runtime.GenerateMessageSend(
> *this, ReturnValueSlot(), BoxingMethod->getReturnType(), Sel, Receiver,
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141201/1359449a/attachment.html>
More information about the cfe-commits
mailing list