# HG changeset patch # User Tomas Lindquist Olsen # Date 1228178657 -3600 # Node ID 8f0b24bc55f07e84018a7dae7507c56fbd9942af # Parent bb4a81e68ddb6e2c43320d5eac880bae98c9e5bc Added CMake option to disable generation of ClassInfo.offTi arrays, defaults to OFF. diff -r bb4a81e68ddb -r 8f0b24bc55f0 CMakeLists.txt --- a/CMakeLists.txt Tue Dec 02 01:20:22 2008 +0100 +++ b/CMakeLists.txt Tue Dec 02 01:44:17 2008 +0100 @@ -41,6 +41,7 @@ set(D_VERSION 1 CACHE STRING "D language version") option(USE_BOEHM_GC "use the Boehm garbage collector internally") +option(GENERATE_OFFTI "generate complete ClassInfo.offTi arrays") if(D_VERSION EQUAL 1) set(DMDFE_PATH dmd) @@ -142,6 +143,10 @@ add_definitions(-DUSE_BOEHM_GC) endif(USE_BOEHM_GC) +if(GENERATE_OFFTI) + add_definitions(-DGENERATE_OFFTI) +endif(GENERATE_OFFTI) + if(CMAKE_MINOR_VERSION LESS 6) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "output dir for built executables") set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib CACHE PATH "output dir for built libraries") diff -r bb4a81e68ddb -r 8f0b24bc55f0 gen/classes.cpp --- a/gen/classes.cpp Tue Dec 02 01:20:22 2008 +0100 +++ b/gen/classes.cpp Tue Dec 02 01:44:17 2008 +0100 @@ -1312,6 +1312,8 @@ ////////////////////////////////////////////////////////////////////////////////////////// +#if GENERATE_OFFTI + // build a single element for the OffsetInfo[] of ClassInfo static LLConstant* build_offti_entry(ClassDeclaration* cd, VarDeclaration* vd) { @@ -1371,6 +1373,8 @@ return DtoConstSlice(size, ptr); } +#endif // GENERATE_OFFTI + static LLConstant* build_class_dtor(ClassDeclaration* cd) { FuncDeclaration* dtor = cd->dtor; @@ -1581,10 +1585,20 @@ // offset typeinfo VarDeclaration* offTiVar = (VarDeclaration*)cinfo->fields.data[9]; const LLType* offTiTy = DtoType(offTiVar->type); + +#if GENERATE_OFFTI + if (cd->isInterfaceDeclaration()) c = LLConstant::getNullValue(offTiTy); else c = build_offti_array(cd, offTiTy); + +#else // GENERATE_OFFTI + + c = LLConstant::getNullValue(offTiTy); + +#endif // GENERATE_OFFTI + inits.push_back(c); // default constructor @@ -1606,8 +1620,6 @@ // FIXME: fill it out! inits.push_back( LLConstant::getNullValue(xgetTy) ); - -#else #endif /*size_t n = inits.size(); diff -r bb4a81e68ddb -r 8f0b24bc55f0 tests/mini/classinfo3.d --- a/tests/mini/classinfo3.d Tue Dec 02 01:20:22 2008 +0100 +++ b/tests/mini/classinfo3.d Tue Dec 02 01:44:17 2008 +0100 @@ -11,7 +11,8 @@ void main() { auto c = C.classinfo; - assert(c.offTi !is null); + if (c.offTi !is null) + { assert(c.offTi.length == 4); size_t base = 2*size_t.sizeof; @@ -24,4 +25,5 @@ assert(c.offTi[2].ti == typeid(long)); assert(c.offTi[3].offset == base+16); assert(c.offTi[3].ti == typeid(int)); + } }