ObjC: get rid of temporary tree list when compiling a method
Nicola Pero
nicola.pero@meta-innovation.com
Tue Apr 12 18:37:00 GMT 2011
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
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. */
More information about the Gcc-patches
mailing list