mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2025-01-24 15:40:59 +00:00
Preparing to do class-based method scopes: can't change class scope once defined (play stays play, ui stays ui)
This commit is contained in:
parent
014db18f2a
commit
12aa18a92b
2 changed files with 10 additions and 4 deletions
|
@ -216,7 +216,6 @@ class_flags(X) ::= class_flags(A) NONEW. { X.Flags = A.Flags | ZCC_NoNew; X.
|
||||||
class_flags(X) ::= class_flags(A) NATIVE. { X.Flags = A.Flags | ZCC_Native; X.Replaces = A.Replaces; }
|
class_flags(X) ::= class_flags(A) NATIVE. { X.Flags = A.Flags | ZCC_Native; X.Replaces = A.Replaces; }
|
||||||
class_flags(X) ::= class_flags(A) UI. { X.Flags = A.Flags | ZCC_UIFlag; X.Replaces = A.Replaces; }
|
class_flags(X) ::= class_flags(A) UI. { X.Flags = A.Flags | ZCC_UIFlag; X.Replaces = A.Replaces; }
|
||||||
class_flags(X) ::= class_flags(A) PLAY. { X.Flags = A.Flags | ZCC_Play; X.Replaces = A.Replaces; }
|
class_flags(X) ::= class_flags(A) PLAY. { X.Flags = A.Flags | ZCC_Play; X.Replaces = A.Replaces; }
|
||||||
class_flags(X) ::= class_flags(A) CLEARSCOPE. { X.Flags = A.Flags | ZCC_ClearScope; X.Replaces = A.Replaces; }
|
|
||||||
class_flags(X) ::= class_flags(A) REPLACES dottable_id(B). { X.Flags = A.Flags; X.Replaces = B; }
|
class_flags(X) ::= class_flags(A) REPLACES dottable_id(B). { X.Flags = A.Flags; X.Replaces = B; }
|
||||||
|
|
||||||
/*----- Dottable Identifier -----*/
|
/*----- Dottable Identifier -----*/
|
||||||
|
@ -332,7 +331,6 @@ struct_def(X) ::= STRUCT(T) IDENTIFIER(A) struct_flags(S) LBRACE opt_struct_body
|
||||||
struct_flags(X) ::= . { X.Flags = 0; }
|
struct_flags(X) ::= . { X.Flags = 0; }
|
||||||
struct_flags(X) ::= struct_flags(A) UI. { X.Flags = A.Flags | ZCC_UIFlag; }
|
struct_flags(X) ::= struct_flags(A) UI. { X.Flags = A.Flags | ZCC_UIFlag; }
|
||||||
struct_flags(X) ::= struct_flags(A) PLAY. { X.Flags = A.Flags | ZCC_Play; }
|
struct_flags(X) ::= struct_flags(A) PLAY. { X.Flags = A.Flags | ZCC_Play; }
|
||||||
struct_flags(X) ::= struct_flags(A) CLEARSCOPE. { X.Flags = A.Flags | ZCC_ClearScope; }
|
|
||||||
struct_flags(X) ::= struct_flags(A) NATIVE. { X.Flags = A.Flags | ZCC_Native; }
|
struct_flags(X) ::= struct_flags(A) NATIVE. { X.Flags = A.Flags | ZCC_Native; }
|
||||||
|
|
||||||
opt_struct_body(X) ::= . { X = NULL; }
|
opt_struct_body(X) ::= . { X = NULL; }
|
||||||
|
|
|
@ -625,10 +625,18 @@ void ZCCCompiler::CreateClassTypes()
|
||||||
Error(c->cls, "Class %s has incompatible flags", c->NodeName().GetChars());
|
Error(c->cls, "Class %s has incompatible flags", c->NodeName().GetChars());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->cls->Flags & ZCC_UIFlag || ((parent->ObjectFlags & OF_UI) && !(c->cls->Flags & ZCC_ClearScope)))
|
if (c->cls->Flags & ZCC_UIFlag)
|
||||||
c->Type()->ObjectFlags = (c->Type()->ObjectFlags&~OF_Play) | OF_UI;
|
c->Type()->ObjectFlags = (c->Type()->ObjectFlags&~OF_Play) | OF_UI;
|
||||||
if (c->cls->Flags & ZCC_Play || ((parent->ObjectFlags & OF_Play) && !(c->cls->Flags & ZCC_ClearScope)))
|
if (c->cls->Flags & ZCC_Play)
|
||||||
c->Type()->ObjectFlags = (c->Type()->ObjectFlags&~OF_UI) | OF_Play;
|
c->Type()->ObjectFlags = (c->Type()->ObjectFlags&~OF_UI) | OF_Play;
|
||||||
|
if (parent->ObjectFlags & (OF_UI | OF_Play)) // parent is either ui or play
|
||||||
|
{
|
||||||
|
if (c->cls->Flags & (ZCC_UIFlag | ZCC_Play))
|
||||||
|
{
|
||||||
|
Error(c->cls, "Can't change class scope in class %s", c->NodeName().GetChars());
|
||||||
|
}
|
||||||
|
c->Type()->ObjectFlags = (c->Type()->ObjectFlags & ~(OF_UI | OF_Play)) | (parent->ObjectFlags & (OF_UI | OF_Play));
|
||||||
|
}
|
||||||
|
|
||||||
c->Type()->bExported = true; // this class is accessible to script side type casts. (The reason for this flag is that types like PInt need to be skipped.)
|
c->Type()->bExported = true; // this class is accessible to script side type casts. (The reason for this flag is that types like PInt need to be skipped.)
|
||||||
c->cls->Symbol = new PSymbolType(c->NodeName(), c->Type());
|
c->cls->Symbol = new PSymbolType(c->NodeName(), c->Type());
|
||||||
|
|
Loading…
Reference in a new issue