[dws-developer] DWSII 2.0.beta.1
Brought to you by:
hhernler,
mackermann
From: Matthias A. <mat...@gm...> - 2003-05-18 19:02:58
|
Hello=20 I finally commited my modifications to the CVS (description see = change-log and below). Most changes concern dws2Exprs.pas and deal with some well known = bugs in DWSII 1.1. I tested my modifications against all test cases in the = DWSII-TestBed (dws2tools\TestBed) and all demo programs. But still there my be some = problems. I'm quite sure that there is a problem in dws2ComConnector because of = the dynamic arrays. And I didn't test all Tdws2Unit features.=20 Please inform me if you find bugs or problems or if you need closer = information about my changes.=20 The next thing I intend to do is to create another beta release from = DWSII 2.0.beta.1. Afterwards I'll finish the tasks (e. g. documentation) that = remain to be done before I release DWSII 2.0. regards, Matthias Changes in DWSII 2.0.beta.1 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Low/High/Length/SizeOf ---------------------- Delphi supports some "special" functions that take a type as parameter. = E. g. the function call "Low(TMyArrayType)" returns the lowest index on the = array type TMyArrayType. DWSII now also supports these functions. The necessary = modifications were: Tdws2Compiler.ReadName Tdws2Compiler.ReadSymbol Tdws2Compiler.ReadSpecialFunction (new) dws2Compiler.TSpecialKind (new) TArrayLengthExpr TStringLengthExpr Dynamic Arrays -------------- Because the support for dynamic arrays was in some parts incomplete I = replaced the existing code from Andreas Luleich by another implementation. Now = dynamic array behave almost like Delphi arrays, you can pass them as function = results and the code is simpler and faster now. Dynamic arrays are stored as global variables on the stack. You create such a variable by with dynamic array constant (e. g. "['hello', = 'world']"). Variables of type "array of ..." only hold the (absolute) address of the = first element of the dynamic array. The size of the array is stored at this = address minus one. The new or modified classes and functions are: - TDynamicArraySymbol and TStaticArraySymbol inherit from TArraySymbol Definition of array types. Dynamic array types are "array of Integer" = and static array types "array[0..7] of Integer". TArraySymbol is an = abstract superclass. - TDynamicArrayExpr and TStaticArrayExpr inherit from TArrayExpr TDynamicArrayExpr is used to read and write dynamic arrays, = TStaticArrayExpr for static arrays. TArrayExpr is the abstract superclass for both. - TArrayConstantExpr Creates a initialises a dynamic array. The compiler creates this = objects from DWSII code like "a :=3D [1, 2, 3, 4]". - TProgram.GetGlobalAddr TProgram maintains a second TAddressGenerator to generate addresses = for dynamic arrays. TSymbol ------- The method CopyData() of TSymbol is no longer necessary because of the = new array support. TStack, TDataExpr ----------------- The class TStack was extended with several methods (WriteData, = WriteValue, ReadValue, ReadData, CopyData) to read and write data from the stack. The unit dws2Stack contains a new function CopyData(). TDataExpr was also extended, too. The new (or partially renamed) methods = are AssignData, AssignDataExpr, AssignExpr and AssignValue. Prior to these changes the code in dws2Exprs was full of very similar = code that copied data. Now this code is encapsulated in TDataExpr and TStack. TRecordExpr ----------- Access to record members was achieved by simply altering the offset of = the base expression and by modifing its type. The modification of the type = created several problems. Therefore I introduced TRecordExpr that accesses a single = member of the parent expresssion. Function Results ---------------- To fix fix several bugs I had to introduce temporary variables to store function results. If a function returns a record or a static array the result has to be accessible in the stack-frame of the calling function. Therefore every function has now in the stack-frame of the calling = function a temporary variable to store its result. The functions = TProgram.GetTempAddr and TFuncExpr.SetResultAddr are used to generate and set these variables. |