Пример #1
0
        /// <summary>
        /// Create type descriptor from given type.
        /// </summary>
        /// <param name="type">Type from which descriptor will be created.</param>
        /// <param name="resolver">The generic parameter resolver.</param>
        /// <returns>Created type descriptor.</returns>
        public static TypeDescriptor Create(Type type, ParameterResolver resolver = null)
        {
            var builder = new TypeDescriptorBuilder();

            if (resolver == null)
            {
                //create default routine for parameters resolver
                var parameters = new Dictionary <Type, int>();
                resolver = (t) =>
                {
                    int number;
                    if (!parameters.TryGetValue(t, out number))
                    {
                        number = parameters.Count;
                        parameters.Add(t, number);
                    }

                    return(TypeDescriptor.GetParameter(number));
                };
            }

            var adapter = new TypeAdapter(type);
            var result  = TypeHierarchyDirector.BuildDescriptor(adapter, (a) => resolver((a as TypeAdapterBase <Type>).AdaptedType));

            return(result);
        }
Пример #2
0
        public void Main()
        {
            var configurationJson = File.ReadAllText("vm.json", Encoding.UTF8);
            var configuration     = JsonConvert.DeserializeObject <VirtualMachineConfiguration>(configurationJson);

            var builder        = new TypeDescriptorBuilder();
            var instructionSet = builder.Build <IInstructionSet>(configuration.InstructionSet);
            var debugger       = builder.Build <ISupervisor>(configuration.Supervisor);

            var cpu     = builder.Build <ICpu>(configuration.Cpu, instructionSet, debugger);
            var memory  = builder.Build <IMemory>(configuration.Memory);
            var devices = configuration.Devices.Select(d => builder.Build <IDevice>(d)).ToArray();

            if (memoryFileName != null)
            {
                Console.WriteLine($"Loading memory from {memoryFileName}");
                FillMemoryFromFile(memory, memoryFileName);
            }

            Console.WriteLine("Starting devices");

            foreach (var device in devices)
            {
                RunDevice(device, memory);
            }

            Console.WriteLine("Starting cpu\n");

            try
            {
                cpu.Run(memory);
            }
            catch (CpuException e)
            {
                Report(e);
            }
            catch (Exception e)
            {
                Report(e);
            }
        }