public virtual void AddLocals(IEnumerable<ParameterDeclaration> declarations, AstNode statement) { declarations.ToList().ForEach(item => { var name = this.Emitter.GetEntityName(item); var vName = this.AddLocal(item.Name, item.Type); if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref) { this.Emitter.LocalsMap[item.Name] = name + ".v"; } else { this.Emitter.LocalsMap[item.Name] = name; } }); var visitor = new ReferenceArgumentVisitor(); statement.AcceptVisitor(visitor); foreach (var expr in visitor.DirectionExpression) { var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter); if (rr is LocalResolveResult && expr is IdentifierExpression) { var ie = (IdentifierExpression)expr; this.Emitter.LocalsMap[ie.Identifier] = ie.Identifier + ".v"; } else { throw new EmitterException(expr, "Only local variables can be passed by reference"); } } }
public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement) { declarations.ToList().ForEach(item => { var vName = this.AddLocal(item.Name, item.Type); if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref) { this.Emitter.LocalsMap[item.Name] = vName + ".v"; } else { this.Emitter.LocalsMap[item.Name] = vName; } }); var visitor = new ReferenceArgumentVisitor(); statement.AcceptVisitor(visitor); foreach (var expr in visitor.DirectionExpression) { var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter); if (rr is LocalResolveResult && expr is IdentifierExpression) { var ie = (IdentifierExpression)expr; this.Emitter.LocalsMap[ie.Identifier] = ie.Identifier + ".v"; } else { throw new Exception("Only local variables can be passed by reference"); } } }
public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement) { var visitor = new ReferenceArgumentVisitor(this.Emitter); statement.AcceptVisitor(visitor); declarations.ToList().ForEach(item => { var rr = item.Parent != null ? (LocalResolveResult)this.Emitter.Resolver.ResolveNode(item, this.Emitter) : null; var name = this.Emitter.GetParameterName(item); var vName = this.AddLocal(item.Name, item, item.Type, name); if (item.Parent == null && item.Name == "value" && visitor.DirectionExpression.Any(expr => expr is IdentifierExpression && ((IdentifierExpression)expr).Identifier == "value")) { return; } if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref) { this.Emitter.LocalsMap[rr != null ? rr.Variable : new DefaultVariable(ReflectionHelper.FindType(this.Emitter.Resolver.Compilation, TypeCode.Object), name)] = vName + ".v"; } else { this.Emitter.LocalsMap[rr != null ? rr.Variable : new DefaultVariable(ReflectionHelper.FindType(this.Emitter.Resolver.Compilation, TypeCode.Object), name)] = vName; } }); foreach (var expr in visitor.DirectionExpression) { var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter); IdentifierExpression identifierExpression; var lrr = rr as LocalResolveResult; if (lrr != null && ((identifierExpression = expr as IdentifierExpression) != null)) { var name = identifierExpression.Identifier; if (Helpers.IsReservedWord(this.Emitter, name)) { name = Helpers.ChangeReservedWord(name); } this.Emitter.LocalsMap[lrr.Variable] = name + ".v"; } } foreach (var variable in visitor.DirectionVariables) { var name = variable.Name; if (Helpers.IsReservedWord(this.Emitter, name)) { name = Helpers.ChangeReservedWord(name); } this.Emitter.LocalsMap[variable] = name + ".v"; } }
public virtual void AddLocals(IEnumerable <ParameterDeclaration> declarations, AstNode statement) { declarations.ToList().ForEach(item => { var name = this.Emitter.GetEntityName(item); var vName = this.AddLocal(item.Name, item.Type, name); if (item.ParameterModifier == ParameterModifier.Out || item.ParameterModifier == ParameterModifier.Ref) { this.Emitter.LocalsMap[item.Name] = vName + ".v"; } else { this.Emitter.LocalsMap[item.Name] = vName; } }); var visitor = new ReferenceArgumentVisitor(); statement.AcceptVisitor(visitor); foreach (var expr in visitor.DirectionExpression) { var rr = this.Emitter.Resolver.ResolveNode(expr, this.Emitter); IdentifierExpression identifierExpression; if (rr is LocalResolveResult && ((identifierExpression = expr as IdentifierExpression) != null)) { var name = identifierExpression.Identifier; if (Helpers.IsReservedWord(name)) { name = Helpers.ChangeReservedWord(name); } this.Emitter.LocalsMap[identifierExpression.Identifier] = name + ".v"; } else { throw new EmitterException(expr, "Only local variables can be passed by reference"); } } }