Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2005-10

Variant compiling errors

4 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Unknown author

Hi.

After a few hours with gdb was isolated errors and strangeness in compiler at work with variants:

Example:

function c(const vv:  variant): variant;
begin
  result := vv;
end;
function b(vv:  variant): variant;
begin
  result := vv;
end;
function a(var vv:  variant): variant;
begin
  result := vv;
end;
procedure start;
var
  v, v1: Variant;
begin
  v := VarArrayCreate([0, 0], varVariant);
  a(v);
  //if variant result of a() isn't assigned, fpc_finalize() at end of a(v)
  //destroys temporary result. But when start() ends fpc_finalize() tryes
  //to destroy it again
  b(v);
  //if b() is called then variant param is copied but not whole (deeply), vv.varray
  //points to the same place as v.array. At end of b(v) is pointer
  //vv.array destroyed by fpc_decref() and then v.array points to the
  //destroyed memory
  c(v);
  //At the start of func c() is v copied to the vv deeply but i think
  //that behaviour of "var" and "const" calling should be the same (by
  //reference) not vy value like c()
end;

I try to understand compiler code and repair it, but this is "very long distance race". But like I see the responses to my previous reports (absolutely no interest), this will be fastest solution :(. Really here isn't anybody who understand to compiler code and help me with repair? Or is anywhere another e-mail list or another comunication channel where i can talk about this problem?

Petr

Ing. Petr Kristan . EPOS PRO s.r.o., Bozeny Nemcove 2625, 530 02 Pardubice tel: +420 466335223 Czech Republic (Eastern Europe) fax: +420 466510709

Reply by email

Florian Klaempfl
to Unknown author
Show quoted text 54 lines
Hi. After a few hours with gdb was isolated errors and strangeness in compiler at work with variants: Example: function c(const vv: variant): variant; begin result := vv; end; function b(vv: variant): variant; begin result := vv; end; function a(var vv: variant): variant; begin result := vv; end; procedure start; var v, v1: Variant; begin v := VarArrayCreate([0, 0], varVariant); a(v); //if variant result of a() isn't assigned, fpc_finalize() at end of a(v) //destroys temporary result. But when start() ends fpc_finalize() tryes //to destroy it again b(v); //if b() is called then variant param is copied but not whole (deeply), vv.varray //points to the same place as v.array. At end of b(v) is pointer //vv.array destroyed by fpc_decref() and then v.array points to the //destroyed memory c(v); //At the start of func c() is v copied to the vv deeply but i think //that behaviour of "var" and "const" calling should be the same (by //reference) not vy value like c() end; I try to understand compiler code and repair it, but this is "very long distance race". But like I see the responses to my previous reports (absolutely no interest), this will be fastest solution :(. Really here isn't anybody who understand to compiler code and help me with repair? Or is anywhere another e-mail list or another comunication channel where i can talk about this problem? Petr

The var arrays problems are known, see also
http://www.freepascal.org/bugs/showrec.php3?ID=3830

It requires some design changes though that's why it isn't fixed yet. The problem is that the compiler handles variants as ref. counted types when passing them as parameters etc. However, this is wrong behaviour as soon as a variant contains an array.

Reply by email

Unknown author
to Florian Klaempfl
Florian Klaempfl wrote 64 lines
wrote: > Hi. > > After a few hours with gdb was isolated errors and strangeness in compiler > at work with variants: > > Example: > > function c(const vv: variant): variant; > begin > result := vv; > end; > > function b(vv: variant): variant; > begin > result := vv; > end; > > function a(var vv: variant): variant; > begin > result := vv; > end; > > procedure start; > var > v, v1: Variant; > begin > v := VarArrayCreate([0, 0], varVariant); > > a(v); > //if variant result of a() isn't assigned, fpc_finalize() at end of a(v) > //destroys temporary result. But when start() ends fpc_finalize() tryes > //to destroy it again > > b(v); > //if b() is called then variant param is copied but not whole (deeply), vv.varray > //points to the same place as v.array. At end of b(v) is pointer > //vv.array destroyed by fpc_decref() and then v.array points to the > //destroyed memory > > c(v); > //At the start of func c() is v copied to the vv deeply but i think > //that behaviour of "var" and "const" calling should be the same (by > //reference) not vy value like c() > end; > > I try to understand compiler code and repair it, but this is "very long > distance race". But like I see the responses to my previous reports > (absolutely no interest), this will be fastest solution :(. Really here > isn't anybody who understand to compiler code and help me with repair? > Or is anywhere another e-mail list or another comunication channel where > i can talk about this problem? > > Petr > The var arrays problems are known, see also http://www.freepascal.org/bugs/showrec.php3?ID=3830 It requires some design changes though that's why it isn't fixed yet. The problem is that the compiler handles variants as ref. counted types when passing them as parameters etc. However, this is wrong behaviour as soon as a variant contains an array.

Thanks for explanation. Yesterday i looked at compiler code and fpc internals documentation. I must recognize that fixing this is beyond my strength. Is somebody working on it? I can help with debugging. Vararray problem stopped my work -- porting big information system to fpc. In Rtl/fcl i can repair or fill missing, but here i'am helpless. For that reason i hurry on fixing this.

Petr

Ing. Petr Kristan . EPOS PRO s.r.o., Bozeny Nemcove 2625, 530 02 Pardubice tel: +420 466335223 Czech Republic (Eastern Europe) fax: +420 466510709

Reply by email

Florian Klaempfl
to Unknown author
Show quoted text 74 lines
On Mon, Oct 10, 2005 at 02:11:04PM +0200, Florian Klaempfl wrote: > wrote: > > >>Hi. >> >>After a few hours with gdb was isolated errors and strangeness in compiler >>at work with variants: >> >>Example: >> >>function c(const vv: variant): variant; >>begin >> result := vv; >>end; >> >>function b(vv: variant): variant; >>begin >> result := vv; >>end; >> >>function a(var vv: variant): variant; >>begin >> result := vv; >>end; >> >>procedure start; >>var >> v, v1: Variant; >>begin >> v := VarArrayCreate([0, 0], varVariant); >> >> a(v); >> //if variant result of a() isn't assigned, fpc_finalize() at end of a(v) >> //destroys temporary result. But when start() ends fpc_finalize() tryes >> //to destroy it again >> >> b(v); >> //if b() is called then variant param is copied but not whole (deeply), vv.varray >> //points to the same place as v.array. At end of b(v) is pointer >> //vv.array destroyed by fpc_decref() and then v.array points to the >> //destroyed memory >> >> c(v); >> //At the start of func c() is v copied to the vv deeply but i think >> //that behaviour of "var" and "const" calling should be the same (by >> //reference) not vy value like c() >>end; >> >>I try to understand compiler code and repair it, but this is "very long >>distance race". But like I see the responses to my previous reports >>(absolutely no interest), this will be fastest solution :(. Really here >>isn't anybody who understand to compiler code and help me with repair? >>Or is anywhere another e-mail list or another comunication channel where >>i can talk about this problem? >> >>Petr >> > >The var arrays problems are known, see also >http://www.freepascal.org/bugs/showrec.php3?ID=3830 > >It requires some design changes though that's why it isn't fixed yet. The >problem is that the compiler handles variants as ref. counted types when passing >them as parameters etc. However, this is wrong behaviour as soon as a variant >contains an array. Thanks for explanation. Yesterday i looked at compiler code and fpc internals documentation. I must recognize that fixing this is beyond my strength. Is somebody working on it? I can help with debugging. Vararray problem stopped my work -- porting big information system to fpc. In Rtl/fcl i can repair or fill missing, but here i'am helpless. For that reason i hurry on fixing this.

If you implement a fpc_copy procedure which copies rtti'ed types properly in rtl/inc/rtti.inc, we're already a huge step forward :)

Reply by email