Ejemplo n.º 1
0
        protected override Entity InternalResolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> sourceMethod,
            Reference reference)
        {
            var classMethodReference = (ClassMethodReference)reference;

            var resolvedOwner = Resolve(program, sourceMethod, classMethodReference.Owner);

            if (resolvedOwner is ResolvedClassId owningClassId)
            {
                var owner = program.FindClassById(owningClassId);

                var method   = program.GetOrCreateMethod(owner, classMethodReference.Name);
                var methodId = program.GetOrCreateMethodId(classMethodReference.Name);

                var resolvedReference = new ResolvedClassMethodReference <TNode>(owningClassId, methodId);
                resolvedReference.Method = method;

                return(resolvedReference);
            }

            if (resolvedOwner is SecondaryEntity owningEntity)
            {
                var methodId = program.GetOrCreateMethodId(classMethodReference.Name);

                var resolvedReference = new ResolvedObjectMethodReference <TNode>(owningEntity, methodId);
                resolvedReference.FindClassMethod = program.FindMethodById;

                sourceMethod.StoreAdditionalVariable(resolvedReference);
                return(resolvedReference);
            }

            return(null);
        }
        private Dictionary <SecondaryEntity, ParameterIndex> AddIntermediateEdgesIfNeeded(
            GraphStructuredProgram <TNode> targetProgram,
            Dictionary <Entity, ParameterIndex> passedParameters,
            TNode currentSource,
            Func <TNode> nodeCreator,
            Func <SecondaryEntity> variableCreator,
            out TNode newSource)
        {
            var processedParameters = passedParameters.ToDictionary(
                pair =>
            {
                if (!(pair.Key is ResolvedLocalVariable))
                {
                    var newTarget   = nodeCreator();
                    var newVariable = variableCreator();
                    var statement   = new ResolvedAssignmentStatement(null, pair.Key, newVariable);
                    var edge        = new OperationEdge <TNode>(currentSource, statement, newTarget);

                    targetProgram.AddEdge(edge);
                    currentSource = newTarget;

                    return(newVariable);
                }

                return((SecondaryEntity)pair.Key);
            },
                pair => pair.Value);

            newSource = currentSource;
            return(processedParameters);
        }
Ejemplo n.º 3
0
 protected abstract bool Step(
     GraphStructuredProgram <TNode> targetProgram,
     ResolvedMethod <TNode> targetMethod,
     TNode source,
     Statement statement,
     TNode target,
     Func <TNode> nodeCreator);
Ejemplo n.º 4
0
        protected override bool Step(
            GraphStructuredProgram <TNode> targetProgram,
            ResolvedMethod <TNode> targetMethod,
            TNode source,
            Statement statement,
            TNode target,
            Func <TNode> nodeCreator)
        {
            if (statement is AssignmentStatement assignment)
            {
                var sourceEntity = ReferenceResolver.Resolve(targetProgram, targetMethod, assignment.Source);
                var targetEntity = ReferenceResolver.Resolve(targetProgram, targetMethod, assignment.Target);

                var targetSecondaryEntity = targetEntity as SecondaryEntity;
                Trace.Assert(targetSecondaryEntity != null);

                var referencedByThis =
                    assignment.Target is ClassFieldReference classFieldReference &&
                    classFieldReference.Owner is ClassReference classReference &&
                    classReference.ThisClassReference;

                var newStatement = new ResolvedAssignmentStatement(
                    assignment.Location, sourceEntity, targetSecondaryEntity, referencedByThis);

                targetProgram.AddEdge(new OperationEdge <TNode>(source, newStatement, target));

                return(false);
            }

            return(true);
        }
Ejemplo n.º 5
0
        public static Entity Resolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Reference reference)
        {
            if (reference == null)
            {
                Console.Error.WriteLine("Null reference");
                return(null);
            }

            var type = reference.GetType();

            if (!Resolvers.ContainsKey(type))
            {
                Console.Error.WriteLine($"Cannot find resolver for reference type {type}");
            }

            var resolved = Resolvers[type].InternalResolve(program, method, reference);

            if (resolved == null)
            {
                Console.Error.WriteLine($"Reference of type {type} has been resolved as null");
            }

            return(resolved);
        }
Ejemplo n.º 6
0
        protected override InternalStatement RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> owner,
            InternalStatement statement)
        {
            var invocation = (ResolvedInvocationStatement <TNode>)statement;

            var restoredEntity = EntitiesRestorer.Restore(program, owner, invocation.TargetEntity);

            var restoredPassedParameters =
                invocation.PassedParameters.ToDictionary(
                    pair => (SecondaryEntity)EntitiesRestorer.Restore(program, owner, pair.Key),
                    pair => pair.Value);

            var restoredReturnedValues =
                invocation.ReturnedValues.ToDictionary(
                    pair => pair.Key,
                    pair => (SecondaryEntity)EntitiesRestorer.Restore(program, owner, pair.Value));

            return(new ResolvedInvocationStatement <TNode>(
                       invocation,
                       restoredEntity,
                       invocation.TargetMethodId,
                       restoredPassedParameters,
                       restoredReturnedValues));
        }
Ejemplo n.º 7
0
        protected override Entity InternalResolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Reference reference)
        {
            var property = (ClassPropertyReference)reference;

            return(Resolve(program, method, new ClassFieldReference(property.Owner, property.Name)));
        }
Ejemplo n.º 8
0
        protected override Entity InternalResolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Reference reference)
        {
            var real = (ClassReference)reference;

            return(program.GetOrCreateClass(real.ClassId).Id);
        }
Ejemplo n.º 9
0
 protected override bool Step(
     GraphStructuredProgram <TNode> targetProgram,
     ResolvedMethod <TNode> targetMethod,
     TNode source, Statement statement, TNode target,
     Func <TNode> nodeCreator)
 {
     targetProgram.AddOperation(source, new Operation <TNode>(statement, target));
     return(true);
 }
        protected override Entity RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var localFunctionReference = (ResolvedLocalFunctionReference <TNode>)entity;

            method.Methods.TryGetValue(localFunctionReference.MethodId, out var restored);
            localFunctionReference.Method = restored;
            return(localFunctionReference);
        }
Ejemplo n.º 11
0
        protected override Entity RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var classField = (ResolvedClassField)entity;

            var clazz = program.FindClassById(classField.ClassId);

            return(clazz.GetOrCreateField(classField.VariableId));
        }
Ejemplo n.º 12
0
        protected override Entity RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var classMethodReference = (ResolvedClassMethodReference <TNode>)entity;

            classMethodReference.Method =
                program.FindMethodById(classMethodReference.OwnerId, classMethodReference.MethodId);

            return(classMethodReference);
        }
Ejemplo n.º 13
0
        protected PdvmBasedAnalysis(
            GraphStructuredProgram <int> program,
            IContextProcessor <TState, TStackSymbol, Node, OperationEdge <Node>,
                               TContext, GssNode <TStackSymbol, TGssData> > contextProcessor,
            Func <PDVM <TState, TStackSymbol, Node, OperationEdge <Node>, TContext, TGssData> > pdvmProvider)
            : base(program)
        {
            InternalCacheProvider      = new CacheProvider <TState, TStackSymbol, TContext, GssNode <TStackSymbol, TGssData> >();
            InternalTransitionProvider = new TransitionProvider(program);

            InternalSimulation = new PDVMSimulation <TState, TStackSymbol, int, OperationEdge <int>, TContext, TGssData>(
                contextProcessor, InternalCacheProvider, InternalTransitionProvider, pdvmProvider);
        }
Ejemplo n.º 14
0
        public static Entity Restore <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var exists = RegisteredRestorers.TryGetValue(entity.GetType(), out var restorer);

            if (exists)
            {
                return(restorer.RestoreImplementation(program, method, entity));
            }

            return(entity);
        }
Ejemplo n.º 15
0
        public static InternalStatement Restore <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            InternalStatement statement)
        {
            var exists = RegisteredRestorers.TryGetValue(statement.InternalType, out var restorer);

            if (exists)
            {
                return(restorer.RestoreImplementation(program, method, statement));
            }

            return(statement);
        }
Ejemplo n.º 16
0
        protected override Entity RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var objectMethodReference = (ResolvedObjectMethodReference <TNode>)entity;

            var restoredOwner = (SecondaryEntity)Restore(program, method, objectMethodReference.OwningObject);
            var restored      = new ResolvedObjectMethodReference <TNode>(restoredOwner, objectMethodReference.MethodId)
            {
                FindClassMethod = program.FindMethodById
            };

            method.StoreAdditionalVariable(restored);

            return(restored);
        }
        protected override Entity InternalResolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> sourceMethod,
            Reference reference)
        {
            var localFunctionReference = (LocalFunctionReference)reference;

            var methodId = program.GetOrCreateMethodId(localFunctionReference.MethodId.Value);
            var method   = sourceMethod.Methods[methodId];

            var resolvedReference = new ResolvedLocalFunctionReference <TNode>(methodId)
            {
                Method = method
            };

            return(resolvedReference);
        }
Ejemplo n.º 18
0
        protected override InternalStatement RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            InternalStatement statement)
        {
            var assignment = (ResolvedAssignmentStatement)statement;

            var source = EntitiesRestorer.Restore(program, method, assignment.Source);

            Trace.Assert(assignment.Target != null);
            var target = assignment.Target == null ? null : EntitiesRestorer.Restore(program, method, assignment.Target);

            Trace.Assert(target is SecondaryEntity);

            return(new ResolvedAssignmentStatement(
                       assignment.Location, source, (SecondaryEntity)target, assignment.TargetReferencedByThis));
        }
Ejemplo n.º 19
0
        protected override Entity RestoreImplementation <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Entity entity)
        {
            var localVariable = (ResolvedLocalVariable)entity;

            var exists = method.Variables.TryGetValue(localVariable.LocalId, out var variable);

            //Trace.Assert(exists);
            if (!exists)
            {
                method.AddLocalVariable(localVariable);
                variable = localVariable;
            }

            return(variable);
        }
Ejemplo n.º 20
0
        private bool InternalStep(
            GraphStructuredProgram <TNode> targetProgram,
            ResolvedMethod <TNode> targetMethod,
            TNode source,
            Statement statement,
            TNode target,
            Func <TNode> nodeCreator)
        {
            //TODO: Check steps order correctness
            var toContinue =
                myComposedWith?.InternalStep(targetProgram, targetMethod, source, statement, target, nodeCreator);

            if (toContinue == null || toContinue.Value)
            {
                return(Step(targetProgram, targetMethod, source, statement, target, nodeCreator));
            }

            return(false);
        }
        protected override Entity InternalResolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Reference reference)
        {
            var real   = (LocalVariableReference)reference;
            var exists = method.Variables.TryGetValue(real.Index, out var resolved);

            Trace.Assert(exists);
            if (!exists)
            {
                method.AddLocalVariable(new ResolvedLocalVariable(real.Index));
                resolved = method.Variables[real.Index];
            }

            if (resolved.DefaultClassType < 0 && real.DefaultType != null)
            {
                var defaultType = program.GetOrCreateClass(real.DefaultType);
                resolved.DefaultClassType = defaultType.Id.GlobalId;
            }

            return(resolved);
        }
Ejemplo n.º 22
0
 public SourceFilterSink(GraphStructuredProgram <int> program)
     : base(program, getPdvmProvider(program))
 {
     myProgram = program;
 }
Ejemplo n.º 23
0
        protected override Entity InternalResolve <TNode>(
            GraphStructuredProgram <TNode> program,
            ResolvedMethod <TNode> method,
            Reference reference)
        {
            var classFieldReference = (ClassFieldReference)reference;

            if (classFieldReference.Owner is ClassReference classReference)
            {
                var clazz = program.GetOrCreateClass(classReference.ClassId);
                var field = program.GetOrCreateClassField(clazz.Id, classFieldReference.Name);

                if (classFieldReference.DefaultClassType != null)
                {
                    field.DefaultClassType = program.GetOrCreateClass(classFieldReference.DefaultClassType).Id.GlobalId;
                }

                return(field);
            }
            else if (classFieldReference.Owner is LocalVariableReference localVariableReference)
            {
                var localVariable = method.Variables[localVariableReference.Index];
                var fieldId       = program.GetOrCreateFieldId(classFieldReference.Name);

                var resolvedObjectField = new ResolvedObjectField(localVariable, fieldId)
                {
                    FindClassField = program.FindClassFieldById
                };

                method.StoreAdditionalVariable(resolvedObjectField);
                return(resolvedObjectField);
            }
            else if (classFieldReference.Owner is ClassFieldReference anotherReference)
            {
                var resolvedAnotherReference = (SecondaryEntity)Resolve(program, method, anotherReference);
                var fieldId = program.GetOrCreateFieldId(classFieldReference.Name);

                var resolvedObjectField = new ResolvedObjectField(resolvedAnotherReference, fieldId)
                {
                    FindClassField = program.FindClassFieldById
                };

                method.StoreAdditionalVariable(resolvedObjectField);
                return(resolvedObjectField);
            }
            else if (classFieldReference.Owner is ClassPropertyReference propertyReference)
            {
                var resolvedAnotherReference = (SecondaryEntity)Resolve(program, method, propertyReference);
                var fieldId = program.GetOrCreateFieldId(classFieldReference.Name);

                var resolvedObjectField = new ResolvedObjectField(resolvedAnotherReference, fieldId)
                {
                    FindClassField = program.FindClassFieldById
                };

                method.StoreAdditionalVariable(resolvedObjectField);
                return(resolvedObjectField);
            }

            Trace.Assert(false);
            return(null);
        }
Ejemplo n.º 24
0
 public TypePropagation(
     GraphStructuredProgram <int> program)
     : base(program, new MyContextProcessor(), () => PdvmProvider(program))
 {
 }
Ejemplo n.º 25
0
 public MyPdvm(
     GraphStructuredProgram <int> processingProgram)
 {
     myProcessingProgram = processingProgram;
 }
Ejemplo n.º 26
0
 public SourceFilterSinkPDVM(GraphStructuredProgram <int> processingProgram) : base(processingProgram)
 {
     mySinkAttributeId   = Program.GetOrCreateAttribute(Constants.SinkAttribute);
     myFilterAttributeId = Program.GetOrCreateAttribute(Constants.FilterAttribute);
 }
Ejemplo n.º 27
0
 protected abstract InternalStatement RestoreImplementation <TNode>(
     GraphStructuredProgram <TNode> program,
     ResolvedMethod <TNode> method,
     InternalStatement statement);
Ejemplo n.º 28
0
 protected abstract Entity RestoreImplementation <TNode>(
     GraphStructuredProgram <TNode> program,
     ResolvedMethod <TNode> method,
     Entity entity);
Ejemplo n.º 29
0
 protected AbstractAnalysis(GraphStructuredProgram <Node> program)
 {
     Program = program;
 }
Ejemplo n.º 30
0
 protected ILProcessingPDVM(GraphStructuredProgram <Node> program)
 {
     Program = program;
 }