* Copy & AddRef operators

This commit is contained in:
Michaël Van Canneyt 2022-02-12 14:54:52 +01:00
parent 41e32d0fba
commit c44f82d11a
4 changed files with 16 additions and 7 deletions

View File

@ -1175,8 +1175,11 @@ type
otLogicalAnd, otLogicalNot, otLogicalXor, otLogicalAnd, otLogicalNot, otLogicalXor,
otRightShift, otRightShift,
otEnumerator, otIn, otEnumerator, otIn,
// Management operators
otInitialize, otInitialize,
otFinalize // Management operators otFinalize,
otAddRef,
otCopy
); );
TOperatorTypes = set of TOperatorType; TOperatorTypes = set of TOperatorType;
@ -1765,13 +1768,13 @@ const
'>',':=','<>','<=','>=','**', '>',':=','<>','<=','>=','**',
'><','Inc','Dec','mod','-','+','Or','div', '><','Inc','Dec','mod','-','+','Or','div',
'shl','or','and','xor','and','not','xor', 'shl','or','and','xor','and','not','xor',
'shr','enumerator','in','',''); 'shr','enumerator','in','','','','');
OperatorNames : Array[TOperatorType] of string OperatorNames : Array[TOperatorType] of string
= ('','implicit','explicit','multiply','add','subtract','divide','lessthan','equal', = ('','implicit','explicit','multiply','add','subtract','divide','lessthan','equal',
'greaterthan','assign','notequal','lessthanorequal','greaterthanorequal','power', 'greaterthan','assign','notequal','lessthanorequal','greaterthanorequal','power',
'symmetricaldifference','inc','dec','modulus','negative','positive','bitwiseor','intdivide', 'symmetricaldifference','inc','dec','modulus','negative','positive','bitwiseor','intdivide',
'leftshift','logicalor','bitwiseand','bitwisexor','logicaland','logicalnot','logicalxor', 'leftshift','logicalor','bitwiseand','bitwisexor','logicaland','logicalnot','logicalxor',
'rightshift','enumerator','in','initialize','finalize'); 'rightshift','enumerator','in','initialize','finalize','addref','copy');
AssignKindNames : Array[TAssignKind] of string = (':=','+=','-=','*=','/=' ); AssignKindNames : Array[TAssignKind] of string = (':=','+=','-=','*=','/=' );

View File

@ -5482,7 +5482,7 @@ begin
ExpectToken(tkColon); ExpectToken(tkColon);
ResultEl.ResultType := ParseType(ResultEl,CurSourcePos); ResultEl.ResultType := ParseType(ResultEl,CurSourcePos);
end end
else if not ((Parent is TPasOperator) and (TPasOperator(Parent).OperatorType in [otInitialize,otFinalize])) then else if not ((Parent is TPasOperator) and (TPasOperator(Parent).OperatorType in [otInitialize,otFinalize,otAddRef,otCopy])) then
// Initialize operator has no result // Initialize operator has no result
begin begin
if (CurToken=tkColon) then if (CurToken=tkColon) then

View File

@ -1416,7 +1416,9 @@ begin
// otInitialize has no result // otInitialize has no result
S:=GetEnumName(TypeInfo(TOperatorType),Ord(T)); S:=GetEnumName(TypeInfo(TOperatorType),Ord(T));
ResetParser; ResetParser;
if t in [otInitialize,otFinalize] then if t in [otCopy] then
AddDeclaration(Format('operator %s (constref Src: Integer; var Dest : Integer)',[OperatorNames[t]]))
else if t in [otInitialize,otFinalize,otAddRef] then
AddDeclaration(Format('operator %s (var a: Integer)',[OperatorNames[t]])) AddDeclaration(Format('operator %s (var a: Integer)',[OperatorNames[t]]))
else if t in UnaryOperators then else if t in UnaryOperators then
AddDeclaration(Format('operator %s (a: Integer) : te',[OperatorNames[t]])) AddDeclaration(Format('operator %s (a: Integer) : te',[OperatorNames[t]]))
@ -1425,7 +1427,9 @@ begin
ParseOperator; ParseOperator;
AssertEquals(S+': Token based',t in [otIn],FOperator.TokenBased); AssertEquals(S+': Token based',t in [otIn],FOperator.TokenBased);
AssertEquals(S+': Correct operator type',T,FOperator.OperatorType); AssertEquals(S+': Correct operator type',T,FOperator.OperatorType);
if t in [otInitialize,otFinalize] then if t in [otCopy] then
AssertEquals('Correct operator name',format('%s(Integer,Integer)',[OperatorNames[t]]),FOperator.Name)
else if t in [otInitialize,otFinalize,otAddRef] then
AssertEquals('Correct operator name',format('%s(Integer)',[OperatorNames[t]]),FOperator.Name) AssertEquals('Correct operator name',format('%s(Integer)',[OperatorNames[t]]),FOperator.Name)
else if t in UnaryOperators then else if t in UnaryOperators then
AssertEquals('Correct operator name',format('%s(Integer):te',[OperatorNames[t]]),FOperator.Name) AssertEquals('Correct operator name',format('%s(Integer):te',[OperatorNames[t]]),FOperator.Name)

View File

@ -494,7 +494,9 @@ const
'Enumerator', 'Enumerator',
'In', 'In',
'Initialize', 'Initialize',
'Finalize' 'Finalize',
'AddRef',
'Copy'
); );
PCUProcedureModifierNames: array[TProcedureModifier] of string = ( PCUProcedureModifierNames: array[TProcedureModifier] of string = (