Patchwork ObjC: get rid of temporary tree list when compiling a method

login
register
mail settings
Submitter Nicola Pero
Date April 12, 2011, 6:37 p.m.
Message ID <1302633459.16216770@192.168.4.58>
Download mbox | patch
Permalink /patch/90845/
State New
Headers show

Comments

Nicola Pero - April 12, 2011, 6:37 p.m.
This fixes another small inefficiency in the Objective-C compiler.

When a method invocation is found, and the parser calls objc_build_method_expr()
to compile it, it used to invoke it as in

  objc_build_message_expr (build_tree_list (rec, args));

this (trivial) patch removes the need to create the temporary tree list, so that
the call becomes

  objc_build_message_expr (rec, args);

it's also easier to understand, not just more efficient.

The speedup is tiny, as it saves just one allocation per method invocation.  It's
more about cleaning up the codebase and migrating it from Lisp to C.

Ok to commit ?

Thanks
Mike Stump - April 12, 2011, 6:45 p.m.
On Apr 12, 2011, at 11:37 AM, Nicola Pero wrote:
> This fixes another small inefficiency in the Objective-C compiler.
> 
> It's more about cleaning up the codebase and migrating it from Lisp to C.

You do know that we are reimplementing gcc in lisp, right?   ^L  It's a joke, just a joke.

> Ok to commit ?

Ok.

Patch

Index: c-family/c-objc.h
===================================================================
--- c-family/c-objc.h   (revision 172328)
+++ c-family/c-objc.h   (working copy)
@@ -53,7 +53,7 @@  extern tree objc_is_id (tree);
 extern void objc_declare_alias (tree, tree);
 extern void objc_declare_class (tree);
 extern void objc_declare_protocols (tree, tree);
-extern tree objc_build_message_expr (tree);
+extern tree objc_build_message_expr (tree, tree);
 extern tree objc_finish_message_expr (tree, tree, tree, tree*);
 extern tree objc_build_selector_expr (location_t, tree);
 extern tree objc_build_protocol_expr (tree);
Index: ChangeLog
===================================================================
--- ChangeLog   (revision 172334)
+++ ChangeLog   (working copy)
@@ -1,3 +1,8 @@ 
+2011-04-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * c-objc.h (objc_build_message_expr): Updated prototype.
+       * stub-objc.c (objc_build_message_expr): Likewise.
+       
 2011-04-12  Martin Jambor  <mjambor@suse.cz>
 
        * c-gimplify.c (c_genericize): Call cgraph_get_create_node instead
Index: c-family/stub-objc.c
===================================================================
--- c-family/stub-objc.c        (revision 172328)
+++ c-family/stub-objc.c        (working copy)
@@ -258,7 +258,7 @@  objc_build_selector_expr (location_t ARG_UNUSED (l
 }
 
 tree
-objc_build_message_expr (tree ARG_UNUSED (expr))
+objc_build_message_expr (tree ARG_UNUSED (receiver), tree ARG_UNUSED (args))
 {
   return 0;
 }
Index: objc/ChangeLog
===================================================================
--- objc/ChangeLog      (revision 172328)
+++ objc/ChangeLog      (working copy)
@@ -1,5 +1,11 @@ 
 2011-04-12  Nicola Pero  <nicola.pero@meta-innovation.com>
 
+       * objc-act.c (objc_build_message_expr): Accept two arguments
+       instead of one so that callers can simply pass the arguments
+       without having to create a temporary chain to hold them.
+
+2011-04-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
        * objc-act.c (printable_ivar_name): New.
        (add_instance_variable): Call printable_ivar_name() when an error
        message needs to be printed.  Do not prepare the instance variable
Index: objc/objc-act.c
===================================================================
--- objc/objc-act.c     (revision 172328)
+++ objc/objc-act.c     (working copy)
@@ -5027,14 +5027,13 @@  objc_message_selector (void)
    (*(<abstract_decl>(*)())_msgSuper)(receiver, selTransTbl[n], ...);  */
 
 tree
-objc_build_message_expr (tree mess)
+objc_build_message_expr (tree receiver, tree message_args)
 {
-  tree receiver = TREE_PURPOSE (mess);
   tree sel_name;
 #ifdef OBJCPLUS
-  tree args = TREE_PURPOSE (TREE_VALUE (mess));
+  tree args = TREE_PURPOSE (message_args);
 #else
-  tree args = TREE_VALUE (mess);
+  tree args = message_args;
 #endif
   tree method_params = NULL_TREE;
 
@@ -5058,7 +5057,7 @@  tree
   /* Build the parameter list to give to the method.  */
   if (TREE_CODE (args) == TREE_LIST)
 #ifdef OBJCPLUS
-    method_params = chainon (args, TREE_VALUE (TREE_VALUE (mess)));
+    method_params = chainon (args, TREE_VALUE (message_args));
 #else
     {
       tree chain = args, prev = NULL_TREE;
Index: ChangeLog
===================================================================
--- ChangeLog   (revision 172328)
+++ ChangeLog   (working copy)
@@ -1,5 +1,11 @@ 
 2011-04-12  Nicola Pero  <nicola.pero@meta-innovation.com>
 
+       * c-parser.c (c_parser_initelt): Updated call to
+       objc_build_message_expr.
+       (c_parser_postfix_expression): Likewise.
+
+2011-04-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
        * c-parser.c (c_lex_one_token): Rewritten conditional used when
        compiling Objective-C to be more efficient.
 
Index: cp/ChangeLog
===================================================================
--- cp/ChangeLog        (revision 172328)
+++ cp/ChangeLog        (working copy)
@@ -1,3 +1,8 @@ 
+2011-04-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * parser.c (cp_parser_objc_message_expression): Updated call
+       to objc_build_message_expr.
+
 2011-04-12  Martin Jambor  <mjambor@suse.cz>
 
        * class.c (cp_fold_obj_type_ref): Call cgraph_get_node instead of
Index: cp/parser.c
===================================================================
--- cp/parser.c (revision 172328)
+++ cp/parser.c (working copy)
@@ -21289,7 +21289,7 @@  cp_parser_objc_message_expression (cp_parser* pars
   messageargs = cp_parser_objc_message_args (parser);
   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
 
-  return objc_build_message_expr (build_tree_list (receiver, messageargs));
+  return objc_build_message_expr (receiver, messageargs);
 }
 
 /* Parse an objc-message-receiver.
Index: c-parser.c
===================================================================
--- c-parser.c  (revision 172328)
+++ c-parser.c  (working copy)
@@ -3788,7 +3788,7 @@  c_parser_initelt (c_parser *parser, struct obstack
                  c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
                                             "expected %<]%>");
                  mexpr.value
-                   = objc_build_message_expr (build_tree_list (rec, args));
+                   = objc_build_message_expr (rec, args);
                  mexpr.original_code = ERROR_MARK;
                  mexpr.original_type = NULL;
                  /* Now parse and process the remainder of the
@@ -6455,8 +6455,7 @@  c_parser_postfix_expression (c_parser *parser)
          args = c_parser_objc_message_args (parser);
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
                                     "expected %<]%>");
-         expr.value = objc_build_message_expr (build_tree_list (receiver,
-                                                                args));
+         expr.value = objc_build_message_expr (receiver, args);
          break;
        }
       /* Else fall through to report error.  */