On 26 April 2011 04:03, Eliot Miranda eliot.miranda@gmail.com wrote:
On Mon, Apr 25, 2011 at 6:39 PM, Igor Stasenko siguctua@gmail.com wrote:
On 26 April 2011 03:05, Mariano Martinez Peck marianopeck@gmail.com wrote:
Hi guys. I don't know why but with CMakeVMMaker the asserts are not working. I can see the flags are being set correct in CmakeList.txt:
add_definitions(-arch i386 -mmacosx-version-min=10.5 -g3 -O0 -msse3 -funroll-loops -fasm-blocks -finline-functions -mfpmath=sse -march=pentium-m -falign-functions=16 -fno-gcse -fno-cse-follow-jumps -std=gnu99 -DBUILD_FOR_OSX -DUSE_INLINE_MEMORY_ACCESSORS -DLSB_FIRST -DHAVE_SYS_TIME_H -DHAVE_NANOSLEEP -DNDEBUG=1 -DDEBUGVM=1 -DCOGMTVM=1 -DUSE_GLOBAL_STRUCT=0 -DBASE_HEADER_SIZE=4 -DCOGVM)
AFAIK, code checks
#ifdef NDEBUG
which means 'if defined NDEBUG'
and so it doesn't matters if it = 1 or = 0 because it is defined, but don't cares which value.
Also, NDEBUG and DEBUGVM should be mutually exclusive?
NO!! NO!! NO!! [ :) ]. I said earlier, NDEBUG is a linux-ism for enabling asserts. See /usr/include/assert.h. So if defined(NDEBUG) assert(foo) does nothing, but if !defined(NDEBUG) assert(foo) prints a warning and in unix/linux aborts, but in Cog continues. DEBUGVM includes some extra code that allows break-pointing jumping from the interpreter into machien code. Arguably it could be eliminated but it'll be useful when we port to new ISAs. I said all this last week. Please take note this time :)
But hey, i insist that they are mutually exclusive. See, if i want to build a debug version of VM, i should use -DDEBUGVM=1 but should not use -DNDEBUG because otherwise all assertions will be suppressed, which is not what i would want in debug version of VM.
AFAIK, windows also using NDEBUG, but my main comment was about that it is used wrongly.
The check
if defined(NDEBUG)
will always pass whether you use -DNDEBUG=1 or -DNDEBUG=0
because it checks if given symbol are defined, it doesn't cares about its value!!!
So, a proper use would be to either omit -DNDEBUG at all, or include it. But not like currently, changing its value between 0 or 1.
Here the code from assert.h:
#ifdef NDEBUG #define assert(e) ((void)0) #else ....
And here the sample code for testing it:
cat a.c
#include <stdio.h>
int main() {
#ifdef NDEBUG printf ("NDEBUG defined\n"); #endif
return 0;
}
Now see what happens:
gcc a.c ./a.out <no output>
gcc -DNDEBUG=0 a.c ./a.out NDEBUG defined
gcc -DNDEBUG=1 a.c ./a.out NDEBUG defined
gcc -DNDEBUG=1 a.c ./a.out NDEBUG defined
gcc -DNDEBUG=ZORK a.c ./a.out NDEBUG defined
best, Eliot
If first stands for 'no-debug' and second stands for 'debug vm'..
I modified the StackInterpreter to this:
lookupMethodInClass: class | currentClass dictionary found | <inline: false> self asserta: '42' = 'cuarenta y tres'. self assert: 'mariano' = 'esta perdido'. self print: 'grrrr'; cr.
.....
and only 'grrr' is printed. The TWO previous assert are ignored.
I may be doing something very stupid...
thanks in advance,
Mariano
On Wed, Apr 13, 2011 at 8:06 PM, Igor Stasenko siguctua@gmail.com wrote:
On 13 April 2011 19:13, Mariano Martinez Peck marianopeck@gmail.com wrote:
I've just commited the fix, but not the comment ;)
Seriously, I don't know how we can document this kind of things. Putting such comments in #compilerFlagsRelease or #compilerFlagsRelease doesn't make sense because they are aprox. 12 implementaions...I don't want to copy paste to all of them. Only in one? it doesn't make sense because people won't see it. So..how we document this kind of things? I have no idea.
The same with class comments. There are so many classes that copy pasting or documenting only one doesn't make sense.
The root class is enough. A subclasses should just say something like 'i am special for ___that__ and do things differently because i want __that__'.
The only thing I though is doing something like this:
compilerFlagsRelease ^#('-g3' '-Os' '-fvisibility=hidden' '-funroll-loops' '-fasm-blocks' '-finline-functions' '-mfpmath=sse' '-fomit-frame-pointer' '-march=pentium-m' '-mtune=prescott' '-falign-functions=16' '-fno-gcse' '-fno-cse-follow-jumps' '-std=gnu99' '-DBUILD_FOR_OSX' '-DUSE_INLINE_MEMORY_ACCESSORS' '-DLSB_FIRST' '-DUSE_INLINE_MEMORY_ACCESSORS' '-DHAVE_SYS_TIME_H' '-DHAVE_NANOSLEEP' '-DNDEBUG=0' , self debugVMFlag: true, '-DCOGMTVM=0' '-DUSE_GLOBAL_STRUCT=0' '-DBASE_HEADER_SIZE=4')
>debugVMFlagEnable: boolean
"THIS flag is blagh...blh..." ^ '-DDEBUGVM=', boolean asNumber asString
or something like that...
This knowledge is important. It of course a question where to put that, but that's exactly why i didn't wanted to use autoconf to generate config.h file, which contains like 50 various flags, without any clues, where these flags being used, and in what situations they should be turned on or off..
So, later we could step over every flag and properly document them, and like that, for people who will come later, we will have an idea what are need to deal with and why.
cheers
Mariano
-- Best regards, Igor Stasenko AKA sig.
-- Mariano http://marianopeck.wordpress.com
-- Best regards, Igor Stasenko AKA sig.