On Thu, 12 Mar 2009, Ron Pinkas wrote:

Hi,

> I still noticed some minor incompatibility which appears to be a Clipper
> bug, or at least I haven't been able to decipher the logic. IAE it manifests
> in very rare condition which I doubt any user is even aware of the odd
> behavior

Can you create any .prg example which gives different results in Clipper
then in Harbour?
For me the Clipper behavior is very simple.
CLEAR MEMORY called explicitly or indirectly by RESTORE FROM ...
without ADDITIVE clause clears all private variables and then all
public variables except GetList. That's all. At least in such
way works current Harbour HVM and I cannot find any incompatibilities
to Clipper here. The only one place where Harbour may give different
results then Clipper is fixed CLEAR MEMORY executed when some PRIVATE
variables exist. Clipper is seriously buggy here. xHarbour also though
the results of probably the same bug are different. Clipper gives
wrong values accessing some itmes freed before but not released by GC
and xHarbour usually GPFs though in the last years the GPF place was
changing. It's memory corruption bug so it's expected.
I was reporting this bug over two years ago to this list. You can find it
in the mail list archive.
Here is self contain example from the message I sent:

   /*
    * Unworking CLEAR MEMORY (this bug exists also in Clipper). In xHarbour
    * it may give some unexpected results or GPF. In Harbour has been fixed.
    */
   memvar V, V2
   proc main()
      local oErr

      ? "Clipper results:"
      ? "V:1 V:1 V:1"
      ? "V:2 V:2 V:2"
      ? "V:2 V:2"
      ? "V2:1 V2:1 V:3 V2:1"
      ? "L:1 L:1 V:3 L:1"
      ? "Variable V does not exist."
      ?
      ? "Expected results:"
      ? "V:1 V:1 V:1"
      ? "V:2 V:2 V:2"
      ? "V:2 V:2"
      ? "V:2 V:2 V:3 V2:1"
      ? "L:1 L:1 V:3 V2:1"
      ? "Variable V does not exist."
      ?
      ? "Current results:"

      private V := "V:1"
      f(@v)
      errorblock({|oErr|break(oErr)})
      ? "Variable V "
      begin sequence
         ?? "is:", V
      recover using oErr
         ?? "does not exist."
      end sequence
   return

   func f(l)
      local cb:={||l}
      ? eval(cb), l, v
      V := "V:2"
      ? eval(cb), l, v
      CLEAR MEMORY
      ? eval(cb), l
      private V2 := "V2:1"
      private V := "V:3"
      ? eval(cb), l, v, v2
      l:="L:1"
      ? eval(cb), l, v, v2
   return cb

Just try this code with current xHarbour version.
Of course Instead of CLEAR MEMORY you can use RESTORE FROM without
ADDITIVE - it makes internally the same job - tries to clear all
existing memvar values.

Please also note that this bug may interact with your results when you are
testing what happens creating some chain of PRIVATE GetList variables and
then calling RESTORE FROM / CLEAR MEMORY.

> I'll be thankful if you can help me understand Clipper results for:
> //-------------------------------------------//
> MEMVAR GetLis
> PROCEDURE Main()
>   ? ProcLine(), GetList
>   PrivateGet()
>   ? ProcLine(), GetList
> RETURN
> PROCEDURE PrivateGet()
>    PRIVATE GetList := "Private"
>    SAVE TO Test ALL
>    OtherPrivateGet()
>    ? ProcLine(), GetList
> RETURN // Should we not get back to PUBLIC visibility here?

We are at public visibility here. Just simply the public varible
GetList value is set by RESTORE FROM to "Private".
The problem is that xHarbour does not reset all memvars offsetes
pushed with function frames inside CLEAR MEMORY but releases all
existing memvars and then tries to restore them.
My example above shows what may happen in such case, f.e. it GPFs
with current xHarbour in Linux GCC builds.

> PROCEDURE OtherPrivateGet()
>    RESTORE FROM Test //ADDITIVE
>    ? ProcLine(), GetList
> RETURN
> INIT PROCEDURE MyInit()
>    GetList := "Public"
> RETURN

I think you should start from fixing the xHarbour memvars code so the
example I sent will work without any problems giving expected results.
Below is result of valgrind test.
HTH

best regards,
Przemek


==27759== Invalid read of size 4
==27759==    at 0x42735EA: hb_itemUnRef (itemapi.c:1437)
==27759==    by 0x4284F52: hb_vmExecute (hvm.c:9309)
==27759==    by 0x4285853: hb_vmDoBlock (hvm.c:7720)
==27759==    by 0x4286575: hb_vmSend (hvm.c:7576)
==27759==    by 0x428379E: hb_vmExecute (hvm.c:2037)
==27759==    by 0x8048806: (within /tmp/20/t03)
==27759==    by 0x428F571: hb_vmDo (hvm.c:7222)
==27759==    by 0x4280DB1: hb_vmExecute (hvm.c:1662)
==27759==    by 0x80487E9: (within /tmp/20/t03)
==27759==    by 0x428F571: hb_vmDo (hvm.c:7222)
==27759==    by 0x4290DA3: hb_vmInit (hvm.c:822)
==27759==    by 0x424C52D: main (mainstd.c:86)
==27759==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
xHarbour-developers mailing list
xHarbour-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xharbour-developers

Reply via email to