Browse Source

Add `#+feature global-context`

This allows to use of `context` in the global scope on a per file basis.
gingerBill 1 month ago
parent
commit
983f3ec423
2 changed files with 13 additions and 1 deletions
  1. 7 0
      src/build_settings.cpp
  2. 6 1
      src/check_decl.cpp

+ 7 - 0
src/build_settings.cpp

@@ -357,6 +357,9 @@ enum OptInFeatureFlags : u64 {
 	OptInFeatureFlag_IntegerDivisionByZero_Zero = 1u<<2,
 	OptInFeatureFlag_IntegerDivisionByZero_Self = 1u<<3,
 
+	OptInFeatureFlag_GlobalContext = 1u<<4,
+
+
 	OptInFeatureFlag_IntegerDivisionByZero_ALL = OptInFeatureFlag_IntegerDivisionByZero_Trap|OptInFeatureFlag_IntegerDivisionByZero_Zero|OptInFeatureFlag_IntegerDivisionByZero_Self,
 
 };
@@ -374,6 +377,10 @@ u64 get_feature_flag_from_name(String const &name) {
 	if (name == "integer-division-by-zero:self") {
 		return OptInFeatureFlag_IntegerDivisionByZero_Self;
 	}
+
+	if (name == "global-context") {
+		return OptInFeatureFlag_GlobalContext;
+	}
 	return OptInFeatureFlag_NONE;
 }
 

+ 6 - 1
src/check_decl.cpp

@@ -1855,7 +1855,12 @@ gb_internal void check_entity_decl(CheckerContext *ctx, Entity *e, DeclInfo *d,
 
 		auto prev_flags = c.scope->flags;
 		defer (c.scope->flags = prev_flags);
-		c.scope->flags &= ~ScopeFlag_ContextDefined;
+
+		if (check_feature_flags(ctx, d->decl_node) & OptInFeatureFlag_GlobalContext) {
+			c.scope->flags |= ScopeFlag_ContextDefined;
+		} else {
+			c.scope->flags &= ~ScopeFlag_ContextDefined;
+		}
 
 
 		e->parent_proc_decl = c.curr_proc_decl;