mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-06-25 16:29:56 +00:00
Add a function to make a pointer type.
This allows us to refactor out code that was doing this in several places.
This commit is contained in:
parent
e5501dc902
commit
5e20e02d06
|
@ -2870,13 +2870,7 @@ var
|
||||||
private: Gen1Name(pc_lao, 0, tname);
|
private: Gen1Name(pc_lao, 0, tname);
|
||||||
otherwise: ;
|
otherwise: ;
|
||||||
end; {case}
|
end; {case}
|
||||||
eType := pointer(Malloc(sizeof(typeRecord)));
|
expressionType := MakePointerTo(iType);
|
||||||
eType^.size := cgPointerSize;
|
|
||||||
eType^.saveDisp := 0;
|
|
||||||
eType^.qualifiers := [];
|
|
||||||
eType^.kind := pointerType;
|
|
||||||
eType^.pType := iType;
|
|
||||||
expressionType := eType;
|
|
||||||
end; {with}
|
end; {with}
|
||||||
end {if}
|
end {if}
|
||||||
else if tree^.token.kind = compoundliteral then begin
|
else if tree^.token.kind = compoundliteral then begin
|
||||||
|
@ -2914,13 +2908,7 @@ var
|
||||||
GenLdcLong(size);
|
GenLdcLong(size);
|
||||||
Gen0(pc_adl);
|
Gen0(pc_adl);
|
||||||
end; {else}
|
end; {else}
|
||||||
eType := pointer(Malloc(sizeof(typeRecord)));
|
expressionType := MakePointerTo(expressionType);
|
||||||
eType^.size := cgPointerSize;
|
|
||||||
eType^.saveDisp := 0;
|
|
||||||
eType^.qualifiers := [];
|
|
||||||
eType^.kind := pointerType;
|
|
||||||
eType^.pType := expressionType;
|
|
||||||
expressionType := eType;
|
|
||||||
end {if}
|
end {if}
|
||||||
else
|
else
|
||||||
Error(79);
|
Error(79);
|
||||||
|
@ -2930,15 +2918,8 @@ var
|
||||||
{load the address of a field of a record}
|
{load the address of a field of a record}
|
||||||
LoadAddress(tree^.left);
|
LoadAddress(tree^.left);
|
||||||
expressionType := tree^.castType;
|
expressionType := tree^.castType;
|
||||||
if expressionType^.kind <> arrayType then begin
|
if expressionType^.kind <> arrayType then
|
||||||
eType := pointer(Malloc(sizeof(typeRecord)));
|
expressionType := MakePointerTo(expressionType);
|
||||||
eType^.size := cgPointerSize;
|
|
||||||
eType^.saveDisp := 0;
|
|
||||||
eType^.qualifiers := [];
|
|
||||||
eType^.kind := pointerType;
|
|
||||||
eType^.pType := expressionType;
|
|
||||||
expressionType := eType;
|
|
||||||
end; {if}
|
|
||||||
end {else if}
|
end {else if}
|
||||||
|
|
||||||
else if ExpressionKind(tree) in [arrayType,pointerType,structType,unionType]
|
else if ExpressionKind(tree) in [arrayType,pointerType,structType,unionType]
|
||||||
|
@ -4233,15 +4214,8 @@ case tree^.token.kind of
|
||||||
else
|
else
|
||||||
lType := lType^.pType;
|
lType := lType^.pType;
|
||||||
ChangePointer(pc_adl, lType^.size, et);
|
ChangePointer(pc_adl, lType^.size, et);
|
||||||
if expressionType^.kind = arrayType then begin
|
if expressionType^.kind = arrayType then
|
||||||
tType := pointer(Malloc(sizeof(typeRecord)));
|
expressionType := MakePointerTo(expressionType^.aType);
|
||||||
tType^.size := cgPointerSize;
|
|
||||||
tType^.saveDisp := 0;
|
|
||||||
tType^.qualifiers := [];
|
|
||||||
tType^.kind := pointerType;
|
|
||||||
tType^.pType := expressionType^.aType;
|
|
||||||
expressionType := tType;
|
|
||||||
end; {if}
|
|
||||||
end {if}
|
end {if}
|
||||||
else begin
|
else begin
|
||||||
|
|
||||||
|
@ -4289,15 +4263,8 @@ case tree^.token.kind of
|
||||||
{subtract a scalar from a pointer}
|
{subtract a scalar from a pointer}
|
||||||
ChangePointer(pc_sbl, size, UsualUnaryConversions);
|
ChangePointer(pc_sbl, size, UsualUnaryConversions);
|
||||||
expressionType := lType;
|
expressionType := lType;
|
||||||
if expressionType^.kind = arrayType then begin
|
if expressionType^.kind = arrayType then
|
||||||
tType := pointer(Malloc(sizeof(typeRecord)));
|
expressionType := MakePointerTo(expressionType^.aType);
|
||||||
tType^.size := cgPointerSize;
|
|
||||||
tType^.saveDisp := 0;
|
|
||||||
tType^.qualifiers := [];
|
|
||||||
tType^.kind := pointerType;
|
|
||||||
tType^.pType := expressionType^.aType;
|
|
||||||
expressionType := tType;
|
|
||||||
end; {if}
|
|
||||||
end {if}
|
end {if}
|
||||||
else begin
|
else begin
|
||||||
|
|
||||||
|
@ -4517,28 +4484,14 @@ case tree^.token.kind of
|
||||||
if tree^.left^.token.kind = stringconst then begin
|
if tree^.left^.token.kind = stringconst then begin
|
||||||
{build pointer-to-array type for address of string constant}
|
{build pointer-to-array type for address of string constant}
|
||||||
tType := pointer(Malloc(sizeof(typeRecord)));
|
tType := pointer(Malloc(sizeof(typeRecord)));
|
||||||
with tType^ do begin
|
tType^ := StringType(tree^.left^.token.prefix)^;
|
||||||
size := cgPointerSize;
|
tType^.size := tree^.left^.token.sval^.length;
|
||||||
saveDisp := 0;
|
|
||||||
qualifiers := [];
|
|
||||||
kind := pointerType;
|
|
||||||
pType := pointer(Malloc(sizeof(typeRecord)));
|
|
||||||
pType^ := StringType(tree^.left^.token.prefix)^;
|
|
||||||
pType^.size := tree^.left^.token.sval^.length;
|
|
||||||
pType^.saveDisp := 0;
|
|
||||||
pType^.elements := pType^.size div pType^.aType^.size;
|
|
||||||
end; {with}
|
|
||||||
expressionType := tType;
|
|
||||||
end {if}
|
|
||||||
else if expressionType^.kind = arrayType then begin
|
|
||||||
tType := pointer(Malloc(sizeof(typeRecord)));
|
|
||||||
tType^.size := cgPointerSize;
|
|
||||||
tType^.saveDisp := 0;
|
tType^.saveDisp := 0;
|
||||||
tType^.qualifiers := [];
|
tType^.elements := tType^.size div tType^.aType^.size;
|
||||||
tType^.kind := pointerType;
|
expressionType := MakePointerTo(tType);
|
||||||
tType^.pType := expressionType^.aType;
|
end {if}
|
||||||
expressionType := tType;
|
else if expressionType^.kind = arrayType then
|
||||||
end; {else if}
|
expressionType := MakePointerTo(expressionType^.aType);
|
||||||
end; {case uand}
|
end; {case uand}
|
||||||
|
|
||||||
uasterisk: begin {unary * (indirection)}
|
uasterisk: begin {unary * (indirection)}
|
||||||
|
|
11
Parser.pas
11
Parser.pas
|
@ -1698,15 +1698,8 @@ while typeStack <> nil do begin {reverse the type stack}
|
||||||
end; {while}
|
end; {while}
|
||||||
|
|
||||||
if doingParameters then {adjust array parameters to pointers}
|
if doingParameters then {adjust array parameters to pointers}
|
||||||
if tPtr^.kind = arrayType then begin
|
if tPtr^.kind = arrayType then
|
||||||
tPtr2 := pointer(Calloc(sizeof(typeRecord)));
|
tPtr := MakePointerTo(tPtr^.aType);
|
||||||
tPtr2^.size := cgPointerSize;
|
|
||||||
{tPtr2^.qualifiers := [];}
|
|
||||||
{tPtr2^.saveDisp := 0;}
|
|
||||||
tPtr2^.kind := pointerType;
|
|
||||||
tPtr2^.pType := tPtr^.aType;
|
|
||||||
tPtr := tPtr2;
|
|
||||||
end; {if}
|
|
||||||
|
|
||||||
if checkParms then begin {check for parameter type conflicts}
|
if checkParms then begin {check for parameter type conflicts}
|
||||||
with variable^ do begin
|
with variable^ do begin
|
||||||
|
|
34
Symbol.pas
34
Symbol.pas
|
@ -182,6 +182,16 @@ function MakePascalType (origType: typePtr): typePtr;
|
||||||
{ returns: pointer to the pascal-qualified type }
|
{ returns: pointer to the pascal-qualified type }
|
||||||
|
|
||||||
|
|
||||||
|
function MakePointerTo (pType: typePtr): typePtr;
|
||||||
|
|
||||||
|
{ make a pointer type }
|
||||||
|
{ }
|
||||||
|
{ parameters: }
|
||||||
|
{ pType - the type pointed to }
|
||||||
|
{ }
|
||||||
|
{ returns: the pointer type }
|
||||||
|
|
||||||
|
|
||||||
function MakeQualifiedType (origType: typePtr; qualifiers: typeQualifierSet):
|
function MakeQualifiedType (origType: typePtr; qualifiers: typeQualifierSet):
|
||||||
typePtr;
|
typePtr;
|
||||||
|
|
||||||
|
@ -1749,6 +1759,30 @@ while tp <> nil do
|
||||||
end; {MakePascalType}
|
end; {MakePascalType}
|
||||||
|
|
||||||
|
|
||||||
|
function MakePointerTo {pType: typePtr): typePtr};
|
||||||
|
|
||||||
|
{ make a pointer type }
|
||||||
|
{ }
|
||||||
|
{ parameters: }
|
||||||
|
{ pType - the type pointed to }
|
||||||
|
{ }
|
||||||
|
{ returns: the pointer type }
|
||||||
|
|
||||||
|
var
|
||||||
|
tp: typePtr; {the pointer type}
|
||||||
|
|
||||||
|
|
||||||
|
begin {MakePointerTo}
|
||||||
|
tp := pointer(Malloc(sizeof(typeRecord)));
|
||||||
|
tp^.size := cgPointerSize;
|
||||||
|
tp^.saveDisp := 0;
|
||||||
|
tp^.qualifiers := [];
|
||||||
|
tp^.kind := pointerType;
|
||||||
|
tp^.pType := pType;
|
||||||
|
MakePointerTo := tp;
|
||||||
|
end; {MakePointerTo}
|
||||||
|
|
||||||
|
|
||||||
function MakeQualifiedType {origType: typePtr; qualifiers: typeQualifierSet):
|
function MakeQualifiedType {origType: typePtr; qualifiers: typeQualifierSet):
|
||||||
typePtr};
|
typePtr};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user