Vra

Lang storie kort:. Ek gebruik reflector op die System.Security.Util.Tokenizer klas, en daar is baie goto state in daar

Hier is 'n kort voorbeeld brokkie:

    Label_0026:
        if (this._inSavedCharacter != -1)
        {
            num = this._inSavedCharacter;
            this._inSavedCharacter = -1;
        }
        else
        {
            switch (this._inTokenSource)
            {
                case TokenSource.UnicodeByteArray:
                    if ((this._inIndex + 1) < this._inSize)
                    {
                        break;
                    }
                    stream.AddToken(-1);
                    return;

                case TokenSource.UTF8ByteArray:
                    if (this._inIndex < this._inSize)
                    {
                        goto Label_00CF;
                    }
                    stream.AddToken(-1);
                    return;

                case TokenSource.ASCIIByteArray:
                    if (this._inIndex < this._inSize)
                    {
                        goto Label_023C;
                    }
                    stream.AddToken(-1);
                    return;

                case TokenSource.CharArray:
                    if (this._inIndex < this._inSize)
                    {
                        goto Label_0272;
                    }
                    stream.AddToken(-1);
                    return;

                case TokenSource.String:
                    if (this._inIndex < this._inSize)
                    {
                        goto Label_02A8;
                    }
                    stream.AddToken(-1);
                    return;

                case TokenSource.NestedStrings:
                    if (this._inNestedSize == 0)
                    {
                        goto Label_030D;
                    }
                    if (this._inNestedIndex >= this._inNestedSize)
                    {
                        goto Label_0306;
                    }
                    num = this._inNestedString[this._inNestedIndex++];
                    goto Label_0402;

                default:
                    num = this._inTokenReader.Read();
                    if (num == -1)
                    {
                        stream.AddToken(-1);
                        return;
                    }
                    goto Label_0402;
            }
            num = (this._inBytes[this._inIndex + 1] << 8) + this._inBytes[this._inIndex];
            this._inIndex += 2;
        }
        goto Label_0402;
    Label_00CF:
        num = this._inBytes[this._inIndex++];
        if ((num & 0x80) != 0)
        {
            switch (((num & 240) >> 4))
            {
                case 8:
                case 9:
                case 10:
                case 11:
                    throw new XmlSyntaxException(this.LineNo);

                case 12:
                case 13:
                    num &= 0x1f;
                    num3 = 2;
                    break;

                case 14:
                    num &= 15;
                    num3 = 3;
                    break;

                case 15:
                    throw new XmlSyntaxException(this.LineNo);
            }
            if (this._inIndex >= this._inSize)
            {
                throw new XmlSyntaxException(this.LineNo, Environment.GetResourceString("XMLSyntax_UnexpectedEndOfFile"));
            }
            byte num2 = this._inBytes[this._inIndex++];
            if ((num2 & 0xc0) != 0x80)
            {
                throw new XmlSyntaxException(this.LineNo);
            }
            num = (num << 6) | (num2 & 0x3f);
            if (num3 != 2)
            {
                if (this._inIndex >= this._inSize)
                {
                    throw new XmlSyntaxException(this.LineNo, Environment.GetResourceString("XMLSyntax_UnexpectedEndOfFile"));
                }
                num2 = this._inBytes[this._inIndex++];
                if ((num2 & 0xc0) != 0x80)
                {
                    throw new XmlSyntaxException(this.LineNo);
                }
                num = (num << 6) | (num2 & 0x3f);
            }
        }
        goto Label_0402;
    Label_023C:
        num = this._inBytes[this._inIndex++];
        goto Label_0402;
    Label_0272:
        num = this._inChars[this._inIndex++];
        goto Label_0402;
    Label_02A8:
        num = this._inString[this._inIndex++];
        goto Label_0402;
    Label_0306:
        this._inNestedSize = 0;

Ek wese wou weet hoe die klas gewerk, maar die aantal goto se maak dit onmoontlik. Waarskynlik iets soos 'n Tokenizer klas behoeftes swaar word new, so my vraag is: Is Reflector kry dit verkeerd, of is goto n optimalisering vir hierdie klas

Was dit nuttig?

Oplossing

Dit lyk soos Reflector is nie in staat om die oorspronklike lusstruktuur bepaal.

As 'n punt van belang (en waarom dit soms die geval) is daar nie IL opcodes vir dinge soos while en for loops en break en continue. Die ekwivalent IL is net if toetse gekombineer met spronge (maw gotos).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top