Browse Source

* Add support for weakexternal modifier

Michaël Van Canneyt 1 month ago
parent
commit
1055c7e0de

+ 3 - 2
packages/fcl-passrc/src/pastree.pp

@@ -1137,7 +1137,8 @@ type
                         pmInline, pmAssembler, pmPublic,
                         pmCompilerProc, pmExternal, pmForward, pmDispId,
                         pmNoReturn, pmFar, pmFinal, pmDiscardResult,
-                        pmNoStackFrame, pmsection, pmRtlProc, pmInternProc);
+                        pmNoStackFrame, pmsection, pmRtlProc, pmInternProc,
+                        pmWeakExternal);
   TProcedureModifiers = Set of TProcedureModifier;
   TProcedureMessageType = (pmtNone,pmtInteger,pmtString);
 
@@ -1884,7 +1885,7 @@ const
                    'inline','assembler','public',
                    'compilerproc','external','forward','dispid',
                    'noreturn','far','final','discardresult','nostackframe',
-                   'section','rtlproc','internproc');
+                   'section','rtlproc','internproc','weakexternal');
 
   VariableModifierNames : Array[TVariableModifier] of TPasTreeString
      = ('cvar', 'external', 'public', 'export', 'class', 'static','far');

+ 2 - 2
packages/fcl-passrc/src/pparser.pp

@@ -4355,7 +4355,7 @@ begin
       else if CurToken=tkSemicolon then
         begin
         NextToken;
-        if CurTokenIsIdentifier('external') then
+        if CurTokenIsIdentifier('external') or CurTokenIsIdentifier('weakexternal') then
           begin
           // typed external const without expression is allowed
           Result.IsConst:=true;
@@ -4905,7 +4905,7 @@ begin
     NextToken;
     end;
   s:=LowerCase(CurTokenText);
-  if (vmExternal in AllowedMods) and (s='external') then
+  if (vmExternal in AllowedMods) and ((s='external') or (s='weakexternal')) then
     ExtMod:=vmExternal
   else if (vmPublic in AllowedMods) and (s='public') then
     ExtMod:=vmPublic

+ 17 - 0
packages/fcl-passrc/tests/tcprocfunc.pas

@@ -164,7 +164,9 @@ type
     Procedure TestProcedureCDeclExport;
     Procedure TestFunctionCDeclExport;
     Procedure TestProcedureExternal;
+    Procedure TestProcedureWeakExternal;
     Procedure TestFunctionExternal;
+    Procedure TestFunctionWeakExternal;
     Procedure TestFunctionForwardNoReturnDelphi;
     procedure TestFunctionForwardNoReturnNoDelphi;
     Procedure TestProcedureExternalLibName;
@@ -1210,6 +1212,13 @@ begin
   AssertNull('No Library name expression',Proc.LibraryExpr);
 end;
 
+procedure TTestProcedureFunction.TestProcedureWeakExternal;
+begin
+  ParseProcedure(';weakexternal','');
+  AssertProc([pmWeakExternal],[],ccDefault,0);
+  AssertNull('No Library name expression',Proc.LibraryExpr);
+end;
+
 procedure TTestProcedureFunction.TestFunctionExternal;
 begin
   AddDeclaration('function A : Integer; external');
@@ -1218,6 +1227,14 @@ begin
   AssertNull('No Library name expression',Func.LibraryExpr);
 end;
 
+procedure TTestProcedureFunction.TestFunctionWeakExternal;
+begin
+  AddDeclaration('function A : Integer; weakexternal');
+  ParseFunction;
+  AssertFunc([pmWeakExternal],[],ccDefault,0);
+  AssertNull('No Library name expression',Func.LibraryExpr);
+end;
+
 procedure TTestProcedureFunction.CreateForwardTest;
 
 begin

+ 7 - 0
packages/fcl-passrc/tests/tcvarparser.pas

@@ -59,6 +59,7 @@ Type
     procedure TestVarExternalLibNoName;
     Procedure TestVarCVar;
     Procedure TestVarCVarExternal;
+    Procedure TestVarCVarWeakExternal;
     Procedure TestVarCVarExport;
     Procedure TestVarPublic;
     Procedure TestVarPublicName;
@@ -411,6 +412,12 @@ begin
   AssertEquals('Variable modifiers',[vmcvar,vmexternal],TheVar.VarModifiers);
 end;
 
+procedure TTestVarParser.TestVarCVarWeakExternal;
+begin
+  ParseVar('integer; cvar;weakexternal','');
+  AssertEquals('Variable modifiers',[vmcvar,vmexternal],TheVar.VarModifiers);
+end;
+
 procedure TTestVarParser.TestVarCVarExport;
 begin
   ParseVar('integer; cvar; export','');

+ 2 - 2
packages/fcl-passrc/tests/testpassrc.lpi

@@ -27,13 +27,13 @@
     </PublishOptions>
     <RunParams>
       <local>
-        <CommandLineParams Value="--suite=TTestProcedureFunction.TestFunctionOneConstRefAttributeArg"/>
+        <CommandLineParams Value="--suite=TTestProcedureFunction.TestProcedureWeakExternal"/>
       </local>
       <FormatVersion Value="2"/>
       <Modes Count="1">
         <Mode0 Name="default">
           <local>
-            <CommandLineParams Value="--suite=TTestProcedureFunction.TestFunctionOneConstRefAttributeArg"/>
+            <CommandLineParams Value="--suite=TTestProcedureFunction.TestProcedureWeakExternal"/>
           </local>
         </Mode0>
       </Modes>

+ 2 - 1
packages/pastojs/src/pas2jsfiler.pp

@@ -550,7 +550,8 @@ const
     'NoStackFrame', 
     'section', 
     'RtlProc', 
-    'InternProc'
+    'InternProc',
+    'WeakExternal'
     );
   PCUProcedureModifiersImplProc = [pmInline,pmAssembler,pmCompilerProc,pmNoReturn];