Boo.Lang.Compiler.Steps.EmitAssembly.LoadAddress C# (CSharp) Метод

LoadAddress() приватный Метод

private LoadAddress ( Expression expression ) : void
expression Boo.Lang.Compiler.Ast.Expression
Результат void
        void LoadAddress(Expression expression)
        {
            if (expression.NodeType == NodeType.SelfLiteralExpression && expression.ExpressionType.IsValueType)
            {
                _il.Emit(OpCodes.Ldarg_0);
                return;
            }

            var entity = expression.Entity;
            if (entity != null)
            {
                switch (entity.EntityType)
                {
                    case EntityType.Local:
                        {
                            var local =  ((InternalLocal) entity);
                            _il.Emit(!local.Type.IsPointer ? OpCodes.Ldloca : OpCodes.Ldloc, local.LocalBuilder);
                            return;
                        }

                    case EntityType.Parameter:
                        {
                            var param = (InternalParameter)entity;
                            if (param.Parameter.IsByRef)
                                LoadParam(param);
                            else
                                _il.Emit(OpCodes.Ldarga, param.Index);
                            return;
                        }

                    case EntityType.Field:
                        {
                            var field = (IField)entity;
                            if (!field.IsLiteral)
                            {
                                EmitLoadFieldAddress(expression, field);
                                return;
                            }
                            break;
                        }
                }
            }

            if (IsValueTypeArraySlicing(expression))
            {
                LoadArrayElementAddress((SlicingExpression)expression);
                return;
            }

            Visit(expression);
            if (!AstUtil.IsIndirection(expression))
            {
                // declare local to hold value type
                var temp = _il.DeclareLocal(GetSystemType(PopType()));
                _il.Emit(OpCodes.Stloc, temp);
                _il.Emit(OpCodes.Ldloca, temp);
            }
        }
EmitAssembly