1 /**************************** comp/local.c *************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 behandeln der lokalen Java-Variablen
9 Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: 1996/11/14
13 *******************************************************************************/
15 /* es werden f"ur die lokalen Java-Variablen 5 Tabellen angelegt,
16 f"ur jeden m"oglichen Typ eine, weil mehrere Java-Variablen
17 verschiendenen Typs die selben Slots belegen k"onnen */
22 /*********************** Funktion: local_get **********************************
24 erzeugt eine neue Pseudo-Variable f"ur einen JavaVM-Slot und einen
25 gew"unschten Typ, oder eine bereits vorhandene Variable.
27 ******************************************************************************/
29 static varid local_get (int slot, int type)
34 secondslot = ((type==TYPE_DOUBLE) || (type==TYPE_LONG)) ? 1 : 0;
36 if (slot+secondslot>=maxlocals)
37 panic ("Local-variable access out of bounds");
38 v = locals[type][slot];
41 v = var_createwithspecialnumber (type, slot);
42 v -> globalscope = true;
43 locals[type][slot] = v;
52 /************************* Funktion: local_init *******************************
54 legt die 5 Tabellen an, und erzeugt auch gleich die Belegungen
55 f"ur die Methodenparameter.
57 ******************************************************************************/
59 static void local_init()
63 if (TYPE_INT != 0 || TYPE_ADDRESS != 4)
64 panic ("JAVA-Basictypes have been changed");
66 for (t=TYPE_INT; t<=TYPE_ADDRESS; t++) {
67 locals[t] = DMNEW (varid, maxlocals);
68 for (i=0; i<maxlocals; i++) locals[t][i] = NULL;
73 for (i=0; i<mparamnum; i++) {
75 mparamvars[i] = local_get (slot, t);
76 slot += ((t==TYPE_DOUBLE || t==TYPE_LONG) ? 2 : 1);
81 /************************ Funktion: local_regalloc ****************************
83 f"uhrt die Registerbelegung f"ur die lokalen Java-Variablen durch
85 ******************************************************************************/
88 static void local_regalloc ()
93 for (s=0; s<maxlocals; s++)
94 for (t=TYPE_INT; t<=TYPE_ADDRESS; t++) {
100 v->reg = reg_allocate (v->type, v->saved, true);