From eb20301b4ad8a19c468682e121139e97c3d924ce Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Sat, 7 Mar 2009 01:48:13 +0000 Subject: [PATCH] 2009-03-07 02:53 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/vm/classes.c * forbid some usage of __clsModMsg() and unblock some others It should make some xHarbour users using OVERRIDE METHOD happy but please remember it's still undocumented and unsupported functionality - use for your own risk. --- harbour/ChangeLog | 7 ++++ harbour/source/vm/classes.c | 81 ++++++++++++++++++++++++++++++------- 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index fce2fbb0bb..9951348e14 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,13 @@ 2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2009-03-07 02:53 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/vm/classes.c + * forbid some usage of __clsModMsg() and unblock some others + It should make some xHarbour users using OVERRIDE METHOD happy + but please remember it's still undocumented and unsupported + functionality - use for your own risk. + 2009-03-06 13:32 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/contrib/gtwvg/tests/demowvg.prg ! Wrong prg at previous commit. diff --git a/harbour/source/vm/classes.c b/harbour/source/vm/classes.c index 3b0d288dd4..94e16dbfed 100644 --- a/harbour/source/vm/classes.c +++ b/harbour/source/vm/classes.c @@ -2904,6 +2904,7 @@ static BOOL hb_clsAddMsg( USHORT uiClass, const char * szMessage, break; case HB_OO_MSG_REALCLASS: + pNewMeth->pFuncSym = &s___msgRealClass; pNewMeth->uiScope = uiScope; break; @@ -2914,6 +2915,7 @@ static BOOL hb_clsAddMsg( USHORT uiClass, const char * szMessage, break; case HB_OO_MSG_DELEGATE: + pNewMeth->pFuncSym = &s___msgDelegate; pNewMeth->uiScope = uiScope; pNewMeth->uiData = uiIndex; @@ -3525,24 +3527,73 @@ HB_FUNC( __CLSMODMSG ) { hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a DATA item", HB_ERR_FUNCNAME, 0 ); } - else if( pFuncSym == &s___msgEvalInline ) + else if( pFuncSym == &s___msgSetClsData || pFuncSym == &s___msgGetClsData ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a CLASSDATA item", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgSetShrData || pFuncSym == &s___msgGetShrData ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a SHARED DATA item", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgSuper || pFuncSym == &s___msgRealClass ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a SUPER class casting", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgDestructor ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a DESTRUCTOR method", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgOnError ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a ONERROR method", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgScopeErr ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a SCOPE ERROR method", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgPerform ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a PERFORM method", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgDelegate ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a DELEGATE method", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgSync ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a SYNC method", HB_ERR_FUNCNAME, 0 ); + } + else if( pFuncSym == &s___msgSyncClass ) + { + hb_errRT_BASE( EG_ARG, 3004, "Cannot modify a CLASS SYNC method", HB_ERR_FUNCNAME, 0 ); + } + else { PHB_ITEM pBlock = hb_param( 3, HB_IT_BLOCK ); - - if( pBlock == NULL ) - hb_errRT_BASE( EG_ARG, 3000, "Cannot modify INLINE method", HB_ERR_FUNCNAME, 0 ); + if( pBlock ) + { + if( pFuncSym == &s___msgEvalInline ) + { + hb_arraySet( s_pClasses[ pMethod->uiSprClass ]->pInlines, + pMethod->uiData, pBlock ); + } + else + { + hb_arrayAdd( pClass->pInlines, pBlock ); + pMethod->uiData = ( USHORT ) hb_arrayLen( pClass->pInlines ); + } + } else - hb_arraySet( s_pClasses[ pMethod->uiSprClass ]->pInlines, - pMethod->uiData, pBlock ); - } - else /* Modify METHOD */ - { - pFuncSym = hb_objGetFuncSym( hb_param( 3, HB_IT_ANY ) ); - - if( pFuncSym == NULL ) - hb_errRT_BASE( EG_ARG, 3000, NULL, HB_ERR_FUNCNAME, 0 ); - else - pMethod->pFuncSym = pFuncSym; + { + pFuncSym = hb_objGetFuncSym( hb_param( 3, HB_IT_ANY ) ); + if( pFuncSym ) + { + pMethod->pFuncSym = pFuncSym; + pMethod->uiData = 0; + } + else + hb_errRT_BASE( EG_ARG, 3000, NULL, HB_ERR_FUNCNAME, 0 ); + } } } }