Commit bc8a5e56 by Per Bothner Committed by Per Bothner

jcf-io.c (open_class): Set filename field.


	* jcf-io.c (open_class):  Set filename field.

	* jcf-parse,c (parse_class_file):  Set current_function_decl
	for better error message when Code attribute is missing.

	* lang.c (put_decl_node, lang_print_error):  Re-arrange for
	better diagnostics, especially for constructors.

From-SVN: r45299
parent 1b9ee723
2001-08-30 Per Bothner <per@bothner.com>
* jcf-io.c (open_class): Set filename field.
* jcf-parse,c (parse_class_file): Set current_function_decl
for better error message when Code attribute is missing.
* lang.c (put_decl_node, lang_print_error): Re-arrange for
better diagnostics, especially for constructors.
2001-08-30 Per Bothner <per@bothner.com>
* jcf-write.c (generate_classfile): Don't write ConstantValue
attribute if field is not final, for compatibility with jdk.
......
......@@ -242,6 +242,7 @@ DEFUN(open_class, (filename, jcf, stream, dep_name),
jcf->read_ptr = NULL;
jcf->read_end = NULL;
jcf->read_state = stream;
jcf->filename = filename;
jcf->filbuf = jcf_filbuf_from_stdio;
}
else
......@@ -556,7 +557,9 @@ DEFUN(jcf_print_utf8_replace, (stream, str, length, in_char, out_char),
/* Check that all the cross-references in the constant pool are
valid. Returns 0 on success.
Otherwise, returns the index of the (first) invalid entry. */
Otherwise, returns the index of the (first) invalid entry.
Only checks internal consistency, but does not check that
any classes, fields, or methods are valid.*/
int
DEFUN(verify_constant_pool, (jcf),
......
......@@ -840,6 +840,7 @@ parse_class_file ()
if (DECL_CODE_OFFSET (method) == 0)
{
current_function_decl = method;
error ("missing Code attribute");
continue;
}
......
......@@ -522,32 +522,36 @@ put_decl_node (node)
if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd'
&& DECL_NAME (node) != NULL_TREE)
{
/* We want to print the type the DECL belongs to. We don't do
that when we handle constructors. */
if (TREE_CODE (node) == FUNCTION_DECL
&& ! DECL_CONSTRUCTOR_P (node)
&& ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node))
if (TREE_CODE (node) == FUNCTION_DECL)
{
put_decl_node (TYPE_NAME (DECL_CONTEXT (node)));
put_decl_string (".", 1);
}
if (! DECL_CONSTRUCTOR_P (node))
put_decl_node (DECL_NAME (node));
if (TREE_CODE (node) == FUNCTION_DECL && TREE_TYPE (node) != NULL_TREE)
{
int i = 0;
tree args = TYPE_ARG_TYPES (TREE_TYPE (node));
if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE)
args = TREE_CHAIN (args);
put_decl_string ("(", 1);
for ( ; args != end_params_node; args = TREE_CHAIN (args), i++)
/* We want to print the type the DECL belongs to. We don't do
that when we handle constructors. */
if (! DECL_CONSTRUCTOR_P (node)
&& ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node))
{
if (i > 0)
put_decl_string (",", 1);
put_decl_node (TREE_VALUE (args));
put_decl_node (TYPE_NAME (DECL_CONTEXT (node)));
put_decl_string (".", 1);
}
if (! DECL_CONSTRUCTOR_P (node))
put_decl_node (DECL_NAME (node));
if (TREE_TYPE (node) != NULL_TREE)
{
int i = 0;
tree args = TYPE_ARG_TYPES (TREE_TYPE (node));
if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE)
args = TREE_CHAIN (args);
put_decl_string ("(", 1);
for ( ; args != end_params_node; args = TREE_CHAIN (args), i++)
{
if (i > 0)
put_decl_string (",", 1);
put_decl_node (TREE_VALUE (args));
}
put_decl_string (")", 1);
}
put_decl_string (")", 1);
}
else
put_decl_node (DECL_NAME (node));
}
else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't'
&& TYPE_NAME (node) != NULL_TREE)
......@@ -648,7 +652,10 @@ lang_print_error (context, file)
else
{
const char *name = lang_printable_name (current_function_decl, 2);
fprintf (stderr, "In method `%s':\n", name);
fprintf (stderr, "In %s `%s':\n",
(DECL_CONSTRUCTOR_P (current_function_decl) ? "constructor"
: "method"),
name);
}
last_error_function = current_function_decl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment