private void Reference(ParameterExpression node, VariableStorageKind storage) { CompilerScope definition = null; foreach (CompilerScope scope in _scopes) { if (scope.Definitions.ContainsKey(node)) { definition = scope; break; } scope.NeedsClosure = true; if (scope.IsMethod) { storage = VariableStorageKind.Hoisted; } } if (definition == null) { throw Error.UndefinedVariable(node.Name, node.Type, CurrentLambdaName); } if (storage == VariableStorageKind.Hoisted) { if (node.IsByRef) { throw Error.CannotCloseOverByRef(node.Name, CurrentLambdaName); } definition.Definitions[node] = VariableStorageKind.Hoisted; } }
private void Reference(ParameterExpression node, VariableStorageKind storage) { CompilerScope definition = null; foreach (var scope in _scopes) { if (scope.Definitions.ContainsKey(node)) { definition = scope; break; } scope.NeedsClosure = true; if (scope.IsMethod) { storage = VariableStorageKind.Hoisted; } } if (definition == null) { throw new InvalidOperationException($"variable '{node.Name}' of type '{node.Type}' referenced from scope '{CurrentLambdaName}', but it is not defined"); } if (storage != VariableStorageKind.Hoisted) { return; } if (node.IsByRef) { throw new InvalidOperationException($"Cannot close over byref parameter '{node.Name}' referenced in lambda '{CurrentLambdaName}'"); } definition.Definitions[node] = VariableStorageKind.Hoisted; }