Let me try that with the correct email address...
Begin forwarded message:
From: John M McIntosh johnmci@smalltalkconsulting.com Date: September 8, 2010 2:20:29 AM PDT To: Squeak VM Developers squeak-vmdev@lists.sourceforge.net Subject: squeak 32bit clean, no? yes? Reply-To: johnmci@smalltalkconsulting.com
It's 2:05am I should be in bed but I'm confused.
given BaseHeaderSize is 4 foo->newMethod is a usqInt (unsigned)
I see in a interp.c Automatically generated from Squeak on #(27 April 2009 5:35:31 pm)
sqInt activateNewMethod(void) { register struct foo * foo = &fum; sqInt initialIP; sqInt newContext; sqInt where; sqInt methodHeader; sqInt tempCount; sqInt i; sqInt nilOop; sqInt tmp;
methodHeader = longAt((foo->newMethod + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
So that is a longAt: ( unsigned sqInt + 4)
But in the interp.c code I generated in July I have methodPointer (a sqInt) = foo->newMethod (a usqint) then methodHeader = longAt((methodPointer + (BASE_HEADER_SIZE)) + (HeaderIndex << (SHIFT_FOR_WORD)));
So that is a longAt: (sqInt + 4).
Er so if foo->newMethod is > 0x7FFFFFFF won't that +4 not do what we think it should do? Or should I go to bed now?
/* Automatically generated from Squeak on 8 July 2010 12:32:36 pm by VMMaker 4.2.6 */
sqInt activateNewMethod(void) { register struct foo * foo = &fum; sqInt tempCount; sqInt nilOop; sqInt where; sqInt initialIP; sqInt i; sqInt newContext; sqInt methodHeader; sqInt methodPointer; sqInt tmp; sqInt activeCntx; sqInt valuePointer; sqInt valuePointer1;
/* begin headerOf: */ methodPointer = foo->newMethod; methodHeader = longAt((methodPointer + (BASE_HEADER_SIZE)) + (HeaderIndex << (SHIFT_FOR_WORD)));
--
John M. McIntosh johnmci@smalltalkconsulting.com Twitter: squeaker68882 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com ===========================================================================
-- =========================================================================== John M. McIntosh johnmci@smalltalkconsulting.com Twitter: squeaker68882 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com ===========================================================================
On Wed, Sep 8, 2010 at 1:48 PM, John M McIntosh < johnmci@smalltalkconsulting.com> wrote:
Let me try that with the correct email address...
Begin forwarded message:
From: John M McIntosh johnmci@smalltalkconsulting.com Date: September 8, 2010 2:20:29 AM PDT To: Squeak VM Developers squeak-vmdev@lists.sourceforge.net Subject: squeak 32bit clean, no? yes? Reply-To: johnmci@smalltalkconsulting.com
It's 2:05am I should be in bed but I'm confused.
given BaseHeaderSize is 4 foo->newMethod is a usqInt (unsigned)
I see in a interp.c Automatically generated from Squeak on #(27 April 2009 5:35:31 pm)
sqInt activateNewMethod(void) { register struct foo * foo = &fum; sqInt initialIP; sqInt newContext; sqInt where; sqInt methodHeader; sqInt tempCount; sqInt i; sqInt nilOop; sqInt tmp;
methodHeader = longAt((foo->newMethod + BaseHeaderSize) +
(HeaderIndex << ShiftForWord));
So that is a longAt: ( unsigned sqInt + 4)
But in the interp.c code I generated in July I have methodPointer (a sqInt) = foo->newMethod (a usqint) then methodHeader = longAt((methodPointer + (BASE_HEADER_SIZE)) +
(HeaderIndex << (SHIFT_FOR_WORD)));
So that is a longAt: (sqInt + 4).
Er so if foo->newMethod is > 0x7FFFFFFF won't that +4 not do what we
think it should do?
Or should I go to bed now?
Go to bed. In C (and in modulo arithmetic in general) (unsigned)((signed)v + N) == (unsigned)v + N. e.g. 0x80000000 + 4 is indeed (2^32 - 4) negated but that's also 0x80000004. i.e. the largest unsigned value is (unsigned)-1, all ones, and so when adding a positive value to a negative signed quantity you end up with a larger unsigned quantity.
/* Automatically generated from Squeak on 8 July 2010 12:32:36 pm by VMMaker 4.2.6 */
sqInt activateNewMethod(void) { register struct foo * foo = &fum; sqInt tempCount; sqInt nilOop; sqInt where; sqInt initialIP; sqInt i; sqInt newContext; sqInt methodHeader; sqInt methodPointer; sqInt tmp; sqInt activeCntx; sqInt valuePointer; sqInt valuePointer1;
/* begin headerOf: */ methodPointer = foo->newMethod; methodHeader = longAt((methodPointer + (BASE_HEADER_SIZE)) +
(HeaderIndex << (SHIFT_FOR_WORD)));
--
===========================================================================
John M. McIntosh johnmci@smalltalkconsulting.com Twitter:
squeaker68882
Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
===========================================================================
--
John M. McIntosh johnmci@smalltalkconsulting.com Twitter: squeaker68882 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com ===========================================================================
vm-dev@lists.squeakfoundation.org