*** src/lib/omniORB2/dynamic/typecode.cc Mon Jan 18 13:54:55 1999 --- newsrc/lib/omniORB2/dynamic/typecode.cc Tue Feb 9 17:45:35 1999 *************** *** 30,35 **** --- 30,42 ---- /* * $Log: typecode.cc,v $ + * Revision 1.18 1999/02/09 17:45:34 djr + * Fixed bug in TypeCode_alignTable generation for structures and exceptions. + * + * Revision 1.17 1999/02/08 18:55:45 djr + * Fixed bug in marshalling of TypeCodes for sequences. The sequence + * bound and the content TypeCode were marshalled in the wrong order. + * * Revision 1.16 1999/01/18 13:54:51 djr * Fixed bugs in implementation of unions. * *************** *** 1920,1925 **** --- 1927,1933 ---- { unsigned num_entries = 0; int simple_size = 0; + omni::alignment_t simple_alignment = omni::ALIGN_8; // Determine how many table entries we will need. for( CORBA::ULong i = 0; i < pd_nmembers; i++ ) { *************** *** 1929,1939 **** for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 ) { // If can, add onto existing simple ... simple_size += mat[j].simple.size; } else { simple_size = mat[j].simple.size; num_entries++; } break; --- 1937,1950 ---- for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 && ! mat[j].simple.alignment <= simple_alignment ) { // If can, add onto existing simple ... + if( simple_size == 0 ) simple_alignment = mat[j].simple.alignment; simple_size += mat[j].simple.size; } else { simple_size = mat[j].simple.size; + simple_alignment = mat[j].simple.alignment; num_entries++; } break; *************** *** 1941,1946 **** --- 1952,1958 ---- default: if( simple_size > 0 ) { simple_size = 0; + simple_alignment = omni::ALIGN_8; num_entries++; } num_entries++; *************** *** 1958,1964 **** } else { pd_alignmentTable.setNumEntries(num_entries); simple_size = 0; ! omni::alignment_t simple_alignment = omni::ALIGN_1; for( CORBA::ULong ii = 0; ii < pd_nmembers; ii++ ) { TypeCode_base* mtc = ToTcBase(pd_members[ii].type); --- 1970,1976 ---- } else { pd_alignmentTable.setNumEntries(num_entries); simple_size = 0; ! simple_alignment = omni::ALIGN_8; for( CORBA::ULong ii = 0; ii < pd_nmembers; ii++ ) { TypeCode_base* mtc = ToTcBase(pd_members[ii].type); *************** *** 1967,1973 **** for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 ) { // If can add onto existing simple ... if( simple_size == 0 ) simple_alignment = mat[j].simple.alignment; simple_size += mat[j].simple.size; --- 1979,1986 ---- for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 && ! mat[j].simple.alignment <= simple_alignment ) { // If can add onto existing simple ... if( simple_size == 0 ) simple_alignment = mat[j].simple.alignment; simple_size += mat[j].simple.size; *************** *** 1982,1987 **** --- 1995,2001 ---- if( simple_size > 0 ) { pd_alignmentTable.addSimple(simple_alignment, simple_size); simple_size = 0; + simple_alignment = omni::ALIGN_8; } pd_alignmentTable.add(mat, j); break; *************** *** 1989,1996 **** } } // And there may be an extra simple one at the end ... ! if( simple_size > 0 ) pd_alignmentTable.addSimple(simple_alignment, simple_size); } } --- 2003,2011 ---- } } // And there may be an extra simple one at the end ... ! if( simple_size > 0 ) { pd_alignmentTable.addSimple(simple_alignment, simple_size); + } } } *************** *** 2268,2273 **** --- 2283,2289 ---- { unsigned num_entries = 0; int simple_size = 0; + omni::alignment_t simple_alignment = omni::ALIGN_8; // Determine how many table entries we will need. for( CORBA::ULong i = 0; i < pd_nmembers; i++ ) { *************** *** 2277,2301 **** for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 ) { // If can add onto existing simple ... simple_size += mat[j].simple.size; } else { simple_size = mat[j].simple.size; num_entries++; } break; default: if( simple_size > 0 ) { - num_entries++; simple_size = 0; } num_entries++; break; } } } // Generate the entries. if( num_entries == 0 ) { --- 2293,2323 ---- for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 && ! mat[j].simple.alignment <= simple_alignment ) { // If can add onto existing simple ... + if( simple_size == 0 ) simple_alignment = mat[j].simple.alignment; simple_size += mat[j].simple.size; } else { simple_size = mat[j].simple.size; + simple_alignment = mat[j].simple.alignment; num_entries++; } break; default: if( simple_size > 0 ) { simple_size = 0; + simple_alignment = omni::ALIGN_8; + num_entries++; } num_entries++; break; } } } + // And there may be an extra simple one at the end ... + if( simple_size > 0 ) num_entries++; // Generate the entries. if( num_entries == 0 ) { *************** *** 2304,2310 **** } else { pd_alignmentTable.setNumEntries(num_entries); simple_size = 0; ! omni::alignment_t simple_alignment = omni::ALIGN_1; for( CORBA::ULong ii = 0; ii < pd_nmembers; ii++ ) { TypeCode_base* mtc = ToTcBase(pd_members[ii].type); --- 2326,2332 ---- } else { pd_alignmentTable.setNumEntries(num_entries); simple_size = 0; ! simple_alignment = omni::ALIGN_8; for( CORBA::ULong ii = 0; ii < pd_nmembers; ii++ ) { TypeCode_base* mtc = ToTcBase(pd_members[ii].type); *************** *** 2313,2319 **** for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 ) { // If can add onto existing simple ... if( simple_size == 0 ) simple_alignment = mat[j].simple.alignment; simple_size += mat[j].simple.size; --- 2335,2342 ---- for( unsigned j = 0; j < mat.entries(); j++ ) { switch( mat[j].type ) { case TypeCode_alignTable::it_simple: ! if( simple_size % mat[j].simple.alignment == 0 && ! mat[j].simple.alignment <= simple_alignment ) { // If can add onto existing simple ... if( simple_size == 0 ) simple_alignment = mat[j].simple.alignment; simple_size += mat[j].simple.size; *************** *** 2328,2338 **** --- 2351,2366 ---- if( simple_size > 0 ) { pd_alignmentTable.addSimple(simple_alignment, simple_size); simple_size = 0; + simple_alignment = omni::ALIGN_8; } pd_alignmentTable.add(mat, j); break; } } + } + // And there may be an extra simple one at the end ... + if( simple_size > 0 ) { + pd_alignmentTable.addSimple(simple_alignment, simple_size); } } }