Commit 2771fe54 by Tom Tromey Committed by Tom Tromey

java-tree.h (boolean_array_vtable, [...]): Declare.

	* java-tree.h (boolean_array_vtable, byte_array_vtable,
	char_array_vtable, short_array_vtable, int_array_vtable,
	long_array_vtable, float_array_vtable, double_array_vtable):
	Declare.
	* expr.c (get_primitive_array_vtable): New function.
	(create_primitive_vtable): New function.
	(java_lang_expand_expr): Enable code to statically generate
	arrays.
	* decl.c (init_decl_processing): Create primitive vtables.
	(boolean_array_vtable, byte_array_vtable, char_array_vtable,
	short_array_vtable, int_array_vtable, long_array_vtable,
	float_array_vtable, double_array_vtable): Define.

From-SVN: r34314
parent 9bcfe71d
2000-05-31 Tom Tromey <tromey@cygnus.com>
* java-tree.h (boolean_array_vtable, byte_array_vtable,
char_array_vtable, short_array_vtable, int_array_vtable,
long_array_vtable, float_array_vtable, double_array_vtable):
Declare.
* expr.c (get_primitive_array_vtable): New function.
(create_primitive_vtable): New function.
(java_lang_expand_expr): Enable code to statically generate
arrays.
* decl.c (init_decl_processing): Create primitive vtables.
(boolean_array_vtable, byte_array_vtable, char_array_vtable,
short_array_vtable, int_array_vtable, long_array_vtable,
float_array_vtable, double_array_vtable): Define.
2000-05-26 Zack Weinberg <zack@wolery.cumb.org> 2000-05-26 Zack Weinberg <zack@wolery.cumb.org>
* java/parse.y (find_applicable_accessible_methods_list): * java/parse.y (find_applicable_accessible_methods_list):
......
...@@ -392,6 +392,16 @@ tree soft_irem_node; ...@@ -392,6 +392,16 @@ tree soft_irem_node;
tree soft_ldiv_node; tree soft_ldiv_node;
tree soft_lrem_node; tree soft_lrem_node;
/* Declarations for vtables for primitive arrays. */
tree boolean_array_vtable;
tree byte_array_vtable;
tree char_array_vtable;
tree short_array_vtable;
tree int_array_vtable;
tree long_array_vtable;
tree float_array_vtable;
tree double_array_vtable;
/* Build (and pushdecl) a "promoted type" for all standard /* Build (and pushdecl) a "promoted type" for all standard
types shorter than int. */ types shorter than int. */
...@@ -451,6 +461,21 @@ builtin_function (name, type, function_code, class, library_name) ...@@ -451,6 +461,21 @@ builtin_function (name, type, function_code, class, library_name)
return decl; return decl;
} }
/* Return tree that represents a vtable for a primitive array. */
static tree
create_primitive_vtable (name)
const char *name;
{
tree r;
char buf[50];
sprintf (buf, "_Jv_%sVTable", name);
r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
DECL_EXTERNAL (r) = 1;
make_decl_rtl (r, buf, 1);
return r;
}
void void
init_decl_processing () init_decl_processing ()
{ {
...@@ -573,7 +598,17 @@ init_decl_processing () ...@@ -573,7 +598,17 @@ init_decl_processing ()
float_zero_node = build_real (float_type_node, dconst0); float_zero_node = build_real (float_type_node, dconst0);
double_zero_node = build_real (double_type_node, dconst0); double_zero_node = build_real (double_type_node, dconst0);
/* As your adding items here, please update the code right after /* These are the vtables for arrays of primitives. */
boolean_array_vtable = create_primitive_vtable ("boolean");
byte_array_vtable = create_primitive_vtable ("byte");
char_array_vtable = create_primitive_vtable ("char");
short_array_vtable = create_primitive_vtable ("short");
int_array_vtable = create_primitive_vtable ("int");
long_array_vtable = create_primitive_vtable ("long");
float_array_vtable = create_primitive_vtable ("float");
double_array_vtable = create_primitive_vtable ("double");
/* As you're adding items here, please update the code right after
this section, so that the filename containing the source code of this section, so that the filename containing the source code of
the pre-defined class gets registered correctly. */ the pre-defined class gets registered correctly. */
unqualified_object_id_node = get_identifier ("Object"); unqualified_object_id_node = get_identifier ("Object");
......
...@@ -2251,6 +2251,33 @@ case_identity (t, v) ...@@ -2251,6 +2251,33 @@ case_identity (t, v)
return v; return v;
} }
/* Return the name of the vtable for an array of a given primitive
type. */
static tree
get_primitive_array_vtable (tree elt)
{
tree r;
if (elt == boolean_type_node)
r = boolean_array_vtable;
else if (elt == byte_type_node)
r = byte_array_vtable;
else if (elt == char_type_node)
r = char_array_vtable;
else if (elt == short_type_node)
r = short_array_vtable;
else if (elt == int_type_node)
r = int_array_vtable;
else if (elt == long_type_node)
r = long_array_vtable;
else if (elt == float_type_node)
r = float_array_vtable;
else if (elt == double_type_node)
r = double_array_vtable;
else
abort ();
return build_address_of (r);
}
struct rtx_def * struct rtx_def *
java_lang_expand_expr (exp, target, tmode, modifier) java_lang_expand_expr (exp, target, tmode, modifier)
register tree exp; register tree exp;
...@@ -2272,22 +2299,25 @@ java_lang_expand_expr (exp, target, tmode, modifier) ...@@ -2272,22 +2299,25 @@ java_lang_expand_expr (exp, target, tmode, modifier)
tree length = build_int_2 (ilength, 0); tree length = build_int_2 (ilength, 0);
tree init = TREE_OPERAND (exp, 0); tree init = TREE_OPERAND (exp, 0);
tree array_decl; tree array_decl;
#if 0
/* Enable this once we can set the vtable field statically. FIXME */ /* See if we can generate the array statically. */
if (TREE_CONSTANT (init) && TREE_STATIC (exp) if (TREE_CONSTANT (init) && TREE_STATIC (exp)
&& JPRIMITIVE_TYPE_P (element_type)) && JPRIMITIVE_TYPE_P (element_type))
{ {
tree temp, value, init_decl; tree temp, value, init_decl;
struct rtx_def *r;
push_obstacks (&permanent_obstack, &permanent_obstack);
START_RECORD_CONSTRUCTOR (temp, object_type_node); START_RECORD_CONSTRUCTOR (temp, object_type_node);
PUSH_FIELD_VALUE (temp, "vtable", PUSH_FIELD_VALUE (temp, "vtable",
null_pointer_node /* FIXME */ get_primitive_array_vtable (element_type));
);
if (! flag_hash_synchronization) if (! flag_hash_synchronization)
PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node); PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
FINISH_RECORD_CONSTRUCTOR (temp); FINISH_RECORD_CONSTRUCTOR (temp);
START_RECORD_CONSTRUCTOR (value, array_type); START_RECORD_CONSTRUCTOR (value, array_type);
PUSH_SUPER_VALUE (value, temp); PUSH_SUPER_VALUE (value, temp);
PUSH_FIELD_VALUE (value, "length", length); /* FIXME: build a new `length' here to get it on the right
obstack. */
PUSH_FIELD_VALUE (value, "length", build_int_2 (ilength, 0));
PUSH_FIELD_VALUE (value, "data", init); PUSH_FIELD_VALUE (value, "data", init);
FINISH_RECORD_CONSTRUCTOR (value); FINISH_RECORD_CONSTRUCTOR (value);
...@@ -2299,9 +2329,11 @@ java_lang_expand_expr (exp, target, tmode, modifier) ...@@ -2299,9 +2329,11 @@ java_lang_expand_expr (exp, target, tmode, modifier)
TREE_READONLY (init_decl) = 1; TREE_READONLY (init_decl) = 1;
make_decl_rtl (init_decl, NULL, 1); make_decl_rtl (init_decl, NULL, 1);
init = build1 (ADDR_EXPR, TREE_TYPE (exp), init_decl); init = build1 (ADDR_EXPR, TREE_TYPE (exp), init_decl);
return expand_expr (init, target, tmode, modifier); r = expand_expr (init, target, tmode, modifier);
pop_obstacks ();
return r;
} }
#endif
array_decl = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (exp)); array_decl = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (exp));
expand_decl (array_decl); expand_decl (array_decl);
tmp = expand_assignment (array_decl, tmp = expand_assignment (array_decl,
......
...@@ -241,6 +241,14 @@ extern tree float_array_type_node; ...@@ -241,6 +241,14 @@ extern tree float_array_type_node;
extern tree array_array_type_node; extern tree array_array_type_node;
extern tree object_array_type_node; extern tree object_array_type_node;
extern tree string_array_type_node; extern tree string_array_type_node;
extern tree boolean_array_vtable;
extern tree byte_array_vtable;
extern tree char_array_vtable;
extern tree short_array_vtable;
extern tree int_array_vtable;
extern tree long_array_vtable;
extern tree float_array_vtable;
extern tree double_array_vtable;
extern tree TYPE_identifier_node; /* "TYPE" */ extern tree TYPE_identifier_node; /* "TYPE" */
extern tree init_identifier_node; /* "<init>" */ extern tree init_identifier_node; /* "<init>" */
extern tree clinit_identifier_node; /* "<clinit>" */ extern tree clinit_identifier_node; /* "<clinit>" */
......
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