]>
Commit | Line | Data |
---|---|---|
e04a16fb | 1 | /* Language parser definitions for the GNU compiler for the Java(TM) language. |
e511adc0 | 2 | Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. |
e04a16fb AG |
3 | Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) |
4 | ||
5 | This file is part of GNU CC. | |
6 | ||
7 | GNU CC is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2, or (at your option) | |
10 | any later version. | |
11 | ||
12 | GNU CC is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GNU CC; see the file COPYING. If not, write to | |
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | |
20 | Boston, MA 02111-1307, USA. | |
21 | ||
22 | Java and all Java-based marks are trademarks or registered trademarks | |
23 | of Sun Microsystems, Inc. in the United States and other countries. | |
24 | The Free Software Foundation is independent of Sun Microsystems, Inc. */ | |
25 | ||
26 | #ifndef JV_LANG_H | |
27 | #define JV_LANG_H | |
28 | ||
29 | #include "lex.h" | |
30 | ||
31 | /* Extern global variable declarations */ | |
32 | extern int java_error_count; | |
33 | extern struct obstack temporary_obstack; | |
34 | extern struct obstack permanent_obstack; | |
35 | extern int quiet_flag; | |
36 | ||
37 | #ifndef JC1_LITE | |
38 | /* Function extern to java/ */ | |
39 | extern int int_fits_type_p PROTO ((tree, tree)); | |
40 | extern tree stabilize_reference PROTO ((tree)); | |
41 | #endif | |
42 | ||
43 | /* Macros for verbose debug info */ | |
44 | #ifdef VERBOSE_SKELETON | |
45 | #define RULE( rule ) printf ( "jv_yacc:%d: rule %s\n", lineno, rule ) | |
46 | #else | |
47 | #define RULE( rule ) | |
48 | #endif | |
49 | ||
5e942c50 | 50 | #ifdef VERBOSE_SKELETON |
e04a16fb AG |
51 | #undef SOURCE_FRONTEND_DEBUG |
52 | #define SOURCE_FRONTEND_DEBUG(X) \ | |
53 | {if (!quiet_flag) {printf ("* "); printf X; putchar ('\n');} } | |
54 | #else | |
55 | #define SOURCE_FRONTEND_DEBUG(X) | |
56 | #endif | |
57 | ||
58 | /* Macro for error recovering */ | |
59 | #ifdef YYDEBUG | |
60 | #define RECOVERED \ | |
61 | { if (!quiet_flag) {printf ("** Recovered\n");} } | |
62 | #define DRECOVERED(s) \ | |
63 | { if (!quiet_flag) {printf ("** Recovered (%s)\n", #s);}} | |
64 | #else | |
65 | #define RECOVERED | |
66 | #define DRECOVERED(s) | |
67 | #endif | |
68 | ||
69 | #define DRECOVER(s) {yyerrok; DRECOVERED(s)} | |
70 | #define RECOVER {yyerrok; RECOVERED} | |
71 | ||
72 | #define YYERROR_NOW ctxp->java_error_flag = 1 | |
73 | #define YYNOT_TWICE if (ctxp->prevent_ese != lineno) | |
74 | ||
75 | /* Accepted modifiers */ | |
76 | #define CLASS_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT|ACC_FINAL | |
77 | #define FIELD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_FINAL| \ | |
78 | ACC_STATIC|ACC_TRANSIENT|ACC_VOLATILE | |
79 | #define METHOD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_ABSTRACT| \ | |
80 | ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE | |
81 | #define INTERFACE_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT | |
82 | #define INTERFACE_METHOD_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT | |
83 | #define INTERFACE_FIELD_MODIFIERS ACC_PUBLIC|ACC_STATIC|ACC_FINAL | |
84 | ||
85 | /* Getting a modifier WFL */ | |
86 | #define MODIFIER_WFL(M) (ctxp->modifier_ctx [(M) - PUBLIC_TK]) | |
87 | ||
88 | /* Check on modifiers */ | |
89 | #define THIS_MODIFIER_ONLY(f, m, v, count, l) \ | |
90 | if ((f) & (m)) \ | |
91 | { \ | |
92 | tree node = ctxp->modifier_ctx [v]; \ | |
93 | if ((l) \ | |
94 | && ((EXPR_WFL_COLNO (node) > EXPR_WFL_COLNO (l)) \ | |
95 | || (EXPR_WFL_LINENO (node) > EXPR_WFL_LINENO (l)))) \ | |
96 | l = node; \ | |
97 | else if (!(l)) \ | |
98 | l = node; \ | |
99 | count++; \ | |
100 | } | |
101 | ||
22eed1e6 APB |
102 | #define ABSTRACT_CHECK(FLAG, V, CL, S) \ |
103 | if ((FLAG) & (V)) \ | |
104 | parse_error_context ((CL), S " method can't be abstract"); | |
105 | ||
106 | #define JCONSTRUCTOR_CHECK(FLAG, V, CL, S) \ | |
107 | if ((FLAG) & (V)) \ | |
108 | parse_error_context ((CL), "Constructor can't be %s", (S)); \ | |
109 | ||
e04a16fb AG |
110 | /* Misc. */ |
111 | #define exit_java_complete_class() \ | |
112 | { \ | |
113 | pop_obstacks (); \ | |
114 | return; \ | |
115 | } | |
116 | ||
117 | #define CLASS_OR_INTERFACE(decl, s1, s2) \ | |
118 | (decl ? \ | |
119 | ((get_access_flags_from_decl (TYPE_NAME (TREE_TYPE (decl))) \ | |
120 | & ACC_INTERFACE) ? \ | |
121 | s2 : s1) : ((s1 [0]=='S'|| s1 [0]=='s') ? \ | |
122 | (s1 [0]=='S' ? "Supertype" : "supertype") : \ | |
123 | (s1 [0] > 'A' ? "Type" : "type"))) | |
124 | ||
c877974e APB |
125 | #define GET_REAL_TYPE(TYPE) \ |
126 | (TREE_CODE (TYPE) == TREE_LIST ? TREE_PURPOSE (TYPE) : TYPE) | |
127 | ||
128 | #define GET_METHOD_NAME(METHOD) \ | |
129 | (TREE_CODE (DECL_NAME (METHOD)) == EXPR_WITH_FILE_LOCATION ? \ | |
130 | EXPR_WFL_NODE (DECL_NAME (METHOD)) : DECL_NAME (METHOD)) | |
131 | ||
e04a16fb AG |
132 | /* Pedantic warning on obsolete modifiers. Note: when cl is NULL, |
133 | flags was set artificially, such as for a interface method */ | |
134 | #define OBSOLETE_MODIFIER_WARNING(cl, flags, modifier, format, arg) \ | |
135 | { \ | |
c877974e | 136 | if (flag_redundant && (cl) && ((flags) & (modifier))) \ |
e04a16fb AG |
137 | parse_warning_context (cl, \ |
138 | "Discouraged redundant use of `%s' modifier " \ | |
139 | "in declaration of " format, \ | |
140 | java_accstring_lookup (modifier), arg); \ | |
141 | } | |
142 | ||
143 | /* Quickly build a temporary pointer on hypothetical type NAME. */ | |
144 | #define BUILD_PTR_FROM_NAME(ptr, name) \ | |
145 | { \ | |
146 | ptr = build (POINTER_TYPE, NULL_TREE); \ | |
147 | TYPE_NAME (ptr) = name; \ | |
148 | } | |
149 | ||
23a79c61 APB |
150 | #define INCOMPLETE_TYPE_P(NODE) \ |
151 | ((TREE_CODE (NODE) == POINTER_TYPE) \ | |
152 | && !TREE_TYPE (NODE) \ | |
153 | && TREE_CODE (TYPE_NAME (NODE)) == IDENTIFIER_NODE) | |
e04a16fb AG |
154 | |
155 | /* Set the EMIT_LINE_NOTE flag of a EXPR_WLF to 1 if debug information | |
156 | are requested. Works in the context of a parser rule. */ | |
157 | #define JAVA_MAYBE_GENERATE_DEBUG_INFO(node) \ | |
158 | (debug_info_level != DINFO_LEVEL_NONE ? \ | |
159 | EXPR_WFL_EMIT_LINE_NOTE (node) = 1, node : node) | |
160 | ||
161 | /* Types classification, according to the JLS, section 4.2 */ | |
e4de5a10 PB |
162 | #define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE) |
163 | #define JINTEGRAL_TYPE_P(TYPE) ((TYPE) \ | |
164 | && (TREE_CODE ((TYPE)) == INTEGER_TYPE \ | |
165 | || TREE_CODE ((TYPE)) == CHAR_TYPE)) | |
166 | #define JNUMERIC_TYPE_P(TYPE) ((TYPE) \ | |
167 | && (JFLOAT_TYPE_P ((TYPE)) \ | |
168 | || JINTEGRAL_TYPE_P ((TYPE)))) | |
169 | #define JPRIMITIVE_TYPE_P(TYPE) ((TYPE) \ | |
170 | && (JNUMERIC_TYPE_P ((TYPE)) \ | |
171 | || TREE_CODE ((TYPE)) == BOOLEAN_TYPE)) | |
e04a16fb | 172 | |
22eed1e6 APB |
173 | #define JBSC_TYPE_P(TYPE) ((TYPE) && (((TYPE) == byte_type_node) \ |
174 | || ((TYPE) == short_type_node) \ | |
175 | || ((TYPE) == char_type_node))) | |
176 | ||
e04a16fb | 177 | /* Not defined in the LRM */ |
e4de5a10 PB |
178 | #define JSTRING_TYPE_P(TYPE) ((TYPE) \ |
179 | && ((TYPE) == string_type_node || \ | |
180 | (TREE_CODE (TYPE) == POINTER_TYPE && \ | |
181 | TREE_TYPE (TYPE) == string_type_node))) | |
182 | #define JSTRING_P(NODE) ((NODE) \ | |
183 | && (TREE_CODE (NODE) == STRING_CST \ | |
184 | || IS_CRAFTED_STRING_BUFFER_P (NODE) \ | |
185 | || JSTRING_TYPE_P (TREE_TYPE (NODE)))) | |
186 | ||
187 | #define JREFERENCE_TYPE_P(TYPE) ((TYPE) \ | |
188 | && (TREE_CODE (TYPE) == RECORD_TYPE \ | |
189 | || (TREE_CODE (TYPE) == POINTER_TYPE \ | |
190 | && TREE_CODE (TREE_TYPE (TYPE)) == \ | |
191 | RECORD_TYPE))) | |
5e942c50 APB |
192 | #define JNULLP_TYPE_P(TYPE) ((TYPE) && (TREE_CODE (TYPE) == POINTER_TYPE) \ |
193 | && (TYPE) == TREE_TYPE (null_pointer_node)) | |
e04a16fb AG |
194 | |
195 | /* Other predicate */ | |
34f4db93 APB |
196 | #define JDECL_P(NODE) (NODE && (TREE_CODE (NODE) == PARM_DECL \ |
197 | || TREE_CODE (NODE) == VAR_DECL \ | |
198 | || TREE_CODE (NODE) == FIELD_DECL)) | |
e04a16fb AG |
199 | |
200 | #define TYPE_INTERFACE_P(TYPE) \ | |
201 | (CLASS_P (TYPE) && CLASS_INTERFACE (TYPE_NAME (TYPE))) | |
202 | ||
203 | #define TYPE_CLASS_P(TYPE) (CLASS_P (TYPE) \ | |
204 | && !CLASS_INTERFACE (TYPE_NAME (TYPE)) \ | |
205 | && !TYPE_ARRAY_P (TYPE)) | |
206 | ||
207 | /* Standard error messages */ | |
208 | #define ERROR_CANT_CONVERT_TO_BOOLEAN(OPERATOR, NODE, TYPE) \ | |
209 | parse_error_context \ | |
210 | ((OPERATOR), "Incompatible type for `%s'. Can't convert `%s' to " \ | |
0a2138e2 | 211 | "boolean", operator_string ((NODE)), lang_printable_name ((TYPE),0)) |
e04a16fb AG |
212 | |
213 | #define ERROR_CANT_CONVERT_TO_NUMERIC(OPERATOR, NODE, TYPE) \ | |
214 | parse_error_context \ | |
215 | ((OPERATOR), "Incompatible type for `%s'. Can't convert `%s' to " \ | |
0a2138e2 | 216 | "numeric type", operator_string ((NODE)), lang_printable_name ((TYPE), 0)) |
e04a16fb AG |
217 | |
218 | #define ERROR_CAST_NEEDED_TO_INTEGRAL(OPERATOR, NODE, TYPE) \ | |
219 | parse_error_context \ | |
220 | ((OPERATOR), (JPRIMITIVE_TYPE_P (TYPE) ? \ | |
221 | "Incompatible type for `%s'. Explicit cast needed to convert " \ | |
222 | "`%s' to integral" : "Incompatible type for `%s'. Can't convert " \ | |
223 | "`%s' to integral"), operator_string ((NODE)), \ | |
0a2138e2 | 224 | lang_printable_name ((TYPE), 0)) |
e04a16fb AG |
225 | |
226 | #define ERROR_VARIABLE_NOT_INITIALIZED(WFL, V) \ | |
227 | parse_error_context \ | |
e4de5a10 | 228 | ((WFL), "Variable `%s' may not have been initialized", \ |
e04a16fb AG |
229 | IDENTIFIER_POINTER (V)) |
230 | ||
e4de5a10 PB |
231 | /* Definition for loop handling. This is Java's own definition of a |
232 | loop body. See parse.y for documentation. It's valid once you hold | |
233 | a loop's body (LOOP_EXPR_BODY) */ | |
e04a16fb AG |
234 | |
235 | /* The loop main block is the one hold the condition and the loop body */ | |
236 | #define LOOP_EXPR_BODY_MAIN_BLOCK(NODE) TREE_OPERAND (NODE, 0) | |
237 | /* And then there is the loop update block */ | |
238 | #define LOOP_EXPR_BODY_UPDATE_BLOCK(NODE) TREE_OPERAND (NODE, 1) | |
239 | ||
240 | /* Inside the loop main block, there is the loop condition and the | |
241 | loop body. They may be reversed if the loop being described is a | |
242 | do-while loop. NOTE: if you use a WFL around the EXIT_EXPR so you | |
243 | can issue debug info for it, the EXIT_EXPR will be one operand | |
244 | further. */ | |
245 | #define LOOP_EXPR_BODY_CONDITION_EXPR(NODE, R) \ | |
246 | TREE_OPERAND (LOOP_EXPR_BODY_MAIN_BLOCK (NODE), (R ? 1 : 0)) | |
247 | ||
248 | /* Here is the labeled block the loop real body is encapsulated in */ | |
249 | #define LOOP_EXPR_BODY_LABELED_BODY(NODE, R) \ | |
250 | TREE_OPERAND (LOOP_EXPR_BODY_MAIN_BLOCK (NODE), (R ? 0 : 1)) | |
251 | /* And here is the loop's real body */ | |
252 | #define LOOP_EXPR_BODY_BODY_EXPR(NODE, R) \ | |
253 | LABELED_BLOCK_BODY (LOOP_EXPR_BODY_LABELED_BODY(NODE, R)) | |
254 | ||
255 | /* Does a loop have a label ? */ | |
256 | #define LOOP_HAS_LABEL_P(LOOP) \ | |
257 | (ctxp->current_labeled_block \ | |
258 | && LABELED_BLOCK_BODY (ctxp->current_labeled_block) == (LOOP)) | |
259 | ||
260 | /* Same operation than the one performed above, but considering the | |
261 | previous labeled block */ | |
262 | #define LOOP_HAS_LABEL_SKIP_P(LOOP) \ | |
263 | (ctxp->current_labeled_block \ | |
264 | && TREE_CHAIN (ctxp->current_labeled_block) \ | |
265 | && LABELED_BLOCK_BODY (TREE_CHAIN (ctxp->current_labeled_block)) == (LOOP)) | |
266 | ||
267 | #define PUSH_LABELED_BLOCK(B) \ | |
268 | { \ | |
269 | TREE_CHAIN (B) = ctxp->current_labeled_block; \ | |
270 | ctxp->current_labeled_block = (B); \ | |
271 | } | |
272 | #define POP_LABELED_BLOCK() \ | |
273 | ctxp->current_labeled_block = TREE_CHAIN (ctxp->current_labeled_block) | |
274 | ||
275 | #define PUSH_LOOP(L) \ | |
276 | { \ | |
277 | TREE_CHAIN (L) = ctxp->current_loop; \ | |
278 | ctxp->current_loop = (L); \ | |
279 | } | |
280 | #define POP_LOOP() ctxp->current_loop = TREE_CHAIN (ctxp->current_loop) | |
281 | ||
b9f7e36c APB |
282 | #define PUSH_EXCEPTIONS(E) \ |
283 | currently_caught_type_list = \ | |
284 | tree_cons (NULL_TREE, (E), currently_caught_type_list); | |
285 | ||
286 | #define POP_EXCEPTIONS() \ | |
287 | currently_caught_type_list = TREE_CHAIN (currently_caught_type_list) | |
288 | ||
22eed1e6 | 289 | /* Check that we're inside a try block. */ |
b9f7e36c APB |
290 | #define IN_TRY_BLOCK_P() \ |
291 | (currently_caught_type_list \ | |
292 | && ((TREE_VALUE (currently_caught_type_list) != \ | |
293 | DECL_FUNCTION_THROWS (current_function_decl)) \ | |
294 | || TREE_CHAIN (currently_caught_type_list))) | |
295 | ||
22eed1e6 | 296 | /* Check that we have exceptions in E. */ |
b9f7e36c APB |
297 | #define EXCEPTIONS_P(E) ((E) ? TREE_VALUE (E) : NULL_TREE) |
298 | ||
e04a16fb AG |
299 | /* Invocation modes, as returned by invocation_mode (). */ |
300 | enum { | |
301 | INVOKE_STATIC, | |
302 | INVOKE_NONVIRTUAL, | |
303 | INVOKE_SUPER, | |
304 | INVOKE_INTERFACE, | |
305 | INVOKE_VIRTUAL, | |
306 | }; | |
307 | ||
308 | /* We need the resolution stuff only if we compile jc1 */ | |
309 | #ifndef JC1_LITE | |
310 | ||
311 | /* Unresolved type identifiers handling. When we process the source | |
312 | code, we blindly accept an unknown type identifier and try to | |
313 | resolve it later. When an unknown type identifier is encountered | |
314 | and used, we record in a struct jdep element what the incomplete | |
315 | type is and what it should patch. Later, java_complete_class will | |
316 | process all classes known to have unresolved type | |
317 | dependencies. Within each of these classes, this routine will | |
318 | process unresolved type dependencies (JDEP_TO_RESOLVE), patch what | |
319 | needs to be patched in the dependent tree node (JDEP_GET_PATCH, | |
320 | JDEP_APPLY_PATCH) and perform other actions dictated by the context | |
321 | of the patch (JDEP_KIND). The ideas are: we patch only what needs | |
322 | to be patched, and with java_complete_class called at the right | |
323 | time, we will start processing incomplete function bodies tree | |
324 | nodes with everything external to function's bodies already | |
325 | completed, it makes things much simpler. */ | |
326 | ||
327 | enum jdep_code { | |
328 | JDEP_NO_PATCH, /* Must be first */ | |
329 | JDEP_SUPER, /* Patch the type of one type | |
330 | supertype. Requires some check | |
331 | before it's done */ | |
332 | JDEP_FIELD, /* Patch the type of a class field */ | |
333 | ||
334 | /* JDEP_{METHOD,METHOD_RETURN,METHOD_END} to be kept in order */ | |
335 | JDEP_METHOD, /* Mark the beginning of the patching | |
336 | of a method declaration, including | |
337 | it's arguments */ | |
338 | JDEP_METHOD_RETURN, /* Mark the beginning of the patching | |
339 | of a method declaration. Arguments | |
340 | aren't patched, only the returned | |
341 | type is */ | |
342 | JDEP_METHOD_END, /* Mark the end of the patching of a | |
343 | method declaration. It indicates | |
344 | that it's time to compute and | |
345 | install a new signature */ | |
346 | ||
347 | JDEP_INTERFACE, /* Patch the type of a Class/interface | |
348 | extension */ | |
349 | JDEP_VARIABLE, /* Patch the type of a variable declaration */ | |
350 | JDEP_PARM, /* Patch the type of a parm declaration */ | |
351 | JDEP_TYPE, /* Patch a random tree node type, | |
352 | without the need for any specific | |
353 | actions */ | |
b9f7e36c | 354 | JDEP_EXCEPTION, /* Patch exceptions specified by `throws' */ |
e04a16fb AG |
355 | }; |
356 | ||
357 | typedef struct _jdep { | |
358 | #ifdef ONLY_INT_FIELDS | |
359 | int kind : 8; /* Type of patch */ | |
360 | #else | |
361 | enum jdep_code kind : 8; | |
362 | #endif | |
363 | ||
364 | int flag0 : 1; /* Some flags */ | |
365 | tree decl; /* Tied decl/or WFL */ | |
366 | tree solv; /* What to solve */ | |
367 | tree wfl; /* Where thing to resolve where found */ | |
368 | tree misc; /* Miscellaneous info (optional). */ | |
369 | tree *patch; /* Address of a location to patch */ | |
370 | struct _jdep *next; /* Linked list */ | |
371 | } jdep; | |
372 | ||
373 | ||
374 | #define JDEP_DECL(J) ((J)->decl) | |
375 | #define JDEP_DECL_WFL(J) ((J)->decl) | |
376 | #define JDEP_KIND(J) ((J)->kind) | |
377 | #define JDEP_SOLV(J) ((J)->solv) | |
378 | #define JDEP_WFL(J) ((J)->wfl) | |
379 | #define JDEP_MISC(J) ((J)->misc) | |
380 | #define JDEP_CLASS(J) ((J)->class) | |
381 | #define JDEP_APPLY_PATCH(J,P) (*(J)->patch = (P)) | |
382 | #define JDEP_GET_PATCH(J) ((J)->patch) | |
383 | #define JDEP_CHAIN(J) ((J)->next) | |
78d21f92 PB |
384 | #define JDEP_TO_RESOLVE(J) ((J)->solv) |
385 | #define JDEP_RESOLVED_DECL(J) ((J)->solv) | |
386 | #define JDEP_RESOLVED(J, D) ((J)->solv = D) | |
387 | #define JDEP_RESOLVED_P(J) \ | |
388 | (!(J)->solv || TREE_CODE ((J)->solv) != POINTER_TYPE) | |
e04a16fb AG |
389 | |
390 | typedef struct _jdeplist { | |
391 | jdep *first; | |
392 | jdep *last; | |
393 | struct _jdeplist *next; | |
394 | } jdeplist; | |
e04a16fb AG |
395 | |
396 | #endif /* JC1_LITE */ | |
397 | ||
398 | #define CLASSD_FIRST(CD) ((CD)->first) | |
399 | #define CLASSD_LAST(CD) ((CD)->last) | |
400 | #define CLASSD_CHAIN(CD) ((CD)->next) | |
401 | ||
402 | #define JDEP_INSERT(L,J) \ | |
403 | { \ | |
404 | if (!(L)->first) \ | |
405 | (L)->last = (L)->first = (J); \ | |
406 | else \ | |
407 | { \ | |
408 | JDEP_CHAIN ((L)->last) = (J); \ | |
409 | (L)->last = (J); \ | |
410 | } \ | |
411 | } | |
412 | ||
c583dd46 APB |
413 | /* if TYPE can't be resolved, obtain something suitable for its |
414 | resolution (TYPE is saved in SAVE before being changed). and set | |
415 | CHAIN to 1. Otherwise, type is set to something usable. CHAIN is | |
c877974e APB |
416 | usually used to determine that a new DEP must be installed on TYPE. |
417 | Note that when compiling java.lang.Object, references to Object are | |
418 | java.lang.Object. */ | |
419 | #define SET_TYPE_FOR_RESOLUTION(TYPE, SAVE, CHAIN) \ | |
420 | { \ | |
421 | tree returned_type; \ | |
422 | (CHAIN) = 0; \ | |
423 | if (TREE_TYPE (ctxp->current_parsed_class) == object_type_node \ | |
424 | && TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION \ | |
425 | && EXPR_WFL_NODE (TYPE) == unqualified_object_id_node) \ | |
426 | (TYPE) = object_type_node; \ | |
427 | else \ | |
428 | { \ | |
429 | if (unresolved_type_p (type, &returned_type)) \ | |
430 | { \ | |
431 | if (returned_type) \ | |
432 | (TYPE) = returned_type; \ | |
433 | else \ | |
434 | { \ | |
435 | (SAVE) = (TYPE); \ | |
436 | (TYPE) = obtain_incomplete_type (TYPE); \ | |
437 | CHAIN = 1; \ | |
438 | } \ | |
439 | } \ | |
440 | } \ | |
c583dd46 | 441 | } |
1886c9d8 APB |
442 | /* Promote a type if it won't be registered as a patch */ |
443 | #define PROMOTE_RECORD_IF_COMPLETE(TYPE, IS_INCOMPLETE) \ | |
444 | { \ | |
445 | if (!(IS_INCOMPLETE) && TREE_CODE (TYPE) == RECORD_TYPE) \ | |
446 | (TYPE) = promote_type (TYPE); \ | |
447 | } | |
c583dd46 | 448 | |
e04a16fb AG |
449 | /* Insert a DECL in the current block */ |
450 | #define BLOCK_CHAIN_DECL(NODE) \ | |
451 | { \ | |
452 | TREE_CHAIN ((NODE)) = \ | |
453 | BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); \ | |
454 | BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)) = (NODE); \ | |
455 | } | |
456 | ||
15fdcfe9 PB |
457 | /* For an artificial BLOCK (created to house a local variable declaration not |
458 | at the start of an existing block), the parent block; otherwise NULL. */ | |
e04a16fb AG |
459 | #define BLOCK_EXPR_ORIGIN(NODE) BLOCK_ABSTRACT_ORIGIN(NODE) |
460 | ||
461 | /* Merge an other line to the source line number of a decl. Used to | |
462 | remember function's end. */ | |
463 | #define DECL_SOURCE_LINE_MERGE(DECL,NO) DECL_SOURCE_LINE(DECL) |= (NO << 16) | |
464 | ||
465 | /* Retrieve those two info separately. */ | |
466 | #define DECL_SOURCE_LINE_FIRST(DECL) (DECL_SOURCE_LINE(DECL) & 0x0000ffff) | |
467 | #define DECL_SOURCE_LINE_LAST(DECL) (DECL_SOURCE_LINE(DECL) >> 16) | |
468 | ||
469 | /* Build a WFL for expression nodes */ | |
470 | #define BUILD_EXPR_WFL(NODE, WFL) \ | |
471 | build_expr_wfl ((NODE), input_filename, EXPR_WFL_LINENO ((WFL)), \ | |
472 | EXPR_WFL_COLNO ((WFL))) | |
473 | ||
474 | #define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 1) | |
475 | #define QUAL_WFL(NODE) TREE_PURPOSE (NODE) | |
476 | #define QUAL_RESOLUTION(NODE) TREE_VALUE (NODE) | |
f8976021 APB |
477 | #define QUAL_DECL_TYPE(NODE) GET_SKIP_TYPE (NODE) |
478 | ||
479 | #define GET_SKIP_TYPE(NODE) \ | |
e04a16fb | 480 | (TREE_CODE (TREE_TYPE (NODE)) == POINTER_TYPE ? \ |
f8976021 | 481 | TREE_TYPE (TREE_TYPE (NODE)): TREE_TYPE (NODE)) |
e04a16fb AG |
482 | |
483 | /* Handy macros for the walk operation */ | |
484 | #define COMPLETE_CHECK_OP(NODE, N) \ | |
485 | { \ | |
486 | TREE_OPERAND ((NODE), (N)) = \ | |
487 | java_complete_tree (TREE_OPERAND ((NODE), (N))); \ | |
488 | if (TREE_OPERAND ((NODE), (N)) == error_mark_node) \ | |
489 | return error_mark_node; \ | |
490 | } | |
491 | #define COMPLETE_CHECK_OP_0(NODE) COMPLETE_CHECK_OP(NODE, 0) | |
492 | #define COMPLETE_CHECK_OP_1(NODE) COMPLETE_CHECK_OP(NODE, 1) | |
22eed1e6 | 493 | #define COMPLETE_CHECK_OP_2(NODE) COMPLETE_CHECK_OP(NODE, 2) |
e04a16fb | 494 | |
e4de5a10 | 495 | /* Building invocations: append(ARG) and StringBuffer(ARG) */ |
061ac426 TT |
496 | #define BUILD_APPEND(ARG) \ |
497 | ((JSTRING_TYPE_P (TREE_TYPE (ARG)) || JPRIMITIVE_TYPE_P (TREE_TYPE (ARG))) \ | |
498 | ? build_method_invocation (wfl_append, \ | |
499 | ARG ? build_tree_list (NULL, (ARG)) : NULL_TREE)\ | |
500 | : build_method_invocation (wfl_append, \ | |
501 | ARG ? build_tree_list (NULL, \ | |
502 | build1 (CONVERT_EXPR, \ | |
503 | object_type_node,\ | |
504 | (ARG))) \ | |
505 | : NULL_TREE)) | |
e4de5a10 PB |
506 | #define BUILD_STRING_BUFFER(ARG) \ |
507 | build_new_invocation (wfl_string_buffer, \ | |
508 | (ARG ? build_tree_list (NULL, (ARG)) : NULL_TREE)) | |
509 | ||
b9f7e36c | 510 | /* For exception handling, build diverse function calls */ |
b9f7e36c APB |
511 | #define BUILD_ASSIGN_EXCEPTION_INFO(WHERE, TO) \ |
512 | { \ | |
513 | (WHERE) = build (MODIFY_EXPR, void_type_node, (TO), \ | |
514 | soft_exceptioninfo_call_node); \ | |
515 | TREE_SIDE_EFFECTS (WHERE) = 1; \ | |
516 | } | |
517 | ||
518 | #define BUILD_THROW(WHERE, WHAT) \ | |
519 | { \ | |
520 | (WHERE) = build (CALL_EXPR, void_type_node, \ | |
521 | build_address_of (throw_node), \ | |
522 | build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \ | |
523 | TREE_SIDE_EFFECTS ((WHERE)) = 1; \ | |
524 | } | |
525 | ||
526 | /* Set wfl_operator for the most accurate error location */ | |
527 | #define SET_WFL_OPERATOR(WHICH, NODE, WFL) \ | |
528 | EXPR_WFL_LINECOL (WHICH) = \ | |
529 | (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \ | |
530 | EXPR_WFL_LINECOL (WFL) : EXPR_WFL_LINECOL (NODE)) | |
531 | ||
532 | #define PATCH_METHOD_RETURN_ERROR() \ | |
533 | { \ | |
534 | if (ret_decl) \ | |
535 | *ret_decl = NULL_TREE; \ | |
536 | return error_mark_node; \ | |
537 | } | |
5e942c50 APB |
538 | |
539 | /* Convenient macro to check. Assumes that CLASS is a CLASS_DECL. */ | |
540 | #define CHECK_METHODS(CLASS) \ | |
541 | { \ | |
542 | if (CLASS_INTERFACE ((CLASS))) \ | |
543 | java_check_abstract_methods ((CLASS)); \ | |
544 | else \ | |
545 | java_check_regular_methods ((CLASS)); \ | |
546 | } | |
547 | ||
548 | /* Using and reseting the @deprecated tag flag */ | |
549 | #define CHECK_DEPRECATED(DECL) \ | |
550 | { \ | |
551 | if (ctxp->deprecated) \ | |
552 | DECL_DEPRECATED (DECL) = 1; \ | |
553 | ctxp->deprecated = 0; \ | |
554 | } | |
555 | ||
ba179f9f | 556 | /* Register an import */ |
5e942c50 APB |
557 | #define REGISTER_IMPORT(WHOLE, NAME) \ |
558 | { \ | |
559 | IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P ((NAME)) = 1; \ | |
560 | node = build_tree_list ((WHOLE), (NAME)); \ | |
561 | TREE_CHAIN (node) = ctxp->import_list; \ | |
562 | ctxp->import_list = node; \ | |
563 | } | |
ba179f9f APB |
564 | |
565 | /* Macro to access the osb (opening square bracket) count */ | |
566 | #define CURRENT_OSB(C) (C)->osb_number [(C)->osb_depth] | |
b9f7e36c | 567 | |
e04a16fb AG |
568 | /* Parser context data structure. */ |
569 | struct parser_ctxt { | |
570 | ||
571 | char *filename; /* Current filename */ | |
572 | FILE *finput; /* Current file input stream */ | |
573 | struct parser_ctxt *next; | |
574 | ||
575 | struct java_line *p_line, *c_line; /* Previous and current line */ | |
576 | java_lc elc; /* Error's line column info */ | |
577 | unicode_t unget_utf8_value; /* An unget utf8 value */ | |
578 | int ccb_indent; /* Keep track of {} indent, lexer */ | |
579 | int first_ccb_indent1; /* First { at ident level 1 */ | |
580 | int last_ccb_indent1; /* Last } at ident level 1 */ | |
581 | int parser_ccb_indent; /* Keep track of {} indent, parser */ | |
ba179f9f APB |
582 | int osb_depth; /* Current depth of [ in an expression */ |
583 | int osb_limit; /* Limit of this depth */ | |
584 | int *osb_number; /* Keep track of ['s */ | |
e04a16fb | 585 | int minus_seen; /* Integral literal overflow */ |
23a79c61 APB |
586 | int lineno; /* Current lineno */ |
587 | int java_error_flag; /* Report error when true */ | |
5e942c50 | 588 | int deprecated; /* @deprecated tag seen */ |
e04a16fb AG |
589 | |
590 | /* This section is defined only if we compile jc1 */ | |
591 | #ifndef JC1_LITE | |
23a79c61 | 592 | tree modifier_ctx [11]; /* WFL of modifiers */ |
e04a16fb AG |
593 | tree current_class; /* Current class */ |
594 | tree current_function_decl; /* Current function decl, save/restore */ | |
595 | ||
8e1f2d4c | 596 | struct JCF *current_jcf; /* CU jcf */ |
e04a16fb AG |
597 | |
598 | int prevent_ese; /* Prevent expression statement error */ | |
599 | int class_err; /* Flag to report certain errors */ | |
600 | ||
601 | int formal_parameter_number; /* Number of parameters found */ | |
602 | int interface_number; /* # itfs declared to extend an itf def */ | |
603 | ||
604 | tree package; /* Defined package ID */ | |
605 | ||
23a79c61 | 606 | /* Those tow list are saved accross file traversal */ |
e04a16fb | 607 | tree incomplete_class; /* List of non-complete classes */ |
23a79c61 APB |
608 | tree gclass_list; /* All classes seen from source code */ |
609 | ||
610 | /* These two lists won't survive file traversal */ | |
e04a16fb AG |
611 | tree class_list; /* List of classes in a CU */ |
612 | jdeplist *classd_list; /* Classe dependencies in a CU */ | |
613 | ||
23a79c61 APB |
614 | tree current_parsed_class; /* Class currently parsed */ |
615 | tree current_parsed_class_un; /* Curr. parsed class unqualified name */ | |
616 | ||
e04a16fb AG |
617 | tree non_static_initialized; /* List of non static initialized fields */ |
618 | tree static_initialized; /* List of static non final initialized */ | |
619 | ||
620 | tree import_list; /* List of import */ | |
621 | tree import_demand_list; /* List of import on demand */ | |
622 | ||
23a79c61 APB |
623 | tree current_loop; /* List of the currently nested |
624 | loops/switches */ | |
625 | tree current_labeled_block; /* List of currently nested | |
626 | labeled blocks. */ | |
e04a16fb | 627 | |
23a79c61 | 628 | int pending_block; /* Pending block to close */ |
22eed1e6 | 629 | |
23a79c61 APB |
630 | int explicit_constructor_p; /* True when processing an explicit |
631 | constructor. This flag is used to trap | |
632 | illegal argument usage during an | |
633 | explicit constructor invocation. */ | |
e04a16fb AG |
634 | #endif /* JC1_LITE */ |
635 | }; | |
636 | ||
e04a16fb | 637 | #ifndef JC1_LITE |
e04a16fb AG |
638 | void safe_layout_class PROTO ((tree)); |
639 | void java_complete_class PROTO ((void)); | |
640 | void java_check_circular_reference PROTO ((void)); | |
641 | void java_check_final PROTO ((void)); | |
e04a16fb AG |
642 | void java_layout_classes PROTO ((void)); |
643 | tree java_method_add_stmt PROTO ((tree, tree)); | |
644 | char *java_get_line_col PROTO ((char *, int, int)); | |
e4de5a10 | 645 | void java_expand_switch PROTO ((tree)); |
c877974e | 646 | int java_report_errors PROTO (()); |
78d21f92 | 647 | extern tree do_resolve_class PROTO ((tree, tree, tree)); |
82371d41 | 648 | #endif |
e04a16fb AG |
649 | |
650 | /* Always in use, no matter what you compile */ | |
e04a16fb | 651 | void java_push_parser_context PROTO ((void)); |
b351b287 | 652 | void java_pop_parser_context PROTO ((int)); |
e04a16fb | 653 | void java_init_lex PROTO ((void)); |
8e1f2d4c KG |
654 | extern void java_parser_context_save_global PROTO ((void)); |
655 | extern void java_parser_context_restore_global PROTO ((void)); | |
e04a16fb | 656 | int yyparse PROTO ((void)); |
8e1f2d4c | 657 | extern int java_parse PROTO ((void)); |
e04a16fb AG |
658 | int yylex (); |
659 | void yyerror PROTO ((char *)); | |
8e1f2d4c | 660 | extern void java_expand_classes PROTO ((void)); |
e04a16fb | 661 | #endif |