Beispiel #1
0
        public override void Generate(Generator generator, TypeReference returnType)
        {
            base.Generate(generator, returnType);
            expression.Prepare(generator, null);
            expression.Generate(generator);
            generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
            exceptionType.GenerateConversion(this, generator, expression.TypeReference);
            generator.Assembler.PushValue();
            Method m      = exceptionType.Definition.FindMethod(new Identifier(this, "Throw"), false, null, null, true);
            int    offset = exceptionType.Definition.GetMethodOffset(this, m, exceptionType.Definition); // bypasses visibility

            generator.Assembler.FetchMethod(offset);
            generator.Assembler.PushValue();
            Placeholder retSite = generator.Assembler.CallFromStack(0);

            if (generator.Resolver.CurrentDefinition != null)
            {
                generator.AddCallTraceEntry(retSite, this, generator.Resolver.CurrentDefinition.Name.DataModifierLess, generator.Resolver.CurrentFieldName);
            }
            else
            {
                generator.AddCallTraceEntry(retSite, this, "meh", "raiseOverflow");
            }
            generator.Assembler.PopValue();
            generator.Assembler.ExceptionHandlerInvoke();
        }
Beispiel #2
0
        public override void Generate(Generator generator)
        {
            base.Generate(generator);
            Placeholder textLocation = generator.AddTextLengthPrefix(text);

            generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
            generator.Assembler.SetValue(literalStringType.RuntimeStruct, textLocation);
            stringType.GenerateConversion(this, generator, literalStringType);
        }