From 446569c31a2c041243f74b206bd394a966ae5cf8 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Tue, 17 Aug 2021 08:41:01 +0200 Subject: [PATCH] Revert "introduce FieldState (#12980)" This reverts commit f0eedb426fc21ac2b5bad8d08eeb4818fe7033d0. --- src/dmd/attrib.d | 16 ++++++++-------- src/dmd/attrib.h | 4 ++-- src/dmd/dclass.d | 5 ++--- src/dmd/declaration.d | 10 +++++----- src/dmd/declaration.h | 2 +- src/dmd/dstruct.d | 4 ++-- src/dmd/dsymbol.d | 12 +----------- src/dmd/dsymbol.h | 7 +------ src/dmd/dtemplate.d | 4 ++-- src/dmd/frontend.h | 26 ++++++-------------------- src/dmd/nspace.d | 4 ++-- src/dmd/nspace.h | 2 +- src/dmd/template.h | 2 +- 13 files changed, 34 insertions(+), 64 deletions(-) diff --git a/src/dmd/attrib.d b/src/dmd/attrib.d index ae8f65b6daa0..fd65c6cd95ba 100644 --- a/src/dmd/attrib.d +++ b/src/dmd/attrib.d @@ -174,9 +174,9 @@ extern (C++) abstract class AttribDeclaration : Dsymbol return Dsymbol.oneMembers(d, ps, ident); } - override void setFieldOffset(AggregateDeclaration ad, ref FieldState fieldState, bool isunion) + override void setFieldOffset(AggregateDeclaration ad, uint* poffset, bool isunion) { - include(null).foreachDsymbol( s => s.setFieldOffset(ad, fieldState, isunion) ); + include(null).foreachDsymbol( s => s.setFieldOffset(ad, poffset, isunion) ); } override final bool hasPointers() @@ -770,7 +770,7 @@ extern (C++) final class AnonDeclaration : AttribDeclaration return AttribDeclaration.setScope(sc); } - override void setFieldOffset(AggregateDeclaration ad, ref FieldState fieldState, bool isunion) + override void setFieldOffset(AggregateDeclaration ad, uint* poffset, bool isunion) { //printf("\tAnonDeclaration::setFieldOffset %s %p\n", isunion ? "union" : "struct", this); if (decl) @@ -789,12 +789,12 @@ extern (C++) final class AnonDeclaration : AttribDeclaration ad.structsize = 0; ad.alignsize = 0; - FieldState fs; + uint offset = 0; decl.foreachDsymbol( (s) { - s.setFieldOffset(ad, fs, this.isunion); + s.setFieldOffset(ad, &offset, this.isunion); if (this.isunion) - fs.offset = 0; + offset = 0; }); /* https://issues.dlang.org/show_bug.cgi?id=13613 @@ -806,7 +806,7 @@ extern (C++) final class AnonDeclaration : AttribDeclaration { ad.structsize = savestructsize; ad.alignsize = savealignsize; - fieldState.offset = ad.structsize; + *poffset = ad.structsize; return; } @@ -829,7 +829,7 @@ extern (C++) final class AnonDeclaration : AttribDeclaration * go ahead and place it. */ anonoffset = AggregateDeclaration.placeField( - &fieldState.offset, + poffset, anonstructsize, anonalignsize, alignment, &ad.structsize, &ad.alignsize, isunion); diff --git a/src/dmd/attrib.h b/src/dmd/attrib.h index e63c80be3c6b..d4b902916580 100644 --- a/src/dmd/attrib.h +++ b/src/dmd/attrib.h @@ -32,7 +32,7 @@ class AttribDeclaration : public Dsymbol void addComment(const utf8_t *comment); const char *kind() const; bool oneMember(Dsymbol **ps, Identifier *ident); - void setFieldOffset(AggregateDeclaration *ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); bool hasPointers(); bool hasStaticCtorOrDtor(); void checkCtorConstInit(); @@ -141,7 +141,7 @@ class AnonDeclaration : public AttribDeclaration AnonDeclaration *syntaxCopy(Dsymbol *s); void setScope(Scope *sc); - void setFieldOffset(AggregateDeclaration *ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); const char *kind() const; AnonDeclaration *isAnonDeclaration() { return this; } void accept(Visitor *v) { v->visit(this); } diff --git a/src/dmd/dclass.d b/src/dmd/dclass.d index 092fc1f949c4..bef6fe4a19a0 100644 --- a/src/dmd/dclass.d +++ b/src/dmd/dclass.d @@ -628,11 +628,10 @@ extern (C++) class ClassDeclaration : AggregateDeclaration // to calculate each variable offsets. It can be improved later. fields.setDim(0); - FieldState fieldState; - fieldState.offset = structsize; + uint offset = structsize; foreach (s; *members) { - s.setFieldOffset(this, fieldState, false); + s.setFieldOffset(this, &offset, false); } sizeok = Sizeok.done; diff --git a/src/dmd/declaration.d b/src/dmd/declaration.d index 1ffd6a83ab6f..f53714a0934b 100644 --- a/src/dmd/declaration.d +++ b/src/dmd/declaration.d @@ -1113,7 +1113,7 @@ extern (C++) class VarDeclaration : Declaration return v; } - override final void setFieldOffset(AggregateDeclaration ad, ref FieldState fieldState, bool isunion) + override final void setFieldOffset(AggregateDeclaration ad, uint* poffset, bool isunion) { //printf("VarDeclaration::setFieldOffset(ad = %s) %s\n", ad.toChars(), toChars()); @@ -1129,7 +1129,7 @@ extern (C++) class VarDeclaration : Declaration Expression e = cast(Expression)o; assert(e.op == TOK.dSymbol); DsymbolExp se = cast(DsymbolExp)e; - se.s.setFieldOffset(ad, fieldState, isunion); + se.s.setFieldOffset(ad, poffset, isunion); } return; } @@ -1146,7 +1146,7 @@ extern (C++) class VarDeclaration : Declaration if (offset) { // already a field - fieldState.offset = ad.structsize; // https://issues.dlang.org/show_bug.cgi?id=13613 + *poffset = ad.structsize; // https://issues.dlang.org/show_bug.cgi?id=13613 return; } for (size_t i = 0; i < ad.fields.dim; i++) @@ -1154,7 +1154,7 @@ extern (C++) class VarDeclaration : Declaration if (ad.fields[i] == this) { // already a field - fieldState.offset = ad.structsize; // https://issues.dlang.org/show_bug.cgi?id=13613 + *poffset = ad.structsize; // https://issues.dlang.org/show_bug.cgi?id=13613 return; } } @@ -1191,7 +1191,7 @@ extern (C++) class VarDeclaration : Declaration uint memsize = cast(uint)sz; // size of member uint memalignsize = target.fieldalign(t); // size of member for alignment purposes offset = AggregateDeclaration.placeField( - &fieldState.offset, + poffset, memsize, memalignsize, alignment, &ad.structsize, &ad.alignsize, isunion); diff --git a/src/dmd/declaration.h b/src/dmd/declaration.h index 03fb4711e32f..d45a574aadaf 100644 --- a/src/dmd/declaration.h +++ b/src/dmd/declaration.h @@ -260,7 +260,7 @@ class VarDeclaration : public Declaration public: static VarDeclaration *create(const Loc &loc, Type *t, Identifier *id, Initializer *init, StorageClass storage_class = STCundefined); VarDeclaration *syntaxCopy(Dsymbol *); - void setFieldOffset(AggregateDeclaration *ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); const char *kind() const; AggregateDeclaration *isThis(); bool needThis(); diff --git a/src/dmd/dstruct.d b/src/dmd/dstruct.d index 7fdc2d07da87..98c1a2c85065 100644 --- a/src/dmd/dstruct.d +++ b/src/dmd/dstruct.d @@ -284,12 +284,12 @@ extern (C++) class StructDeclaration : AggregateDeclaration fields.setDim(0); // workaround // Set the offsets of the fields and determine the size of the struct - FieldState fieldState; + uint offset = 0; bool isunion = isUnionDeclaration() !is null; for (size_t i = 0; i < members.dim; i++) { Dsymbol s = (*members)[i]; - s.setFieldOffset(this, fieldState, isunion); + s.setFieldOffset(this, &offset, isunion); } if (type.ty == Terror) { diff --git a/src/dmd/dsymbol.d b/src/dmd/dsymbol.d index 96982fb76876..4be8ec674138 100644 --- a/src/dmd/dsymbol.d +++ b/src/dmd/dsymbol.d @@ -218,16 +218,6 @@ enum : int TagNameSpace = 0x100, // search ImportC tag symbol table } -/*********************************************************** - * Struct/Class/Union field state. - * Used for transitory information when setting field offsets, such - * as bit fields. - */ -struct FieldState -{ - uint offset; /// offset for next field -} - /*********************************************************** */ extern (C++) class Dsymbol : ASTNode @@ -1146,7 +1136,7 @@ extern (C++) class Dsymbol : ASTNode return true; } - void setFieldOffset(AggregateDeclaration ad, ref FieldState fieldState, bool isunion) + void setFieldOffset(AggregateDeclaration ad, uint* poffset, bool isunion) { } diff --git a/src/dmd/dsymbol.h b/src/dmd/dsymbol.h index 75e5c6306cf0..4a4c46fbac57 100644 --- a/src/dmd/dsymbol.h +++ b/src/dmd/dsymbol.h @@ -139,11 +139,6 @@ enum TagNameSpace = 0x100, // search ImportC tag symbol table }; -struct FieldState -{ - unsigned offset; -}; - class Dsymbol : public ASTNode { public: @@ -220,7 +215,7 @@ class Dsymbol : public ASTNode virtual Visibility visible(); virtual Dsymbol *syntaxCopy(Dsymbol *s); // copy only syntax trees virtual bool oneMember(Dsymbol **ps, Identifier *ident); - virtual void setFieldOffset(AggregateDeclaration *ad, FieldState& fieldState, bool isunion); + virtual void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); virtual bool hasPointers(); virtual bool hasStaticCtorOrDtor(); virtual void addLocalClass(ClassDeclarations *) { } diff --git a/src/dmd/dtemplate.d b/src/dmd/dtemplate.d index 244e7bc509b3..9ab1bd7be592 100644 --- a/src/dmd/dtemplate.d +++ b/src/dmd/dtemplate.d @@ -7670,13 +7670,13 @@ extern (C++) final class TemplateMixin : TemplateInstance return members.foreachDsymbol( (s) { return s.hasPointers(); } ) != 0; } - override void setFieldOffset(AggregateDeclaration ad, ref FieldState fieldState, bool isunion) + override void setFieldOffset(AggregateDeclaration ad, uint* poffset, bool isunion) { //printf("TemplateMixin.setFieldOffset() %s\n", toChars()); if (_scope) // if fwd reference dsymbolSemantic(this, null); // try to resolve it - members.foreachDsymbol( (s) { s.setFieldOffset(ad, fieldState, isunion); } ); + members.foreachDsymbol( (s) { s.setFieldOffset(ad, poffset, isunion); } ); } override const(char)* toChars() const diff --git a/src/dmd/frontend.h b/src/dmd/frontend.h index 9df27004191c..0d18d7bc1f79 100644 --- a/src/dmd/frontend.h +++ b/src/dmd/frontend.h @@ -54,7 +54,6 @@ class LabelDsymbol; class ClassDeclaration; class Type; class Package; -struct FieldState; class EnumMember; class TemplateDeclaration; class TemplateMixin; @@ -1034,7 +1033,7 @@ class Dsymbol : public ASTNode virtual Visibility visible(); virtual Dsymbol* syntaxCopy(Dsymbol* s); virtual bool oneMember(Dsymbol** ps, Identifier* ident); - virtual void setFieldOffset(AggregateDeclaration* ad, FieldState& fieldState, bool isunion); + virtual void setFieldOffset(AggregateDeclaration* ad, uint32_t* poffset, bool isunion); virtual bool hasPointers(); virtual bool hasStaticCtorOrDtor(); virtual void addLocalClass(Array* _param_0); @@ -2475,18 +2474,6 @@ enum class StructFlags hasPointers = 1, }; -struct FieldState final -{ - uint32_t offset; - FieldState() : - offset() - { - } - FieldState(uint32_t offset) : - offset(offset) - {} -}; - enum { IgnoreNone = 0, @@ -3688,7 +3675,7 @@ class Nspace final : public ScopeDsymbol void setScope(Scope* sc); Dsymbol* search(const Loc& loc, Identifier* ident, int32_t flags = 8); bool hasPointers(); - void setFieldOffset(AggregateDeclaration* ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration* ad, uint32_t* poffset, bool isunion); const char* kind() const; Nspace* isNspace(); void accept(Visitor* v); @@ -4486,7 +4473,6 @@ struct ASTCodegen final using Dsymbol = ::Dsymbol; using DsymbolTable = ::DsymbolTable; using ExpressionDsymbol = ::ExpressionDsymbol; - using FieldState = ::FieldState; using ForwardingScopeDsymbol = ::ForwardingScopeDsymbol; using OverloadSet = ::OverloadSet; using PASS = ::PASS; @@ -5026,7 +5012,7 @@ class AttribDeclaration : public Dsymbol void addComment(const char* comment); const char* kind() const; bool oneMember(Dsymbol** ps, Identifier* ident); - void setFieldOffset(AggregateDeclaration* ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration* ad, uint32_t* poffset, bool isunion); bool hasPointers(); bool hasStaticCtorOrDtor(); void checkCtorConstInit(); @@ -5128,7 +5114,7 @@ class AnonDeclaration final : public AttribDeclaration uint32_t anonalignsize; AnonDeclaration* syntaxCopy(Dsymbol* s); void setScope(Scope* sc); - void setFieldOffset(AggregateDeclaration* ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration* ad, uint32_t* poffset, bool isunion); const char* kind() const; AnonDeclaration* isAnonDeclaration(); void accept(Visitor* v); @@ -5590,7 +5576,7 @@ class VarDeclaration : public Declaration bool isArgDtorVar; static VarDeclaration* create(const Loc& loc, Type* type, Identifier* ident, Initializer* _init, StorageClass storage_class = static_cast(STC::undefined_)); VarDeclaration* syntaxCopy(Dsymbol* s); - void setFieldOffset(AggregateDeclaration* ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration* ad, uint32_t* poffset, bool isunion); const char* kind() const; AggregateDeclaration* isThis(); bool needThis(); @@ -6348,7 +6334,7 @@ class TemplateMixin final : public TemplateInstance const char* kind() const; bool oneMember(Dsymbol** ps, Identifier* ident); bool hasPointers(); - void setFieldOffset(AggregateDeclaration* ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration* ad, uint32_t* poffset, bool isunion); const char* toChars() const; TemplateMixin* isTemplateMixin(); void accept(Visitor* v); diff --git a/src/dmd/nspace.d b/src/dmd/nspace.d index 215f2595888c..b70f6674722b 100644 --- a/src/dmd/nspace.d +++ b/src/dmd/nspace.d @@ -145,12 +145,12 @@ extern (C++) final class Nspace : ScopeDsymbol return members.foreachDsymbol( (s) { return s.hasPointers(); } ) != 0; } - override void setFieldOffset(AggregateDeclaration ad, ref FieldState fieldState, bool isunion) + override void setFieldOffset(AggregateDeclaration ad, uint* poffset, bool isunion) { //printf("Nspace::setFieldOffset() %s\n", toChars()); if (_scope) // if fwd reference dsymbolSemantic(this, null); // try to resolve it - members.foreachDsymbol( s => s.setFieldOffset(ad, fieldState, isunion) ); + members.foreachDsymbol( s => s.setFieldOffset(ad, poffset, isunion) ); } override const(char)* kind() const diff --git a/src/dmd/nspace.h b/src/dmd/nspace.h index 43d36e9e4e0b..3c3a22d5b483 100644 --- a/src/dmd/nspace.h +++ b/src/dmd/nspace.h @@ -25,7 +25,7 @@ class Nspace : public ScopeDsymbol void setScope(Scope *sc); Dsymbol *search(const Loc &loc, Identifier *ident, int flags = SearchLocalsOnly); bool hasPointers(); - void setFieldOffset(AggregateDeclaration *ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); const char *kind() const; Nspace *isNspace() { return this; } void accept(Visitor *v) { v->visit(this); } diff --git a/src/dmd/template.h b/src/dmd/template.h index 08ce9acef99f..93c7bd67c338 100644 --- a/src/dmd/template.h +++ b/src/dmd/template.h @@ -299,7 +299,7 @@ class TemplateMixin : public TemplateInstance const char *kind() const; bool oneMember(Dsymbol **ps, Identifier *ident); bool hasPointers(); - void setFieldOffset(AggregateDeclaration *ad, FieldState& fieldState, bool isunion); + void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion); const char *toChars() const; TemplateMixin *isTemplateMixin() { return this; }