On Mon, 7 Jul 2008, Andrew Whitworth via RT wrote: > On Thu Mar 13 18:06:21 2008, doughera wrote: > > I don't know if those calculations are still correct, now that strings > > are not "bufferlike". > > Most of the memory management code uses a cast to (Buffer *) or (PObj *) > to test a generic object's flags field. So long as a particular item's > flag field can be found in this method, the alignment of the rest of the > item should neither be assumed nor expected. To that end, I would say > that strings are indeed "bufferlike" because you can cast them to a > buffer to test for the flags field. > > Maybe it's worthwhile for us to test the offset values of the flags > field for each type of item (string, buffer, pobj, pmc, stack_chunk_t) > to ensure they are properly aligned and interchangable, as the memory > system treats them.
But each of those types explicitly starts with the same two elements UnionVal cache; Parrot_UInt flags; so no casting is necessary to find the flags. Why do you need to do any casting at all? Now I'd certainly agree that this requirement should be documented in the pobj.h and stacks.h header files, and I could easily imagine either a 'coding-standard' type test (as part of C<make test>) or a series of asserts() somewhere in the parrot runtime to ensure that the structures are as claimed, but for now, I think that if there's a problem finding the flags, it's likely a side effect of a problem elsewhere. My original post that started this thread had to do with interchanging the position of the 'strstart' and 'bufused' elements in the parrot_string_t structure. In principle, that shouldn't matter at all. In practice, it caused parrot to die with an alignment error. I could well believe that the alignment error was a consequence of some other error, and using the word 'alignment' in the Subject line might, in hindsight, have been misleading. However, the error went away if you padded the string structure with an extra element, so it does indeed smell like an alignment assumption somewhere. My first guess was that calculations involving sizeof(Buffer) were now questionable, but that was just a guess. -- Andy Dougherty [EMAIL PROTECTED]