OSDN Git Service

* stringpool.c (set_identifier): New function.
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 2 Mar 2001 00:40:00 +0000 (00:40 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 2 Mar 2001 00:40:00 +0000 (00:40 +0000)
* tree.h: Prototype it.

* c-parse.in: Kill D_YES. If compiled for objc, call
save_and_forget_protocol_qualifiers from init_reswords.
* objc/objc-act.c (remember_protocol_qualifiers,
forget_protocol_qualifiers): Don't diddle C_IS_RESERVED_WORD.
Swap out the non-keyword IDENTIFIER_NODEs for keyword ones, or
vice versa.
(save_and_forget_protocol_qualifiers): New function.
* c-lex.h: Prototype save_and_forget_protocol_qualifiers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40170 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-lex.h
gcc/c-parse.in
gcc/objc/objc-act.c
gcc/stringpool.c
gcc/tree.h

index ee9f3d4..637efd3 100644 (file)
@@ -1,3 +1,17 @@
+2001-03-01  Zack Weinberg  <zackw@stanford.edu>
+
+       * stringpool.c (set_identifier): New function.
+       * tree.h: Prototype it.
+
+       * c-parse.in: Kill D_YES. If compiled for objc, call
+       save_and_forget_protocol_qualifiers from init_reswords.
+       * objc/objc-act.c (remember_protocol_qualifiers,
+       forget_protocol_qualifiers): Don't diddle C_IS_RESERVED_WORD.
+       Swap out the non-keyword IDENTIFIER_NODEs for keyword ones, or
+       vice versa.
+       (save_and_forget_protocol_qualifiers): New function.
+       * c-lex.h: Prototype save_and_forget_protocol_qualifiers.
+
 2001-03-01  Diego Novillo  <dnovillo@redhat.com>
 
        * c-semantics.c (prune_unused_decls): Return error_mark_node
index bfdc2ab..bd25a16 100644 (file)
@@ -27,6 +27,7 @@ extern void position_after_white_space PARAMS ((void));
 extern int c_lex PARAMS ((tree *));
 extern const char *init_c_lex PARAMS ((const char *));
 
+extern void save_and_forget_protocol_qualifiers PARAMS ((void));
 extern void forget_protocol_qualifiers PARAMS ((void));
 extern void remember_protocol_qualifiers PARAMS ((void));
 extern tree is_class_name PARAMS ((tree));
index 4f1de58..ea59e73 100644 (file)
@@ -2878,7 +2878,6 @@ struct resword
 #define D_EXT  0x04    /* GCC extension */
 #define D_EXT89        0x08    /* GCC extension incorporated in C99 */
 #define D_OBJC 0x10    /* Objective C only */
-#define D_YES  0x20    /* always starts disabled */
 
 static const struct resword reswords[] =
 {
@@ -2971,12 +2970,12 @@ ifobjc
   { "@public",         RID_AT_PUBLIC,          D_OBJC },
   { "@selector",       RID_AT_SELECTOR,        D_OBJC },
   { "id",              RID_ID,                 D_OBJC },
-  { "bycopy",          RID_BYCOPY,             D_OBJC|D_YES },
-  { "byref",           RID_BYREF,              D_OBJC|D_YES },
-  { "in",              RID_IN,                 D_OBJC|D_YES },
-  { "inout",           RID_INOUT,              D_OBJC|D_YES },
-  { "oneway",          RID_ONEWAY,             D_OBJC|D_YES },
-  { "out",             RID_OUT,                D_OBJC|D_YES },
+  { "bycopy",          RID_BYCOPY,             D_OBJC },
+  { "byref",           RID_BYREF,              D_OBJC },
+  { "in",              RID_IN,                 D_OBJC },
+  { "inout",           RID_INOUT,              D_OBJC },
+  { "oneway",          RID_ONEWAY,             D_OBJC },
+  { "out",             RID_OUT,                D_OBJC },
 end ifobjc
 };
 #define N_reswords (sizeof reswords / sizeof (struct resword))
@@ -3138,14 +3137,12 @@ init_reswords ()
 
       id = get_identifier (reswords[i].word);
       C_RID_CODE (id) = reswords[i].rid;
+      C_IS_RESERVED_WORD (id) = 1;
       ridpointers [(int) reswords[i].rid] = id;
-
-      /* Objective C does tricky things with enabling and disabling 
-        keywords.  So these we must not elide in the test above, but
-        wait and not mark them reserved now.  */
-      if (! (reswords[i].disable & D_YES))
-       C_IS_RESERVED_WORD (id) = 1;
     }
+ifobjc
+  save_and_forget_protocol_qualifiers ();
+end ifobjc
 }
 
 const char *
index 8da5c6b..f5f27ad 100644 (file)
@@ -8590,25 +8590,45 @@ lookup_objc_ivar (id)
     return 0;
 }
 
-/* Parser callbacks.  */
+/* Parser callbacks.
+   Some ObjC keywords are reserved only in a particular context:
+   in out inout bycopy byref oneway.
+   We have to save and restore the IDENTIFIER_NODEs that describe
+   them as keywords, when appropriate.  */
+
+#define N_PQ 6
+static tree saved_pq[N_PQ];
+static tree saved_not_pq[N_PQ];
+static const char *const pq_strings[N_PQ] = {
+  "bycopy", "byref", "in", "inout", "oneway", "out"
+};
+
+void
+save_and_forget_protocol_qualifiers ()
+{
+  int i;
+  for (i = 0; i < N_PQ; i++)
+    saved_pq[i] = set_identifier (pq_strings[i], NULL_TREE);
+
+  ggc_add_tree_root (saved_pq, N_PQ);
+  ggc_add_tree_root (saved_not_pq, N_PQ);
+}
+
 void
 forget_protocol_qualifiers ()
 {
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_IN]) = 0;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_OUT]) = 0;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_INOUT]) = 0;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_BYCOPY]) = 0;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_BYREF]) = 0;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_ONEWAY]) = 0;
+  int i;
+  for (i = 0; i < N_PQ; i++)
+    {
+      set_identifier (pq_strings[i], saved_not_pq[i]);
+      saved_not_pq[i] = NULL_TREE;
+    }
 }
 
 void
 remember_protocol_qualifiers ()
 {
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_IN]) = 1;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_OUT]) = 1;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_INOUT]) = 1;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_BYCOPY]) = 1;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_BYREF]) = 1;
-  C_IS_RESERVED_WORD (ridpointers[(int) RID_ONEWAY]) = 1;
+  int i;
+  for (i = 0; i < N_PQ; i++)
+    saved_not_pq[i] = set_identifier (pq_strings[i], saved_pq[i]);
 }
index ceb454d..f5e8968 100644 (file)
@@ -340,6 +340,25 @@ maybe_get_identifier (text)
   return NULL_TREE;
 }
 
+/* Look up an identifier with the name TEXT, replace its identifier
+   node with NODE, and return the old identifier node.  This is used
+   by languages which need to enable and disable keywords based on
+   context; e.g. see remember_protocol_qualifiers in objc/objc-act.c.  */
+tree
+set_identifier (text, node)
+     const char *text;
+     tree node;
+{
+  struct str_header *str;
+  tree old;
+  size_t length = strlen (text);
+
+  str = alloc_string (text, length, INSERT);
+  old = str->data;     /* might be null */
+  str->data = node;
+  return old;
+}
+
 /* Report some basic statistics about the string pool.  */
 
 void
index 45252dd..cfcd7be 100644 (file)
@@ -1922,6 +1922,13 @@ extern tree get_identifier               PARAMS ((const char *));
 
 extern tree maybe_get_identifier       PARAMS ((const char *));
 
+/* Look up an identifier with the name TEXT, replace its identifier
+   node with NODE, and return the old identifier node.  This is used
+   by languages which need to enable and disable keywords based on
+   context; e.g. see remember_protocol_qualifiers in objc/objc-act.c.  */
+
+extern tree set_identifier             PARAMS ((const char *, tree));
+
 /* Construct various types of nodes.  */
 
 #define build_int_2(LO,HI)  \