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.ob
Flow analysis for Ownership/Borrowing
Authors: 
License: 
Source ob.d
Documentation https://dlang.org/phobos/dmd_escape.html
References https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1021.md Argument Ownership and Function Calls
- voidoblive(FuncDeclarationfuncdecl);
- Perform ownership/borrowing checks for funcdecl. Does not modify the AST, just checks for errors.
- structObState;
- Collect the state information.- Array!size_tvarStack;
- temporary storage
- Array!boolmutableStack;
- parallel to varStack[], is type mutable?
- PtrVarState[]varPool;
- memory pool
 
- structObNode;
- A node in the function's expression graph, and its edges to predecessors and successors.- Expressionexp;
- expression for the node
- ObNodespreds;
- predecessors
- ObNodessuccs;
- successors
- ObNode*tryBlock;
- try-finally block we're inside
- uintindex;
- index of this in obnodes
- PtrVarState[]gen;
- new states generated for this node
- PtrVarState[]input;
- variable states on entry to exp
- PtrVarState[]output;
- variable states on exit to exp
 
- enumPtrState: ubyte;
- Pointer variable states:Initial state is not known; ignore for now Undefined not in a usable state T* p = void; Owner mutable pointer T* p = initializer; Borrowed scope mutable pointer, borrowed from [p] T* p = initializer; scope T* b = p; Readonly scope const pointer, copied from [p] T* p = initializer; scope const(T)* cp = p;Examples:T* p = initializer; // p is owner T** pp = &p; // pp borrows from p T* p = initialize; // p is owner T* q = p; // transfer: q is owner, p is undefined
- const(char)*PtrStateToChars(PtrStatestate);
- structPtrVarState;
- Carries the state of a pointer variable.- BitArraydeps;
- dependencies
- PtrStatestate;
- state the pointer variable is in
- voidprint(VarDeclaration[]vars);
- Print a bracketed list of all the variables that depend on 'this'Parameters:VarDeclaration[] varsvariables that depend on 'this' 
- voiddepsToBuf(ref OutBufferbuf, const VarDeclaration[]vars);
- Produce a user-readable comma separated string of the dependencies.Parameters:OutBuffer bufwrite resulting string here VarDeclaration[] varsarray from which to get the variable names 
 
- voidsetLabelStatementExtraFields(DsymbolTablelabtab);
- Set the .extra field for LabelStatements in labtab[].
- voidtoObNodes(ref ObNodesobnodes, Statements);
- Convert statement into ObNodes.
- voidinsertFinallyBlockCalls(ref ObNodesobnodes);
- Insert finally block calls when doing a goto from inside a try block to outside. Done after blocks are generated because then we know all the edges of the graph, but before the pred's are computed.Parameters:ObNodes obnodesgraph of the function 
- voidinsertFinallyBlockGotos(ref ObNodesobnodes);
- Remove try-finally scaffolding.Parameters:ObNodes obnodesnodes for the function 
- @safe voidnumberNodes(ref ObNodesobnodes);
- Set the index field of each ObNode to its index in theobnodes[] array.
- voidremoveUnreachable(ref ObNodesobnodes);
- Remove unreachable nodes and compress them out of obnodes[].Parameters:ObNodes obnodesarray of nodes 
- voidcomputePreds(ref ObNodesobnodes);
- Compute predecessors.
- boolisTrackableVar(VarDeclarationv);
- Are we interested in tracking variablev?
- VarDeclarationisTrackableVarExp(Expressione);
- Are we interested in tracking this expression?Returns:variable if so, null if not
- voidcollectVars(FuncDeclarationfuncdecl, out VarDeclarationsvars);
- Find the pointer variable declarations in this function, and fillvarswith them.Parameters:FuncDeclaration funcdeclfunction we are in VarDeclarations varsarray to fill in 
- voidallocDeps(PtrVarState[]pvss);
- Allocate BitArrays in PtrVarState. Can be allocated much more efficiently by subdividing a single large array of bits
- voidallocStates(ref ObStateobstate);
- Allocate state variables foreach node.
- boolisBorrowedPtr(VarDeclarationv);
- Does v meet the definiton of a Borrowed pointer?Returns:true if it does
- boolisReadonlyPtr(VarDeclarationv);
- Does v meet the definiton of a Readonly pointer?Returns:true if it does
- voidgenKill(ref ObStateobstate, ObNode*ob);
- Compute the gen vector for ob.
- PtrStatetoPtrState(VarDeclarationv);
- Determine the state of a variable based on its type and storage class.
- boolhasPointersToMutableFields(Typet);
- Does typetcontain any pointers to mutable?
- boolhasMutableFields(Typet);
- Does typethave any mutable fields?
- voiddoDataFlowAnalysis(ref ObStateobstate);
- Do the data flow analysis (i.e. compute the input[] and output[] vectors for each ObNode).
- voidescapeLive(Expressione, scope void delegate(VarDeclaration)onVar);
- Check for escaping variables using DIP1000's escapeByValue, with live set to trueParameters:Expression eexpression to check void delegate(VarDeclaration) onVargets called for each variable escaped through e, either by value or by ref
- voidcheckObErrors(ref ObStateobstate);
- Check for Ownership/Borrowing errors.
- voidreadVar(ObNode*ob, const size_tvi, boolmutable, PtrVarState[]gen);
- Read from variable vi. The beginning of the 'scope' of a variable is when it is first read. Hence, when a read is done, instead of when assignment to the variable is done, the O/B rules are enforced. (Also called "non-lexical scoping".)
- voidmakeChildrenUndefined(size_tvi, PtrVarState[]gen);
- Recursively make Undefined all who list vi as a dependency
- voidmakeUndefined(size_tvi, PtrVarState[]gen);
- Recursively make Undefined vi undefined and all who list vi as a dependencyParameters:size_t vivariable's index PtrVarState[] genarray of the states of variables 
- boolisMutableRef(Typet);
- Is typeta reference to a const or a reference to a mutable?
Copyright © 1999-2025 by the D Language Foundation | Page generated by
Ddoc on Mon Mar 31 10:27:59 2025