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); }
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(); }