Ejemplo n.º 1
0
 public FunctionDefinition GetFunctionBySignature(ContractDefinition contract, string signature)
 {
     foreach (FunctionDefinition funcDef in ContractToFunctionsMap[contract])
     {
         if (TransUtils.ComputeFunctionSignature(funcDef).Equals(signature))
         {
             return(funcDef);
         }
     }
     Debug.Assert(false, $"Cannot find function signature: {signature}");
     return(null);
 }
Ejemplo n.º 2
0
        private void ResolveFunctions()
        {
            ResolutionHelper          resolutionHelper = new ResolutionHelper(context);
            List <ContractDefinition> sortedContracts  = resolutionHelper.TopologicalSortByDependency(context.ContractDefinitions);

            foreach (ContractDefinition contract in sortedContracts)
            {
                // create a deep copy
                List <int> linearizedBaseContractIds = new List <int>(contract.LinearizedBaseContracts);
                linearizedBaseContractIds.Reverse();

                foreach (int id in linearizedBaseContractIds)
                {
                    ContractDefinition baseContract = context.GetASTNodeById(id) as ContractDefinition;
                    Debug.Assert(baseContract != null);

                    if (baseContract == contract)
                    {
                        HashSet <FunctionDefinition> functions = context.GetFuncDefintionsInContract(contract);
                        foreach (FunctionDefinition function in functions)
                        {
                            string signature = TransUtils.ComputeFunctionSignature(function);
                            context.AddFunctionToDynamicType(signature, contract, function);
                        }
                    }
                    else
                    {
                        HashSet <FunctionDefinition> functions = context.GetFuncDefintionsInContract(baseContract);
                        foreach (FunctionDefinition function in functions)
                        {
                            if (function.Visibility == EnumVisibility.PRIVATE)
                            {
                                continue;
                            }

                            string signature = TransUtils.ComputeFunctionSignature(function);
                            context.AddFunctionToDynamicType(signature, contract, function);
                        }
                        // Events
                        // TODO: Do we need to lookup by signature?
                        HashSet <EventDefinition> events = context.GetEventDefintionsInContract(baseContract);
                        foreach (var evt in events)
                        {
                            context.AddEventToContract(contract, evt);
                        }
                    }
                }
            }

            // PrintFunctionResolutionMap();
        }
Ejemplo n.º 3
0
        public void AddFunctionToContract(ContractDefinition contract, FunctionDefinition funcDef)
        {
            if (!ContractToFunctionsMap.ContainsKey(contract))
            {
                Debug.Assert(!ContractToFuncSigsMap.ContainsKey(contract));
                ContractToFunctionsMap[contract] = new HashSet <FunctionDefinition>();
                ContractToFuncSigsMap[contract]  = new HashSet <string>();
            }

            Debug.Assert(!ContractToFunctionsMap[contract].Contains(funcDef), $"Duplicated function definition: {funcDef.Name}");
            ContractToFunctionsMap[contract].Add(funcDef);

            string signature = TransUtils.ComputeFunctionSignature(funcDef);

            Debug.Assert(!ContractToFuncSigsMap[contract].Contains(signature), $"Duplicated function signature: {signature}");
            ContractToFuncSigsMap[contract].Add(signature);

            Debug.Assert(!FunctionToContractMap.ContainsKey(funcDef), $"Duplicated function: {funcDef.Name}");
            FunctionToContractMap[funcDef] = contract;
        }