Changes in src/Virtual/Tables.cc [69c5c00:1c01c58]
- File:
-
- 1 edited
-
src/Virtual/Tables.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Virtual/Tables.cc
r69c5c00 r1c01c58 14 14 // 15 15 16 #include <SynTree/Attribute.h>17 16 #include <SynTree/Declaration.h> 18 17 #include <SynTree/Expression.h> 19 #include <SynTree/Statement.h>20 18 #include <SynTree/Type.h> 21 19 … … 40 38 } 41 39 40 // Fuse base polymorphic declaration and forall arguments into a new type. 41 static StructInstType * vtableInstType( 42 StructDecl * polyDecl, std::list< Expression * > && parameters ) { 43 assert( parameters.size() == polyDecl->parameters.size() ); 44 StructInstType * type = new StructInstType( 45 Type::Qualifiers( /* Type::Const */ ), polyDecl ); 46 type->parameters = std::move( parameters ); 47 return type; 48 } 49 42 50 static ObjectDecl * makeVtableDeclaration( 43 51 StructInstType * type, Initializer * init ) { … … 58 66 59 67 ObjectDecl * makeVtableForward( StructInstType * type ) { 60 assert( type );61 68 return makeVtableDeclaration( type, nullptr ); 62 69 } 63 70 71 ObjectDecl * makeVtableForward( 72 StructDecl * polyDecl, std::list< Expression * > && parameters ) { 73 return makeVtableForward( vtableInstType( polyDecl, std::move( parameters ) ) ); 74 } 75 64 76 ObjectDecl * makeVtableInstance( 65 StructInstType * vtableType, Type * objectType, Initializer * init ) { 66 assert( vtableType ); 67 assert( objectType ); 77 StructInstType * vtableType, Type * vobject_type, Initializer * init ) { 68 78 StructDecl * vtableStruct = vtableType->baseStruct; 69 79 // Build the initialization … … 82 92 new SingleInit( new AddressExpr( new NameExpr( parentInstance ) ) ) ); 83 93 } else if ( std::string( "size" ) == field->name ) { 84 inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) );94 inits.push_back( new SingleInit( new SizeofExpr( vobject_type->clone() ) ) ); 85 95 } else if ( std::string( "align" ) == field->name ) { 86 inits.push_back( new SingleInit( new AlignofExpr( objectType->clone() ) ) );96 inits.push_back( new SingleInit( new AlignofExpr( vobject_type->clone() ) ) ); 87 97 } else { 88 98 inits.push_back( new SingleInit( new NameExpr( field->name ) ) ); … … 98 108 } 99 109 100 namespace { 101 std::string const functionName = "get_exception_vtable"; 102 } 103 104 FunctionDecl * makeGetExceptionForward( 105 Type * vtableType, Type * exceptType ) { 106 assert( vtableType ); 107 assert( exceptType ); 108 FunctionType * type = new FunctionType( noQualifiers, false ); 109 vtableType->tq.is_const = true; 110 type->returnVals.push_back( new ObjectDecl( 111 "_retvalue", 112 noStorageClasses, 113 LinkageSpec::Cforall, 114 nullptr, 115 new ReferenceType( noQualifiers, vtableType ), 116 nullptr, 117 { new Attribute("unused") } 118 ) ); 119 type->parameters.push_back( new ObjectDecl( 120 "__unused", 121 noStorageClasses, 122 LinkageSpec::Cforall, 123 nullptr, 124 new PointerType( noQualifiers, exceptType ), 125 nullptr, 126 { new Attribute("unused") } 127 ) ); 128 return new FunctionDecl( 129 functionName, 130 noStorageClasses, 131 LinkageSpec::Cforall, 132 type, 133 nullptr 134 ); 135 } 136 137 FunctionDecl * makeGetExceptionFunction( 138 ObjectDecl * vtableInstance, Type * exceptType ) { 139 assert( vtableInstance ); 140 assert( exceptType ); 141 FunctionDecl * func = makeGetExceptionForward( 142 vtableInstance->type->clone(), exceptType ); 143 func->statements = new CompoundStmt( { 144 new ReturnStmt( new VariableExpr( vtableInstance ) ), 145 } ); 146 return func; 110 ObjectDecl * makeVtableInstance( 111 StructDecl * polyDecl, std::list< Expression * > && parameters, 112 Type * vobject, Initializer * init ) { 113 return makeVtableInstance( 114 vtableInstType( polyDecl, std::move( parameters ) ), vobject, init ); 147 115 } 148 116
Note:
See TracChangeset
for help on using the changeset viewer.