Report a bug
		
				If you spot a problem with this page, click here to create a Bugzilla issue.
		
			Improve this page
		
			Quickly fork, edit online, and submit a pull request for this page.
			Requires a signed-in GitHub account. This works well for small changes.
			If you'd like to make larger changes you may want to consider using
			a local clone.
		
	dmd.escape
Most of the logic to implement scoped pointers and scoped references is here.
Authors: 
License: 
Source escape.d
Documentation https://dlang.org/phobos/dmd_escape.html
- structEscapeState;
- Groups global state for escape checking together- static voidreset();
- Called by initDMD / deinitializeDMD to reset global state
 
- boolcheckMutableArguments(ref Scopesc, FuncDeclarationfd, TypeFunctiontf, Expressionethis, Expressions*arguments, boolgag);
- Checks memory objects passed to a function. Checks that if a memory object is passed by ref or by pointer, all of the refs or pointers are const, or there is only one mutable ref or pointer to it.References DIP 1021 Parameters:Scope scused to determine current function and module FuncDeclaration fdfunction being called TypeFunction tffd's type Expression ethisif not null, the this pointer Expressions* argumentsactual arguments to function bool gagdo not print error messages Returns:true if error
- boolcheckArrayLiteralEscape(ref Scopesc, ArrayLiteralExpae, boolgag);
- Array literal is going to be allocated on the GC heap. Check its elements to see if any would escape by going on the heap.Parameters:Scope scused to determine current function and module ArrayLiteralExp aearray literal expression bool gagdo not print error messages Returns:true if any elements escaped
- boolcheckAssocArrayLiteralEscape(ref Scopesc, AssocArrayLiteralExpae, boolgag);
- Associative array literal is going to be allocated on the GC heap. Check its elements to see if any would escape by going on the heap.Parameters:Scope scused to determine current function and module AssocArrayLiteralExp aeassociative array literal expression bool gagdo not print error messages Returns:true if any elements escaped
- boolcheckParamArgumentEscape(ref Scopesc, FuncDeclarationfdc, IdentifierparId, VarDeclarationvPar, STCparStc, Expressionarg, boolassertmsg, boolgag);
- Function parameter par is being initialized toarg, and par may escape. Detect if scoped values can escape this way. Print error messages when these are detected.Parameters:Scope scused to determine current function and module FuncDeclaration fdcfunction being called, null if called indirectly Identifier parIdname of function parameter for error messages VarDeclaration vParVarDeclaration corresponding to par STC parStcstorage classes of function parameter (may have added scope from pure) Expression arginitializer for param bool assertmsgtrue if the parameter is the msg argument to assert(bool, msg). bool gagdo not print error messages Returns:true if pointers to the stack can escape via assignment
- boolcheckParamArgumentReturn(ref Scopesc, ExpressionfirstArg, Expressionarg, Parameterparam, boolgag);
- Function argument initializes a return parameter, and that parameter gets assigned tofirstArg. Essentially, treat asfirstArg=arg;Parameters:Scope scused to determine current function and module Expression firstArgref argument through which argmay be assignedExpression arginitializer for parameter Parameter paramparameter declaration corresponding to argbool gagdo not print error messages Returns:true if assignment tofirstArgwould cause an error
- boolcheckConstructorEscape(ref Scopesc, CallExpce, boolgag);
- Check struct constructor of the form s.this(args), by checking each return parameter to see if it gets assigned to s.Parameters:Scope scused to determine current function and module CallExp ceconstructor call of the form s.this(args) bool gagdo not print error messages Returns:true if construction would cause an escaping reference error
- enumReturnParamDest: int;
- How a return parameter escapes its pointer value- returnVal
- through return statement: return x
- this_
- assigned to a struct instance: this.x = x
- firstArg
- assigned to first argument:firstArg= x
 
- ReturnParamDestreturnParamDest(TypeFunctiontf, Typetthis);
- Find out if instead of returning a return parameter via a return statement, it is returned via assignment to either this or the first parameter.This works the same as returning the value via a return statement. Although the first argument must be ref, it is not regarded as returning by ref.Parameters:TypeFunction tffunction type Type tthistype of this parameter, or null if none Returns:What a return parameter should transfer the lifetime of the argument to
- boolcheckAssignEscape(ref Scopesc, Expressione, boolgag, boolbyRef);
- Given an AssignExp, determine if the lvalue will cause the contents of the rvalue to escape. Print error messages when these are detected. Infer scope attribute for the lvalue where possible, in order to eliminate the error.Parameters:Scope scused to determine current function and module Expression eAssignExp or CatAssignExp to check for any pointers to the stack bool gagdo not print error messages bool byRefset to true if e1 of egets assigned a reference to e2Returns:true if pointers to the stack can escape via assignment
- boolcheckThrowEscape(ref Scopesc, Expressione, boolgag);
- Detect cases where pointers to the stack can escape the lifetime of the stack frame when throwinge. Print error messages when these are detected.Parameters:Scope scused to determine current function and module Expression eexpression to check for any pointers to the stack bool gagdo not print error messages Returns:true if pointers to the stack can escape
- boolcheckNewEscape(ref Scopesc, Expressione, boolgag);
- Detect cases where pointers to the stack can escape the lifetime of the stack frame by being placed into a GC allocated object. Print error messages when these are detected.Parameters:Scope scused to determine current function and module Expression eexpression to check for any pointers to the stack bool gagdo not print error messages Returns:true if pointers to the stack can escape
- boolcheckReturnEscape(ref Scopesc, Expressione, boolgag);
- Detect cases where pointers to the stack can escape the lifetime of the stack frame by returningeby value. Print error messages when these are detected.Parameters:Scope scused to determine current function and module Expression eexpression to check for any pointers to the stack bool gagdo not print error messages Returns:true if pointers to the stack can escape
- boolcheckReturnEscapeRef(ref Scopesc, Expressione, boolgag);
- Detect cases where returningeby ref can result in a reference to the stack being returned. Print error messages when these are detected.Parameters:Scope scused to determine current function and module Expression eexpression to check bool gagdo not print error messages Returns:true if references to the stack can escape
- voidescapeByValue(Expressione, ref scope EscapeByResultser);
- e is an expression to be returned by value, and that value contains pointers. Walk e to determine which variables are possibly being returned by value, such as: int* function(int* p) { return p; } If e is a form of &p, determine which variables have content which is being returned as ref, such as: int* function(int i) { return &i; } Multiple variables can be inserted, because of expressions like this: int function(bool b, int i, int* p) { return b ? &i : p; }No side effects.Parameters:Expression eexpression to be returned by value EscapeByResults erwhere to place collected data 
- structEscapeByResults;
- Aggregate the data collected by the escapeBy??() functions.- void delegate(VarDeclaration, bool retRefTransition)byRef;
- called on variables being returned by ref / address
- void delegate(VarDeclaration)byValue;
- called on variables with values containing pointers
- void delegate(FuncDeclaration, bool called)byFunc;
- called on nested functions that are turned into delegates When called is true, it means the delegate escapes variables from the closure through a call to it, while false means the delegate itself escapes.
- void delegate(Expression, bool retRefTransition)byExp;
- called when expression temporaries are being returned by ref / address
- boollive;
- if @live semantics apply, i.e. expressions p, *p, **p, etc., all return p.
 
- voidfindAllOuterAccessedVariables(FuncDeclarationfd, VarDeclarations*vars);
- Find all variables accessed by this delegate that are in functions enclosing it.Parameters:FuncDeclaration fdfunction VarDeclarations* varsarray to append found variables to 
- voidfinishScopeParamInference(FuncDeclarationfuncdecl, ref TypeFunctionf);
- After semantic analysis of the function body, try to infer scope / return on the parametersParameters:FuncDeclaration funcdeclfunction declaration that was analyzed TypeFunction ffinal function type. funcdecl.type started as the 'premature type' before attribute inference, then its inferred attributes are copied over to final typef
Copyright © 1999-2025 by the D Language Foundation | Page generated by
Ddoc on Mon Mar 31 10:27:54 2025