1 /* src/vm/linker.c - class linker functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Reinhard Grafl
29 Changes: Andreas Krall
35 $Id: linker.c 3351 2005-10-05 11:53:28Z edwin $
45 #include "mm/memory.h"
46 #include "native/native.h"
47 #include "vm/builtin.h"
49 #include "vm/classcache.h"
50 #include "vm/exceptions.h"
51 #include "vm/loader.h"
52 #include "vm/options.h"
53 #include "vm/resolve.h"
54 #include "vm/statistics.h"
55 #include "vm/stringlocal.h"
56 #include "vm/jit/codegen.inc.h"
59 /* global variables ***********************************************************/
61 static s4 interfaceindex; /* sequential numbering of interfaces */
65 /* primitivetype_table *********************************************************
67 Structure for primitive classes: contains the class for wrapping
68 the primitive type, the primitive class, the name of the class for
69 wrapping, the one character type signature and the name of the
72 CAUTION: Don't change the order of the types. This table is indexed
73 by the ARRAYTYPE_ constants (except ARRAYTYPE_OBJECT).
75 *******************************************************************************/
77 primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT] = {
78 { NULL, NULL, "java/lang/Integer", 'I', "int" , "[I", NULL, NULL },
79 { NULL, NULL, "java/lang/Long", 'J', "long" , "[J", NULL, NULL },
80 { NULL, NULL, "java/lang/Float", 'F', "float" , "[F", NULL, NULL },
81 { NULL, NULL, "java/lang/Double", 'D', "double" , "[D", NULL, NULL },
82 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
83 { NULL, NULL, "java/lang/Byte", 'B', "byte" , "[B", NULL, NULL },
84 { NULL, NULL, "java/lang/Character", 'C', "char" , "[C", NULL, NULL },
85 { NULL, NULL, "java/lang/Short", 'S', "short" , "[S", NULL, NULL },
86 { NULL, NULL, "java/lang/Boolean", 'Z', "boolean" , "[Z", NULL, NULL },
87 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
88 { NULL, NULL, "java/lang/Void", 'V', "void" , NULL, NULL, NULL }
92 /* private functions **********************************************************/
94 static bool link_primitivetype_table(void);
95 static classinfo *link_class_intern(classinfo *c);
96 static arraydescriptor *link_array(classinfo *c);
97 static void linker_compute_class_values(classinfo *c);
98 static void linker_compute_subclasses(classinfo *c);
99 static void linker_addinterface(classinfo *c, classinfo *ic);
100 static s4 class_highestinterface(classinfo *c);
103 /* linker_init *****************************************************************
105 Initializes the linker subsystem.
107 *******************************************************************************/
109 bool linker_init(void)
111 /* reset interface index */
115 /* link important system classes */
117 if (!link_class(class_java_lang_Object))
120 if (!link_class(class_java_lang_String))
123 if (!link_class(class_java_lang_Cloneable))
126 if (!link_class(class_java_io_Serializable))
130 /* link classes for wrapping primitive types */
132 if (!link_class(class_java_lang_Void))
135 if (!link_class(class_java_lang_Boolean))
138 if (!link_class(class_java_lang_Byte))
141 if (!link_class(class_java_lang_Character))
144 if (!link_class(class_java_lang_Short))
147 if (!link_class(class_java_lang_Integer))
150 if (!link_class(class_java_lang_Long))
153 if (!link_class(class_java_lang_Float))
156 if (!link_class(class_java_lang_Double))
160 /* load some other important classes */
162 if (!link_class(class_java_lang_Class))
165 if (!link_class(class_java_lang_ClassLoader))
168 if (!link_class(class_java_lang_SecurityManager))
171 if (!link_class(class_java_lang_System))
174 if (!link_class(class_java_lang_Thread))
177 if (!link_class(class_java_lang_ThreadGroup))
180 if (!link_class(class_java_lang_VMThread))
184 /* some classes which may be used more often */
186 if (!link_class(class_java_lang_StackTraceElement))
189 if (!link_class(class_java_lang_reflect_Constructor))
192 if (!link_class(class_java_lang_reflect_Field))
195 if (!link_class(class_java_lang_reflect_Method))
198 if (!link_class(class_java_security_PrivilegedAction))
201 if (!link_class(class_java_util_Vector))
204 if (!link_class(arrayclass_java_lang_Object))
208 /* create pseudo classes used by the typechecker */
210 /* pseudo class for Arraystubs (extends java.lang.Object) */
212 pseudo_class_Arraystub =
213 class_create_classinfo(utf_new_char("$ARRAYSTUB$"));
214 pseudo_class_Arraystub->loaded = true;
215 pseudo_class_Arraystub->super.cls = class_java_lang_Object;
216 pseudo_class_Arraystub->interfacescount = 2;
217 pseudo_class_Arraystub->interfaces = MNEW(classref_or_classinfo, 2);
218 pseudo_class_Arraystub->interfaces[0].cls = class_java_lang_Cloneable;
219 pseudo_class_Arraystub->interfaces[1].cls = class_java_io_Serializable;
221 if (!classcache_store_unique(pseudo_class_Arraystub)) {
222 log_text("could not cache pseudo_class_Arraystub");
226 if (!link_class(pseudo_class_Arraystub))
229 /* pseudo class representing the null type */
231 pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$"));
232 pseudo_class_Null->loaded = true;
233 pseudo_class_Null->super.cls = class_java_lang_Object;
235 if (!classcache_store_unique(pseudo_class_Null)) {
236 log_text("could not cache pseudo_class_Null");
240 if (!link_class(pseudo_class_Null))
243 /* pseudo class representing new uninitialized objects */
245 pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$"));
246 pseudo_class_New->loaded = true;
247 pseudo_class_New->linked = true; /* XXX is this allright? */
248 pseudo_class_New->super.cls = class_java_lang_Object;
250 if (!classcache_store_unique(pseudo_class_New)) {
251 log_text("could not cache pseudo_class_New");
255 /* create classes representing primitive types */
257 if (!link_primitivetype_table())
261 /* Correct vftbl-entries (retarded loading and linking of class */
262 /* java/lang/String). */
264 stringtable_update();
270 /* link_primitivetype_table ****************************************************
272 Create classes representing primitive types.
274 *******************************************************************************/
276 static bool link_primitivetype_table(void)
282 for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
285 if (!primitivetype_table[i].name)
288 /* create primitive class */
290 c = class_create_classinfo(utf_new_char(primitivetype_table[i].name));
292 c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT;
293 c->classUsed = NOTUSED; /* not used initially CO-RT */
296 /* prevent loader from loading primitive class */
300 /* INFO: don't put primitive classes into the classcache */
305 primitivetype_table[i].class_primitive = c;
307 /* create class for wrapping the primitive type */
309 u = utf_new_char(primitivetype_table[i].wrapname);
311 if (!(c = load_class_bootstrap(u)))
314 primitivetype_table[i].class_wrap = c;
315 primitivetype_table[i].class_wrap->classUsed = NOTUSED; /* not used initially CO-RT */
316 primitivetype_table[i].class_wrap->impldBy = NULL;
318 /* create the primitive array class */
320 if (primitivetype_table[i].arrayname) {
321 u = utf_new_char(primitivetype_table[i].arrayname);
322 c = class_create_classinfo(u);
323 c = load_newly_created_array(c, NULL);
327 primitivetype_table[i].arrayclass = c;
334 primitivetype_table[i].arrayvftbl = c->vftbl;
342 /* link_class ******************************************************************
344 Wrapper function for link_class_intern to ease monitor enter/exit
345 and exception handling.
347 *******************************************************************************/
349 classinfo *link_class(classinfo *c)
354 *exceptionptr = new_nullpointerexception();
358 #if defined(USE_THREADS)
359 /* enter a monitor on the class */
361 builtin_monitorenter((java_objectheader *) c);
364 /* maybe the class is already linked */
366 #if defined(USE_THREADS)
367 builtin_monitorexit((java_objectheader *) c);
373 #if defined(STATISTICS)
376 if (getcompilingtime)
377 compilingtime_stop();
383 /* call the internal function */
385 r = link_class_intern(c);
387 /* if return value is NULL, we had a problem and the class is not linked */
392 #if defined(STATISTICS)
398 if (getcompilingtime)
399 compilingtime_start();
402 #if defined(USE_THREADS)
403 /* leave the monitor */
405 builtin_monitorexit((java_objectheader *) c);
412 /* link_class_intern ***********************************************************
414 Tries to link a class. The function calculates the length in bytes
415 that an instance of this class requires as well as the VTBL for
416 methods and interface methods.
418 *******************************************************************************/
420 static classinfo *link_class_intern(classinfo *c)
422 classinfo *super; /* super class */
423 classinfo *tc; /* temporary class variable */
424 s4 supervftbllength; /* vftbllegnth of super class */
425 s4 vftbllength; /* vftbllength of current class */
426 s4 interfacetablelength; /* interface table length */
427 vftbl_t *v; /* vftbl of current class */
428 s4 i,j; /* interface/method/field counter */
429 arraydescriptor *arraydesc; /* descriptor for array classes */
431 /* maybe the class is already linked */
437 log_message_class("Linking class: ", c);
439 /* the class must be loaded */
442 throw_cacao_exception_exit(string_java_lang_InternalError,
443 "Trying to link unloaded class");
445 /* cache the self-reference of this class */
446 /* we do this for cases where the defining loader of the class */
447 /* has not yet been recorded as an initiating loader for the class */
448 /* this is needed so subsequent code can assume that self-refs */
449 /* will always resolve lazily */
450 classcache_store(c->classloader,c,false);
452 /* ok, this class is somewhat linked */
458 /* check interfaces */
460 for (i = 0; i < c->interfacescount; i++) {
461 /* resolve this super interface */
463 if (!resolve_classref_or_classinfo(NULL, c->interfaces[i], resolveEager,
467 c->interfaces[i].cls = tc;
469 /* detect circularity */
473 new_exception_utfmessage(string_java_lang_ClassCircularityError,
480 if (!(tc->flags & ACC_INTERFACE)) {
482 new_exception_message(string_java_lang_IncompatibleClassChangeError,
483 "Implementing class");
492 /* check super class */
496 if (c->super.any == NULL) { /* class java.lang.Object */
498 c->classUsed = USED; /* Object class is always used CO-RT*/
500 c->instancesize = sizeof(java_objectheader);
502 vftbllength = supervftbllength = 0;
507 /* resolve super class */
509 if (!resolve_classref_or_classinfo(NULL, c->super, resolveEager, true, false,
512 c->super.cls = super;
514 /* detect circularity */
518 new_exception_utfmessage(string_java_lang_ClassCircularityError,
523 assert(super->loaded);
525 if (super->flags & ACC_INTERFACE) {
526 /* java.lang.IncompatibleClassChangeError: class a has interface java.lang.Cloneable as super class */
527 log_text("Interface specified as super class");
531 /* Don't allow extending final classes */
533 if (super->flags & ACC_FINAL) {
535 new_exception_message(string_java_lang_VerifyError,
536 "Cannot inherit from final class");
541 if (!link_class(super))
544 /* handle array classes */
546 if (c->name->text[0] == '[')
547 if (!(arraydesc = link_array(c)))
550 if (c->flags & ACC_INTERFACE)
551 c->index = interfaceindex++;
553 c->index = super->index + 1;
555 c->instancesize = super->instancesize;
557 vftbllength = supervftbllength = super->vftbl->vftbllength;
559 c->finalizer = super->finalizer;
563 /* compute vftbl length */
565 for (i = 0; i < c->methodscount; i++) {
566 methodinfo *m = &(c->methods[i]);
568 if (!(m->flags & ACC_STATIC)) { /* is instance method */
574 for (j = 0; j < tc->methodscount; j++) {
575 if (method_canoverwrite(m, &(tc->methods[j]))) {
576 if (tc->methods[j].flags & ACC_PRIVATE)
577 goto notfoundvftblindex;
579 if (tc->methods[j].flags & ACC_FINAL) {
580 /* class a overrides final method . */
582 new_exception(string_java_lang_VerifyError);
586 m->vftblindex = tc->methods[j].vftblindex;
587 goto foundvftblindex;
595 m->vftblindex = (vftbllength++);
602 /* check interfaces of ABSTRACT class for unimplemented methods */
604 if (c->flags & ACC_ABSTRACT) {
607 s4 abstractmethodscount;
611 abstractmethodscount = 0;
613 for (i = 0; i < c->interfacescount; i++) {
614 ic = c->interfaces[i].cls;
616 for (j = 0; j < ic->methodscount; j++) {
617 im = &(ic->methods[j]);
619 /* skip `<clinit>' and `<init>' */
621 if (im->name == utf_clinit || im->name == utf_init)
627 for (k = 0; k < tc->methodscount; k++) {
628 if (method_canoverwrite(im, &(tc->methods[k])))
629 goto noabstractmethod;
635 abstractmethodscount++;
642 if (abstractmethodscount > 0) {
645 /* reallocate methods memory */
647 c->methods = MREALLOC(c->methods, methodinfo, c->methodscount,
648 c->methodscount + abstractmethodscount);
650 for (i = 0; i < c->interfacescount; i++) {
651 ic = c->interfaces[i].cls;
653 for (j = 0; j < ic->methodscount; j++) {
654 im = &(ic->methods[j]);
656 /* skip `<clinit>' and `<init>' */
658 if (im->name == utf_clinit || im->name == utf_init)
664 for (k = 0; k < tc->methodscount; k++) {
665 if (method_canoverwrite(im, &(tc->methods[k])))
666 goto noabstractmethod2;
672 am = &(c->methods[c->methodscount]);
675 MCOPY(am, im, methodinfo, 1);
677 am->vftblindex = (vftbllength++);
688 #if defined(STATISTICS)
691 sizeof(vftbl_t) + (sizeof(methodptr) * (vftbllength - 1));
694 /* compute interfacetable length */
696 interfacetablelength = 0;
699 for (i = 0; i < tc->interfacescount; i++) {
700 s4 h = class_highestinterface(tc->interfaces[i].cls) + 1;
701 if (h > interfacetablelength)
702 interfacetablelength = h;
707 /* allocate virtual function table */
709 v = (vftbl_t *) mem_alloc(sizeof(vftbl_t) +
710 sizeof(methodptr) * (vftbllength - 1) +
711 sizeof(methodptr*) * (interfacetablelength - (interfacetablelength > 0)));
712 v = (vftbl_t *) (((methodptr *) v) +
713 (interfacetablelength - 1) * (interfacetablelength > 1));
714 c->header.vftbl = c->vftbl = v;
716 v->vftbllength = vftbllength;
717 v->interfacetablelength = interfacetablelength;
718 v->arraydesc = arraydesc;
720 /* store interface index in vftbl */
722 if (c->flags & ACC_INTERFACE)
723 v->baseval = -(c->index);
725 /* copy virtual function table of super class */
727 for (i = 0; i < supervftbllength; i++)
728 v->table[i] = super->vftbl->table[i];
730 /* add method stubs into virtual function table */
732 for (i = 0; i < c->methodscount; i++) {
733 methodinfo *m = &(c->methods[i]);
735 /* Methods in ABSTRACT classes from interfaces maybe already have a */
739 m->stubroutine = createcompilerstub(m);
741 if (!(m->flags & ACC_STATIC))
742 v->table[m->vftblindex] = (methodptr) (ptrint) m->stubroutine;
745 /* compute instance size and offset of each field */
747 for (i = 0; i < c->fieldscount; i++) {
749 fieldinfo *f = &(c->fields[i]);
751 if (!(f->flags & ACC_STATIC)) {
752 dsize = desc_typesize(f->descriptor);
753 c->instancesize = ALIGN(c->instancesize, dsize);
754 f->offset = c->instancesize;
755 c->instancesize += dsize;
759 /* initialize interfacetable and interfacevftbllength */
761 v->interfacevftbllength = MNEW(s4, interfacetablelength);
763 #if defined(STATISTICS)
765 count_vftbl_len += (4 + sizeof(s4)) * v->interfacetablelength;
768 for (i = 0; i < interfacetablelength; i++) {
769 v->interfacevftbllength[i] = 0;
770 v->interfacetable[-i] = NULL;
775 for (tc = c; tc != NULL; tc = tc->super.cls)
776 for (i = 0; i < tc->interfacescount; i++)
777 linker_addinterface(c, tc->interfaces[i].cls);
779 /* add finalizer method (not for java.lang.Object) */
784 fi = class_findmethod(c, utf_finalize, utf_void__void);
787 if (!(fi->flags & ACC_STATIC))
791 /* resolve exception class references */
793 for (i = 0; i < c->methodscount; i++) {
794 methodinfo *m = &(c->methods[i]);
796 for (j = 0; j < m->exceptiontablelength; j++) {
797 if (!m->exceptiontable[j].catchtype.any)
799 if (!resolve_classref_or_classinfo(NULL,
800 m->exceptiontable[j].catchtype,
801 resolveEager, true, false,
802 &(m->exceptiontable[j].catchtype.cls)))
809 linker_compute_subclasses(c);
812 log_message_class("Linking done class: ", c);
814 /* just return c to show that we didn't had a problem */
820 /* link_array ******************************************************************
822 This function is called by link_class to create the arraydescriptor
825 This function returns NULL if the array cannot be linked because
826 the component type has not been linked yet.
828 *******************************************************************************/
830 static arraydescriptor *link_array(classinfo *c)
834 arraydescriptor *desc;
839 namelen = c->name->blength;
841 /* Check the component type */
843 switch (c->name->text[1]) {
845 /* c is an array of arrays. */
846 u = utf_new_intern(c->name->text + 1, namelen - 1);
847 if (!(comp = load_class_from_classloader(u, c->classloader)))
852 /* c is an array of objects. */
853 u = utf_new_intern(c->name->text + 2, namelen - 3);
854 if (!(comp = load_class_from_classloader(u, c->classloader)))
859 /* If the component type has not been linked, link it now */
860 assert(!comp || comp->loaded);
861 if (comp && !comp->linked) {
863 if (!link_class(comp))
867 /* Allocate the arraydescriptor */
868 desc = NEW(arraydescriptor);
871 /* c is an array of references */
872 desc->arraytype = ARRAYTYPE_OBJECT;
873 desc->componentsize = sizeof(void*);
874 desc->dataoffset = OFFSET(java_objectarray, data);
876 compvftbl = comp->vftbl;
879 log_text("Component class has no vftbl");
883 desc->componentvftbl = compvftbl;
885 if (compvftbl->arraydesc) {
886 desc->elementvftbl = compvftbl->arraydesc->elementvftbl;
888 if (compvftbl->arraydesc->dimension >= 255) {
889 log_text("Creating array of dimension >255");
893 desc->dimension = compvftbl->arraydesc->dimension + 1;
894 desc->elementtype = compvftbl->arraydesc->elementtype;
897 desc->elementvftbl = compvftbl;
899 desc->elementtype = ARRAYTYPE_OBJECT;
903 /* c is an array of a primitive type */
904 switch (c->name->text[1]) {
906 desc->arraytype = ARRAYTYPE_BOOLEAN;
907 desc->dataoffset = OFFSET(java_booleanarray,data);
908 desc->componentsize = sizeof(u1);
912 desc->arraytype = ARRAYTYPE_BYTE;
913 desc->dataoffset = OFFSET(java_bytearray,data);
914 desc->componentsize = sizeof(u1);
918 desc->arraytype = ARRAYTYPE_CHAR;
919 desc->dataoffset = OFFSET(java_chararray,data);
920 desc->componentsize = sizeof(u2);
924 desc->arraytype = ARRAYTYPE_DOUBLE;
925 desc->dataoffset = OFFSET(java_doublearray,data);
926 desc->componentsize = sizeof(double);
930 desc->arraytype = ARRAYTYPE_FLOAT;
931 desc->dataoffset = OFFSET(java_floatarray,data);
932 desc->componentsize = sizeof(float);
936 desc->arraytype = ARRAYTYPE_INT;
937 desc->dataoffset = OFFSET(java_intarray,data);
938 desc->componentsize = sizeof(s4);
942 desc->arraytype = ARRAYTYPE_LONG;
943 desc->dataoffset = OFFSET(java_longarray,data);
944 desc->componentsize = sizeof(s8);
948 desc->arraytype = ARRAYTYPE_SHORT;
949 desc->dataoffset = OFFSET(java_shortarray,data);
950 desc->componentsize = sizeof(s2);
954 *exceptionptr = new_classnotfoundexception(c->name);
958 desc->componentvftbl = NULL;
959 desc->elementvftbl = NULL;
961 desc->elementtype = desc->arraytype;
968 /* linker_compute_subclasses ***************************************************
972 *******************************************************************************/
974 static void linker_compute_subclasses(classinfo *c)
976 #if defined(USE_THREADS)
977 #if defined(NATIVE_THREADS)
984 if (!(c->flags & ACC_INTERFACE)) {
989 if (!(c->flags & ACC_INTERFACE) && (c->super.any != NULL)) {
990 c->nextsub = c->super.cls->sub;
991 c->super.cls->sub = c;
996 /* compute class values */
998 linker_compute_class_values(class_java_lang_Object);
1000 #if defined(USE_THREADS)
1001 #if defined(NATIVE_THREADS)
1010 /* linker_compute_class_values *************************************************
1014 *******************************************************************************/
1016 static void linker_compute_class_values(classinfo *c)
1020 c->vftbl->baseval = ++classvalue;
1025 linker_compute_class_values(subs);
1027 subs = subs->nextsub;
1030 c->vftbl->diffval = classvalue - c->vftbl->baseval;
1034 /* linker_addinterface *********************************************************
1036 Is needed by link_class for adding a VTBL to a class. All
1037 interfaces implemented by ic are added as well.
1039 *******************************************************************************/
1041 static void linker_addinterface(classinfo *c, classinfo *ic)
1045 vftbl_t *v = c->vftbl;
1047 if (i >= v->interfacetablelength) {
1048 log_text("Inernal error: interfacetable overflow");
1052 if (v->interfacetable[-i])
1055 if (ic->methodscount == 0) { /* fake entry needed for subtype test */
1056 v->interfacevftbllength[i] = 1;
1057 v->interfacetable[-i] = MNEW(methodptr, 1);
1058 v->interfacetable[-i][0] = NULL;
1061 v->interfacevftbllength[i] = ic->methodscount;
1062 v->interfacetable[-i] = MNEW(methodptr, ic->methodscount);
1064 #if defined(STATISTICS)
1066 count_vftbl_len += sizeof(methodptr) *
1067 (ic->methodscount + (ic->methodscount == 0));
1070 for (j = 0; j < ic->methodscount; j++) {
1074 for (m = 0; m < sc->methodscount; m++) {
1075 methodinfo *mi = &(sc->methods[m]);
1077 if (method_canoverwrite(mi, &(ic->methods[j]))) {
1078 v->interfacetable[-i][j] = v->table[mi->vftblindex];
1089 for (j = 0; j < ic->interfacescount; j++)
1090 linker_addinterface(c, ic->interfaces[j].cls);
1094 /* class_highestinterface ******************************************************
1096 Used by the function link_class to determine the amount of memory
1097 needed for the interface table.
1099 *******************************************************************************/
1101 static s4 class_highestinterface(classinfo *c)
1107 /* check for ACC_INTERFACE bit already done in link_class_intern */
1111 for (i = 0; i < c->interfacescount; i++) {
1112 h2 = class_highestinterface(c->interfaces[i].cls);
1123 * These are local overrides for various environment variables in Emacs.
1124 * Please do not remove this and leave it at the end of the file, where
1125 * Emacs will automagically detect them.
1126 * ---------------------------------------------------------------------
1129 * indent-tabs-mode: t