2001-11-18 22:15 GMT+1 JFL (mafact) <jfl@mafact.com>

This commit is contained in:
Jean-Francois Lefebvre
2001-11-18 21:20:09 +00:00
parent 430fb7324e
commit 891690234d
5 changed files with 179 additions and 100 deletions

View File

@@ -1,3 +1,18 @@
2001-11-18 22:15 GMT+1 JFL (mafact) <jfl@mafact.com>
* harbour/source/vm/classes.c
* change CLSADDMSG() to intercept Operator overloading and
use standardised symbol in place of operator itself
(like "-" => "__OpLess" )
* harbour/source/vm/hvm.c
* Modif done to send correct message to object as newly defined
* harbour/include/hbclass.ch
+ added an OPERATOR command for Inline use now we can define an OPERATOR
using inline only like ;
OPERATOR "-" ARG xARg INLINE ::cValue - xArg
see new test overload.prg
* harbour/tests/overload.prg
adapted to command mode and use of the new OPERATOR INLINE command
2001-11-17 15:40 GMT+0700 Andi Jahja <harbour@cbn.net.id>
* source/lang/msgzhbig.c
- remove msgzhbig.c as it was replaced by msgzhb5.c

View File

@@ -404,6 +404,12 @@ DECLARE HBClass ;
s_oClass:AddInline( <(op)>, {|Self [,<params>] | Self:<MethodName>( [<params>] ) }, HBCLSCHOICE( <.export.>, <.protect.>, <.hidde.> ) )
#endif
#xcommand OPERATOR <op> ARG <cArg> INLINE <Code,...> [ <export: EXPORTED, VISIBLE>] [<protect: PROTECTED>] [<hidde: HIDDEN>] => ;
s_oClass:AddInline( <(op)>, {|Self, <cArg> | <Code> }, HBCLSCHOICE( <.export.>, <.protect.>, <.hidde.> ) )
//command OPERATOR <op> ARG <cArg> INLINE [Local lx,...] <Code,...> [ <export: EXPORTED, VISIBLE>] [<protect: PROTECTED>] [<hidde: HIDDEN>] => ;
//oClass:AddInline( <(op)>, {|Self, <cArg> [,<lx>] | <Code> }, HBCLSCHOICE( <.export.>, <.protect.>, <.hidde.> ) )
#ifdef STRICT_OO
#xcommand MESSAGE <MessageName> [ AS <type> ] METHOD <MethodName> [ <ctor: CONSTRUCTOR> ] [ <export: EXPORTED, VISIBLE>] [<protect: PROTECTED>] [<hidde: HIDDEN>] => ;
_HB_MEMBER <MessageName>() [<-ctor-> AS CLASS _CLASS_NAME_] [ AS <type> ];;

View File

@@ -78,7 +78,7 @@
* Copyright 1999 Janica Lubos <janica@fornax.elf.stuba.sk>
* hb_clsDictRealloc()
*
* Copyright 2000 ( ->07/2000 ) JF. Lefebvre <jfl@mafact.com> & RA. Cuylen <rac@mafact.com>
* Copyright 2000 ( ->07/2000 ) JF. Lefebvre <jfl@mafact.com> & RA. Cuylen <cakiral@altern.org
* Multiple inheritence fully implemented
* Forwarding, delegating
* Data initialisation & Autoinit for Bool and Numeric
@@ -101,9 +101,39 @@
* __CLS_PAR00() (Allow the creation of class wich not autoinherit of the default HBObject)
* Adding HB_CLS_ENFORCERO FLAG to disable Write access to RO VAR
* outside of Constructors /!\ Could be related to some incompatibility
* Added hb_objGetRealClsName to keep a full class tree
* Added hb_objGetRealClsName to keep a full class tree ( for 99% cases )
* Fixed hb_clsIsParent
*
*
* hb_objGetMthd() & __CLSADDMSG modified to translate the followings operators
*
"+" = __OpPlus
"-" = __OpMinus
"*" = __OpMult
"/" = __OpDivide
"%" = __OpMod
"^" = __OpPower
"**" = __OpMod (currently it's different from "^", but this is not in sync,
with Clipper syntax, where these two are synonims)
"++" = __OpInc
"--" = __OpDec
"==" = __OpEqual
"=" = __OpEqual (same as "==")
"!=" = __OpNotEqual
"<>" = __OpNotEqual (same as "!=")
"#" = __OpNotEqual (same as "!=")
"<" = __OpLess
"<=" = __OpLessEqual
">" = __OpGreater
">=" = __OpGreaterEqual
"$" = __OpInstring
"!" = __OpNot
".NOT." = __OpNot (same as "!")
".AND." = __OpAnd
".OR." = __OpOr
":=" = __OpAssign ... not tested ...
*
*
* See doc/license.txt for licensing terms.
*
*/
@@ -762,6 +792,7 @@ PHB_FUNC hb_objGetMthd( PHB_ITEM pObject, PHB_SYMB pMessage, BOOL lAllowErrFunc
while( uiAt != uiLimit )
{
if( pClass->pMethods[ uiAt ].pMessage == pMsg )
{
pMethod = pClass->pMethods + uiAt;
@@ -907,6 +938,8 @@ ULONG hb_objHasMsg( PHB_ITEM pObject, char *szString )
* HB_OO_CLSTP_CLASS 64 : message is the name of a superclass
* HB_OO_CLSTP_SUPER 128 : message is herited
*/
HB_FUNC( __CLSADDMSG )
{
USHORT uiClass = ( USHORT ) hb_parni( 1 );
@@ -916,13 +949,66 @@ HB_FUNC( __CLSADDMSG )
if( uiClass && uiClass <= s_uiClasses )
{
PCLASS pClass = s_pClasses + ( uiClass - 1 );
PHB_DYNS pMessage = hb_dynsymGet( hb_parc( 2 ) );
PHB_DYNS pMessage ;
USHORT uiBucket;
USHORT wType = ( USHORT ) hb_parni( 4 );
USHORT uiAt;
PMETHOD pNewMeth;
if (strcmp("+",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpPlus" ) ;
else if (strcmp("-",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpMinus") ;
else if (strcmp("*",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpMult" ) ;
else if (strcmp("/",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpDivide") ;
else if (strcmp("%",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpMod" ) ;
else if (strcmp("^",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpPower") ;
else if (strcmp("**",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpMod" ) ;
else if (strcmp("++",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpInc" ) ;
else if (strcmp("--",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpDec" ) ;
else if (strcmp("==",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpEqual") ;
else if (strcmp("=",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpEqual") ;
else if (strcmp("!=",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpNotEqual") ;
else if (strcmp("<>",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpNotEqual") ;
else if (strcmp("#",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpNotEqual") ;
else if (strcmp("<",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpLess" ) ;
else if (strcmp("<=",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpLessEqual") ;
else if (strcmp(">",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpGreater") ;
else if (strcmp(">=",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpGreaterEqual") ;
else if (strcmp(":=",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpAssign") ;
else if (strcmp("$",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpInstring") ;
else if (strcmp("!",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpNot" ) ;
else if (strcmp(".NOT.",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpNot" ) ;
else if (strcmp(".AND.",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpAnd" ) ;
else if (strcmp(".OR.",hb_parc(2)) == 0)
pMessage = hb_dynsymGet( "__OpOr" ) ;
else
pMessage = hb_dynsymGet( hb_parc( 2 ) );
if( wType == HB_OO_MSG_INLINE && hb_param( 3, HB_IT_BLOCK ) == NULL )
hb_errRT_BASE( EG_ARG, 3000, NULL, "__CLSADDMSG", 0 );
@@ -964,7 +1050,7 @@ HB_FUNC( __CLSADDMSG )
pNewMeth->ulRecurse = 0;
pNewMeth->bIsPersistent = bPersistent;
/* in cas eof re-used message */
/* in case of re-used message */
if ( pNewMeth->pInitValue )
{
hb_itemRelease(pNewMeth->pInitValue) ;

View File

@@ -1666,9 +1666,8 @@ static void hb_vmPlus( void )
hb_vmPushDate( lDate1 + lNumber2 );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "+" ) )
hb_vmOperatorCall( pItem1, pItem2, "+" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpPlus" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPPLUS" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1081, NULL, "+", 2, pItem1, pItem2 );
@@ -1742,9 +1741,8 @@ static void hb_vmMinus( void )
else
hb_errRT_BASE( EG_STROVERFLOW, 1210, NULL, "-", 2, pItem1, pItem2 );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "-" ) )
hb_vmOperatorCall( pItem1, pItem2, "-" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpMinus" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPMINUS" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1082, NULL, "-", 2, pItem1, pItem2 );
@@ -1778,9 +1776,8 @@ static void hb_vmMult( void )
hb_vmPushNumType( d1 * d2, iDec1 + iDec2, iType1, iType2 );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "*" ) )
hb_vmOperatorCall( pItem1, pItem2, "*" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpMult" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPMULT" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1083, NULL, "*", 2, pItem1, pItem2 );
@@ -1836,9 +1833,8 @@ static void hb_vmDivide( void )
}
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "/" ) )
hb_vmOperatorCall( pItem1, pItem2, "/" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpDivide" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPDIVIDE" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1084, NULL, "/", 2, pItem1, pItem2 );
@@ -1885,9 +1881,8 @@ static void hb_vmModulus( void )
hb_vmPushNumType( fmod( d1, d2 ), hb_set.HB_SET_DECIMALS, iType1, iType2 );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "%" ) )
hb_vmOperatorCall( pItem1, pItem2, "%" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpMod" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPMOD" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1085, NULL, "%", 2, pItem1, pItem2 );
@@ -1922,12 +1917,10 @@ static void hb_vmPower( void )
hb_vmPushDouble( pow( d1, d2 ), hb_set.HB_SET_DECIMALS );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "^" ) )
hb_vmOperatorCall( pItem1, pItem2, "^" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "**" ) )
hb_vmOperatorCall( pItem1, pItem2, "**" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpPower" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPPOWER" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpMod" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPMOD" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1088, NULL, "^", 2, pItem1, pItem2 );
@@ -1958,10 +1951,8 @@ static void hb_vmInc( void )
}
else if( HB_IS_DATE( pItem ) )
hb_vmPushDate( hb_vmPopDate() + 1 );
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, "++" ) )
hb_vmOperatorCallUnary( hb_stackItemFromTop( -1 ), "++" );
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, "__OpInc" ) )
hb_vmOperatorCallUnary( hb_stackItemFromTop( -1 ), "__OPINC" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1086, NULL, "++", 1, pItem );
@@ -1991,10 +1982,8 @@ static void hb_vmDec( void )
}
else if( HB_IS_DATE( pItem) )
hb_vmPushDate( hb_vmPopDate() - 1 );
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, "--" ) )
hb_vmOperatorCallUnary( pItem, "--" );
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, "__OpDec" ) )
hb_vmOperatorCallUnary( pItem, "__OPDEC" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1087, NULL, "--", 1, pItem );
@@ -2063,19 +2052,12 @@ static void hb_vmEqual( BOOL bExact )
else if( HB_IS_NUMERIC( pItem1 ) && HB_IS_NUMERIC( pItem2 ) )
hb_vmPushLogical( hb_vmPopNumber() == hb_vmPopNumber() );
else if( HB_IS_DATE( pItem1 ) && HB_IS_DATE( pItem2 ) )
hb_vmPushLogical( hb_vmPopDate() == hb_vmPopDate() );
else if( HB_IS_LOGICAL( pItem1 ) && HB_IS_LOGICAL( pItem2 ) )
hb_vmPushLogical( hb_vmPopLogical() == hb_vmPopLogical() );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "==" ) )
hb_vmOperatorCall( pItem1, pItem2, "==" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "=" ) )
hb_vmOperatorCall( pItem1, pItem2, "=" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpEqual" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPEQUAL" );
else if( bExact && HB_IS_ARRAY( pItem1 ) && HB_IS_ARRAY( pItem2 ) )
{
BOOL bResult = pItem1->item.asArray.value->pItems && pItem2->item.asArray.value->pItems &&
@@ -2145,22 +2127,12 @@ static void hb_vmNotEqual( void )
else if( HB_IS_NUMERIC( pItem1 ) && HB_IS_NUMERIC( pItem2 ) )
hb_vmPushLogical( hb_vmPopNumber() != hb_vmPopNumber() );
else if( HB_IS_DATE( pItem1 ) && HB_IS_DATE( pItem2 ) )
hb_vmPushLogical( hb_vmPopDate() != hb_vmPopDate() );
else if( HB_IS_LOGICAL( pItem1 ) && HB_IS_LOGICAL( pItem2 ) )
hb_vmPushLogical( hb_vmPopLogical() != hb_vmPopLogical() );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "!=" ) )
hb_vmOperatorCall( pItem1, pItem2, "!=" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "<>" ) )
hb_vmOperatorCall( pItem1, pItem2, "<>" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "#" ) )
hb_vmOperatorCall( pItem1, pItem2, "#" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpNotEqual" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPNOTEQUAL" );
else if( pItem1->type != pItem2->type ||
( HB_IS_BLOCK( pItem1 ) && HB_IS_BLOCK( pItem2 ) ) ||
( HB_IS_ARRAY( pItem1 ) && HB_IS_ARRAY( pItem2 ) ) )
@@ -2194,31 +2166,26 @@ static void hb_vmLess( void )
hb_stackPop();
hb_vmPushLogical( i < 0 );
}
else if( HB_IS_NUMERIC( hb_stackItemFromTop( - 1 ) ) && HB_IS_NUMERIC( hb_stackItemFromTop( -2 ) ) )
{
double dNumber2 = hb_vmPopNumber();
double dNumber1 = hb_vmPopNumber();
hb_vmPushLogical( dNumber1 < dNumber2 );
}
else if( HB_IS_DATE( hb_stackItemFromTop( -1 ) ) && HB_IS_DATE( hb_stackItemFromTop( -2 ) ) )
{
long lDate2 = hb_vmPopDate();
long lDate1 = hb_vmPopDate();
hb_vmPushLogical( lDate1 < lDate2 );
}
else if( HB_IS_LOGICAL( hb_stackItemFromTop( -1 ) ) && HB_IS_LOGICAL( hb_stackItemFromTop( -2 ) ) )
{
BOOL bLogical2 = hb_vmPopLogical();
BOOL bLogical1 = hb_vmPopLogical();
hb_vmPushLogical( bLogical1 < bLogical2 );
}
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), "<" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), "<" );
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), "__OpLess" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), "__OPLESS" );
else
{
PHB_ITEM pItem2 = hb_stackItemFromTop( -1 );
@@ -2246,31 +2213,26 @@ static void hb_vmLessEqual( void )
hb_stackPop();
hb_vmPushLogical( i <= 0 );
}
else if( HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) && HB_IS_NUMERIC( hb_stackItemFromTop( -2 ) ) )
{
double dNumber2 = hb_vmPopNumber();
double dNumber1 = hb_vmPopNumber();
hb_vmPushLogical( dNumber1 <= dNumber2 );
}
else if( HB_IS_DATE( hb_stackItemFromTop( -1 ) ) && HB_IS_DATE( hb_stackItemFromTop( -2 ) ) )
{
long lDate2 = hb_vmPopDate();
long lDate1 = hb_vmPopDate();
hb_vmPushLogical( lDate1 <= lDate2 );
}
else if( HB_IS_LOGICAL( hb_stackItemFromTop( -1 ) ) && HB_IS_LOGICAL( hb_stackItemFromTop( -2 ) ) )
{
BOOL bLogical2 = hb_vmPopLogical();
BOOL bLogical1 = hb_vmPopLogical();
hb_vmPushLogical( bLogical1 <= bLogical2 );
}
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), "<=" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), "<=" );
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), "__OpLessEqual" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), "__OPLESSEQUAL" );
else
{
PHB_ITEM pItem2 = hb_stackItemFromTop( -1 );
@@ -2298,31 +2260,26 @@ static void hb_vmGreater( void )
hb_stackPop();
hb_vmPushLogical( i > 0 );
}
else if( HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) && HB_IS_NUMERIC( hb_stackItemFromTop( -2 ) ) )
{
double dNumber2 = hb_vmPopNumber();
double dNumber1 = hb_vmPopNumber();
hb_vmPushLogical( dNumber1 > dNumber2 );
}
else if( HB_IS_DATE( hb_stackItemFromTop( -1 ) ) && HB_IS_DATE( hb_stackItemFromTop( -2 ) ) )
{
long lDate2 = hb_vmPopDate();
long lDate1 = hb_vmPopDate();
hb_vmPushLogical( lDate1 > lDate2 );
}
else if( HB_IS_LOGICAL( hb_stackItemFromTop( -1 ) ) && HB_IS_LOGICAL( hb_stackItemFromTop( -2 ) ) )
{
BOOL bLogical2 = hb_vmPopLogical();
BOOL bLogical1 = hb_vmPopLogical();
hb_vmPushLogical( bLogical1 > bLogical2 );
}
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), ">" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), ">" );
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), "__OpGreater" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), "__OPGREATER" );
else
{
PHB_ITEM pItem2 = hb_stackItemFromTop( -1 );
@@ -2350,31 +2307,26 @@ static void hb_vmGreaterEqual( void )
hb_stackPop();
hb_vmPushLogical( i >= 0 );
}
else if( HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) && HB_IS_NUMERIC( hb_stackItemFromTop( -2 ) ) )
{
double dNumber2 = hb_vmPopNumber();
double dNumber1 = hb_vmPopNumber();
hb_vmPushLogical( dNumber1 >= dNumber2 );
}
else if( HB_IS_DATE( hb_stackItemFromTop( -1 ) ) && HB_IS_DATE( hb_stackItemFromTop( -2 ) ) )
{
long lDate2 = hb_vmPopDate();
long lDate1 = hb_vmPopDate();
hb_vmPushLogical( lDate1 >= lDate2 );
}
else if( HB_IS_LOGICAL( hb_stackItemFromTop( -1 ) ) && HB_IS_LOGICAL( hb_stackItemFromTop( -2 ) ) )
{
BOOL bLogical2 = hb_vmPopLogical();
BOOL bLogical1 = hb_vmPopLogical();
hb_vmPushLogical( bLogical1 >= bLogical2 );
}
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), ">=" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), ">=" );
else if( HB_IS_OBJECT( hb_stackItemFromTop( -2 ) ) && hb_objHasMsg( hb_stackItemFromTop( -2 ), "__OpGreaterEqual" ) )
hb_vmOperatorCall( hb_stackItemFromTop( -2 ), hb_stackItemFromTop( -1 ), "__OPGREATEREQUAL" );
else
{
PHB_ITEM pItem2 = hb_stackItemFromTop( -1 );
@@ -2409,8 +2361,8 @@ static void hb_vmInstring( void )
hb_stackPop();
hb_vmPushLogical( bResult );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "$" ) )
hb_vmOperatorCall( pItem1, pItem2, "$" );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpInstring" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPINSTRING" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1109, NULL, "$", 2, pItem1, pItem2 );
@@ -2512,13 +2464,8 @@ static void hb_vmNot( void )
if( HB_IS_LOGICAL( pItem ) )
pItem->item.asLogical.value = ! pItem->item.asLogical.value;
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, "!" ) )
hb_vmOperatorCallUnary( pItem, "!" );
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, ".NOT." ) )
hb_vmOperatorCallUnary( pItem, ".NOT." );
else if( HB_IS_OBJECT( pItem ) && hb_objHasMsg( pItem, "__OpNot" ) )
hb_vmOperatorCallUnary( pItem, "__OPNOT" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1077, NULL, ".NOT.", 1, pItem );
@@ -2549,10 +2496,8 @@ static void hb_vmAnd( void )
hb_stackPop();
hb_vmPushLogical( bResult );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, ".AND." ) )
hb_vmOperatorCall( pItem1, pItem2, ".AND." );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpAnd" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPAND" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1078, NULL, ".AND.", 2, pItem1, pItem2 );
@@ -2584,10 +2529,8 @@ static void hb_vmOr( void )
hb_stackPop();
hb_vmPushLogical( bResult );
}
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, ".OR." ) )
hb_vmOperatorCall( pItem1, pItem2, ".OR." );
else if( HB_IS_OBJECT( pItem1 ) && hb_objHasMsg( pItem1, "__OpOr" ) )
hb_vmOperatorCall( pItem1, pItem2, "__OPOR" );
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1079, NULL, ".OR.", 2, pItem1, pItem2 );
@@ -4760,4 +4703,4 @@ HB_FUNC( __TRACEPRGCALLS )
hb_bTracePrgCalls = hb_parl( 1 );
hb_retl( bOldValue );
}
}

View File

@@ -12,9 +12,14 @@
// Written by Eddie Runia <eddie@runia.com>
// www - http://www.harbour-project.org
//
// Jfl 2001/11/18 command mode added
//
// Placed in the public domain
//
#include "hbclass.ch"
function Main()
local oString := TString():New( "Hello" )
@@ -40,6 +45,28 @@ function Main()
return nil
create class tString
VAR cValue
METHOD New(cText) INLINE ::cValue := cText, self
OPERATOR "==" ARG cArg INLINE ::cValue == cArg
OPERATOR "!=" ARG cArg INLINE ::cValue != cArg
OPERATOR "<" ARG cArg INLINE ::cValue < cArg
OPERATOR "<=" ARG cArg INLINE ::cValue <= cArg
OPERATOR ">" ARG cArg INLINE ::cValue > cArg
OPERATOR ">=" ARG cArg INLINE ::cValue >= cArg
OPERATOR "+" ARG cArg INLINE ::cValue + cArg
OPERATOR "-" ARG cArg INLINE ::cValue - cArg
OPERATOR "$" ARG cArg INLINE ::cValue $ cArg
endclass
/*
function TString()
static oClass
@@ -75,3 +102,5 @@ static function New( cText )
::cValue := cText
return Self
*/