Example #1
0
            public void Call(Generator generator)
            {
                ILocation      location = new NowhereLocation();
                SlotExpression e        = new SlotExpression(location, new Identifier(location, "this"), true);

                e.Resolve(generator);
                e.Prepare(generator, null);
                e.Generate(generator);
                generator.Assembler.SetTypePart(node.RuntimeStruct);
                generator.Assembler.PushValue();
                int i = 0;

                foreach (Expression a in arguments)
                {
                    a.Prepare(generator, node.parameters.ParameterList[i].TypeReference);
                    a.Generate(generator);
                    node.parameters.ParameterList[i].TypeReference.GenerateConversion(a, generator, a.TypeReference);
                    generator.Assembler.PushValue();
                    i++;
                }
                Placeholder retSite = generator.Assembler.CallFromStack(arguments.Count);

                generator.AddCallTraceEntry(retSite, location, generator.Resolver.CurrentDefinition.Name.DataModifierLess, generator.Resolver.CurrentFieldName);
                node.MarkFieldsAssigned(generator);
            }
Example #2
0
        public static void SetupExceptionHandlers(Generator generator)
        {
            ILocation nl = new NowhereLocation();

            generator.Resolver.CurrentFieldName = "raiseOverflow";
            generator.AllocateAssembler();
            generator.Assembler.StartFunction();
            generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, nl);
            generator.OverflowExceptionRegion.WritePlaceholder(generator.Assembler.Region.BaseLocation);
            generator.Resolver.EnterDefinitionContext(null);
            Statement s = new ThrowStatement(nl, new CallExpression(nl, new NewExpression(nl, new TypeName(new Identifier(nl, "pluk.base.OverflowException")))));

            s.Resolve(generator);
            s.Prepare(generator);
            s.Generate(generator, null);
            generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, nl, SourceMark.EndSequence);
            generator.Symbols.WriteCode(generator.Assembler.Region.BaseLocation, generator.Assembler.Region.Length, "raiseOverflow");
            generator.Resolver.LeaveContext();
        }