瀏覽代碼

+ added class TNewExeEntryPoint and methods/properties to TNewExeEntryTable to
make it hold a list of entry points

git-svn-id: trunk@42626 -

nickysn 6 年之前
父節點
當前提交
8f3aa92678
共有 1 個文件被更改,包括 66 次插入1 次删除
  1. 66 1
      compiler/ogomf.pas

+ 66 - 1
compiler/ogomf.pas

@@ -570,14 +570,44 @@ interface
         property Size: QWord read GetSize;
       end;
 
+      TNewExeEntryPointFlag = (
+        neepfMovableSegment,
+        neepfExported,
+        neepfSingleData
+      );
+      TNewExeEntryPointFlags = set of TNewExeEntryPointFlag;
+
+      { TNewExeEntryPoint }
+
+      TNewExeEntryPoint = class
+      private
+        FFlags: TNewExeEntryPointFlag;
+        FSegment: Byte;
+        FOffset: Word;
+      public
+        property Flags: TNewExeEntryPointFlag read FFlags write FFlags;
+        property Segment: Byte read FSegment write FSegment;
+        property Offset: Word read FOffset write FOffset;
+      end;
+
       { TNewExeEntryTable }
 
       TNewExeEntryTable = class
-      private
+      strict private
+        FItems: array of TNewExeEntryPoint;
+
+        function GetCount: Word;
+        function GetItems(i: Integer): TNewExeEntryPoint;
         function GetSize: QWord;
+        procedure SetItems(i: Integer; AValue: TNewExeEntryPoint);
       public
+        destructor Destroy;override;
+
         procedure WriteTo(aWriter: TObjectWriter);
+        procedure GrowTo(aNewCount: Word);
         property Size: QWord read GetSize;
+        property Count: Word read GetCount;
+        property Items[i: Integer]: TNewExeEntryPoint read GetItems write SetItems;default;
       end;
 
       { These are fake "meta sections" used by the linker script. The actual
@@ -3961,11 +3991,46 @@ cleanup:
         Result:=0;
       end;
 
+    procedure TNewExeEntryTable.SetItems(i: Integer; AValue: TNewExeEntryPoint);
+      begin
+        if (i<1) or (i>Length(FItems)) then
+          internalerror(2019081002);
+        FItems[i-1]:=AValue;
+      end;
+
+    function TNewExeEntryTable.GetCount: Word;
+      begin
+        Result:=Length(FItems);
+      end;
+
+    function TNewExeEntryTable.GetItems(i: Integer): TNewExeEntryPoint;
+      begin
+        if (i<1) or (i>Length(FItems)) then
+          internalerror(2019081002);
+        Result:=FItems[i-1];
+      end;
+
+    destructor TNewExeEntryTable.Destroy;
+      var
+        i: Integer;
+      begin
+        for i:=low(FItems) to high(FItems) do
+          FreeAndNil(FItems[i]);
+        inherited Destroy;
+      end;
+
     procedure TNewExeEntryTable.WriteTo(aWriter: TObjectWriter);
       begin
         { todo: implement }
       end;
 
+    procedure TNewExeEntryTable.GrowTo(aNewCount: Word);
+      begin
+        if aNewCount<Count then
+          internalerror(2019081003);
+        SetLength(FItems,aNewCount);
+      end;
+
 {****************************************************************************
                               TNewExeSection
 ****************************************************************************}