Пример #1
0
        public FlowBranchingException StartFlowBranching(ExceptionStatement stmt)
        {
            FlowBranchingException branching = new FlowBranchingException(CurrentBranching, stmt);

            current_flow_branching = branching;
            return(branching);
        }
Пример #2
0
        private CachedDecompiledMember DecompileMethod(ILanguage language, MethodDefinition method, TypeSpecificContext typeContext)
        {
            CachedDecompiledMember decompiledMember;
            Statement statement;

            try
            {
                DecompilationContext innerContext = null;
                statement        = method.Body.Decompile(language, out innerContext, typeContext);
                decompiledMember = new CachedDecompiledMember(new DecompiledMember(Utilities.GetMemberUniqueName(method), statement, innerContext.MethodContext), innerContext.TypeContext);
            }
            catch (Exception ex)
            {
                this.ExceptionsWhileDecompiling.Add(method);

                BlockStatement blockStatement = new BlockStatement();
                statement = new ExceptionStatement(ex, method);
                blockStatement.AddStatement(statement);

                decompiledMember = new CachedDecompiledMember(new DecompiledMember(Utilities.GetMemberUniqueName(method), blockStatement, new MethodSpecificContext(method.Body)));

                OnExceptionThrown(ex);
            }
            return(decompiledMember);
        }
Пример #3
0
        public override bool Resolve(BlockContext bc)
        {
            expr = expr.Resolve(bc);
            if (expr == null)
            {
                return(false);
            }

            machine_initializer = bc.CurrentAnonymousMethod as T;
            inside_try_block    = bc.CurrentTryBlock;
            return(true);
        }
Пример #4
0
 public void RegisterResumePoint()
 {
     if (inside_try_block == null)
     {
         resume_pc = machine_initializer.AddResumePoint(this);
     }
     else
     {
         resume_pc        = inside_try_block.AddResumePoint(this, resume_pc, machine_initializer);
         unwind_protect   = true;
         inside_try_block = null;
     }
 }
Пример #5
0
        public Method CreateFinallyHost(ExceptionStatement block)
        {
            var method = new Method(IteratorHost, null, TypeManager.system_void_expr, Modifiers.COMPILER_GENERATED,
                                    new MemberName(CompilerGeneratedClass.MakeName("", "", "Finally", finally_hosts_counter++), loc),
                                    ParametersCompiled.EmptyReadOnlyParameters, null);

            method.Block = new ToplevelBlock(method.Compiler, method.ParameterInfo, loc);
            method.Block.AddStatement(new TryFinallyBlockProxyStatement(this, block));

            // Cannot it add to IteratorHost because it'd be emitted before nested
            // anonoymous methods which could capture shared variable

            return(method);
        }
Пример #6
0
 public virtual void VisitExceptionStatement(ExceptionStatement node)
 {
 }
Пример #7
0
 public virtual ICodeNode VisitExceptionStatement(ExceptionStatement node)
 {
     return(node);
 }
 public override void VisitExceptionStatement(ExceptionStatement node)
 {
     WriteException(new Exception("Exception in: " + node.Member.GetFullMemberName(Language), node.ExceptionObject), node.Member);
 }
        protected virtual void WriteInternal(IMemberDefinition member)
        {
            uint memberToken = member.MetadataToken.ToUInt32();

            if (isStopped)
            {
                return;
            }

            membersStack.Push(member);

            bool isNestedType = member is TypeDefinition && member != this.CurrentType;

            if (!isNestedType)
            {
                formatter.PreserveIndent(member);
            }

            try
            {
                if (this.Settings.WriteDocumentation && !isNestedType)
                {
                    int documentationStartIndex = this.formatter.CurrentPosition;
                    WriteDocumentation(member);
                    AddMemberDocumentationOffsetSpan(memberToken, documentationStartIndex, this.formatter.CurrentPosition);
                }
                if (member is TypeDefinition)
                {
                    formatter.WriteMemberDeclaration(member);

                    WriteTypeInANewWriterIfNeeded((TypeDefinition)member);
                }
                else
                {
                    int attributesStartIndex = this.formatter.CurrentPosition;
                    WriteAttributes(member);
                    AddMemberAttributesOffsetSpan(memberToken, attributesStartIndex, this.formatter.CurrentPosition);

                    int decompiledCodeStartIndex = this.formatter.CurrentPosition;

                    if (member is MethodDefinition)
                    {
                        formatter.WriteMemberDeclaration(member);

                        Write((MethodDefinition)member);
                    }
                    else if (member is PropertyDefinition)
                    {
                        formatter.WriteMemberDeclaration(member);

                        Write((PropertyDefinition)member);
                    }
                    else if (member is EventDefinition)
                    {
                        formatter.WriteMemberDeclaration(member);

                        Write((EventDefinition)member);
                    }
                    else if (member is FieldDefinition)
                    {
                        formatter.WriteMemberDeclaration(member);

                        Write((FieldDefinition)member);
                    }

                    this.currentWritingInfo.MemberTokenToDecompiledCodeMap.Add(memberToken, new OffsetSpan(decompiledCodeStartIndex, this.formatter.CurrentPosition - 1));
                }
            }
            catch (Exception ex)
            {
                ExceptionStatement exceptionStatement = new ExceptionStatement(ex, member);
                Visit(exceptionStatement);
                formatter.RestoreIndent(member);
                this.currentWritingInfo.ExceptionsWhileWriting.Add(member);
                this.currentWritingInfo.MembersWithExceptions.Add(memberToken);

                if (member is PropertyDefinition)
                {
                    PropertyDefinition property = member as PropertyDefinition;

                    if (property.GetMethod != null)
                    {
                        this.currentWritingInfo.ExceptionsWhileWriting.Add(property.GetMethod);
                    }

                    if (property.SetMethod != null)
                    {
                        this.currentWritingInfo.ExceptionsWhileWriting.Add(property.SetMethod);
                    }
                }

                if (member is EventDefinition)
                {
                    EventDefinition @event = member as EventDefinition;

                    if (@event.AddMethod != null)
                    {
                        this.currentWritingInfo.ExceptionsWhileWriting.Add(@event.AddMethod);
                    }

                    if (@event.RemoveMethod != null)
                    {
                        this.currentWritingInfo.ExceptionsWhileWriting.Add(@event.RemoveMethod);
                    }

                    if (@event.InvokeMethod != null)
                    {
                        this.currentWritingInfo.ExceptionsWhileWriting.Add(@event.InvokeMethod);
                    }
                }

                OnExceptionThrown(ex);
            }

            if (!(member is TypeDefinition) || (member == CurrentType))
            {
                formatter.RemovePreservedIndent(member);
            }

            membersStack.Pop();
        }
		public FlowBranchingTryFinally (FlowBranching parent,
					       ExceptionStatement stmt)
			: base (parent, BranchingType.Exception, SiblingType.Try,
				null, stmt.loc)
		{
			this.stmt = stmt;
		}
Пример #11
0
 public TryFinallyBlockProxyStatement(Iterator iterator, ExceptionStatement block)
 {
     this.iterator = iterator;
     this.block    = block;
 }
Пример #12
0
        public string GenerateRoutineScripts(RoutineScript script)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine($"CREATE {script.Type.ToString()} {script.FullName}");

            if (script.Parameters.Count > 0)
            {
                sb.AppendLine("(");

                int i = 0;
                foreach (Parameter parameter in script.Parameters)
                {
                    ParameterType parameterType = parameter.ParameterType;

                    string strParameterType = "";

                    if (parameterType == ParameterType.IN)
                    {
                        strParameterType = "";
                    }
                    else if (parameterType.HasFlag(ParameterType.IN) && parameterType.HasFlag(ParameterType.OUT))
                    {
                        strParameterType = "OUT";
                    }
                    else if (parameterType != ParameterType.NONE)
                    {
                        strParameterType = parameterType.ToString();
                    }

                    string defaultValue = parameter.DefaultValue == null ? "" : "=" + parameter.DefaultValue;

                    sb.AppendLine($"{parameter.Name} {parameter.DataType} {defaultValue} {strParameterType}{(i == script.Parameters.Count - 1 ? "" : ",")}");

                    i++;
                }

                sb.AppendLine(")");
            }
            else if (script.Type == RoutineType.FUNCTION)
            {
                sb.AppendLine("(");
                sb.AppendLine(")");
            }

            if (script.Type == RoutineType.FUNCTION)
            {
                if (script.ReturnTable == null)
                {
                    sb.AppendLine($"RETURNS {script.ReturnDataType}");
                }
                else
                {
                    sb.AppendLine($"RETURNS {script.ReturnTable.Name}({string.Join(",", script.ReturnTable.Columns.Select(t => $"{t.Name} {t.DataType}")) })");
                }
            }

            sb.AppendLine("AS");

            sb.AppendLine("BEGIN");

            Action <IEnumerable <Statement> > appendStatements = (statements) =>
            {
                foreach (Statement statement in statements)
                {
                    if (statement is WhileStatement @while)
                    {
                        FetchCursorStatement fetchCursorStatement = @while.Statements.FirstOrDefault(item => item is FetchCursorStatement) as FetchCursorStatement;

                        if (fetchCursorStatement != null && !statements.Any(item => item is FetchCursorStatement))
                        {
                            @while.Condition.Symbol = "@@FETCH_STATUS = 0";

                            sb.AppendLine(this.BuildStatement(fetchCursorStatement));
                        }
                    }

                    sb.AppendLine(this.BuildStatement(statement));
                }
            };

            ExceptionStatement exceptionStatement = (ExceptionStatement)script.Statements.FirstOrDefault(item => item is ExceptionStatement);

            if (exceptionStatement != null)
            {
                sb.AppendLine("BEGIN TRY");
                appendStatements(script.Statements.Where(item => !(item is ExceptionStatement)));
                sb.AppendLine("END TRY");

                sb.AppendLine("BEGIN CATCH");

                foreach (ExceptionItem exceptionItem in exceptionStatement.Items)
                {
                    sb.AppendLine($"IF {exceptionItem.Name} = ERROR_PROCEDURE() OR {exceptionItem.Name} = ERROR_NUMBER()");
                    sb.AppendLine("BEGIN");

                    appendStatements(exceptionItem.Statements);

                    sb.AppendLine("END");
                }

                sb.AppendLine("END CATCH");
            }
            else
            {
                appendStatements(script.Statements);
            }

            sb.AppendLine("END");

            return(this.FormatScripts(sb.ToString()));
        }