Merged subtype and current trunk.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Thu, 18 Sep 2008 08:46:15 +0000 (10:46 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Thu, 18 Sep 2008 08:46:15 +0000 (10:46 +0200)
--HG--
branch : subtype-trunk

13 files changed:
1  2 
src/vm/class.c
src/vm/jit/alpha/codegen.c
src/vm/jit/builtin.cpp
src/vm/jit/builtin.hpp
src/vm/jit/emit-common.cpp
src/vm/jit/i386/codegen.c
src/vm/jit/i386/emit.c
src/vm/jit/i386/patcher.c
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/emit.c
src/vm/linker.c
src/vm/linker.h
src/vm/vftbl.hpp

diff --cc src/vm/class.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc src/vm/linker.c
Simple merge
diff --cc src/vm/linker.h
Simple merge
index 0000000000000000000000000000000000000000,80f45a89316e15286bc65a7026921bbabb7c74a7..01c5a70fa3f31e3192eeb3c09e40f33cace53d1f
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,125 +1,133 @@@
+ /* src/vm/vftbl.hpp - virtual function table
+    Copyright (C) 2008
+    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+    This file is part of CACAO.
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2, or (at
+    your option) any later version.
+    This program is distributed in the hope that it will be useful, but
+    WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    General Public License for more details.
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA.
+ */
+ #ifndef _VFTBL_HPP
+ #define _VFTBL_HPP
+ // Forward declaration.
+ typedef struct _vftbl vftbl_t;
+ #include "config.h"
+ /* virtual function table ******************************************************
+    The vtbl has a bidirectional layout with open ends at both sides.
+    interfacetablelength gives the number of entries of the interface
+    table at the start of the vftbl. The vftbl pointer points to
+    &interfacetable[0].  vftbllength gives the number of entries of
+    table at the end of the vftbl.
+    runtime type check (checkcast):
+    Different methods are used for runtime type check depending on the
+    argument of checkcast/instanceof.
+       
+    A check against a class is implemented via relative numbering on
+    the class hierachy tree. The tree is numbered in a depth first
+    traversal setting the base field and the diff field. The diff field
+    gets the result of (high - base) so that a range check can be
+    implemented by an unsigned compare. A sub type test is done by
+    checking the inclusion of base of the sub class in the range of the
+    superclass.
+    A check against an interface is implemented via the
+    interfacevftbl. If the interfacevftbl contains a nonnull value a
+    class is a subclass of this interface.
+    interfacetable:
+    Like standard virtual methods interface methods are called using
+    virtual function tables. All interfaces are numbered sequentially
+    (starting with zero). For each class there exist an interface table
+    of virtual function tables for each implemented interface. The
+    length of the interface table is determined by the highest number
+    of an implemented interface.
+    The following example assumes a class which implements interface 0 and 3:
+    interfacetablelength = 4
+                   | ...       |            +----------+
+                   +-----------+            | method 2 |---> method z
+                   | class     |            | method 1 |---> method y
+                   +-----------+            | method 0 |---> method x
+                   | ivftbl  0 |----------> +----------+
+     vftblptr ---> +-----------+
+                   | ivftbl -1 |--> NULL    +----------+
+                   | ivftbl -2 |--> NULL    | method 1 |---> method x
+                   | ivftbl -3 |-----+      | method 0 |---> method a
+                   +-----------+     +----> +----------+
+      
+                               +---------------+
+                               | length 3 = 2  |
+                               | length 2 = 0  |
+                               | length 1 = 0  |
+                               | length 0 = 3  |
+     interfacevftbllength ---> +---------------+
+ *******************************************************************************/
+ // Includes.
+ #include "vm/class.h"
+ #include "vm/references.h"
++#define DISPLAY_SIZE 4
++
+ struct _vftbl {
+       methodptr   *interfacetable[1];    /* interface table (access via macro)  */
+       classinfo   *clazz;                /* class, the vtbl belongs to          */
+       arraydescriptor *arraydesc;        /* for array classes, otherwise NULL   */
+       s4           vftbllength;          /* virtual function table length       */
+       s4           interfacetablelength; /* interface table length              */
+       s4           baseval;              /* base for runtime type check         */
+                                          /* (-index for interfaces)             */
+       s4           diffval;              /* high - base for runtime type check  */
++
++      s4 subtype_depth;
++      s4 subtype_offset;
++      struct _vftbl *subtype_display[DISPLAY_SIZE+1];  /* the last one is cache */
++      struct _vftbl **subtype_overflow;
++
+       s4          *interfacevftbllength; /* length of interface vftbls          */
+       methodptr    table[1];             /* class vftbl                         */
+ };
+ #endif // _VFTBL_HPP
+ /*
+  * These are local overrides for various environment variables in Emacs.
+  * Please do not remove this and leave it at the end of the file, where
+  * Emacs will automagically detect them.
+  * ---------------------------------------------------------------------
+  * Local variables:
+  * mode: c++
+  * indent-tabs-mode: t
+  * c-basic-offset: 4
+  * tab-width: 4
+  * End:
+  * vim:noexpandtab:sw=4:ts=4:
+  */