| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 | {    This file is part of the Free Pascal run time library.    Copyright (c) 2011 by Jonas Maebe    member of the Free Pascal development team.    This file implements the helper routines for TObject    See the file COPYING.FPC, included in this distribution,    for details about the copyright.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************}  procedure TObject.Free;    begin      if not DestructorCalled then        begin          DestructorCalled:=true;          Destroy;        end;    end;  destructor TObject.Destroy;    begin    end;  procedure TObject.Finalize;    begin      Free;    end;  procedure tvarrec.init(l: longint);    begin      VType:=vtInteger;      Value:=JLInteger.valueOf(l);    end;  procedure tvarrec.init(b: boolean);    begin      VType:=vtBoolean;      Value:=JLBoolean.valueOf(b);    end;  procedure tvarrec.init(c: ansichar);    begin      VType:=vtChar;      Value:=JLByte.valueOf(byte(c));    end;  procedure tvarrec.init(w: widechar);    begin      VType:=vtWideChar;      Value:=JLCharacter.valueOf(w);    end;  procedure tvarrec.init(d: extended);    var      arr: array[0..0] of extended;    begin      VType:=vtExtended;      { VExtended has to return a PExtended -> return address of array (it        doesn't matter that this is a local variable, all arrays are garbage        collected pointers underneath!) }      arr[0]:=d;      Value:=JLObject(@arr);    end;  procedure tvarrec.init(const s: shortstring);    begin      VType:=vtString;      Value:=JLObject(@s);    end;  procedure tvarrec.init(constref p: pointer);    begin      // pointer = object      VType:=vtPointer;      Value:=JLObject(p);    end;  procedure tvarrec.init(p: PAnsiChar);    begin      VType:=vtPChar;      Value:=JLObject(p);    end;  procedure tvarrec.init(p: JLObject);    begin      VType:=vtObject;      Value:=p;    end;  procedure tvarrec.init(c: TJClass);    begin      VType:=vtClass;      Value:=JLObject(c);    end;  procedure tvarrec.init(p: pwidechar);    begin      VType:=vtPWideChar;      Value:=JLObject(p);    end;  procedure tvarrec.init(const a: ansistring);    begin      VType:=vtAnsiString;      Value:=JLObject(a);    end;  procedure tvarrec.init(constref c: currency);    begin      VType:=vtCurrency;      { a constref parameter is internally passed as an array -> we can just        take its address and return it later as a pcurrency (which is also a        pointer internally) }      Value:=JLObject(@c);    end;  procedure tvarrec.init(const w: widestring);    begin      VType:=vtUnicodeString;      Value:=JLObject(w);    end;  procedure tvarrec.init(i: int64);    var      arr: array[0..0] of int64;    begin      VType:=vtInt64;      arr[0]:=i;      Value:=JLObject(@arr);    end;  procedure tvarrec.init(q: qword; unsigned: boolean = true);    var      arr: array[0..0] of qword;    begin      init(int64(q));      { parameter could be false in case it's called from Java code }      if unsigned then        VType:=vtQWord;    end;  function tvarrec.VInteger: longint;    begin      result:=JLInteger(Value).intValue    end;  function tvarrec.VBoolean: boolean;    begin      result:=JLBoolean(Value).booleanValue;    end;  function tvarrec.VChar: ansichar;    begin      result:=AnsiChar(JLByte(Value).byteValue);    end;  function tvarrec.VWideChar: widechar;    begin      result:=JLCharacter(Value).charValue;    end;  function tvarrec.VExtended: pextended;    begin      result:=PExtended(Value);    end;  function tvarrec.VDouble: double;    begin      result:=JLDouble(Value).doubleValue;    end;  function tvarrec.VString: PShortString;    begin      result:=PShortString(Value);    end;  function tvarrec.VPointer: pointer;    begin      result:=pointer(Value);    end;  function tvarrec.VPChar: PAnsiChar;    begin      result:=PAnsiChar(Value);    end;  function tvarrec.VObject: JLObject;    begin      result:=Value;    end;  function tvarrec.VClass: TJClass;    begin      result:=TJClass(Value);    end;  function tvarrec.VPWideChar: PWideChar;    begin      result:=PWideChar(Value);    end;  function tvarrec.VAnsiString: Pointer;    begin      result:=Pointer(Value);    end;  function tvarrec.VCurrency: PCurrency;    begin      result:=PCurrency(Value);    end;  // function tvarrec.VVariant: PVariant;  function tvarrec.VInterface: JLObject;    begin      result:=Value;    end;  function tvarrec.VWideString: Pointer;    begin      result:=Pointer(Value);    end;  function tvarrec.VInt64: PInt64;    begin      result:=PInt64(Value);    end;  function tvarrec.VUnicodeString: Pointer;     begin       result:=Pointer(Value);     end;  function tvarrec.VQWord: PQWord;    begin      result:=PQword(Value);    end;
 |