From 1fc6222e6c345f0082ba2316f25bd6c554b67e48 Mon Sep 17 00:00:00 2001 From: Antonio Linares Date: Wed, 6 Oct 1999 05:55:48 +0000 Subject: [PATCH] *** empty log message *** --- harbour/ChangeLog | 372 ++++++++++++++++++---------------- harbour/include/hboo.ch | 19 +- harbour/source/rtl/classes.c | 18 +- harbour/source/rtl/tclass.prg | 143 ++++++------- 4 files changed, 300 insertions(+), 252 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3bdce64732..7dc847cef5 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,178 +1,20 @@ -19991006-01:10 EDT David G. Holm +19991006-07:41 GMT+1 Antonio Linares + * source/rtl/classes.c + + Added support for CLASSDATAs INIT clause. + * source/rtl/tclass.prg + + Added support for CLASSDATAs INIT clause. + * include/hboo.ch + + new defines added for CLASSDATAS. - * source/rtl/dates.c - % SECONDS() now uses ftime() and localtime() for all platforms. - - * source/rtl/environ.c - + Added HB_VERSION() changes supplied by Jose Lalin with - corrections for the compiler version and revision for - Borland C 3.1 and 5.x, Cygnus GCC with Cygwin, - Cygnus GCC with Mingw32, and Delorie GCC. - - * source/rtl/set.c - + Added HB_DEFPATH() and HB___DEFPATH() supplied by Jose Lalin. - - * include/extend.h - * source/rtl/fm.c - % Only use hb_xmemcopy() and hb_xmemset() when the size of an - unsigned int is not the same as the size of an unsigned long. - - * include/gtapi.h - * source/rtl/console.c - * source/rtl/gtapi.c - ! DEVPOS(), SETPOS(), console cursor position, and console display - functions modified for improved Clipper compatibility. - -19991005-23:20 EDT Paul Tucker - + include/harbour.ch - * This file is meant as a repository of defines or translations needed - to allow CA-Clipper to compile programs that take advantage of any - Harbour specific extensions or additions to the language. - Currently, it only handles a substitute for HB_OsNewLine() - -19991006-03:02 GMT+1 Victor Szel - * include/extend.h - source/rtl/arrays.c - source/rtl/classes.c - source/rtl/do.c - source/rtl/itemapi.c - source/vm/hvm.c - * hb_g_symEval -> hb_symEval - * source/vm/mainwin.c - * hb_g_* -> hb_* - * source/vm/hvm.c - ! aStatics made static now for sure. - * source/rtl/strings.c - ! Typo fixed. - * source/rtl/memoline.c - ! Formatting fix. - -19991005-20:35 EDT Paul Tucker - * source/rtl/memoline.c - * add a cast on xgrab call. - -19991006-02:26 GMT+1 Victor Szel - * include/set.h - source/rtl/set.c - source/rtl/console.c - source/rtl/transfrm.c - ! 64 changed to CLR_STRLEN in set.h - * Separate global "set" variables moved inside HB_SET_STRUCT - * include/caundoc.api - + _bset, _bmove, _bcopy undocumented Clipper functions added, they are - mapped to mem*() functions. - * source/vm/main*.c - ! Typo fixed. - -19991006-00:32 GMT+1 Victor Szel - * include/extend.h - source/vm/debug.c - source/vm/hvm.c - * aStatics made static, prefixed with "s_" - __vmVarSGet(), __vmVarSList moved to hvm.c from debug.c - * source/vm/debug.c - include/hbextern.ch - source/runner/stdalone/external.prg - source/debug/debugger.prg - tests/debugtst.prg - * __APARAM -> __vmParLList - __GETLOCAL -> __vmVarLGet - __STATIC -> __vmVarSGet - __ASTATIC -> __vmVarSList - __GLOBALSTACKLEN -> __vmStkGCount - __AGLOBALSTACK -> __vmStkGList - __STACKLEN -> __vmStkLCount - __ASTACK -> __vmStkLList - Functions renamed. - * source/rdd/dbcmd.c - + zeros changed to NULL/'\0' - * source/debug/debugger.prg - source/rtl/menuto.prg - source/rtl/setkey.prg - source/rtl/tclass.prg - source/rtl/terror.prg - source/tools/fileread.prg - + static var names prefixed with "s_" in all .PRG modules. - * source/rtl/console.c - doc/funclist.txt - + DISPOUTAT() undocumented Clipper function added. - * include/extend.h - source/rtl/arrays.c - source/rtl/classes.c - source/rtl/do.c - source/rtl/itemapi.c - source/vm/hvm.c - * symEval -> hb_g_symEval - Global variable prefixed with "hb_g_". - -19991005-17:30 EDT Paul Tucker - * makefile.vc - + source/rtl/mlcount - + source/rtl/memoline - + source/vm/mainstd (for now) - + source/rtl/rddord - * gtapi.obj moved to terminal.lib - * duplicate console.obj removed from terminal.lib - (as reported by Gerrit Jan Doornink ) - -Tue Oct 05 14:44:16 1999 Gonzalo A. Diethelm - - * source/rtl/filesys.c (hb_fsTell): - Replaced use of tell() with an equivalent call to lseek(), so that - this is supported under gcc. - -19991005-20:34 GMT+1 Victor Szel - * include/hbextern.ch - source/runner/stdalone/external.prg - - One of the two HB_OSNEWLINE removed. - + source/rtl/memoline.c - source/rtl/Makefile - doc/funclist.txt - + MEMOLINE() added - (thanks to Ignacio Ortiz de Zúniga ) - !! WARNING !! Please modify non-GNU make files. - -19991005-18:20 GMT+1 Victor Szel - + source/rtl/rddord.prg - source/rtl/Makefile - + dbCreateIndex() - dbSetIndex() - dbClearIndex() - dbReindex() - dbSetOrder() - IndexExt() - IndexKey() - These will not work yet, since they are simple wrapper to the ord*() - functions. Just like in Clipper. - !! WARNING !! Please modify non-GNU make files. - -19991005-18:02 GMT+1 Victor Szel - * tests/rtl_test.prg - + Added more complete tests for <,>,<=,>=,!= operators. - * source/vm/hvm.c - % hb_vmPopDate() is no more checking the type of the popped value, and - the related unrecoverable error is also removed, since the callers - do this check before each call. - * Some more function grouping, small corrections. - ! hb_vmLess(), hb_vmLessEqual(), hb_vmGreater(), hb_vmGreaterEqual() - some cases were not handled, so stack corruption could occure, when - two ARRAY/BLOCK/OBJECT were compared. Fixed. - ! hb_vmNotEqual() fixed for ARRAY/OBJECT/BLOCK types. - * source/vm/hvm.c - include/pcode.h - source/compiler/genc.c - source/compiler/genhrb.c - source/compiler/harbour.y - * HB_P_GENARRAY -> HB_P_ARRAYGEN - * HB_P_DIMARRAY -> HB_P_ARRAYDIM - !! WARNING !! Please rebuild all .PRG files, since the pcode values have - changed. - * include/hbver.h - + Revision set to "a" - * source/compiler/harbour.c - + isatty.c put back in order. - * source/compiler/main*.c - + Some small cleanups. +19991006-01:06 GMT+1 Antonio Linares + * makefile.b32 + + mising include source\compiler path compiling harboury.c + * source/rtl/classes.c + + Added support for CLASSDATAs INIT clause. + * source/rtl/tclass.prg + + Added support for CLASSDATAs INIT clause. + * include/hboo.ch + + new defines added for CLASSDATAS. 19991005-14:41 GMT+1 Victor Szel * tests/run_tsta.bat @@ -214,11 +56,193 @@ Tue Oct 05 14:44:16 1999 Gonzalo A. Diethelm 19991005-12:30 GMT+2 Ryszard Glab *source/compiler/harbour.y + * changed some rules to correctly handle the following syntax: + LOCAL cbVar:={|| cbVar} + (the cbVar inside a codeblock is correctly considered a local + variable instead of memvar variable) + * corrected usage info to print LF at the end of message + +19991005-08:36 GMT+1 Victor Szel + * source/vm/main*.c + source/vm/Makefile + include/ctoharb.h + ! Some cleanup on the new main() functions. + (using header file, fixed CVS headers, added copyright header, removed a TODO, + TO DO -> TODO, Hungarian notation, global var name, 0 -> NULL, + added to GNU makefile, std main return value missing.) + * makefile.b40 (removed) + makefile.b32 + make_b40.bat + + makefile.b40 removed, since from now on makefile.b32 provides + the same functionality when B40 macro is defined. See make_b40.bat. + * *.bat + *.b?? + hbpplib.b32 (removed) + + Further uniformized. + + hbpp.exe make process uncommented from make_b16.bat. + We will see how it works. + + hbpplib.b32 incorporated into hbpp.b32 + - hbpp.b16 (removed) + makefile.b16 + make_b16.bat + - hbpp.b16 removed, since it was not used, and is now incorporated to + makefile.b16. + * source/runner/stdalone/hbrun.prg + + Using OutStd() instead of QOUT() to enable output redirecting like in + other command line utilites. + +19991005-07:55 GMT+1 Antonio Linares + + New file source/vm/mainstd.c (entry point for std applications) + + New file source/vm/mainwin.c (entry point for win appplications) + * source/vm/hvm.c + -+ main() renamed to hb_vmInit() + * hb_quit() removed from there and moved to mainstd.c and + mainwin.c respectively. + * makefile.b32 + * added support for mainstd.c and mainwin.c modules. + (make_b32.bat tested and works ok). + * tests/bld_b32.bat + * %1 moved to the end of line + * del %1.c removed + (tested and works ok). + +19991005-00:13 GMT+1 Victor Szel + * source/compiler/genc.c + ! Cosmetic: Some double tabs changed to single ones. + +19991004-22:34 GMT+1 Victor Szel + * tests/db_brows.prg + - READEXIT() removed since it's now part of the RTL. + +19991004-21:34 GMT+1 Victor Szel + * tests/*.bat + ! Reworked, standardized, simplified. Please test them. + Now they resemble to the bin/*.bat batch files. + * tests/buildexe.bat + - Removed since it was obsolete, use bld_b16.bat instead. + +19991004-19:54 GMT+1 Victor Szel + * source/rtl/memvars.c + ! memvars.ch changed to hbmemvar.ch + * tests/working/*.* moved to tests/*.* + * tests/working/db_brows.* + ! Fixed the CVS header, they missed to closing "$" + +19991004-19:23 GMT+1 Victor Szel + * tests/broken/*.* moved to tests/working + tests/working/Makefile + * moved to the BAD_PRG_SOURCES + - tests/broken/ + - Removed + * tests/working/hscript/*.* moved to samples/hscript + * Moved + * source/rtl/mlcount.c + * BYTE type changed to USHORT. + * Hungarian notation slighly corrected. + +19991004-18:58 GMT+1 Victor Szel + + source/runner/stdalone/hbrun.prg + + Added (now for sure) + +19991004-18:53 GMT+1 Victor Szel + + include/reserved.ch + + Added for complete Clipper compatibility, the file is a dummy, so it's + a TODO to replicate to originial functionality. + * include/Makefile + * Updated. + +Mon Oct 04 12:52:42 1999 Gonzalo A. Diethelm + + * tests/working/Makefile: + Added missing '\' after db_brows.ch. + Changed spaces to tabs. + +19991004-18:42 GMT+1 Victor Szel + * include/classes.ch -> include/hbclass.ch + include/external.ch -> include/hbextern.ch + include/memvars.ch -> include/hbmemvar.ch + source/debug/debugger.prg + source/debug/tbrwtext.prg + source/rtl/tbcolumn.prg + source/rtl/tbrowse.prg + source/rtl/tget.prg + source/rtl/tgetlist.prg + tests/working/classch.prg + source/runner/stdalone/hbrun.prg + source/rtl/memvarbl.prg + source/rtl/menuto.prg + * Non-Clipper compatible Harbour .CH filenames prefixed with "HB" to avoid + possible name collisions with existing header files. + +19991004-18:06 GMT+1 Victor Szel + + source/rtl/mlcount.c + source/rtl/Makefile + doc/funclist.txt + + MLCOUNT() added + (thanks to Ignacio Ortiz de Zúniga ) + - source/runner/stdalone/runner.prg + - Removed (now for sure) + +19991004-16:25 GMT+1 Victor Szel + * source/runner/stdalone/runner.prg -> hbrun.prg + source/runner/stdalone/Makefile + runner.b32 + makefile.vc + tests/working/hbrun.bat -> hbrunprg.bat + tests/working/run_all.bat + tests/working/test_all.prg + * runner.exe renamed to hbrun.exe to better fit into the final + executable naming style (harbour/hbpp/hbrun) + +19991004-15:15 GMT+1 Victor Szel + * source/hbpp -> source/pp + source/Makefile + source/pp/Makefile + source/pp/stdalone/Makefile + source/compiler/Makefile + source/runner/stdalone/Makefile + tests/working/Makefile + makefile.* + *.b?? + * source/hbpp changed to source/pp. + +19991004-14:48 GMT+1 Victor Szel + * tests/working/*.bat + *.b?? + makefile.vc + libs/* + lib/* + * libs directory name changed to lib, the win16 and win32 + subdirs have been removed. + * win32 dir is no longer needed, since now the windows terminal.lib + is named termwin.lib. +source/rtl/tgetlist.prg + doc/funclist.txt + + READINSERT() function added. (Thanks to Matteo Baccan) + * source/rtl/filesys.c + include/filesys.h + + hb_fsTell() added to the header file + % hb_fsSetDev*() now calls hb_fsSetDevMode(), so some platform specific + code could be eliminated. + % Some simplification in FSETDEVMOD() + + Added missing HB_ prefix to FSETDEVMOD() + +19991005-12:30 GMT+2 Ryszard Glab + + *source/compiler/harbour.y +<<<<<<< ChangeLog + * changed some rules to correctly handle the following syntax: + LOCAL cbVar:={|| cbVar} + (the cbVar inside a codeblock is correctly considered a local + variable instead of memvar variable) + * corrected usage info to print LF at the end of message +======= * changed some rules to correctly handle the following syntax: LOCAL cbVar:={|| cbVar} (the cbVar inside a codeblock is correctly considered a local variable instead of memvar variable) * corrected usage info to print LF at the end of message +>>>>>>> 1.1131 19991005-08:36 GMT+1 Victor Szel * source/vm/main*.c diff --git a/harbour/include/hboo.ch b/harbour/include/hboo.ch index 5f41277b82..8812dd8283 100644 --- a/harbour/include/hboo.ch +++ b/harbour/include/hboo.ch @@ -38,14 +38,17 @@ #ifndef _HBOO_CH #define _HBOO_CH -#define MET_METHOD 0 -#define MET_DATA 1 -#define MET_CLASSDATA 2 -#define MET_INLINE 3 -#define MET_VIRTUAL 4 -#define MET_SUPER 5 +#define MET_METHOD 0 +#define MET_DATA 1 +#define MET_CLASSDATA 2 +#define MET_INLINE 3 +#define MET_VIRTUAL 4 +#define MET_SUPER 5 -#define DATA_SYMBOL 1 -#define DATA_VALUE 2 +#define DATA_SYMBOL 1 +#define DATA_VALUE 2 + +#define CLASSDATA_SYMBOL 1 +#define CLASSDATA_VALUE 2 #endif /* _HBOO_CH */ diff --git a/harbour/source/rtl/classes.c b/harbour/source/rtl/classes.c index 6cff75b855..23353861d4 100644 --- a/harbour/source/rtl/classes.c +++ b/harbour/source/rtl/classes.c @@ -429,11 +429,20 @@ HARBOUR HB___CLSADDMSG( void ) if( pMessage->pSymbol->szName[ 0 ] == '_' ) pNewMeth->pFunction = hb___msgSetClsData; else + { + PHB_ITEM pInit = hb_param( 5, IT_ANY ); + pNewMeth->pFunction = hb___msgGetClsData; + + if( pInit && !IS_NIL( pInit )) /* Initializer found */ + { + pNewMeth->pInitValue = hb_itemNew( NULL ); + hb_itemCopy( pNewMeth->pInitValue, pInit ); + } + } break; case MET_INLINE: - pNewMeth->uiData = hb_arrayLen( pClass->pInlines ) + 1; hb_arraySize( pClass->pInlines, pNewMeth->uiData ); hb_arraySet( pClass->pInlines, pNewMeth->uiData, @@ -600,7 +609,12 @@ HARBOUR HB___CLSINST( void ) for( uiAt = 0; uiAt < uiLimit; uiAt++, pMeth++ ) if( pMeth->pInitValue ) - hb_itemArrayPut( &stack.Return, pMeth->uiData, pMeth->pInitValue ); + { + if( pMeth->pFunction != hb___msgGetClsData ) /* is a DATA */ + hb_itemArrayPut( &stack.Return, pMeth->uiData, pMeth->pInitValue ); + else /* it is a ClassData */ + hb_arraySet( pClass->pClassDatas, pMeth->uiData, pMeth->pInitValue ); + } } } diff --git a/harbour/source/rtl/tclass.prg b/harbour/source/rtl/tclass.prg index 0e048bdf69..92c7fa7ebf 100644 --- a/harbour/source/rtl/tclass.prg +++ b/harbour/source/rtl/tclass.prg @@ -23,7 +23,7 @@ * * 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. See the + * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -54,9 +54,9 @@ FUNCTION TClass() - STATIC s_hClass := NIL + STATIC s_hClass := nil - IF s_hClass == NIL + if s_hClass == nil s_hClass := __clsNew( "TCLASS", 10 ) __clsAddMsg( s_hClass, "New", @New(), MET_METHOD ) @@ -90,15 +90,15 @@ FUNCTION TClass() __clsAddMsg( s_hClass, "_uInit", 9, MET_DATA ) __clsAddMsg( s_hClass, "cType", 10, MET_DATA ) __clsAddMsg( s_hClass, "_cType", 10, MET_DATA ) - ENDIF + endif - RETURN __clsInst( s_hClass ) + return __clsInst( s_hClass ) //----------------------------------------------------------------------------// -STATIC FUNCTION New( cClassName, cSuper ) +static function New( cClassName, cSuper ) - LOCAL Self := QSelf() + local Self := QSelf() ::cName := Upper( cClassName ) ::aDatas := {} @@ -106,30 +106,30 @@ STATIC FUNCTION New( cClassName, cSuper ) ::aClsDatas := {} ::aInlines := {} ::aVirtuals := {} - IF ISCHARACTER( cSuper ) + if ISCHARACTER( cSuper ) ::cSuper := cSuper - ENDIF + endif - RETURN Self + return Self //----------------------------------------------------------------------------// -STATIC FUNCTION Create() +static function Create() - LOCAL Self := QSelf() - LOCAL n - LOCAL nLen - LOCAL nLenDatas := Len( ::aDatas ) - LOCAL nDataBegin := 0 - LOCAL nClassBegin := 0 - LOCAL hClass - LOCAL hSuper - LOCAL ahSuper := {} + local Self := QSelf() + local n + local nLen + local nLenDatas := Len( ::aDatas ) + local nDataBegin := 0 + local nClassBegin := 0 + local hClass + local hSuper + local ahSuper := {} - IF ::cSuper == NIL + if ::cSuper == nil hClass := __clsNew( ::cName, nLenDatas ) - ELSE // Single inheritance + else // Single inheritance hSuper := __clsInstSuper( Upper( ::cSuper ) ) hClass := __clsNew( ::cName, nLenDatas, hSuper ) // Add class casts @@ -138,121 +138,128 @@ STATIC FUNCTION Create() nDataBegin := __cls_CntData( hSuper ) // Get offset for new DATAs nClassBegin := __cls_CntClsData( hSuper ) // Get offset for new ClassData - ENDIF + endif ::hClass := hClass - FOR n := 1 TO nLenDatas + for n := 1 to nLenDatas __clsAddMsg( hClass, ::aDatas[ n ][ DATA_SYMBOL ], n + nDataBegin, MET_DATA, ; ::aDatas[ n ][ DATA_VALUE ] ) - __clsAddMsg( hClass, "_" + ::aDatas[ n ][ DATA_SYMBOL ], n + nDataBegin, MET_DATA ) - NEXT + __clsAddMsg( hClass, "_" + ::aDatas[ n ][ DATA_SYMBOL ], n + nDataBegin,; + MET_DATA ) + next nLen := Len( ::aMethods ) - FOR n := 1 TO nLen + for n := 1 to nLen __clsAddMsg( hClass, ::aMethods[ n ][ 1 ], ::aMethods[ n ][ 2 ], MET_METHOD ) - NEXT + next nLen := Len( ::aClsDatas ) - FOR n := 1 TO nLen - __clsAddMsg( hClass, ::aClsDatas[ n ], n + nClassBegin, MET_CLASSDATA ) - __clsAddMsg( hClass, "_" + ::aClsDatas[ n ], n + nClassBegin, MET_CLASSDATA ) - NEXT + for n := 1 to nLen + __clsAddMsg( hClass, ::aClsDatas[ n ][ CLASSDATA_SYMBOL ], n + nClassBegin,; + MET_CLASSDATA, ::aClsDatas[ n ][ CLASSDATA_VALUE ] ) + __clsAddMsg( hClass, "_" + ::aClsDatas[ n ][ CLASSDATA_SYMBOL ],; + n + nClassBegin, MET_CLASSDATA ) + next nLen := Len( ::aInlines ) - FOR n := 1 TO nLen + for n := 1 to nLen __clsAddMsg( hClass, ::aInlines[ n ][ 1 ], ::aInlines[ n ][ 2 ],; MET_INLINE ) - NEXT + next // __clsAddMsg( hClass, Upper( ::cName ), {|self|self}, MET_INLINE ) // Useful? nLen := Len( ::aVirtuals ) - FOR n := 1 TO nLen + for n := 1 to nLen __clsAddMsg( hClass, ::aVirtuals[ n ], n, MET_VIRTUAL ) - NEXT + next - RETURN NIL +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION Instance() +static function Instance() - LOCAL Self := QSelf() + local Self := QSelf() - RETURN __clsInst( ::hClass ) +return __clsInst( ::hClass ) //----------------------------------------------------------------------------// -STATIC FUNCTION AddData( cData, xInit ) /* xInit is initializer */ +static function AddData( cData, xInit ) /* xInit is initializer */ - LOCAL Self := QSelf() + local Self := QSelf() - IF ::uInit != NIL + if ::uInit != nil xInit := ::uInit - ENDIF + endif - aAdd( ::aDatas, { cData, xInit } ) + AAdd( ::aDatas, { cData, xInit } ) - RETURN NIL +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION AddClassData( cData ) +static function AddClassData( cData, xInit ) - LOCAL Self := QSelf() + local Self := QSelf() - aAdd( ::aClsDatas, cData ) + if ::uInit != nil + xInit := ::uInit + endif - RETURN NIL + AAdd( ::aClsDatas, { cData, xInit } ) + +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION AddInline( cMethod, bCode ) +static function AddInline( cMethod, bCode ) - LOCAL Self := QSelf() + local Self := QSelf() - aAdd( ::aInlines, { cMethod, bCode } ) + AAdd( ::aInlines, { cMethod, bCode } ) - RETURN NIL +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION AddMethod( cMethod, nFuncPtr ) +static function AddMethod( cMethod, nFuncPtr ) - LOCAL Self := QSelf() + local Self := QSelf() - aAdd( ::aMethods, { cMethod, nFuncPtr } ) + AAdd( ::aMethods, { cMethod, nFuncPtr } ) - RETURN NIL +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION AddVirtual( cMethod ) +static function AddVirtual( cMethod ) - LOCAL Self := QSelf() + local Self := QSelf() - aAdd( ::aVirtuals, cMethod ) + AAdd( ::aVirtuals, cMethod ) - RETURN NIL +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION SetInit( uValue ) +static function SetInit( uValue ) - LOCAL Self := QSelf() + local Self := QSelf() ::uInit := uValue - RETURN NIL +return nil //----------------------------------------------------------------------------// -STATIC FUNCTION SetType( cType ) +static function SetType( cType ) - LOCAL Self := QSelf() + local Self := QSelf() ::cType := cType - RETURN NIL +return nil //----------------------------------------------------------------------------//