* harbour/include/hbcomp.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/include/hbexprc.c
* harbour/include/hbmacro.h
* harbour/include/hbpcode.h
* harbour/include/hbxvm.h
* harbour/source/common/hbdate.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbopt.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbstripl.c
* harbour/source/rtl/abs.c
* harbour/source/rtl/at.c
* harbour/source/rtl/chrasc.c
* harbour/source/rtl/datec.c
* harbour/source/rtl/dateshb.c
* harbour/source/rtl/diskspac.c
* harbour/source/rtl/disksphb.c
* harbour/source/rtl/gtfunc.c
* harbour/source/rtl/left.c
* harbour/source/rtl/len.c
* harbour/source/rtl/math.c
* harbour/source/rtl/minmax.c
* harbour/source/rtl/mod.c
* harbour/source/rtl/philes.c
* harbour/source/rtl/philesx.c
* harbour/source/rtl/replic.c
* harbour/source/rtl/round.c
* harbour/source/rtl/set.c
* harbour/source/rtl/space.c
* harbour/source/rtl/strcase.c
* harbour/source/rtl/strpeek.c
* harbour/source/rtl/transfrm.c
* harbour/source/rtl/trim.c
* harbour/source/rtl/type.c
* harbour/source/rtl/val.c
* harbour/source/rtl/word.c
* harbour/source/vm/hvm.c
* harbour/source/vm/macro.c
* added some PCODEs to cover all possible combination of ++, --, <op>=
operations in the same way and keep Clipper compatible RT errors.
* added some other PCODEs to optimize some commonly used expressions/
statements
* use HB_ERR_ARGS_BASEPARAMS instead of hb_paramError()
* some other cleanups and minor optimizations
* harbour/utils/hbtest/rt_math.prg
* update expected result for MOD() - it was not Clipper compatible and
it will be hard to make it compatible without introducing some Clipper's
side effects
* harbour/bin/hb-func.sh
* do not pass linking parameters to GCC/G++ when is used for
compilation only
* harbour/contrib/rdd_ads/Makefile
* set -DWIN32 for W32 compilation
* harbour/contrib/rdd_ads/makefile.bc
* formatting
* harbour/include/hbapi.h
* harbour/source/rtl/strcase.c
+ added hb_charUpper() and hb_charLower()
* harbour/include/hbapigt.h
* harbour/include/hbgtcore.h
* harbour/source/rtl/gtapi.c
* harbour/source/rtl/hbgtcore.c
+ added support for ALERT() on GT level - C functions: hb_gtAlert()/
hb_gt_Alert()
To replicate some details of Clipper and CT3 behavior ALERT() cannot
be implement only on upper level as .prg function
* harbour/source/rtl/gtfunc.c
+ added .prg function HB_GTALLERT()
* harbour/source/rtl/alert.prg
* redirected ALERT() to HB_GTALLERT()
* harbour/source/rtl/fstemp.c
* use the same case conversion as in low level hb_fs*() functions to
avoid possible problems with national characters
* harbour/source/rtl/dates.c
* harbour/source/rtl/set.c
* harbour/source/rtl/strmatch.c
* harbour/source/rtl/transfrm.c
* use hb_charUpper()
* casting
* harbour/source/rtl/isprint.c
* harbour/include/hbapi.h
! hb_printerIsReady() C level function made public again.
+ Added proper declaration for it.
* harbour/bin/bld.bat
! Mistakenly committed change undone.
* harbour/include/hbgtinfo.ch
* harbour/contrib/libct/ctwin.c
* harbour/source/rtl/gtalleg/gtalleg.c
* harbour/source/rtl/gtcrs/gtcrs.c
* harbour/source/rtl/gtdos/gtdos.c
* harbour/source/rtl/gtos2/gtos2.c
* harbour/source/rtl/gtpca/gtpca.c
* harbour/source/rtl/gtsln/gtsln.c
* harbour/source/rtl/gtstd/gtstd.c
* harbour/source/rtl/gtwin/gtwin.c
* harbour/source/rtl/gtwvt/gtwvt.c
* harbour/source/rtl/gtxwc/gtxwc.c
+ added support for GTI_FULLSCREEN, GTI_KBDSUPPORT, GTI_ISCTWIN
* harbour/source/rtl/hbgtcore.c
! fixed line and box drawing when the coordinates are out of screen size
* harbour/include/hbapi.h
* harbour/include/hbcomp.h
* harbour/include/hbpcode.h
* harbour/include/hbstack.h
* harbour/include/hbvm.h
* harbour/include/hbxvm.h
* harbour/source/compiler/complex.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.yyh
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbstripl.c
* harbour/source/vm/classes.c
* harbour/source/vm/estack.c
* harbour/source/vm/hvm.c
* harbour/source/vm/itemapi.c
! added protection against cyclic references in arrays
* eliminated action parameter from hb_vmRequestReenter() /
hb_vmRequestRestore()
* moved s_lRecoverBase and s_uiActionRequest to HB_STACK structure
for future MT HVM version
+ added internal item structure hb_struRecover - it's not real item
but this structure is used to keep information about BEGIN SEQUENCE
data - it reduce HB_STACK usage
+ added support for ALWAYS clause in BEGIN SEQUENCE
The syntax is:
BEGIN SEQUENCE
<code>
[ RECOVER [ USING oErr ] ]
<recoverCode>
[ ALWAYS ]
<alwaysCode>
END [ SEQUENCE ]
It's guaranteed that <alwaysCode> is _ALWAYS_ executed even if
inside <code> or <recoverCode> some new exceptions like RETURN,
BREAK or QUIT will appear.
Please note that when the following code is executed:
BEGIN SEQUENCE
<code>
ALWAYS
<alwaysCode>
END
(without RECOVER clause) then BREAK exception inside <code> is not
recovered, <alwaysCode> is executed and then BREAK exception is
passed to outer BEGIN SEQUENCE. This is the same semantic as
used in TRY / [ CATCH ] / FINALLY / END
Those of you who prefer to use TRY / CATCH / FINALLY / END instead
of BEGIN SEQUENCE / RECOVER / ALWAYS / END can simply add to your
source code:
#command TRY => BEGIN SEQUENCE
#command CATCH [ oErr ] => RECOVER [ USING <oErr> ]
and:
errorBlock( {|oErr| break( oErr ) } )
Though instead of 'break( oErr )' I suggest to use some small function
which will support some basic recovery/substitute operations like in
default errorsys() and LockErrHandler() to not break existing code
which may depends on the default behavior.
If you want I can add direct support for TRY / CATCH / FINALLY / END
but I'm not sure it's really necessary.
Please note also that in Harbour ALWAYS code is execute even for QUIT
excpetion.
When <alwaysCode> is executed current exception is stored and restored
when is finished. If new exception appears inside <alwaysCode> then
restored exception depends on the priority in the following order:
QUIT // highest priority
BREAK
RETURN
If both exceptions have the same priority and contain additional value
(error object in BREAK or return value in RETURN) then the recently set
one is restored. It's similar behavior to destructor code.
* harbour/source/common/hbstr.c
* moved one character length string table (hb_szAscii) from hvm.c
to use it also in compiler and preprocessor
* harbour/source/compiler/ppcomp.c
* harbour/source/pp/ppcore.c
* harbour/source/pp/pplib.c
* tuned error messages to be more Clipper compatible
% use static strings from hb_szAscii
* harbour/source/rtl/alert.prg
* use hb_gtInfo( GTI_FULLSCREEN ) to detect type of GT driver
! some minor fixes
TOFIX: we have to also use GTI_ISCTWIN or add window allocation
to standard GT drivers to be Clipper compatible when CTWIN
is used - In Clipper Tools ALERT() works in differ way then
the standard one. It creates separate window box to display
data, supports SETKEY(), etc. I'll think about adding some
extended support for ALERT() and similar operations (f.e.
separate debugger windows) to GT API so it will be also
possible to overload standard alert() command by GUI message
box in GTGUI and similar GT drivers.
* harbour/source/rtl/binnumx.c
! fixed U2BIN() - wrong casting
* harbour/contrib/rdd_ads/adsfunc.c
* harbour/source/rdd/workarea.c
* formatting
* harbour/include/hbapi.h
* harbour/source/vm/extend.c
+ added missing hb_storptrGC()
* harbour/include/hbapicdp.h
* harbour/source/rtl/cdpapi.c
+ added parameter to unicode translation function to protect control
code translation
* formatting
* harbour/source/rtl/gtsln/kbsln.c
* harbour/source/rtl/gtxwc/gtxwc.c
* use new unicode translation function format. It also fixes problem
with space translation in GTLSN used in UTF8 mode
* harbour/include/hbapiitm.h
* harbour/source/vm/itemapi.c
+ added hb_itemCopyToRef(), hb_itemMoveToRef(), hb_itemMoveRef(),
hb_itemUnRefWrite()
* harbour/include/hbexprb.c
! use HB_P_DUPLUNREF instead of HB_P_DUPLICATE when assign is used in
push context - Clipper compatible behavior, see:
x:=10
f(y:=iif(.t.,@x,))
? x, y
func f(x)
x+=100
return nil
* harbour/include/hbver.h
* harbour/source/common/hbver.c
* changed status to "devel"
* harbour/source/common/expropt2.c
* disabled setting NIL when iif(.t.,,sth()) is optimized to avoid
warning when iif() is used as statement - to fix number of parameters
passed to function in code like f(iif(.t.,,sth())) we will need a
little bit deeper modification
* harbour/source/compiler/complex.c
* added hack for potential problems caused by WITH OBJECT syntax, f.e.
in code like:
proc p(obj,x)
case:=myCaseClass():new()
retu:=myCaseClass():new()
WITH OBJECT obj
do case
case x==nil
case:value()
case:action()
retu:sth()
end
END
case:action()
retu:sth()
return
case:action(), case:value(), retu:sth() can means two different things
and compiler cannot guess which one should use. It cannot be fixed
because it's caused by bad WITH OBJECT syntax. In xHarbour constractions
like case:value() or retu:sth() are always used as in WITH OBJECT
context what is not Clipper compatible. I do not want to introduce
such limitations. We have two choices: change WITH OBJECT syntax or
add some hack to "hide" the problem a little bit. Now I intorduce
ugly hack which check number of spaces between ':' so
case :action()
is compiled as case condition using WITH OBJECT message and
case:action() as sending message to object in case variable
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
+ added support for passing base value to FOR EACH by reference.
* harbour/source/vm/arrays.c
* use hb_itemMoveRef() in AINS()/ADEL() to avoid creation of cyclic
reference chains
* harbour/source/vm/debug.c
* harbour/source/vm/memvars.c
* use hb_itemCopyToRef() to avoid creation of cyclic reference chains
* harbour/source/vm/classes.c
* harbour/source/vm/hvm.c
* use hb_itemMoveToRef() to avoid creation of cyclic reference chains
+ added support for for writable string enumerators, f.e.:
proc main()
local s, c
s:="abcdefghijklmnopqrst"
for each c in @s
if c$"aeio"
c:="*"
endif
next
? s // "*bcd*fgh*jklmn*pqrst"
return
* harbour/include/hbexprb.c
* make function call optimizations only when hb_compFunCallCheck()
do not report errors
* harbour/source/common/reserved.c
+ added VALTYPE to list of reserved words and shortcuts (Clipper
compatible)
* harbour/source/compiler/hbfunchk.c
* checking for number of parameters in FILE() function call is Harbour
extension - do not enable it when HB_C52_STRICT macro is set
* harbour/source/rtl/filehb.c
* formatting
* harbour/include/hbcompdf.h
+ added comment
* harbour/include/hbexpra.c
* change expression type for <exp> = <exp> from HB_EO_EQUAL
to HB_EO_ASSIGN in hb_compExprGenStatement() function so
later we can safely make all optimization in hb_compExprUseEqual()
during reduce process - optimization only when PCODE is generated
is too late and causes that expressions like:
iif( 1 = 1, <exp>, <exp> )
are not reduces (Clipper reduce them)
* do not execute hb_compFunCallCheck() in hb_compExprNewFunCall()
to avoid repeating the same error message in hb_compExprUseFunCall()
* harbour/include/hbexprb.c
* enabled reduction for hb_compExprUseEqual() and generate errors
when it's used as statement
* harbour/source/common/expropt2.c
* added some missing reductions for expressions like: NIL == NIL
* harbour/source/common/reserved.c
% very basic optimization: use binary search instead of linear
scanning for reserved words and shortcuts - it gives noticeable
speed improvement in macro compiler
* harbour/source/compiler/complex.c
* changed the order of special keywords to keep alphabetic sorting
* harbour/source/compiler/harbour.c
% some minor optimizations in aliased expressions
! added protection in hb_compIsJump() to avoid possible problems
when this function is executed after replacing some code with
jumps by series of NOOPs in optimizations process
* harbour/source/compiler/hbfix.c
* better optimization of PCODE generated for logical expressions
* harbour/source/compiler/hbfunchk.c
% use binary search instead of linear scan
* harbour/source/rtl/minmax.c
! fixed GPF when MIN() or MAX() function is called with less then
two parameters
* harbour/source/vm/itemapi.c
* minor optimization and formatting
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hberrors.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/include/hbpcode.h
* harbour/include/hbxvm.h
* harbour/source/common/expropt1.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hbgenerr.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbstripl.c
* harbour/source/vm/hvm.c
+ added support for passing optional parameters to called function, f.e.:
proc p( a, b, ... )
qout( a, b, "X", ... )
* forbid creating function pointer when function is used with parameters,
f.e.: x:=@f1(1,2,3)
* harbour/source/compiler/complex.c
* cleaned all restrictions on reserved words I've found - if I missed
sth then please inform me. The previous behavior and some error
messages are used with -kc compiler switch
* harbour/source/rtl/symbol.prg
* harbour/source/rtl/tobject.prg
! eliminated limitations in number of constructor parameters
(new syntax with passing optional parameters used)
* harbour/config/w32/bcc32.cf
* cleanup
+ harbour/config/w32/xcc.cf
+ added XCC support
* harbour/contrib/btree/hb_btree.c
* use hb_vmAtInit()/hb_vmAtExit() instead of INIT/EXIT functions defined
from C code
* harbour/contrib/libct/tab.c
* casting
* harbour/contrib/odbc/odbc.c
! removed #include <malloc.h> - it should not be used with new C
compilers
I think that we should replace this library with hbodbc from xHarbour.
* harbour/contrib/ole/ole2.c
* updated for XCC
* harbour/include/hbdefs.h
* include stdint.h if available
* harbour/source/compiler/complex.c
! fixed yet another stupid mistake in WITHOBJECT token
* harbour/include/hbpcode.h
* harbour/include/hbxvm.h
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbstripl.c
* harbour/source/vm/hvm.c
+ added HB_P_SWAP <n> PCODE
* harbour/include/hbcompdf.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/include/hbexprc.c
* harbour/include/hbexprop.h
! fixed GPF during compilation of @:var, @:&var, @o:&var
+ added support for @o:&var and @:var, @:&var inside WITH OBJECT
statement
* changed PCODE generated of ++,--,+=,-=,...
Now left side expression is evaluated _ONLY_ once and when object
messages are used it's guarantied that exactly the same object
variable will be used. It also fixes some problems which exists
in Clipper. This optimization is enabled by -kh flag (by default)
and can be disabled with -kc.
% optimize ald macros in ++,--,+=,-=,... operations
* add automatically "_" prefix when macro message is used in assignment
context, f.e.:
s:="osCode"
o:=errorNew()
? o:&s
o:&s := 100
? ++o:&s
? o:&s *= 5
* harbour/include/hblang.ch
- removed #xtranslate - this file is included by C code and some C
compiler do not like unknown directives
* harbour/utils/hbtest/rt_math.prg
+ added test code for <op>assign and (pre/post)(inc/dec)rementation,
macro messages and WITH OBJECT
* harbour/source/compiler/harbour.c
* harbour/source/rdd/dbf1.c
* harbour/source/rtl/errorapi.c
* harbour/source/rtl/hbgtcore.c
* harbour/source/rtl/gtdos/gtdos.c
* harbour/source/rtl/gtos2/gtos2.c
* harbour/source/rtl/gtpca/gtpca.c
* harbour/source/rtl/gtsln/gtsln.c
* harbour/source/rtl/gtstd/gtstd.c
* harbour/source/rtl/gtwin/gtwin.c
* casting and warning cleanup
* harbour/utils/Makefile
+ added $(HB_UTILS)
- harbour/utils/hbpp/hbpp.h
+ harbour/utils/hbpp/hbppdef.h
* harbour/utils/hbpp/hbpp.c
* harbour/utils/hbpp/hbppcomp.c
* harbour/utils/hbpp/hbppcore.c
* harbour/utils/hbpp/hbpplib.c
* harbour/utils/hbpp/hbpptbl.c
* harbour/utils/hbpp/pragma.c
* renamed hbpp.h to hbppdef.h to avoid possible conflict with hbpp.h
in include directory
* casting and warning cleanup
* harbour/include/hbapi.h
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbdefs.h
* harbour/include/hberrors.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/include/hbexprc.c
* harbour/include/hbpcode.h
* harbour/include/hbxvm.h
* harbour/source/common/expropt1.c
* harbour/source/common/expropt2.c
* harbour/source/common/hbstr.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/gencobj.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hbgenerr.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbstripl.c
* harbour/source/macro/macro.y
* harbour/source/macro/macro.yyc
* harbour/source/rtl/console.c
* harbour/source/rtl/isprint.c
* harbour/source/rtl/left.c
* harbour/source/rtl/right.c
* harbour/source/rtl/strtran.c
* harbour/source/vm/codebloc.c
* harbour/source/vm/hvm.c
* harbour/source/vm/macro.c
* general PCODE cleanup and address most of TODO/TOFIX notes in
source code:
! fixed GPF traps when too long string or codeblock is generatd
+ added support for 16MB codeblocks and strings
! removed macrocompiler limitation for jumps range
! fixed GPF when more then 255 local variables is used and added
support for 2^15 locals
! removed all strtok() functions
% added optimization for all +=, -=, *=, %=, ^=, **= operations
when left side of expression is variable or array item
% added optimization for all +=, -=, *=, %=, ^=, **= operations
when left side of expression is object method and updated ++, --
for new code. It's still disabled until we will not add support
for late evaluated reference items to HVM
! fixed a[++i]++ and similar operations (a[++i]*=2, ...). Now ++i is
executed only once. It's not Clipper compatible but it was in
TODO note in source code. It can be disabled by -kc option
* finished support to xHarbour like #pragma TEXTHIDDEN(1)
! fixed local add int optimization when PARAMETERS used after
optimization changed local variable number over 255
! fixed GPF trap when in HB_P_<op>EQ PCODEs when executed for
direct values
* others
! fixed problems reported by Chen
* optimized strtran(), left(), right() to not create new string copy
when the same value is returned
* harbour/source/rtl/console.c
* pacify false CG error messages - Chen Kedem modifications (sizeof(int)
in #if replaced by hardcoded 4 for compilers which does not allow to
use sizeof() in #if directives)
* harbour/TODO
- removed console.c cleanup note from TOFIX
* harbour/include/hbcomp.h
* harbour/include/hbexprb.c
* harbour/include/hbexprc.c
* harbour/source/common/expropt1.c
* minor code cleanup
* harbour/source/rtl/memoline.c
! added fix sent to me by Randy Portnoff - it's a little bit differ
then the one Randy sent to list but this one seems to be correct.
I never used this function in Clipper and made only very basic
tests. I believe that Randy make better tests and this fix will
not break some other constructions.
* harbour/config/bsd/gcc.cf
* harbour/config/darwin/gcc.cf
* harbour/config/dos/bcc16.cf
* harbour/config/dos/djgpp.cf
* harbour/config/dos/owatcom.cf
* harbour/config/dos/rsx32.cf
* harbour/config/hpux/gcc.cf
* harbour/config/linux/gcc.cf
* harbour/config/linux/owatcom.cf
* harbour/config/os2/gcc.cf
* harbour/config/os2/icc.cf
* harbour/config/sunos/gcc.cf
* harbour/config/w32/bcc32.cf
* harbour/config/w32/gcc.cf
* harbour/config/w32/mingw32.cf
* harbour/config/w32/msvc.cf
* harbour/config/w32/rsxnt.cf
* harbour/config/w32/watcom.cf
* added respecting HB_GT_DEFAULT, though it's quite possible that I'll
remove it at all soon.
* some other cleanup
* harbour/source/compiler/complex.c
! fixed wrongly replicated from FLEX lexer condition used to DECLARE.
Now they should be the same as in FLEX lexer but IMHO they are not
Clipper compatible.
* harbour/source/compiler/gencli.c
* harbour/source/compiler/gencobj.c
* harbour/source/compiler/genhrb.c
* harbour/source/compiler/genjava.c
* harbour/source/compiler/genobj32.c
* harbour/source/compiler/harbour.c
* harbour/source/rtl/hbffind.c
* harbour/source/pp/ppcore.c
* harbour/source/rdd/workarea.c
! fixed sizes of some C stack buffers and strncpy() parameters
* use hb_strn*() instead of strn*() in few places to be sure that 0
is always stored in destination buffer
* harbour/source/rtl/gtcgi/gtcgi.c
* change reported GT name from "Standard stream console" to
"Raw stream console" to make it differ then GTSTD one.
* harbour/bin/hb-func.sh
* harbour/bin/hb-mkslib.sh
* harbour/bin/postinst.sh
* harbour/config/bsd/gcc.cf
* harbour/config/darwin/gcc.cf
* harbour/config/dos/owatcom.cf
* harbour/config/hpux/gcc.cf
* harbour/config/linux/gcc.cf
* harbour/config/linux/owatcom.cf
* harbour/config/os2/gcc.cf
* harbour/config/sunos/gcc.cf
* harbour/config/w32/watcom.cf
* harbour/contrib/rdd_ads/ads1.c
* harbour/contrib/rdd_ads/adsfunc.c
* harbour/include/hbapifs.h
* harbour/include/hbexprc.c
* harbour/include/hbsetup.h
* harbour/source/common/expropt2.c
* harbour/source/common/hbdate.c
* harbour/source/common/hbgete.c
* harbour/source/common/hbstr.c
* harbour/source/common/hbver.c
* harbour/source/common/hbverdsp.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/fixflex.c
* harbour/source/compiler/gencobj.c
* harbour/source/compiler/genobj32.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.l
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hbfunchk.c
* harbour/source/pp/ppcore.c
* harbour/source/pp/ppgen.c
* harbour/source/pp/pplib.c
* harbour/source/rdd/dbcmd.c
* harbour/source/rdd/workarea.c
* harbour/source/rdd/dbfcdx/dbfcdx1.c
* harbour/source/rdd/dbffpt/dbffpt1.c
* harbour/source/rdd/hsx/hsx.c
* harbour/source/rtl/accept.c
* harbour/source/rtl/ampm.c
* harbour/source/rtl/console.c
* harbour/source/rtl/defpath.c
* harbour/source/rtl/errorint.c
* harbour/source/rtl/filesys.c
* harbour/source/rtl/fkmax.c
* harbour/source/rtl/fstemp.c
* harbour/source/rtl/hbffind.c
* harbour/source/rtl/hbgtcore.c
* harbour/source/rtl/langapi.c
* harbour/source/rtl/seconds.c
* harbour/source/rtl/set.c
* harbour/source/rtl/tobject.prg
* harbour/source/rtl/transfrm.c
* harbour/source/rtl/gtcrs/chrmap.c
* harbour/source/rtl/gtcrs/gtcrs.c
* harbour/source/rtl/gtcrs/gtcrs.h
* harbour/source/rtl/gtpca/gtpca.c
* harbour/source/rtl/gtwvt/gtwvt.c
* harbour/source/rtl/gtxwc/gtxwc.c
* harbour/source/vm/classes.c
* harbour/source/vm/cmdarg.c
* harbour/source/vm/debug.c
* harbour/source/vm/estack.c
* harbour/source/vm/fm.c
* harbour/source/vm/hvm.c
* harbour/source/vm/macro.c
* harbour/source/vm/proc.c
* harbour/source/vm/runner.c
* harbour/utils/hbmake/hbmlang.c
* harbour/utils/hbpp/hbpp.c
* harbour/utils/hbpp/hbppcomp.c
* harbour/utils/hbpp/hbppcore.c
* harbour/utils/hbpp/hbpplib.c
* harbour/utils/hbpp/pragma.c
* harbour/utils/hbver/hbverfix.c
* general code cleanup: all strcpy() and strcat() replaced hb strn*()
and hb_strn*(), sprintf() by snprintf(), etc.
It fixed some possible buffer overflow but it's also possible that
it will exploit some some hidden so far problems but I strongly
prefer to know about them ASAP to fix them before final 1.0 release.
! fixed bug I introduce in codeblock falgs which disabled early macro
evaluation in codeblocks.
! added missing protection against execution by bison destructor for
used CBSTART token on syntax error.
% use PP stringify logik added for FLEX support to remove all redundant
spaces in stringified for early macro evaluation codeblocks and add
spaces between operators if after preprocessing they were removed.
Now we are supporting also some code which cannot be compiled by
Clipper.
% cleaned and improved the speed of printer redirecting in console code.
Chen please check if CG still reports problems and if not ubdate
TODO/TOFIX or inform me about them.
* some cleanups in building process for different *nixes: MacOSX, SunOS,
*BSD, etc.
* removed not longer necessary (I hope) compiler flag to force default
'char' type as signed. Now Harbour should work with signed and unsigned
char without any problems. To other developers: please remember that
when you are using 'char' as 8 bytes signed integer then it's a bug.
Always explicitly use: 'signed char' in such case. On some platforms
it's not possible to set default type for 'char' so if you hardcode
that 'char' is signed or unsigned somewhere then code will not be
portable. Chen if you will find a while to also rebuild Harbour with
BCC and -K switch to make some tests with CG then I'll be thankful.
* harbour/source/macro/macro.y
* harbour/source/macro/macro.yyc
* harbour/source/macro/macro.yyh
* harbour/source/macro/macrolex.c
* added support for extended string (e"...") to macro compiler and
strings with embedded ASCII NUL character (chr(0))
* harbour/source/rtl/valtostr.c
* added HB_STRTOEXP() function which converts string item to valid
expression which can be compiled by macro compiler. String may
contain any characters.
* harbour/source/rtl/persist.prg
* use HB_STRTOEXP() for sting conversion and 0d....... for date
constants
* harbour/source/rtl/readvar.prg
* harbour/source/rtl/xsavescr.c
* minor cleanup
* harbour/bin/pack_src.sh
+ added packing *.yy[ch] files
* harbour/makefile.bc
* harbour/makefile.vc
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/include/hbexprc.c
* harbour/include/hbexprop.h
* harbour/include/hbpp.h
* harbour/source/common/expropt1.c
* harbour/source/common/expropt2.c
* harbour/source/compiler/Makefile
* harbour/source/compiler/complex.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.l
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.yyh
* harbour/source/compiler/hbgenerr.c
* harbour/source/macro/macro.y
* harbour/source/macro/macro.yyc
* harbour/source/pp/ppcore.c
+ added hb_comp prefix to grammar/lexer compiler public functions to
reduce possible conflict with 3-rd party code which may use default
yy prefix.
! do not use bison destructors for expressions. Internal bison logic
cannot properly detect if expression was used or not in some of our
grammar rules and it's possible that some expressions will not be freed
and some other freed twice.
! added protection against multiple destructors execution for CBSTART
and LITERAL tokens
* added small garbage collector for deallocating expressions which were
not freed (such situation can happen in syntax errors)
% some optimizations in used structures to reduce their sizes
+ added protection against execution PCODE optimizations for functions
which were not cleanly compiled.
* harbour/source/rtl/idle.c
* use const in nanosec() timeout declaration
* harbour/bin/hb-func.sh
+ added linker parametrs to hbcc
* harbour/include/hbapi.h
+ added hb_retclenAdoptRaw()
* harbour/include/hbapifs.h
* harbour/source/common/hbfsapi.c
* changed first parameters of hb_fsAddSearchPath() to const char *
* harbour/include/hbclass.ch
* update for new PP. I think that now we can try to create final
version of our OOP rules.
* harbour/include/hbdefs.h
+ added UCHAR and SCHAR typedefs
* harbour/include/hbrddcdx.h
* indenting
* harbour/source/rdd/workarea.c
! fixed minor typo
* harbour/source/common/hbdate.c
* harbour/source/rtl/dates.c
* moved hb_dateToday() and hb_dateTimeStr() from RTL to COMMON library
- harbour/include/hbpp.h
- harbour/source/pp/ppcomp.c
- harbour/source/pp/ppcore.c
- harbour/source/pp/pplib.c
- harbour/source/pp/pptable.c
- harbour/source/pp/pragma.c
* harbour/utils/hbpp/Makefile
* harbour/utils/hbpp/hbpp.c
+ harbour/utils/hbpp/hbpp.h
+ harbour/utils/hbpp/ppcomp.c
+ harbour/utils/hbpp/ppcore.c
+ harbour/utils/hbpp/pplib.c
+ harbour/utils/hbpp/pptable.c
+ harbour/utils/hbpp/pragma.c
* moved all PP code to harbour/utils/hbpp
It's interesting and working preprocessor and the code can be
usable for some other things so I do not want to remove it.
Probablly we should move it to contrib/hbpptext
* harbour/include/hbcomp.h
* harbour/include/hberrors.h
* harbour/include/hbsetup.ch
+ harbour/include/hbpp.h
+ harbour/include/hbstdgen.ch
* harbour/source/common/hbstr.c
* harbour/source/compiler/Makefile
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/harbour.l
* harbour/source/compiler/hbgenerr.c
+ harbour/source/compiler/ppcomp.c
* harbour/source/pp/Makefile
+ harbour/source/pp/ppcore.c
+ harbour/source/pp/pplib.c
+ harbour/source/pp/ppgen.c
+ New PP code written from scratch. It works in similar way to
Clipper PP even the error codes are replicated. The code is MT
safe does not have any limitation on size of preprocessed code,
line, etc. It's also Clipper compatible lexer. It means that
we do not longer need FLEX or SIMPLEX which can be replaced
by new PP after some small modifications. Anyhow I haven't
decided to make it myself. I would like to agree with with the
rest of developers. I will be very happy if such modifications
will be done by someone else, Ryszard?
Meanwhile I current PP join on output the line tokens and give
the string line to FLEX/SIMPLEX. It does not have any sense and
all FLEX/SIMPLEX limitations are still existing. Ryszard, even
if we keep it then I hope you can remove at least FLEX line buffer
and use the one returned from PP.
Because string tokens in parsed line are converted to text which is
later once again decoded to tokens by FLEX I had to introduce new
string format which supports embedded string delimiters. I chose
modified version of xHarbour extension with escaped strings e"<sting>"
so now FLEX understand such strings and decode them like C escaped
strings. It means that you can use them also in the .prg code f.e.:
outstd( e"Hello\n\rWorld" )
The new PP is also noticeable faster. You should see the difference
compiling long files. The build in PP rules are generated automatically
by ppgen program created from source/pp/ppgen.c
I had to add to GNU source/pp/Makefile these two lines:
pptable.c : ppgen$(EXE_EXT)
./ppgen$(EXE_EXT) $(TOP)$(ROOT)include/hbstdgen.ch -opptable.c -q
Sth like that will have to be done also in non GNU make system.
Now Harbour can be compiled only using GNU make.
Marek can you update non GNU make files? I would like to leave this
modification to you or other developers who can test it.
It was quite big modification and I do not believe that I haven't
make any mistakes but I hope that in few weeks I'll fix any reported
bugs and it will resolve any PP problems.
TODO:
* error messages
create one common list of errors and warnings and keep it
in common library. PP and compiler can still generate different
errors with the same number. It can be confusing for the users
and hard to document and add i18n translations.
If possible we should also try to keep Clipper error numbers.
In new PP code I added Clipper error numbers but I cannot use
them until compiler code is not updated.
We should aslo remove the ctype passed to error functions and
hack with first character in warning messages and use only
error number. The codes from 1000 to 1999 should be warnings
where range 1000:1099 is activated by -w, 1100:1199 by -w1,
1200:1299 by -w2, etc. 2000:2999 are errors and 3000:3999
fatal errors. All compiler functions which generate an error
should expect that error function will not stop the compiler
but return and cleanly finished their job. It's necessary for
MT support in compiler and making compiler part of some other
programs which may still work and compile different source code.
* FLEX/SIMPLEX
remove them at all and add some final pass to PP to create
more precise tokens for grammar parser or at least add better
integration to remove some redundant code and existing limits.
* hb_inLine() support - it's broken in new PP but as I can see
it was never working correctly. I can add a hack to PP to support
hb_inLine() but I'm not sure it's worth to do. Maybe in few days.
+ harbour/include/std.ch
+ added new std.ch. It was created without using Clipper's std.ch.
It's quite possible that some rules are wrong and should be fixed
so please help. Anyhow I created a set of programs based on new PP
code generating all possible combinations of different commands I
collected from different source code, documentation and match patterns
of rules I was adding to new std.ch and then I was comparing .ppo
files generated by Clipper and Harbour so I do not expect any bigger
problems then some minor typos. I had to introduce some modifications
in spacing as workaround for FLEX/SIMPLEX which cannot properly decode
text preprocessed by Clipper after stringify.
* harbour/utils/hbpptest/pretest.prg
* updated for new PP
It reports 16 wrong translations but some of them are valid
and some others are caused by escaped string e"..." (one of hack
for FLEX/SIMPLEX support)
I also had to remove all spaces in comparison the results
because they were not Clipper ocmpatible at all. Ryszard please
look at it.
* harbour/include/hbclass.ch
+ added validation for class data names. As additional preprocessor
rule to not use <!marker!>
* harbour/include/hboo.ch
* harbour/source/rtl/tclass.prg
* harbour/source/vm/classes.c
+ added delegate messages
* harbour/include/hbstack.h
* harbour/source/vm/arrays.c
* harbour/source/vm/estack.c
* harbour/source/vm/hvm.c
* harbour/source/vm/proc.c
+ added startup symbol to hb_stack. It gives very good stop
condition for all procedures which trace stack calls and
resolves the problem with hb_stack.pBase which was never
pointing to valid function/procedure symbol when no symbol
was put on HVM stack. Now after hb_stackInit() the first
item is allocated for "hb_stackInit()" symbol so hb_stack.pBase
is always a pointer to valid function/procedure symbol.
* changed the guard condition for buggy code in hb_stackPop()
and similar code from:
hb_stack.pPos < hb_stack.pItems
to:
hb_stack.pPos <= hb_stack.pBase
The old condition was generating usable error message only in the
startup function. In deeply called functions it was only waste of
CPU time on one of the most often call functions. Before it was
activated internal stack structures were corrupted.
If we were leaving for many years without really working stack
underflow protection then maybe we should think about disabling
it at when HB_STACK_MACROS are used and keep it only in real
stack functions for HVM developers. Single protection in
hb_stackOldFrame() I've just added is enough for basic C code
validation.
I created the second version of stack macros without it in
hbstack.h but I would like to hear other developers opinion.
* harbour/include/hbclass.ch
* most of the rules rewritten
! fixed some wrong rules and general cleanup
+ added additional code validation
! fixed compilation of more then one class in single file.
Now it's even possible to declare all classes at beginning of
single file and then implementing their methods in any order
! fixed using static classes and classes
! fixed compilation without <ClassName>_ prefix in method names
+ added support for HB_CLS_NO_DECORATION macro which disable
adding <ClassName>_ prefix to method names - this macro is
set by default when HB_SHORTNAMES is set.
+ added support for declared parameters validation - it can be
disabled with HB_CLS_NO_PARAMS_ERR and I had to disable it
by default due to problems with our preprocessor.
Ryszard seems that our PP has serious problems with decoding
directives when there is no space between symbol and some other
non symbol character. I had to add some workarounds and even
introduce buggy rules to make it working. Please look at it.
You can remove #define HB_CLS_NO_PARAMS_ERR from hbclass.ch
and try to rebuild Harbour core code to see the problem.
* harbour/include/hboo.ch
* harbour/source/vm/classes.c
+ added support for new primitive message: HB_OO_MSG_PERFORM
* harbour/source/rtl/tclass.prg
- removed <lPersistent> parameter from HBClass messages and
internals data. Persistent is supported as scope bit and
separate variable was redundant.
- removed stripping of () from message names. Here is not a place
to fix wrong preprocessor rules.
* harbour/utils/hbtest/rt_class.prg
* use: METHOD PROCEDURE ... CALSS ...
instead of: PROCEDURE ... CALSS ...
The first version is preferable syntax.
* harbour/source/debug/dbgtmenu.prg
* harbour/source/rtl/checkbox.prg
! fixed some parameters in method declaration - global cleanup
will have to wait for preprocessor fixes
Hi all,
Please make test with current hbclass.ch code.
I hope that I haven't broken too much things ;-) but I rewrite
from scratch most rules and it's possible that I missed sth or
made some stupid typos. Current version is much shorter and should
be easier to updated. For sure I've intentionally changed one thing.
CLASSDATA was ignoring SHARED attribute and always created shared
class variables. Seems that it was long existing typo but the fix
may interact with already existing code which needs SHARED class
variables but does not use SHARED clause in CLASSDATA declaration.
In such case please update it and add missing SHARED.
Also in the end of CLASS declaration we have:
[ ; #translate Super( <SuperClassN> ): => ::<SuperClassN>: ] ;
[ ; #translate Super( <SuperClass1> ): => ::<SuperClass1>: ] ;
[ ; #translate Super(): => ::<SuperClass1>: ] ;
[ ; #translate Super: => ::<SuperClass1>: ] ;
[ ; #translate ::Super : => ::<SuperClass1>: ]
These rules introduce very serious bug - they are breaking supercasting
in code which makes sth like:
::super:super:super:msg
or in any other code which sends SUPER message to some other class
objects. I will have to remove them. At least the last three ones.
There were some other things I wanted to write about but it's too late
and I'm to tired - sorry. If you will have any question please ask. if
you will notice some problems with current rules please inform me.
* harbour/include/common.ch
- removed ISSYMBOL()
* harbour/source/rtl/tclass.prg
* use valtype() instead of IS*()
* some minor modifications
* harbour/source/vm/hvm.c
* minor modification
* harbour/include/common.ch
+ added ISSYMBOL()
* harbour/include/hbextern.ch
- removed __CLS_PARAM()
* harbour/include/hbclass.ch
* harbour/source/rtl/tclass.prg
* harbour/source/vm/classes.c
* replaced __CLS_PAR00() and __CLS_PARAM() functions by preprocessor
rules. These functions are not longer necessary though I left them
in classes.c for backward binary compatibility. Probably they will
be removed in the future.
! use function pointers (@<funcname>()) instead of function names
with REQUEST for super classes ID. It fixes using STATIC class
functions.
* harbour/make_rpm.sh
* check for rpmbuild also when BUGGY_RPM is set
* harbour/make_tgz.sh
* removed rebuild hbpptest with shared libraries
* harbour/include/hbapicls.h
+ added definitions for hb_clsCreate(), hb_clsAdd(), hb_clsAssociate()
* harbour/include/hbapierr.h
* harbour/source/rtl/errorapi.c
+ added hb_errFuncName - pseudo function name which can be used as
operation description in new error object. It should help to simplify
some code and fix function names when RT error is generated from C
function which can be executed from different .prg functions.
* harbour/include/hbclass.ch
+ added some missing Classy(y) compatible object variable type
descriptions: Int, Integer, Block
* harbour/source/rdd/dbfcdx/dbfcdx1.c
! disabled early retrieving from the cache key position and key count
* harbour/include/hbvm.h
* harbour/source/vm/hvm.c
+ added: void hb_vmPushEvalSym( void ) for the code which do not
want to access any [P]HB_SYMB structures
* changed symbol name in hb_symEval from __EVAL to EVAL and modified
hb_symEval registration method to not register hb_vmDoBlock as global
function. Having PHB_DYNS address for "EVAL" in hb_symEval.pDynSym
allows to eliminate some strcmp() when we are looking for EVAL public
symbol.
! fixed symbol table updating in PCODE functions for future multi module
.hrb files
* harbour/source/vm/proc.c
* use hb_symEval.pDynSym instead of strcmp()
* harbour/source/vm/arrays.c
* harbour/source/vm/debug.c
* minor code cleanup
* harbour/source/rtl/tclass.prg
* harbour/source/vm/classes.c
% separate message hash table from methods table - it will cause farther
reduction of allocated memory - many thanks to all people who send
me statistics about number of used classes and symbols from their code.
% use hb_symEval.pDynSym
+ added support for object variable type scope checking like in Class(y).
! fixed typo in pushing object class variables by reference
% s_pClasses is now indexed directly by class handle
% some other optimiztions
! make hidden and non virtual invisible in child classes if it overloaded
some other non hidden method. In such case the overloaded method is used
and can be accessed.
! make friend functions real method class oriented not (super)object for
hidden messages
* harbour/source/vm/itemapi.c
* minor modification in function order to group together the ones
which can operate on reference counters
+ added additional stop condition in hb_itemUnRef() - we will have
to make some modifications for the code which execute hb_itemUnRef()
to resolve some possible conflicts with operators overloading and
compiler optimizations
* harbour/source/vm/classes.c
* do not inherit friends - seems that our classes code was too
friendly ;-)
It also effectively resolves logical problem with accessing
overloaded non virtual methods from friends.
+ added __clsLock( <hClass> ) - it locks any farther class
modifications and can be used if programmer wants to be sure
that no one will try to hack his class definition. It's very
important when programmers work in a team on bigger project.
Please do not add to CVS any __clsUnLock() functions - if someone
needs it then he can create his own custom HVM build.
* code cleanup
* harbour/source/vm/eval.c
+ added hb_execFromArray() - idea and syntax borrowed from xHarbour's
HB_ExecFromArray() by Giancarlo Niccolai though it's independent
implementation. Now when we have support for functions with variable
number of parameters then we need sth like this function to fully
benefit from new feature. The following syntax is supported:
hb_execFromArray( <cFuncName> [, <aParams> ] )
hb_execFromArray( @<funcName>() [, <aParams> ] )
hb_execFromArray( <bCodeBlock> [, <aParams> ] )
hb_execFromArray( <oObject> , <cMethodName> [, <aParams> ] )
hb_execFromArray( <oObject> , @<msgName>() [, <aParams> ] )
or:
hb_execFromArray( <aExecArray> )
where <aExecArray> is in one of the following format:
{ <cFuncName> [, <params,...>] }
{ @<funcName>() [, <params,...>] }
{ <bCodeBlock> [, <params,...>] }
{ <oObject> , <cMethodName> [, <params,...>] }
{ <oObject> , @<msgName>() [, <params,...>] }
* harbour/source/rtl/symbol.prg
* removed C code inside #pragma BEGINDUMP/ENDDUMP
now it's only .prg code which uses variable parameters function
and hb_execFromArray()
* harbour/include/hbclass.ch
* harbour/include/hbvm.h
* harbour/source/rtl/tclass.prg
* harbour/source/vm/classes.c
* harbour/source/vm/hvm.c
! fixed bug in real codeblock scoping which was exploited by
dictionary resizing
* changed ACCESS messages to ASSIGN ones when object item
reference is created for proper READONLY scope checking.
The reference to object variable can be created only when
caller has sufficient ASSIGN privileges.
+ added FRIEND CLASS and FRIEND FUNCTION support.
It's enough to add class definition:
FRIEND CLASS <classFunc1> [, <classFuncN> ]
and/or:
FRIEND FUNCTION <FuncName1> [, <FuncNameN> ]
and all methods of given class or given function will be able
to access private variables.
Warning!!! Friends cannot access overloaded non virtual methods.
This feature is available _ONLY_ for real class members.
+ added MODULE FRIENDLY to class definition. It causes that all other
functions and classes defined in the same .prg module will have
friend privileges. In such way works xHarbour and there is now way
to disable this "feature" what is IMHO bug. In Harbour programmer
has to explicitly enable it (until he will not change / add new
preprocessor rule and set it as default ;-)). Syntax:
CREATE CLASS .... MODULE FRIENDLY
...
END CLASS
* harbour/source/vm/proc.c
* harbour/source/vm/runner.c
* updated function symbols processing
* harbour/source/compiler/harbour.c
* added note in hb_compOptimizeFrames() about exceeding maximum number
of local variables (255). We should add new pcode(s) HB_P_LARGE[V]FRAME
or generate compile time error.
* harbour/source/vm/macro.c
% minor optimizations
+ harbour/doc/destruct.txt
+ added description for object destructors in Harbour
* harbour/include/error.ch
+ added new error code EG_DESTRUCTOR
* harbour/source/lang/msgpl852.c
* harbour/source/lang/msgpliso.c
* harbour/source/lang/msgplmaz.c
* harbour/source/lang/msgplwin.c
* harbour/source/rtl/langapi.c
+ added desription for new error code - other language modules
have to be updated
* harbour/include/hbapi.h
+ added hb_gcRefCheck() and cover some hb_gc* functions by
_HB_API_INTERNAL_ macro
* harbour/source/vm/itemapi.c
! fixed possible RT error generation when some exception is active
* harbour/include/hbapicls.h
* harbour/include/hbclass.ch
* harbour/include/hboo.ch
* harbour/source/rtl/tclass.prg
* harbour/source/vm/arrays.c
* harbour/source/vm/classes.c
+ added support for object destructors
* harbour/source/vm/garbage.c
+ added support for object destructors
+ added logic to detect buggu .prg code which uses destructors
see doc/destruct.txt for more info.
It's also possible that this code will exploit some bugs
in other code which uses GC allocated memory blocks.
* harbour/source/vm/garbage.c
* minor cleanup
* harbour/source/rtl/cdpapi.c
* harbour/include/hbextern.ch
+ added HB_CDPLIST() - it returns array with all registered CODEPAGEs
* harbour/source/rtl/set.c
! fixed typo in _SET_DEFEXTENSIONS
* harbour/tests/testrpt.prg
! fixed syntax
! use lower name in report name to work properly on case sensitive
file systems
* harbour/include/hbapicls.ch
* added HB_EXPORT to public functions and some internal covered by
_HB_API_INTERNAL_ macro
* harbour/include/hboo.ch
+ added HB_OO_CLSTP_NONVIRTUAL and HB_OO_CLSTP_OVERLOADED
* harbour/source/rtl/tclass.prg
! do not add supercast class messages - now it's done automatically
by __clsNew() function with proper instance area offset updating
! enumerate instance class datas in __clsAddMsg() from 1 - inherited
instance variables are managed internally by classy code with
proper instance area offset updating
! use __CLS_CNTCLSDATA() as start offset for class data. Do not
try to calculate it yourself - some of super classes can be ignored
when they are appear in the inheritance tree more then once so it's
not possible to calculate class data or instance data start offset
using simple sum of class or instance variables in super classes.
* harbour/source/vm/classes.c
! fixed instance area casting
! fixed class variables casting
! fixed multi-inheritance when the same class can apear more then
once in super classes tree.
! Do not add unnecessary instance variables for the same class when
it's inherited more then once.
! Do not add unnecessary class variables for the same class when
it's inherited more then once.
! Do not add unnecessary initialization class and instance variables
+ added support for non virtual messages
+ added support for static and casted scoping
+ super cast messages added automatically. They are used to dynamic
recalculation of instance are offsets and to avoid multiple inheritance
of the same class so please do not overload them or you will have as
result something what we have before recent modifications in the
instance and class data area. Just simply run tests/clsccast.prg
and tests/clsicast.prg compiled with current CVS code and last
release code or with xHarbour and compare the results.
Also Class(y) does not pass these tests and I do not know if any
other dynamic OOP model in xbase languages can properly address it.
BTW maybe I should add RT error when .prg code will try to delete
or overwrite class cast message. For me it seems to be reasonable
and what's your opinion?
* make hidden class members non virtual by default. It can be disabled
by compiling classes.c with -DHB_VIRTUAL_HIDDEN but IMHO keeping
HIDDEN members as virtual causes that they are not really HIDDEN
because subclasses can simply overwrite them. It also means that
it's not possible to create class with some private data and
methods which will never interact with any subclass code created
by other programmers where name conflict can appear. So one of
the most important OOP features is missing in such case.
See tests/clsnv.prg as an example for non virtual hidden members.
+ tests/clsicast.prg
+ added test code for proper instance area allocating and casting
+ tests/clsccast.prg
+ added test code for proper class data allocating and casting
+ tests/clsnv.prg
+ added test code for non virtual hidden class members
Now we should be able to create and class model even replicate the
static one like in C++ using current class engine which still fully
supports dynamic bindings. It consumes less memory and due to much
more efficient hashing it should be faster then it was though some
other minor optimization can be add and I'll plan to make them in
some spare time.
The item type verification in assignment is still missing. I'll add
it when I'll collect some statistic informantion I'd like to ask
[x]Harbour users. I need these information to tune some internal
structures where I can balance between speed and memory allocation
to statistically optimal form.
Marek asked me to add passing object datas by reference and I'll do
that but I'd like to ask Ryszard to add support for:
@<oVar>:<message>
to compiler. I'll implement all other HVM modifications. If you can
please also add support for:
<oVar>:&<cMsgName>[(...)]
For this we do not need any HVM modifications or new PCODEs.
We are supporting xBase++ macro list compilation in:
cList:="1,2,3"
x := aVar[ &cList ]
aVar:={ &cList }
func( &cList )
But we do not support:
<oVar>:<message>( &cList )
IMHO it looks ugly. If we have this syntax for function call then we
should also support it in message sending.
Ryszard can you make necessary compiler modifications?
I'm also thinking about adding support for variable parameters
func myfunc(...)
[...]
return xVar
In few cases it will help to encode some function much more efficient
then now.
I'll add Class(y) compatible functions used in class(y) header files
so it will be possible to use original class(y) .ch files in Harbour
though it will not be the most efficient because we have @func() operator
which gives better performance then using codeblocks. Anyhow classy
create separate meta class for each class with CLASS members and
<clasName>() function always return such meta class object so for full
Class(y) compatibility we need to generate differ .prg code.
But all such modifications now can be done on preprocessor and
.prg level and they will not need .c code modification.
We should make them to give user interface for our new OOP features.
Now I'm waiting for reports about any problems with current classy
code.
* harbour/include/hbapi.h
* harbour/source/vm/hvm.c
* harbour/source/vm/codebloc.c
* harbour/source/vm/arrays.c
* moved static base offset from hb_struBlock structure
to HB_CODEBLOCK structure
+ added hclass member to hb_struBlock - it will be used in
the future for checking codeblock scope in classy so we will
real scope checking also for messages sent from codeblocks.
- removed supercast and superoffset members from hb_struArray
structure.
* harbour/include/hbclass.ch
* added class(y) like
@:<MessageName>([<MsgParams,...>])
send operator. It's not exactly the same as in class(y) where
this operator is hardcoded to executing function directly,
needs method name instead of message name and is linked statically.
In Harbour this operator uses message name so can be used also for
instance variables and make dynamic casting to the class from which
current method is inherited. In short words sending messages to @:
instead of :: causes that they work like non-virtual messages in
C++ mode.
If you do not use the same method body in different classes
then you can also use explicitly self casting:
::<myclass>:<msgname>[(...)]
and it will be a little bit faster
* harbour/include/hboo.ch
+ added: HB_OO_MSG_ASSIGN, HB_OO_MSG_ACCESS,
HB_OO_MSG_CLSASSIGN, HB_OO_MSG_CLSACCESS
They should be used insted of HB_OO_MSG_DATA and HB_OO_MSG_CLSDATA
This resolves problems with name conflicts when we were detecting
type of message (ACCESS/ASSIGN) by checking the first character
in message name. F.e. now it's possible to create exported instance
variable called __WithObject and it will be used in all WITH OBJECT
statement instead of the base object value. It's simple and effective
WITH OBJECT overloading.
I kept backward compatibility for HB_OO_MSG_DATA and HB_OO_MSG_CLSDATA
but I strongly suggest to update code to use new constants.
+ added HB_OO_MSG_REALCLASS
* harbour/source/rtl/objfunc.prg
* harbour/source/rtl/tobject.prg
* harbour/source/rtl/tclass.prg
* use HB_OO_MSG_[CLS]{ASSIGN,ACCESS} instead of HB_OO_MSG_[CLS]DATA
* harbour/source/rtl/tclass.prg
+ added REALCLASS message to creted classes - it's used for @: operator
* harbour/source/vm/classes.c
* updated for above modifications
* calculate instance area offset in supercasting dynamically - it
will allow to eliminate multiple instance area allocating when
in the inheritance tree the same class exists more then once and
also quite easy add support for non-virtual messages.
! fixed GPF in __CLSINSTSUPER() class function generate HVM exception
% do not inherit unaccessible inline blocks
* some other minor optimization, fixes and code cleanups
* harbour/source/rdd/usrrdd/usrrdd.c
! fixed HB_TRACE message
* harbour/source/rtl/errorapi.c
! generate internal error if ErrorNew() function does not return an object
* harbour/include/hbset.h
* harbour/include/set.ch
* harbour/source/pp/pptable.c
* harbour/source/rtl/set.c
+ Added Set( _SET_DEFEXTENSIONS, <logical: .T./.F.> )
Default value is .T. (CA-Cl*pper compatible). If set to .F.,
Harbour runtime/RDD code will never attempt to add a
default extension to the filename arguments. Commands/functions
where this setting makes a difference are:
- SET ALTERNATE TO / Set( _SET_ALTFILE_, ... )
- SET PRINTER TO / Set( _SET_PRINTFILE_, ... )
- Set( _SET_EXTRAFILE, ... )
- SAVE TO / __mvSave()
- RESTORE FROM / __mvRestore()
- LABEL FORM
- REPORT FORM
- COPY TO ... DELIMITED
- COPY TO ... SDF
- LIST / __dbList()
- USE / dbUseArea()
- dbCreate()
- SET INDEX TO / ordListAdd() (not yet implemented)
- __HRBLOAD(), __HRBRUN()
; Notes:
- From now on, it possible to create/load files using the
above functions/commands which have no extension. This
might be desirable in a few platform and/or situations.
For example on Win32, it's possible to directly print
to a shared Windows printer queue, using these commands:
lOldValue := Set( _SET_DEFEXTENSIONS, .F. )
SET PRINTER TO \\myserver\myprinter
Set( _SET_DEFEXTENSIONS, lOldValue )
Or, it is possible to open a dbf file which has no extension:
dbUseArea(.T., NIL, "dbf_filename_with_no_extension", "w_DATA", .F., .F.)
- Compiler is (of course) not affected by this setting.
- Preprocessor (PP) lib flavour is not affected by this setting.
- Support is not full in the RDD code yet.
* harbour/source/rdd/dbf1.c
* harbour/source/rdd/dblist.prg
* harbour/source/rdd/delim1.c
* harbour/source/rdd/sdf1.c
* harbour/source/rtl/tlabel.prg
* harbour/source/rtl/treport.prg
* harbour/source/rtl/set.c
* harbour/source/vm/memvars.c
* harbour/source/vm/runner.c
+ Honoring _SET_DEFEXTENSIONS setting all over the code.
* harbour/source/rtl/tlabel.prg
* harbour/source/rtl/treport.prg
! Made the logic multiplatform where it's decided whether to
add a default extension to the loaded filename.
C:\PATH.A\MYFILE didn't get the default extension while
C:\PATH\MYFILE did.
* harbour/source/lang/msgcs852.c
* harbour/source/lang/msgcsiso.c
* harbour/source/lang/msgcskam.c
* harbour/source/lang/msgcswin.c
* typo fixed (Vojtech Obrdlik <vobrdlik centrum.cz>)
* harbour/include/hbapicdp.h
* harbour/source/codepage/Makefile
+ harbour/source/codepage/cpcs852.c
+ harbour/source/codepage/cpcsiso.c
+ harbour/source/codepage/cpcskam.c
+ harbour/source/codepage/cpcswin.c
+ harbour/source/codepage/uckam.c
* harbour/doc/en/lang.txt
* harbour/common.mak
+ added czech codepage support (Vojtech Obrdlik <vobrdlik centrum.cz>)
Vojtech many thanks.
We will have to fix our CDP code to work well with characters
with the same wight - now sorting with such codepages does not
work correctly, f.e. in CSISO:
CHR(65)+CHR(204) > CHR(65)+CHR(201)
but:
CHR(65)+CHR(201) >= CHR(65)+CHR(204)
as you can see comparison depends on string order:
s1 > s2 but not s2 < s1
It means that such codepages cannot be used in any sorting
systems like indexes until we will not fix internal CPD logic.
Alexander can you look at it?
If not then please inform me and I'll work on it in some spare
time.
* harbour/source/rtl/do.c
* minor RTE message simplification
* harbour/source/rtl/gtos2/gtos2.c
* casting
* harbour/source/vm/dynsym.c
+ added __DYNSN2SYM( <cName> ) -> symbolItem
* harbour/include/hbapi.h
* harbour/source/vm/arrays.c
+ added supercast and superoffset members to hb_struArray structure
* harbour/source/vm/classes.c
* harbour/source/rtl/tclass.prg
! fixed calculation of instance area offsets
! fixed accessing instance variables with super casting
+ added selfclass casting
+ added support for sending 'exec' and 'name' messages to
symbol items, f.e.:
funcSym := (@funcName())
? "Exacuting:", funcSym:name
funcSym:exec( param1, param2, ... )
* changed __CLASSNAME() to be Clipper compatible
* changed __CLSINST()/__CLASSINSTANCE() now accepts as third paramter
function name - Clipper compatible
! fixed GPF trap in __OBJGETCLSNAME() when executed with wrong parameter
* some other fixes and small speed improvement
* harbour/include/hbapi.h
* moved HB_STACK_STATE declaration from hbstack.h to hbapi.h
it's covered by _HB_API_INTERNAL_ macro so it should not
effect 3-rd party code
* modified hb_struSymbol structure:
LONG stackbase
replaced by:
PHB_STACK_STATE stackstate
this modification allows to keepadditional information bound with
function call stack accessible from different HVM modules.
Now it's used by memvars code to keep/update PRIVATE variables
stack pointers. I plan to store in HB_STACK_STATE structure
information additional information for classes code like super
casting or instance variables offsets in new OOP model I'm working on.
It can be also used by debugger code to retrieve some informations
about executed functions without active updating by main HVM loop.
+ added hb_memvarsClear() - cleanly clears all PRIVATE and PUBLIC
variables
+ added hb_memvarUpdatePrivatesBase() - updates PRIVATE stack base
offset so PRIVATE variables created in current function/procedure
will not be removed when it returns
- removed hb_memvarsRelease() and hb_memvarValueNew()
* harbour/include/hbstack.h
+ added hb_stackClearMevarsBase() - helper function for hb_memvarsClear()
clears PRIVATE stack offsets in executed functions
* changed to static offset from int to long - in different places we
were using int or long in HVM so I cleaned the HVM code to always
operate on the same type
* harbour/source/vm/estack.c
* set/restore PRIVATE stack base offset in hb_stackNewFrame()/
hb_stackOldFrame()
* updated for new HB_IT_SYMBOL structure
* harbour/source/vm/hvm.c
! removed setting/restoring PRIVATE stack base offset in hb_vmExecute()
It make code like:
eval(&("{||VAR:=1}"))
Clipper compatible
* updated for new HB_IT_SYMBOL structure
* changed order of execution exit procedures for clean memvars removing
and future destructors execution. I'll describe it better when I'll
add destructors.
* harbour/source/vm/memvars.c
! fixed CLEAR MEMORY - now this function should be safe in Harbour
It's not exactly compatible with Clipper because I intentionally
didn't replicated some Clipper bugs like possible memory corruption.
+ added hb_memvarsClear() - cleanly clears all PRIVATE and PUBLIC
variables
+ added hb_memvarUpdatePrivatesBase() - updates PRIVATE stack base
offset so PRIVATE variables created in current function/procedure
will not be removed when it returns
! fixed releasing PUBLIC and PRIVATE variables which were passed by
reference and are still active on HVM stack or in codeblocks as
detached locals (see: hb_memvarDetachDynSym())
* modified hb_memvarFindSymbol() to be more Clipper compatible
% optimized hb_memvarRelease() to operate or PHB_DYNS instead of
string comparison and not make linear dynamic symbol scan for
PUBLIC or not existing symbols
- removed hb_memvarReleasePublic()
* harbour/include/hbvmpub.h
* harbour/include/hbxvm.h
* harbour/source/compiler/gencc.c
* harbour/source/vm/classes.c
* harbour/source/vm/debug.c
* harbour/source/vm/itemapi.c
* harbour/source/vm/pcount.c
* harbour/source/vm/proc.c
* harbour/source/vm/pvalue.c
* updated for the above modifications
* harbour/source/rtl/memvarbl.prg
* harbour/source/rtl/menuto.prg
* use __mvEXIST( cMemvar ) instead of __mvSCOPE( cMemvar ) > HB_MV_ERROR
__mvEXIST() is much faster function
* harbour/source/rtl/type.c
* execute hb_memvarUpdatePrivatesBase() after macro type checking.
This should not be necessary but we are not Clipper compatible here
and this is work around for difference in our TYPE() implementation.
Clipper for:
? TYPE("VAR:=1")
create PUBLIC variable VAR when [x]Harbour PRIVATE one.
Should we try to make it Clipper compatible?
The above should fix problems reported with memvars. We are not 100%
Clipper compatible but unlike in Clipper we cannot break VM internals
using some operation on references to memvars and detached locals
and/or RELEASE.../ CLEAR MEMORY. This modifications should be intensively
tested. If you will find any problems with current code please inform me.
I'd like to hear your opinions about memvars created by TYPE() (see above).
Should we change it? It may not be very easy operation - we will have to
change macro compiler and add new PCODE for that.
* harbour/contrib/rdd_ads/ads1.c
* harbour/include/hbapi.h
* harbour/include/hbapigt.h
* harbour/include/hbapiitm.h
* harbour/include/hbdefs.h
* harbour/include/hbrdddbf.h
* harbour/include/hbstack.h
* harbour/include/hbsxfunc.h
* harbour/source/common/expropt1.c
* harbour/source/common/hbstr.c
* harbour/source/compiler/harbour.c
* harbour/source/compiler/hbident.c
* harbour/source/pp/ppcore.c
* harbour/source/rdd/hbdbsort.c
* harbour/source/rdd/dbffpt/dbffpt1.c
* harbour/source/rdd/hbsix/sxcompr.c
* harbour/source/rtl/hardcr.c
* harbour/source/rtl/inkey.c
* harbour/source/rtl/isprint.c
* harbour/source/rtl/math.c
* harbour/source/rtl/mtran.c
* harbour/source/rtl/natmsg.c
* harbour/source/rtl/gtcrs/chrmap.c
* harbour/source/rtl/gtcrs/gtcrs.c
* harbour/source/rtl/gtsln/gtsln.c
* harbour/source/rtl/gtsln/gtsln.h
* harbour/source/rtl/gtsln/kbsln.c
* harbour/source/rtl/gtsln/keytrans.c
* harbour/source/rtl/gtsln/mousesln.c
* harbour/source/vm/estack.c
* harbour/source/vm/extend.c
* harbour/source/vm/runner.c
* harbour/utils/hbver/hbverfix.c
* general code cleanup, public functions declared in header files,
local changed to static, added mising void for functions without
parameters, etc.
We still have some public functions which are not used by core code
and not declared in header files, like:
hb_memvarValueBaseAddress(), hb_memvarGetVarHandle(),
hb_memvarGetValueByHandle(), hb_clsCreate(), hb_clsAdd(),
hb_clsAssociate(), hb_hashTableDel(), hb_hashTableSize(),
I haven't touched them yet though we will have to keep in mind that
we should make sth with them.
* harbour/include/hbapifs.h
* changed order of members in HB_FNAME structure to avoid possible
problems with alignment
* harbour/include/hbexprb.c
! cleaned usGroups usage to avoid BCC warnings
* harbour/source/rtl/filesys.c
* harbour/source/rtl/fstemp.c
* code formatting and casting
* harbour/include/hbset.h
* harbour/source/rtl/set.c
* some minor updates for future incoming hb_set structure
modifications
* harbour/source/vm/hvm.c
* use HB_MACRO2STRING() macro for default lang setting
* harbour/include/hbrdddel.h
* harbour/source/rdd/delim1.c
* harbour/source/rdd/dbcmd.c
+ extended COPY TO ... DELIMITED ... / APPEND FROM ... DELIMITED ...
to support some other common formats.
COPY TO ... DELIMITED WITH TAB
APPEND FROM ... DELIMITED WITH TAB
uses chr(9) as field separator and without string delimiters
COPY TO ... DELIMITED WITH PIPE
APPEND FROM ... DELIMITED WITH PIPE
uses '|' as field separator and without string delimiters
COPY TO ... DELIMITED WITH ( { cStrDelim, cFldSeparator } )
APPEND FROM ... DELIMITED WITH ( { cStrDelim, cFldSeparator } )
allows users to set and any character field delimiters and fields
separators
* harbour/source/rtl/set.c
! fixed possible GPF after hb_setListenerRemove()
* removed default: clause in main SET() switch to enable C compiler
warning when not all HB_SET_* cases are defined.
* harbour/source/vm/hvm.c
! fixed bug#1533096 reported by Chen
* harbour/make_b32.bat
* harbour/make_vc.bat
! install call redirected to nul instead of make_b32.log to avoid
overwriting the build results with less important (no) information.
* harbour/include/hbundoc.api
+ Added _txopen() (not tested)
* harbour/source/rdd/dbfcdx/dbfcdx1.c
* harbour/source/rdd/dbfntx/dbfntx1.c
! BCC -w warnings fixed.
* harbour/source/rtl/filehb.c
+ Added TOFIX about a CA-Cl*pper incompatibility.
In CA-Cl*pper the argument of FILE() is RTrim()-ed
before doing the check.
* harbour/source/rtl/fstemp.c
! Fixed two BCC warnings.