All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.oracle.truffle.api.strings.TStringInternalNodesFactory Maven / Gradle / Ivy

Go to download

Truffle is a multi-language framework for executing dynamic languages that achieves high performance when combined with Graal.

There is a newer version: 24.1.1
Show newest version
// CheckStyle: start generated
package com.oracle.truffle.api.strings;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.GeneratedBy;
import com.oracle.truffle.api.dsl.UnsupportedSpecializationException;
import com.oracle.truffle.api.nodes.DenyReplace;
import com.oracle.truffle.api.nodes.ExplodeLoop;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.NodeCost;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.api.strings.AbstractTruffleString.NativePointer;
import com.oracle.truffle.api.strings.MutableTruffleString.CalcLazyAttributesNode;
import com.oracle.truffle.api.strings.MutableTruffleStringFactory.CalcLazyAttributesNodeGen;
import com.oracle.truffle.api.strings.TStringInternalNodes.ByteLengthOfCodePointNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CalcStringAttributesInnerNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CalcStringAttributesNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CodePointAtNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CodePointAtRawNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CodePointIndexToRawNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ConcatEagerNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ConcatMaterializeBytesNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CreateJavaStringNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.CreateSubstringNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.FromBufferWithStringCompactionKnownAttributesNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.FromBufferWithStringCompactionNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.FromJavaStringUTF16Node;
import com.oracle.truffle.api.strings.TStringInternalNodes.FromNativePointerNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.GetCodePointLengthNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.GetCodeRangeNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.IndexOfCodePointNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.IndexOfCodePointRawNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.IndexOfStringNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.IndexOfStringRawNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.LastIndexOfCodePointNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.LastIndexOfCodePointRawNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.LastIndexOfStringNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.LastIndexOfStringRawNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ParseDoubleNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ParseIntNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ParseLongNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.RawIndexToCodePointIndexNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ReadByteNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.RegionEqualsNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.StrideFromCodeRangeNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.SubstringNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.ToJavaStringNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.TransCodeIntlNode;
import com.oracle.truffle.api.strings.TStringInternalNodes.TransCodeNode;
import com.oracle.truffle.api.strings.TStringOpsNodes.RawIndexOfCodePointNode;
import com.oracle.truffle.api.strings.TStringOpsNodes.RawIndexOfStringNode;
import com.oracle.truffle.api.strings.TStringOpsNodes.RawLastIndexOfCodePointNode;
import com.oracle.truffle.api.strings.TStringOpsNodes.RawLastIndexOfStringNode;
import com.oracle.truffle.api.strings.TStringOpsNodesFactory.RawIndexOfCodePointNodeGen;
import com.oracle.truffle.api.strings.TStringOpsNodesFactory.RawIndexOfStringNodeGen;
import com.oracle.truffle.api.strings.TStringOpsNodesFactory.RawLastIndexOfCodePointNodeGen;
import com.oracle.truffle.api.strings.TStringOpsNodesFactory.RawLastIndexOfStringNodeGen;
import com.oracle.truffle.api.strings.TruffleString.Encoding;
import com.oracle.truffle.api.strings.TruffleString.ErrorHandling;
import com.oracle.truffle.api.strings.TruffleString.NumberFormatException;
import com.oracle.truffle.api.strings.TruffleString.ToIndexableNode;
import com.oracle.truffle.api.strings.TruffleStringIterator.NextNode;
import com.oracle.truffle.api.strings.TruffleStringIterator.PreviousNode;
import java.lang.invoke.VarHandle;
import java.util.concurrent.locks.Lock;

@GeneratedBy(TStringInternalNodes.class)
final class TStringInternalNodesFactory {

    @GeneratedBy(GetCodeRangeNode.class)
    static final class GetCodeRangeNodeGen extends GetCodeRangeNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private CalcLazyAttributesNode mutableCacheMiss_calcLazyAttributesNode_;

        private GetCodeRangeNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value) {
            int state_0 = this.state_0_;
            if ((state_0 & 0b1) != 0 /* is-state_0 immutable(TruffleString) */ && arg0Value instanceof TruffleString) {
                TruffleString arg0Value_ = (TruffleString) arg0Value;
                return immutable(arg0Value_);
            }
            if ((state_0 & 0b110) != 0 /* is-state_0 mutableCacheHit(MutableTruffleString) || mutableCacheMiss(MutableTruffleString, CalcLazyAttributesNode) */ && arg0Value instanceof MutableTruffleString) {
                MutableTruffleString arg0Value_ = (MutableTruffleString) arg0Value;
                if ((state_0 & 0b10) != 0 /* is-state_0 mutableCacheHit(MutableTruffleString) */) {
                    if ((!(TStringGuards.isUnknown(arg0Value_.codeRange())))) {
                        return mutableCacheHit(arg0Value_);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 mutableCacheMiss(MutableTruffleString, CalcLazyAttributesNode) */) {
                    if ((TStringGuards.isUnknown(arg0Value_.codeRange()))) {
                        return mutableCacheMiss(arg0Value_, this.mutableCacheMiss_calcLazyAttributesNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 immutable(TruffleString) */;
                    lock.unlock();
                    hasLock = false;
                    return immutable(arg0Value_);
                }
                if (arg0Value instanceof MutableTruffleString) {
                    MutableTruffleString arg0Value_ = (MutableTruffleString) arg0Value;
                    if ((!(TStringGuards.isUnknown(arg0Value_.codeRange())))) {
                        this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 mutableCacheHit(MutableTruffleString) */;
                        lock.unlock();
                        hasLock = false;
                        return mutableCacheHit(arg0Value_);
                    }
                    if ((TStringGuards.isUnknown(arg0Value_.codeRange()))) {
                        this.mutableCacheMiss_calcLazyAttributesNode_ = super.insert((CalcLazyAttributesNodeGen.create()));
                        this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 mutableCacheMiss(MutableTruffleString, CalcLazyAttributesNode) */;
                        lock.unlock();
                        hasLock = false;
                        return mutableCacheMiss(arg0Value_, this.mutableCacheMiss_calcLazyAttributesNode_);
                    }
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null}, arg0Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static GetCodeRangeNode create() {
            return new GetCodeRangeNodeGen();
        }

        public static GetCodeRangeNode getUncached() {
            return GetCodeRangeNodeGen.UNCACHED;
        }

        @GeneratedBy(GetCodeRangeNode.class)
        @DenyReplace
        private static final class Uncached extends GetCodeRangeNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value) {
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    return immutable(arg0Value_);
                }
                if (arg0Value instanceof MutableTruffleString) {
                    MutableTruffleString arg0Value_ = (MutableTruffleString) arg0Value;
                    if ((!(TStringGuards.isUnknown(arg0Value_.codeRange())))) {
                        return mutableCacheHit(arg0Value_);
                    }
                    if ((TStringGuards.isUnknown(arg0Value_.codeRange()))) {
                        return mutableCacheMiss(arg0Value_, (CalcLazyAttributesNodeGen.getUncached()));
                    }
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null}, arg0Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(GetCodePointLengthNode.class)
    static final class GetCodePointLengthNodeGen extends GetCodePointLengthNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private CalcLazyAttributesNode mutableCacheMiss_calcLazyAttributesNode_;

        private GetCodePointLengthNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value) {
            int state_0 = this.state_0_;
            if ((state_0 & 0b1) != 0 /* is-state_0 immutable(TruffleString) */ && arg0Value instanceof TruffleString) {
                TruffleString arg0Value_ = (TruffleString) arg0Value;
                return immutable(arg0Value_);
            }
            if ((state_0 & 0b110) != 0 /* is-state_0 mutableCacheHit(MutableTruffleString) || mutableCacheMiss(MutableTruffleString, CalcLazyAttributesNode) */ && arg0Value instanceof MutableTruffleString) {
                MutableTruffleString arg0Value_ = (MutableTruffleString) arg0Value;
                if ((state_0 & 0b10) != 0 /* is-state_0 mutableCacheHit(MutableTruffleString) */) {
                    if ((arg0Value_.codePointLength() >= 0)) {
                        return mutableCacheHit(arg0Value_);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 mutableCacheMiss(MutableTruffleString, CalcLazyAttributesNode) */) {
                    if ((arg0Value_.codePointLength() < 0)) {
                        return mutableCacheMiss(arg0Value_, this.mutableCacheMiss_calcLazyAttributesNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 immutable(TruffleString) */;
                    lock.unlock();
                    hasLock = false;
                    return immutable(arg0Value_);
                }
                if (arg0Value instanceof MutableTruffleString) {
                    MutableTruffleString arg0Value_ = (MutableTruffleString) arg0Value;
                    if ((arg0Value_.codePointLength() >= 0)) {
                        this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 mutableCacheHit(MutableTruffleString) */;
                        lock.unlock();
                        hasLock = false;
                        return mutableCacheHit(arg0Value_);
                    }
                    if ((arg0Value_.codePointLength() < 0)) {
                        this.mutableCacheMiss_calcLazyAttributesNode_ = super.insert((CalcLazyAttributesNodeGen.create()));
                        this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 mutableCacheMiss(MutableTruffleString, CalcLazyAttributesNode) */;
                        lock.unlock();
                        hasLock = false;
                        return mutableCacheMiss(arg0Value_, this.mutableCacheMiss_calcLazyAttributesNode_);
                    }
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null}, arg0Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static GetCodePointLengthNode create() {
            return new GetCodePointLengthNodeGen();
        }

        public static GetCodePointLengthNode getUncached() {
            return GetCodePointLengthNodeGen.UNCACHED;
        }

        @GeneratedBy(GetCodePointLengthNode.class)
        @DenyReplace
        private static final class Uncached extends GetCodePointLengthNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value) {
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    return immutable(arg0Value_);
                }
                if (arg0Value instanceof MutableTruffleString) {
                    MutableTruffleString arg0Value_ = (MutableTruffleString) arg0Value;
                    if ((arg0Value_.codePointLength() >= 0)) {
                        return mutableCacheHit(arg0Value_);
                    }
                    if ((arg0Value_.codePointLength() < 0)) {
                        return mutableCacheMiss(arg0Value_, (CalcLazyAttributesNodeGen.getUncached()));
                    }
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null}, arg0Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CreateSubstringNode.class)
    static final class CreateSubstringNodeGen extends CreateSubstringNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private volatile int exclude_;
        @Child private CachedData cached_cache;
        @Child private CalcStringAttributesNode uncached_calcAttributesNode_;

        private CreateSubstringNodeGen() {
        }

        @ExplodeLoop
        @Override
        TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) || doUncached(AbstractTruffleString, Object, int, int, int, Encoding, int, CalcStringAttributesNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) */) {
                    CachedData s0_ = this.cached_cache;
                    while (s0_ != null) {
                        if ((arg5Value == s0_.cachedEncoding_) && (arg4Value == s0_.cachedStride_)) {
                            return doCached(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, s0_.cachedEncoding_, s0_.cachedStride_, s0_.calcAttributesNode_);
                        }
                        s0_ = s0_.next_;
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doUncached(AbstractTruffleString, Object, int, int, int, Encoding, int, CalcStringAttributesNode) */) {
                    return doUncached(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.uncached_calcAttributesNode_);
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private TruffleString executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                int exclude = this.exclude_;
                if ((exclude) == 0 /* is-not-exclude doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) */) {
                    int count0_ = 0;
                    CachedData s0_ = this.cached_cache;
                    if ((state_0 & 0b1) != 0 /* is-state_0 doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) */) {
                        while (s0_ != null) {
                            if ((arg5Value == s0_.cachedEncoding_) && (arg4Value == s0_.cachedStride_)) {
                                break;
                            }
                            s0_ = s0_.next_;
                            count0_++;
                        }
                    }
                    if (s0_ == null) {
                        // assert (arg5Value == s0_.cachedEncoding_);
                        // assert (arg4Value == s0_.cachedStride_);
                        if (count0_ < (6)) {
                            s0_ = super.insert(new CachedData(cached_cache));
                            s0_.cachedEncoding_ = (arg5Value);
                            s0_.cachedStride_ = (arg4Value);
                            s0_.calcAttributesNode_ = s0_.insertAccessor((CalcStringAttributesNodeGen.create()));
                            VarHandle.storeStoreFence();
                            this.cached_cache = s0_;
                            this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) */;
                        }
                    }
                    if (s0_ != null) {
                        lock.unlock();
                        hasLock = false;
                        return doCached(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, s0_.cachedEncoding_, s0_.cachedStride_, s0_.calcAttributesNode_);
                    }
                }
                this.uncached_calcAttributesNode_ = super.insert((CalcStringAttributesNodeGen.create()));
                this.exclude_ = exclude = exclude | 0b1 /* add-exclude doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) */;
                this.cached_cache = null;
                state_0 = state_0 & 0xfffffffe /* remove-state_0 doCached(AbstractTruffleString, Object, int, int, int, Encoding, int, Encoding, int, CalcStringAttributesNode) */;
                this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doUncached(AbstractTruffleString, Object, int, int, int, Encoding, int, CalcStringAttributesNode) */;
                lock.unlock();
                hasLock = false;
                return doUncached(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.uncached_calcAttributesNode_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    CachedData s0_ = this.cached_cache;
                    if ((s0_ == null || s0_.next_ == null)) {
                        return NodeCost.MONOMORPHIC;
                    }
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static CreateSubstringNode create() {
            return new CreateSubstringNodeGen();
        }

        public static CreateSubstringNode getUncached() {
            return CreateSubstringNodeGen.UNCACHED;
        }

        @GeneratedBy(CreateSubstringNode.class)
        private static final class CachedData extends Node {

            @Child CachedData next_;
            @CompilationFinal Encoding cachedEncoding_;
            @CompilationFinal int cachedStride_;
            @Child CalcStringAttributesNode calcAttributesNode_;

            CachedData(CachedData next_) {
                this.next_ = next_;
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.NONE;
            }

             T insertAccessor(T node) {
                return super.insert(node);
            }

        }
        @GeneratedBy(CreateSubstringNode.class)
        @DenyReplace
        private static final class Uncached extends CreateSubstringNode {

            @TruffleBoundary
            @Override
            TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
                return doUncached(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (CalcStringAttributesNode.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(FromBufferWithStringCompactionNode.class)
    static final class FromBufferWithStringCompactionNodeGen extends FromBufferWithStringCompactionNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private FromBufferWithStringCompactionData fromBufferWithStringCompaction_cache;

        private FromBufferWithStringCompactionNodeGen() {
        }

        @Override
        TruffleString execute(Object arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, boolean arg4Value, boolean arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 fromBufferWithStringCompaction(Object, int, int, Encoding, boolean, boolean, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile) */) {
                FromBufferWithStringCompactionData s0_ = this.fromBufferWithStringCompaction_cache;
                if (s0_ != null) {
                    return fromBufferWithStringCompaction(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.asciiLatinBytesProfile_, s0_.utf8Profile_, s0_.utf8BrokenProfile_, s0_.utf16Profile_, s0_.utf16CompactProfile_, s0_.utf32Profile_, s0_.utf32Compact0Profile_, s0_.utf32Compact1Profile_, s0_.exoticValidProfile_, s0_.exoticFixedWidthProfile_);
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private TruffleString executeAndSpecialize(Object arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, boolean arg4Value, boolean arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                FromBufferWithStringCompactionData s0_ = new FromBufferWithStringCompactionData();
                s0_.asciiLatinBytesProfile_ = (ConditionProfile.create());
                s0_.utf8Profile_ = (ConditionProfile.create());
                s0_.utf8BrokenProfile_ = (ConditionProfile.create());
                s0_.utf16Profile_ = (ConditionProfile.create());
                s0_.utf16CompactProfile_ = (ConditionProfile.create());
                s0_.utf32Profile_ = (ConditionProfile.create());
                s0_.utf32Compact0Profile_ = (ConditionProfile.create());
                s0_.utf32Compact1Profile_ = (ConditionProfile.create());
                s0_.exoticValidProfile_ = (ConditionProfile.create());
                s0_.exoticFixedWidthProfile_ = (ConditionProfile.create());
                VarHandle.storeStoreFence();
                this.fromBufferWithStringCompaction_cache = s0_;
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 fromBufferWithStringCompaction(Object, int, int, Encoding, boolean, boolean, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile) */;
                lock.unlock();
                hasLock = false;
                return fromBufferWithStringCompaction(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.asciiLatinBytesProfile_, s0_.utf8Profile_, s0_.utf8BrokenProfile_, s0_.utf16Profile_, s0_.utf16CompactProfile_, s0_.utf32Profile_, s0_.utf32Compact0Profile_, s0_.utf32Compact1Profile_, s0_.exoticValidProfile_, s0_.exoticFixedWidthProfile_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static FromBufferWithStringCompactionNode create() {
            return new FromBufferWithStringCompactionNodeGen();
        }

        public static FromBufferWithStringCompactionNode getUncached() {
            return FromBufferWithStringCompactionNodeGen.UNCACHED;
        }

        @GeneratedBy(FromBufferWithStringCompactionNode.class)
        private static final class FromBufferWithStringCompactionData {

            @CompilationFinal ConditionProfile asciiLatinBytesProfile_;
            @CompilationFinal ConditionProfile utf8Profile_;
            @CompilationFinal ConditionProfile utf8BrokenProfile_;
            @CompilationFinal ConditionProfile utf16Profile_;
            @CompilationFinal ConditionProfile utf16CompactProfile_;
            @CompilationFinal ConditionProfile utf32Profile_;
            @CompilationFinal ConditionProfile utf32Compact0Profile_;
            @CompilationFinal ConditionProfile utf32Compact1Profile_;
            @CompilationFinal ConditionProfile exoticValidProfile_;
            @CompilationFinal ConditionProfile exoticFixedWidthProfile_;

            FromBufferWithStringCompactionData() {
            }

        }
        @GeneratedBy(FromBufferWithStringCompactionNode.class)
        @DenyReplace
        private static final class Uncached extends FromBufferWithStringCompactionNode {

            @TruffleBoundary
            @Override
            TruffleString execute(Object arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, boolean arg4Value, boolean arg5Value) {
                return fromBufferWithStringCompaction(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(FromBufferWithStringCompactionKnownAttributesNode.class)
    static final class FromBufferWithStringCompactionKnownAttributesNodeGen extends FromBufferWithStringCompactionKnownAttributesNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private FromBufferWithStringCompactionData fromBufferWithStringCompaction_cache;

        private FromBufferWithStringCompactionKnownAttributesNodeGen() {
        }

        @Override
        TruffleString execute(Object arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 fromBufferWithStringCompaction(Object, int, int, Encoding, int, int, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile) */) {
                FromBufferWithStringCompactionData s0_ = this.fromBufferWithStringCompaction_cache;
                if (s0_ != null) {
                    return fromBufferWithStringCompaction(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.utf16Profile_, s0_.utf16CompactProfile_, s0_.utf32Profile_, s0_.utf32Compact0Profile_, s0_.utf32Compact1Profile_);
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private TruffleString executeAndSpecialize(Object arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                FromBufferWithStringCompactionData s0_ = new FromBufferWithStringCompactionData();
                s0_.utf16Profile_ = (ConditionProfile.create());
                s0_.utf16CompactProfile_ = (ConditionProfile.create());
                s0_.utf32Profile_ = (ConditionProfile.create());
                s0_.utf32Compact0Profile_ = (ConditionProfile.create());
                s0_.utf32Compact1Profile_ = (ConditionProfile.create());
                VarHandle.storeStoreFence();
                this.fromBufferWithStringCompaction_cache = s0_;
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 fromBufferWithStringCompaction(Object, int, int, Encoding, int, int, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile) */;
                lock.unlock();
                hasLock = false;
                return fromBufferWithStringCompaction(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.utf16Profile_, s0_.utf16CompactProfile_, s0_.utf32Profile_, s0_.utf32Compact0Profile_, s0_.utf32Compact1Profile_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static FromBufferWithStringCompactionKnownAttributesNode create() {
            return new FromBufferWithStringCompactionKnownAttributesNodeGen();
        }

        public static FromBufferWithStringCompactionKnownAttributesNode getUncached() {
            return FromBufferWithStringCompactionKnownAttributesNodeGen.UNCACHED;
        }

        @GeneratedBy(FromBufferWithStringCompactionKnownAttributesNode.class)
        private static final class FromBufferWithStringCompactionData {

            @CompilationFinal ConditionProfile utf16Profile_;
            @CompilationFinal ConditionProfile utf16CompactProfile_;
            @CompilationFinal ConditionProfile utf32Profile_;
            @CompilationFinal ConditionProfile utf32Compact0Profile_;
            @CompilationFinal ConditionProfile utf32Compact1Profile_;

            FromBufferWithStringCompactionData() {
            }

        }
        @GeneratedBy(FromBufferWithStringCompactionKnownAttributesNode.class)
        @DenyReplace
        private static final class Uncached extends FromBufferWithStringCompactionKnownAttributesNode {

            @TruffleBoundary
            @Override
            TruffleString execute(Object arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value) {
                return fromBufferWithStringCompaction(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(FromNativePointerNode.class)
    static final class FromNativePointerNodeGen extends FromNativePointerNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private FromNativePointerInternalData fromNativePointerInternal_cache;

        private FromNativePointerNodeGen() {
        }

        @Override
        TruffleString execute(NativePointer arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, boolean arg4Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 fromNativePointerInternal(NativePointer, int, int, Encoding, boolean, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile) */) {
                FromNativePointerInternalData s0_ = this.fromNativePointerInternal_cache;
                if (s0_ != null) {
                    return fromNativePointerInternal(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, s0_.asciiLatinBytesProfile_, s0_.utf8Profile_, s0_.utf8BrokenProfile_, s0_.utf16Profile_, s0_.utf32Profile_, s0_.exoticValidProfile_, s0_.exoticFixedWidthProfile_);
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
        }

        private TruffleString executeAndSpecialize(NativePointer arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, boolean arg4Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                FromNativePointerInternalData s0_ = new FromNativePointerInternalData();
                s0_.asciiLatinBytesProfile_ = (ConditionProfile.create());
                s0_.utf8Profile_ = (ConditionProfile.create());
                s0_.utf8BrokenProfile_ = (ConditionProfile.create());
                s0_.utf16Profile_ = (ConditionProfile.create());
                s0_.utf32Profile_ = (ConditionProfile.create());
                s0_.exoticValidProfile_ = (ConditionProfile.create());
                s0_.exoticFixedWidthProfile_ = (ConditionProfile.create());
                VarHandle.storeStoreFence();
                this.fromNativePointerInternal_cache = s0_;
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 fromNativePointerInternal(NativePointer, int, int, Encoding, boolean, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile, ConditionProfile) */;
                lock.unlock();
                hasLock = false;
                return fromNativePointerInternal(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, s0_.asciiLatinBytesProfile_, s0_.utf8Profile_, s0_.utf8BrokenProfile_, s0_.utf16Profile_, s0_.utf32Profile_, s0_.exoticValidProfile_, s0_.exoticFixedWidthProfile_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static FromNativePointerNode create() {
            return new FromNativePointerNodeGen();
        }

        public static FromNativePointerNode getUncached() {
            return FromNativePointerNodeGen.UNCACHED;
        }

        @GeneratedBy(FromNativePointerNode.class)
        private static final class FromNativePointerInternalData {

            @CompilationFinal ConditionProfile asciiLatinBytesProfile_;
            @CompilationFinal ConditionProfile utf8Profile_;
            @CompilationFinal ConditionProfile utf8BrokenProfile_;
            @CompilationFinal ConditionProfile utf16Profile_;
            @CompilationFinal ConditionProfile utf32Profile_;
            @CompilationFinal ConditionProfile exoticValidProfile_;
            @CompilationFinal ConditionProfile exoticFixedWidthProfile_;

            FromNativePointerInternalData() {
            }

        }
        @GeneratedBy(FromNativePointerNode.class)
        @DenyReplace
        private static final class Uncached extends FromNativePointerNode {

            @TruffleBoundary
            @Override
            TruffleString execute(NativePointer arg0Value, int arg1Value, int arg2Value, Encoding arg3Value, boolean arg4Value) {
                return fromNativePointerInternal(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ByteLengthOfCodePointNode.class)
    static final class ByteLengthOfCodePointNodeGen extends ByteLengthOfCodePointNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private CodePointAtRawNode uTF32BrokenReturnNegative_codePointAtRawNode_;

        private ByteLengthOfCodePointNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || doFixedValidReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || doASCIIBrokenReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || doUTF32BrokenReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, CodePointAtRawNode) || utf8Valid(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || utf8Broken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || utf16Valid(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || utf16Broken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value)) && (TStringGuards.isBestEffort(arg5Value))) {
                        return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doFixedValidReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUpToValidFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                        return doFixedValidReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 doASCIIBrokenReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isAscii(arg3Value)) && (TStringGuards.isBrokenFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                        return doASCIIBrokenReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 doUTF32BrokenReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, CodePointAtRawNode) */) {
                    if ((TStringGuards.isUTF32(arg3Value)) && (TStringGuards.isBrokenFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                        return doUTF32BrokenReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.uTF32BrokenReturnNegative_codePointAtRawNode_);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 utf8Valid(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                        return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 utf8Broken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                        return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b1000000) != 0 /* is-state_0 utf16Valid(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                        return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b10000000) != 0 /* is-state_0 utf16Broken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                        return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100000000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value)) && (TStringGuards.isBestEffort(arg5Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUpToValidFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doFixedValidReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return doFixedValidReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isAscii(arg3Value)) && (TStringGuards.isBrokenFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 doASCIIBrokenReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return doASCIIBrokenReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF32(arg3Value)) && (TStringGuards.isBrokenFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                    this.uTF32BrokenReturnNegative_codePointAtRawNode_ = super.insert((CodePointAtRawNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 doUTF32BrokenReturnNegative(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, CodePointAtRawNode) */;
                    lock.unlock();
                    hasLock = false;
                    return doUTF32BrokenReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.uTF32BrokenReturnNegative_codePointAtRawNode_);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 utf8Valid(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 utf8Broken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1000000 /* add-state_0 utf16Valid(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b10000000 /* add-state_0 utf16Broken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                    this.state_0_ = state_0 = state_0 | 0b100000000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ByteLengthOfCodePointNode create() {
            return new ByteLengthOfCodePointNodeGen();
        }

        public static ByteLengthOfCodePointNode getUncached() {
            return ByteLengthOfCodePointNodeGen.UNCACHED;
        }

        @GeneratedBy(ByteLengthOfCodePointNode.class)
        @DenyReplace
        private static final class Uncached extends ByteLengthOfCodePointNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
                if ((TStringGuards.isFixedWidth(arg2Value)) && (TStringGuards.isBestEffort(arg5Value))) {
                    return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUpToValidFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                    return doFixedValidReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isAscii(arg3Value)) && (TStringGuards.isBrokenFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                    return doASCIIBrokenReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF32(arg3Value)) && (TStringGuards.isBrokenFixedWidth(arg2Value)) && (TStringGuards.isReturnNegative(arg5Value))) {
                    return doUTF32BrokenReturnNegative(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (CodePointAtRawNodeGen.getUncached()));
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(RawIndexToCodePointIndexNode.class)
    static final class RawIndexToCodePointIndexNodeGen extends RawIndexToCodePointIndexNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ConditionProfile utf8Valid_brokenProfile_;
        @CompilationFinal private ConditionProfile utf8Broken_brokenProfile_;
        @CompilationFinal private ConditionProfile unsupported_validProfile_;
        @CompilationFinal private ConditionProfile unsupported_fixedWidthProfile_;

        private RawIndexToCodePointIndexNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, int) || utf8Valid(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile) || utf8Broken(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile) || utf16Valid(AbstractTruffleString, Object, int, Encoding, int, int) || utf16Broken(AbstractTruffleString, Object, int, Encoding, int, int) || unsupported(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile, ConditionProfile) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, int) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value))) {
                        return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 utf8Valid(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                        return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8Valid_brokenProfile_);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf8Broken(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                        return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8Broken_brokenProfile_);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 utf16Valid(AbstractTruffleString, Object, int, Encoding, int, int) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                        return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 utf16Broken(AbstractTruffleString, Object, int, Encoding, int, int) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                        return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.unsupported_validProfile_, this.unsupported_fixedWidthProfile_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, int) */;
                    lock.unlock();
                    hasLock = false;
                    return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    this.utf8Valid_brokenProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 utf8Valid(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8Valid_brokenProfile_);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    this.utf8Broken_brokenProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf8Broken(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8Broken_brokenProfile_);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 utf16Valid(AbstractTruffleString, Object, int, Encoding, int, int) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 utf16Broken(AbstractTruffleString, Object, int, Encoding, int, int) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                    this.unsupported_validProfile_ = (ConditionProfile.create());
                    this.unsupported_fixedWidthProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.unsupported_validProfile_, this.unsupported_fixedWidthProfile_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static RawIndexToCodePointIndexNode create() {
            return new RawIndexToCodePointIndexNodeGen();
        }

        public static RawIndexToCodePointIndexNode getUncached() {
            return RawIndexToCodePointIndexNodeGen.UNCACHED;
        }

        @GeneratedBy(RawIndexToCodePointIndexNode.class)
        @DenyReplace
        private static final class Uncached extends RawIndexToCodePointIndexNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value) {
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CodePointIndexToRawNode.class)
    static final class CodePointIndexToRawNodeGen extends CodePointIndexToRawNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private int state_0_;

        private CodePointIndexToRawNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, boolean arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, int, boolean) || utf8Valid(AbstractTruffleString, Object, int, Encoding, int, int, boolean) || utf8Broken(AbstractTruffleString, Object, int, Encoding, int, int, boolean) || utf16Valid(AbstractTruffleString, Object, int, Encoding, int, int, boolean) || utf16Broken(AbstractTruffleString, Object, int, Encoding, int, int, boolean) || unsupported(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value))) {
                        return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 utf8Valid(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                        return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf8Broken(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                        return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 utf16Valid(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                        return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 utf16Broken(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                        return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, boolean arg6Value) {
            int state_0 = this.state_0_;
            if ((TStringGuards.isFixedWidth(arg2Value))) {
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 utf8Valid(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf8Broken(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 utf16Valid(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 utf16Broken(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static CodePointIndexToRawNode create() {
            return new CodePointIndexToRawNodeGen();
        }

        public static CodePointIndexToRawNode getUncached() {
            return CodePointIndexToRawNodeGen.UNCACHED;
        }

        @GeneratedBy(CodePointIndexToRawNode.class)
        @DenyReplace
        private static final class Uncached extends CodePointIndexToRawNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, boolean arg6Value) {
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    return doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    return utf8Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    return utf8Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isValidMultiByte(arg2Value))) {
                    return utf16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (TStringGuards.isBrokenMultiByte(arg2Value))) {
                    return utf16Broken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ReadByteNode.class)
    static final class ReadByteNodeGen extends ReadByteNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ConditionProfile uTF16_stride0Profile_;
        @CompilationFinal private ConditionProfile uTF32_stride0Profile_;
        @CompilationFinal private ConditionProfile uTF32_stride1Profile_;

        private ReadByteNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doUTF16(AbstractTruffleString, Object, int, Encoding, ConditionProfile) || doUTF32(AbstractTruffleString, Object, int, Encoding, ConditionProfile, ConditionProfile) || doRest(AbstractTruffleString, Object, int, Encoding) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doUTF16(AbstractTruffleString, Object, int, Encoding, ConditionProfile) */) {
                    if ((TStringGuards.isUTF16(arg3Value))) {
                        return ReadByteNode.doUTF16(arg0Value, arg1Value, arg2Value, arg3Value, this.uTF16_stride0Profile_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doUTF32(AbstractTruffleString, Object, int, Encoding, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUTF32(arg3Value))) {
                        return ReadByteNode.doUTF32(arg0Value, arg1Value, arg2Value, arg3Value, this.uTF32_stride0Profile_, this.uTF32_stride1Profile_);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 doRest(AbstractTruffleString, Object, int, Encoding) */) {
                    if ((!(TStringGuards.isUTF16Or32(arg3Value)))) {
                        return ReadByteNode.doRest(arg0Value, arg1Value, arg2Value, arg3Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isUTF16(arg3Value))) {
                    this.uTF16_stride0Profile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doUTF16(AbstractTruffleString, Object, int, Encoding, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return ReadByteNode.doUTF16(arg0Value, arg1Value, arg2Value, arg3Value, this.uTF16_stride0Profile_);
                }
                if ((TStringGuards.isUTF32(arg3Value))) {
                    this.uTF32_stride0Profile_ = (ConditionProfile.create());
                    this.uTF32_stride1Profile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doUTF32(AbstractTruffleString, Object, int, Encoding, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return ReadByteNode.doUTF32(arg0Value, arg1Value, arg2Value, arg3Value, this.uTF32_stride0Profile_, this.uTF32_stride1Profile_);
                }
                if ((!(TStringGuards.isUTF16Or32(arg3Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 doRest(AbstractTruffleString, Object, int, Encoding) */;
                    lock.unlock();
                    hasLock = false;
                    return ReadByteNode.doRest(arg0Value, arg1Value, arg2Value, arg3Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ReadByteNode create() {
            return new ReadByteNodeGen();
        }

        public static ReadByteNode getUncached() {
            return ReadByteNodeGen.UNCACHED;
        }

        @GeneratedBy(ReadByteNode.class)
        @DenyReplace
        private static final class Uncached extends ReadByteNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value) {
                if ((TStringGuards.isUTF16(arg3Value))) {
                    return ReadByteNode.doUTF16(arg0Value, arg1Value, arg2Value, arg3Value, (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF32(arg3Value))) {
                    return ReadByteNode.doUTF32(arg0Value, arg1Value, arg2Value, arg3Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((!(TStringGuards.isUTF16Or32(arg3Value)))) {
                    return ReadByteNode.doRest(arg0Value, arg1Value, arg2Value, arg3Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CodePointAtNode.class)
    static final class CodePointAtNodeGen extends CodePointAtNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private Utf16Data utf16_cache;
        @CompilationFinal private ConditionProfile utf32_stride0Profile_;
        @CompilationFinal private ConditionProfile utf32_stride1Profile_;
        @CompilationFinal private ConditionProfile utf8_fixedWidthProfile_;
        @CompilationFinal private ConditionProfile utf8_validProfile_;

        private CodePointAtNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 utf16(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile, ConditionProfile) || utf32(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) || utf8(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) || doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || doAsciiBroken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 utf16(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile, ConditionProfile) */) {
                    Utf16Data s0_ = this.utf16_cache;
                    if (s0_ != null) {
                        if ((TStringGuards.isUTF16(arg3Value))) {
                            return utf16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.fixedWidthProfile_, s0_.stride0Profile_, s0_.validProfile_);
                        }
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 utf32(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUTF32(arg3Value))) {
                        return CodePointAtNode.utf32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf32_stride0Profile_, this.utf32_stride1Profile_);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf8(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUTF8(arg3Value))) {
                        return utf8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8_fixedWidthProfile_, this.utf8_validProfile_);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((!(TStringGuards.isUTF16Or32(arg3Value))) && (!(TStringGuards.isUTF8(arg3Value))) && (TStringGuards.isBytes(arg3Value) || TStringGuards.is7Or8Bit(arg2Value))) {
                        return CodePointAtNode.doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 doAsciiBroken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isAscii(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                        return CodePointAtNode.doAsciiBroken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isUTF16(arg3Value))) {
                    Utf16Data s0_ = new Utf16Data();
                    s0_.fixedWidthProfile_ = (ConditionProfile.create());
                    s0_.stride0Profile_ = (ConditionProfile.create());
                    s0_.validProfile_ = (ConditionProfile.create());
                    VarHandle.storeStoreFence();
                    this.utf16_cache = s0_;
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 utf16(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.fixedWidthProfile_, s0_.stride0Profile_, s0_.validProfile_);
                }
                if ((TStringGuards.isUTF32(arg3Value))) {
                    this.utf32_stride0Profile_ = (ConditionProfile.create());
                    this.utf32_stride1Profile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 utf32(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtNode.utf32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf32_stride0Profile_, this.utf32_stride1Profile_);
                }
                if ((TStringGuards.isUTF8(arg3Value))) {
                    this.utf8_fixedWidthProfile_ = (ConditionProfile.create());
                    this.utf8_validProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf8(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8_fixedWidthProfile_, this.utf8_validProfile_);
                }
                if ((!(TStringGuards.isUTF16Or32(arg3Value))) && (!(TStringGuards.isUTF8(arg3Value))) && (TStringGuards.isBytes(arg3Value) || TStringGuards.is7Or8Bit(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtNode.doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isAscii(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 doAsciiBroken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtNode.doAsciiBroken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static CodePointAtNode create() {
            return new CodePointAtNodeGen();
        }

        public static CodePointAtNode getUncached() {
            return CodePointAtNodeGen.UNCACHED;
        }

        @GeneratedBy(CodePointAtNode.class)
        private static final class Utf16Data {

            @CompilationFinal ConditionProfile fixedWidthProfile_;
            @CompilationFinal ConditionProfile stride0Profile_;
            @CompilationFinal ConditionProfile validProfile_;

            Utf16Data() {
            }

        }
        @GeneratedBy(CodePointAtNode.class)
        @DenyReplace
        private static final class Uncached extends CodePointAtNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
                if ((TStringGuards.isUTF16(arg3Value))) {
                    return utf16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF32(arg3Value))) {
                    return CodePointAtNode.utf32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF8(arg3Value))) {
                    return utf8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((!(TStringGuards.isUTF16Or32(arg3Value))) && (!(TStringGuards.isUTF8(arg3Value))) && (TStringGuards.isBytes(arg3Value) || TStringGuards.is7Or8Bit(arg2Value))) {
                    return CodePointAtNode.doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isAscii(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    return CodePointAtNode.doAsciiBroken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CodePointAtRawNode.class)
    static final class CodePointAtRawNodeGen extends CodePointAtRawNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private Utf16Data utf16_cache;
        @CompilationFinal private ConditionProfile utf32_stride0Profile_;
        @CompilationFinal private ConditionProfile utf32_stride1Profile_;
        @CompilationFinal private ConditionProfile utf8_fixedWidthProfile_;
        @CompilationFinal private ConditionProfile utf8_validProfile_;

        private CodePointAtRawNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 utf16(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile, ConditionProfile) || utf32(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) || utf8(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) || doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || doAsciiBroken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) || unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 utf16(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile, ConditionProfile) */) {
                    Utf16Data s0_ = this.utf16_cache;
                    if (s0_ != null) {
                        if ((TStringGuards.isUTF16(arg3Value))) {
                            return CodePointAtRawNode.utf16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.fixedWidthProfile_, s0_.validProfile_, s0_.stride0Profile_);
                        }
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 utf32(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUTF32(arg3Value))) {
                        return CodePointAtRawNode.utf32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf32_stride0Profile_, this.utf32_stride1Profile_);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf8(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUTF8(arg3Value))) {
                        return CodePointAtRawNode.utf8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8_fixedWidthProfile_, this.utf8_validProfile_);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((!(TStringGuards.isUTF16Or32(arg3Value))) && (!(TStringGuards.isUTF8(arg3Value))) && (TStringGuards.isBytes(arg3Value) || TStringGuards.is7Or8Bit(arg2Value))) {
                        return CodePointAtRawNode.doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 doAsciiBroken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isAscii(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                        return CodePointAtRawNode.doAsciiBroken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                        return CodePointAtRawNode.unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isUTF16(arg3Value))) {
                    Utf16Data s0_ = new Utf16Data();
                    s0_.fixedWidthProfile_ = (ConditionProfile.create());
                    s0_.validProfile_ = (ConditionProfile.create());
                    s0_.stride0Profile_ = (ConditionProfile.create());
                    VarHandle.storeStoreFence();
                    this.utf16_cache = s0_;
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 utf16(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtRawNode.utf16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.fixedWidthProfile_, s0_.validProfile_, s0_.stride0Profile_);
                }
                if ((TStringGuards.isUTF32(arg3Value))) {
                    this.utf32_stride0Profile_ = (ConditionProfile.create());
                    this.utf32_stride1Profile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 utf32(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtRawNode.utf32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf32_stride0Profile_, this.utf32_stride1Profile_);
                }
                if ((TStringGuards.isUTF8(arg3Value))) {
                    this.utf8_fixedWidthProfile_ = (ConditionProfile.create());
                    this.utf8_validProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf8(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtRawNode.utf8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.utf8_fixedWidthProfile_, this.utf8_validProfile_);
                }
                if ((!(TStringGuards.isUTF16Or32(arg3Value))) && (!(TStringGuards.isUTF8(arg3Value))) && (TStringGuards.isBytes(arg3Value) || TStringGuards.is7Or8Bit(arg2Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 doFixed(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtRawNode.doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isAscii(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 doAsciiBroken(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtRawNode.doAsciiBroken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, ErrorHandling) */;
                    lock.unlock();
                    hasLock = false;
                    return CodePointAtRawNode.unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static CodePointAtRawNode create() {
            return new CodePointAtRawNodeGen();
        }

        public static CodePointAtRawNode getUncached() {
            return CodePointAtRawNodeGen.UNCACHED;
        }

        @GeneratedBy(CodePointAtRawNode.class)
        private static final class Utf16Data {

            @CompilationFinal ConditionProfile fixedWidthProfile_;
            @CompilationFinal ConditionProfile validProfile_;
            @CompilationFinal ConditionProfile stride0Profile_;

            Utf16Data() {
            }

        }
        @GeneratedBy(CodePointAtRawNode.class)
        @DenyReplace
        private static final class Uncached extends CodePointAtRawNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, ErrorHandling arg5Value) {
                if ((TStringGuards.isUTF16(arg3Value))) {
                    return CodePointAtRawNode.utf16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF32(arg3Value))) {
                    return CodePointAtRawNode.utf32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF8(arg3Value))) {
                    return CodePointAtRawNode.utf8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                if ((!(TStringGuards.isUTF16Or32(arg3Value))) && (!(TStringGuards.isUTF8(arg3Value))) && (TStringGuards.isBytes(arg3Value) || TStringGuards.is7Or8Bit(arg2Value))) {
                    return CodePointAtRawNode.doFixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isAscii(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    return CodePointAtRawNode.doAsciiBroken(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.is7Or8Bit(arg2Value)))) {
                    return CodePointAtRawNode.unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(IndexOfCodePointNode.class)
    static final class IndexOfCodePointNodeGen extends IndexOfCodePointNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawIndexOfCodePointNode fixedWidth_indexOfNode_;
        @Child private NextNode decode_nextNode_;

        private IndexOfCodePointNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doFixedWidth(AbstractTruffleString, Object, int, Encoding, int, int, int, RawIndexOfCodePointNode) || decode(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doFixedWidth(AbstractTruffleString, Object, int, Encoding, int, int, int, RawIndexOfCodePointNode) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value))) {
                        return IndexOfCodePointNode.doFixedWidth(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.fixedWidth_indexOfNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 decode(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */) {
                    if ((!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.decode_nextNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    this.fixedWidth_indexOfNode_ = super.insert((RawIndexOfCodePointNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doFixedWidth(AbstractTruffleString, Object, int, Encoding, int, int, int, RawIndexOfCodePointNode) */;
                    lock.unlock();
                    hasLock = false;
                    return IndexOfCodePointNode.doFixedWidth(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.fixedWidth_indexOfNode_);
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.decode_nextNode_ = super.insert((NextNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 decode(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.decode_nextNode_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static IndexOfCodePointNode create() {
            return new IndexOfCodePointNodeGen();
        }

        public static IndexOfCodePointNode getUncached() {
            return IndexOfCodePointNodeGen.UNCACHED;
        }

        @GeneratedBy(IndexOfCodePointNode.class)
        @DenyReplace
        private static final class Uncached extends IndexOfCodePointNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    return IndexOfCodePointNode.doFixedWidth(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (RawIndexOfCodePointNodeGen.getUncached()));
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (NextNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(IndexOfCodePointRawNode.class)
    static final class IndexOfCodePointRawNodeGen extends IndexOfCodePointRawNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawIndexOfCodePointNode utf8Fixed_indexOfNode_;
        @Child private NextNode unsupported_nextNode_;

        private IndexOfCodePointRawNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 utf8Fixed(AbstractTruffleString, Object, int, Encoding, int, int, int, RawIndexOfCodePointNode) || utf8Variable(AbstractTruffleString, Object, int, Encoding, int, int, int) || utf16Variable(AbstractTruffleString, Object, int, Encoding, int, int, int) || unsupported(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 utf8Fixed(AbstractTruffleString, Object, int, Encoding, int, int, int, RawIndexOfCodePointNode) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value))) {
                        return IndexOfCodePointRawNode.utf8Fixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.utf8Fixed_indexOfNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 utf8Variable(AbstractTruffleString, Object, int, Encoding, int, int, int) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return utf8Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf16Variable(AbstractTruffleString, Object, int, Encoding, int, int, int) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return utf16Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.unsupported_nextNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    this.utf8Fixed_indexOfNode_ = super.insert((RawIndexOfCodePointNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 utf8Fixed(AbstractTruffleString, Object, int, Encoding, int, int, int, RawIndexOfCodePointNode) */;
                    lock.unlock();
                    hasLock = false;
                    return IndexOfCodePointRawNode.utf8Fixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.utf8Fixed_indexOfNode_);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 utf8Variable(AbstractTruffleString, Object, int, Encoding, int, int, int) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf16Variable(AbstractTruffleString, Object, int, Encoding, int, int, int) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.unsupported_nextNode_ = super.insert((NextNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.unsupported_nextNode_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static IndexOfCodePointRawNode create() {
            return new IndexOfCodePointRawNodeGen();
        }

        public static IndexOfCodePointRawNode getUncached() {
            return IndexOfCodePointRawNodeGen.UNCACHED;
        }

        @GeneratedBy(IndexOfCodePointRawNode.class)
        @DenyReplace
        private static final class Uncached extends IndexOfCodePointRawNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    return IndexOfCodePointRawNode.utf8Fixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (RawIndexOfCodePointNodeGen.getUncached()));
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return utf8Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return utf16Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (NextNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(LastIndexOfCodePointNode.class)
    static final class LastIndexOfCodePointNodeGen extends LastIndexOfCodePointNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawLastIndexOfCodePointNode fixedWidth_lastIndexOfNode_;
        @Child private NextNode decode_nextNode_;

        private LastIndexOfCodePointNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doFixedWidth(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) || decode(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doFixedWidth(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value))) {
                        return LastIndexOfCodePointNode.doFixedWidth(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.fixedWidth_lastIndexOfNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 decode(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */) {
                    if ((!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.decode_nextNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    this.fixedWidth_lastIndexOfNode_ = super.insert((RawLastIndexOfCodePointNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doFixedWidth(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */;
                    lock.unlock();
                    hasLock = false;
                    return LastIndexOfCodePointNode.doFixedWidth(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.fixedWidth_lastIndexOfNode_);
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.decode_nextNode_ = super.insert((NextNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 decode(AbstractTruffleString, Object, int, Encoding, int, int, int, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.decode_nextNode_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static LastIndexOfCodePointNode create() {
            return new LastIndexOfCodePointNodeGen();
        }

        public static LastIndexOfCodePointNode getUncached() {
            return LastIndexOfCodePointNodeGen.UNCACHED;
        }

        @GeneratedBy(LastIndexOfCodePointNode.class)
        @DenyReplace
        private static final class Uncached extends LastIndexOfCodePointNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    return LastIndexOfCodePointNode.doFixedWidth(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (RawLastIndexOfCodePointNodeGen.getUncached()));
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (NextNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(LastIndexOfCodePointRawNode.class)
    static final class LastIndexOfCodePointRawNodeGen extends LastIndexOfCodePointRawNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawLastIndexOfCodePointNode lastIndexOfNode;
        @Child private PreviousNode unsupported_prevNode_;

        private LastIndexOfCodePointRawNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 utf8Fixed(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) || utf8Variable(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) || utf16Variable(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) || unsupported(AbstractTruffleString, Object, int, Encoding, int, int, int, PreviousNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 utf8Fixed(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value))) {
                        return LastIndexOfCodePointRawNode.utf8Fixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.lastIndexOfNode);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 utf8Variable(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */) {
                    if ((TStringGuards.isUTF8(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return utf8Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.lastIndexOfNode);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf16Variable(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */) {
                    if ((TStringGuards.isUTF16(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return utf16Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.lastIndexOfNode);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, int, PreviousNode) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.unsupported_prevNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    this.lastIndexOfNode = super.insert(this.lastIndexOfNode == null ? ((RawLastIndexOfCodePointNodeGen.create())) : this.lastIndexOfNode);
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 utf8Fixed(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */;
                    lock.unlock();
                    hasLock = false;
                    return LastIndexOfCodePointRawNode.utf8Fixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.lastIndexOfNode);
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.lastIndexOfNode = super.insert(this.lastIndexOfNode == null ? ((RawLastIndexOfCodePointNodeGen.create())) : this.lastIndexOfNode);
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 utf8Variable(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.lastIndexOfNode);
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.lastIndexOfNode = super.insert(this.lastIndexOfNode == null ? ((RawLastIndexOfCodePointNodeGen.create())) : this.lastIndexOfNode);
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf16Variable(AbstractTruffleString, Object, int, Encoding, int, int, int, RawLastIndexOfCodePointNode) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.lastIndexOfNode);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.unsupported_prevNode_ = super.insert((PreviousNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, Encoding, int, int, int, PreviousNode) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.unsupported_prevNode_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static LastIndexOfCodePointRawNode create() {
            return new LastIndexOfCodePointRawNodeGen();
        }

        public static LastIndexOfCodePointRawNode getUncached() {
            return LastIndexOfCodePointRawNodeGen.UNCACHED;
        }

        @GeneratedBy(LastIndexOfCodePointRawNode.class)
        @DenyReplace
        private static final class Uncached extends LastIndexOfCodePointRawNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, int arg6Value) {
                if ((TStringGuards.isFixedWidth(arg2Value))) {
                    return LastIndexOfCodePointRawNode.utf8Fixed(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (RawLastIndexOfCodePointNodeGen.getUncached()));
                }
                if ((TStringGuards.isUTF8(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return utf8Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (RawLastIndexOfCodePointNodeGen.getUncached()));
                }
                if ((TStringGuards.isUTF16(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return utf16Variable(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (RawLastIndexOfCodePointNodeGen.getUncached()));
                }
                if ((TStringGuards.isUnsupportedEncoding(arg3Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (PreviousNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(SubstringNode.class)
    static final class SubstringNodeGen extends SubstringNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private CreateSubstringNode materializeSubstring_createSubstringNode_;
        @Child private CreateLazySubstringData createLazySubstring_cache;

        private SubstringNodeGen() {
        }

        @Override
        TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, boolean arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 lengthZero(AbstractTruffleString, Object, int, Encoding, int, int, boolean) || sameStr(TruffleString, Object, int, Encoding, int, int, boolean) || materializeSubstring(AbstractTruffleString, Object, int, Encoding, int, int, boolean, CreateSubstringNode) || createLazySubstring(TruffleString, Object, int, Encoding, int, int, boolean, CalcStringAttributesNode, ConditionProfile, ConditionProfile) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 lengthZero(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */) {
                    if ((arg5Value == 0)) {
                        return SubstringNode.lengthZero(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 sameStr(TruffleString, Object, int, Encoding, int, int, boolean) */ && arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    if ((arg4Value == 0) && (arg5Value == TStringGuards.length(arg0Value_))) {
                        return SubstringNode.sameStr(arg0Value_, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 materializeSubstring(AbstractTruffleString, Object, int, Encoding, int, int, boolean, CreateSubstringNode) */) {
                    if ((arg5Value > 0) && (arg5Value != TStringGuards.length(arg0Value) || arg0Value.isMutable()) && (!(arg6Value))) {
                        return SubstringNode.materializeSubstring(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.materializeSubstring_createSubstringNode_);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 createLazySubstring(TruffleString, Object, int, Encoding, int, int, boolean, CalcStringAttributesNode, ConditionProfile, ConditionProfile) */ && arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    CreateLazySubstringData s3_ = this.createLazySubstring_cache;
                    if (s3_ != null) {
                        if ((arg5Value > 0) && (arg5Value != TStringGuards.length(arg0Value_)) && (arg6Value)) {
                            return createLazySubstring(arg0Value_, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, s3_.calcAttributesNode_, s3_.stride1MustMaterializeProfile_, s3_.stride2MustMaterializeProfile_);
                        }
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private TruffleString executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, boolean arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((arg5Value == 0)) {
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 lengthZero(AbstractTruffleString, Object, int, Encoding, int, int, boolean) */;
                    lock.unlock();
                    hasLock = false;
                    return SubstringNode.lengthZero(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    if ((arg4Value == 0) && (arg5Value == TStringGuards.length(arg0Value_))) {
                        this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 sameStr(TruffleString, Object, int, Encoding, int, int, boolean) */;
                        lock.unlock();
                        hasLock = false;
                        return SubstringNode.sameStr(arg0Value_, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((arg5Value > 0) && (arg5Value != TStringGuards.length(arg0Value) || arg0Value.isMutable()) && (!(arg6Value))) {
                    this.materializeSubstring_createSubstringNode_ = super.insert((CreateSubstringNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 materializeSubstring(AbstractTruffleString, Object, int, Encoding, int, int, boolean, CreateSubstringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return SubstringNode.materializeSubstring(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.materializeSubstring_createSubstringNode_);
                }
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    if ((arg5Value > 0) && (arg5Value != TStringGuards.length(arg0Value_)) && (arg6Value)) {
                        CreateLazySubstringData s3_ = super.insert(new CreateLazySubstringData());
                        s3_.calcAttributesNode_ = s3_.insertAccessor((CalcStringAttributesNodeGen.create()));
                        s3_.stride1MustMaterializeProfile_ = (ConditionProfile.create());
                        s3_.stride2MustMaterializeProfile_ = (ConditionProfile.create());
                        VarHandle.storeStoreFence();
                        this.createLazySubstring_cache = s3_;
                        this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 createLazySubstring(TruffleString, Object, int, Encoding, int, int, boolean, CalcStringAttributesNode, ConditionProfile, ConditionProfile) */;
                        lock.unlock();
                        hasLock = false;
                        return createLazySubstring(arg0Value_, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, s3_.calcAttributesNode_, s3_.stride1MustMaterializeProfile_, s3_.stride2MustMaterializeProfile_);
                    }
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static SubstringNode create() {
            return new SubstringNodeGen();
        }

        public static SubstringNode getUncached() {
            return SubstringNodeGen.UNCACHED;
        }

        @GeneratedBy(SubstringNode.class)
        private static final class CreateLazySubstringData extends Node {

            @Child CalcStringAttributesNode calcAttributesNode_;
            @CompilationFinal ConditionProfile stride1MustMaterializeProfile_;
            @CompilationFinal ConditionProfile stride2MustMaterializeProfile_;

            CreateLazySubstringData() {
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.NONE;
            }

             T insertAccessor(T node) {
                return super.insert(node);
            }

        }
        @GeneratedBy(SubstringNode.class)
        @DenyReplace
        private static final class Uncached extends SubstringNode {

            @TruffleBoundary
            @Override
            TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value, int arg5Value, boolean arg6Value) {
                if ((arg5Value == 0)) {
                    return SubstringNode.lengthZero(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    if ((arg4Value == 0) && (arg5Value == TStringGuards.length(arg0Value_))) {
                        return SubstringNode.sameStr(arg0Value_, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((arg5Value > 0) && (arg5Value != TStringGuards.length(arg0Value) || arg0Value.isMutable()) && (!(arg6Value))) {
                    return SubstringNode.materializeSubstring(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (CreateSubstringNodeGen.getUncached()));
                }
                if (arg0Value instanceof TruffleString) {
                    TruffleString arg0Value_ = (TruffleString) arg0Value;
                    if ((arg5Value > 0) && (arg5Value != TStringGuards.length(arg0Value_)) && (arg6Value)) {
                        return createLazySubstring(arg0Value_, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (CalcStringAttributesNode.getUncached()), (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                    }
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ConcatEagerNode.class)
    static final class ConcatEagerNodeGen extends ConcatEagerNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private ConcatData concat_cache;

        private ConcatEagerNodeGen() {
        }

        @Override
        TruffleString execute(AbstractTruffleString arg0Value, AbstractTruffleString arg1Value, Encoding arg2Value, int arg3Value, int arg4Value, int arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 concat(AbstractTruffleString, AbstractTruffleString, Encoding, int, int, int, ToIndexableNode, ToIndexableNode, GetCodePointLengthNode, GetCodePointLengthNode, ConcatMaterializeBytesNode, CalcStringAttributesNode, ConditionProfile) */) {
                ConcatData s0_ = this.concat_cache;
                if (s0_ != null) {
                    return ConcatEagerNode.concat(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.toIndexableNodeA_, s0_.toIndexableNodeB_, s0_.getCodePointLengthANode_, s0_.getCodePointLengthBNode_, s0_.materializeBytesNode_, s0_.calculateAttributesNode_, s0_.brokenProfile_);
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private TruffleString executeAndSpecialize(AbstractTruffleString arg0Value, AbstractTruffleString arg1Value, Encoding arg2Value, int arg3Value, int arg4Value, int arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                ConcatData s0_ = super.insert(new ConcatData());
                s0_.toIndexableNodeA_ = s0_.insertAccessor((ToIndexableNode.create()));
                s0_.toIndexableNodeB_ = s0_.insertAccessor((ToIndexableNode.create()));
                s0_.getCodePointLengthANode_ = s0_.insertAccessor((GetCodePointLengthNodeGen.create()));
                s0_.getCodePointLengthBNode_ = s0_.insertAccessor((GetCodePointLengthNodeGen.create()));
                s0_.materializeBytesNode_ = s0_.insertAccessor((ConcatMaterializeBytesNodeGen.create()));
                s0_.calculateAttributesNode_ = s0_.insertAccessor((CalcStringAttributesNodeGen.create()));
                s0_.brokenProfile_ = (ConditionProfile.create());
                VarHandle.storeStoreFence();
                this.concat_cache = s0_;
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 concat(AbstractTruffleString, AbstractTruffleString, Encoding, int, int, int, ToIndexableNode, ToIndexableNode, GetCodePointLengthNode, GetCodePointLengthNode, ConcatMaterializeBytesNode, CalcStringAttributesNode, ConditionProfile) */;
                lock.unlock();
                hasLock = false;
                return ConcatEagerNode.concat(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s0_.toIndexableNodeA_, s0_.toIndexableNodeB_, s0_.getCodePointLengthANode_, s0_.getCodePointLengthBNode_, s0_.materializeBytesNode_, s0_.calculateAttributesNode_, s0_.brokenProfile_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static ConcatEagerNode create() {
            return new ConcatEagerNodeGen();
        }

        public static ConcatEagerNode getUncached() {
            return ConcatEagerNodeGen.UNCACHED;
        }

        @GeneratedBy(ConcatEagerNode.class)
        private static final class ConcatData extends Node {

            @Child ToIndexableNode toIndexableNodeA_;
            @Child ToIndexableNode toIndexableNodeB_;
            @Child GetCodePointLengthNode getCodePointLengthANode_;
            @Child GetCodePointLengthNode getCodePointLengthBNode_;
            @Child ConcatMaterializeBytesNode materializeBytesNode_;
            @Child CalcStringAttributesNode calculateAttributesNode_;
            @CompilationFinal ConditionProfile brokenProfile_;

            ConcatData() {
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.NONE;
            }

             T insertAccessor(T node) {
                return super.insert(node);
            }

        }
        @GeneratedBy(ConcatEagerNode.class)
        @DenyReplace
        private static final class Uncached extends ConcatEagerNode {

            @TruffleBoundary
            @Override
            TruffleString execute(AbstractTruffleString arg0Value, AbstractTruffleString arg1Value, Encoding arg2Value, int arg3Value, int arg4Value, int arg5Value) {
                return ConcatEagerNode.concat(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (ToIndexableNode.getUncached()), (ToIndexableNode.getUncached()), (GetCodePointLengthNode.getUncached()), (GetCodePointLengthNode.getUncached()), (ConcatMaterializeBytesNodeGen.getUncached()), (CalcStringAttributesNode.getUncached()), (ConditionProfile.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ConcatMaterializeBytesNode.class)
    static final class ConcatMaterializeBytesNodeGen extends ConcatMaterializeBytesNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private int state_0_;

        private ConcatMaterializeBytesNodeGen() {
        }

        @Override
        byte[] execute(AbstractTruffleString arg0Value, Object arg1Value, AbstractTruffleString arg2Value, Object arg3Value, Encoding arg4Value, int arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doWithCompression(AbstractTruffleString, Object, AbstractTruffleString, Object, Encoding, int, int) || doNoCompression(AbstractTruffleString, Object, AbstractTruffleString, Object, Encoding, int, int) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doWithCompression(AbstractTruffleString, Object, AbstractTruffleString, Object, Encoding, int, int) */) {
                    if ((TStringGuards.isUTF16(arg4Value) || TStringGuards.isUTF32(arg4Value))) {
                        return doWithCompression(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doNoCompression(AbstractTruffleString, Object, AbstractTruffleString, Object, Encoding, int, int) */) {
                    if ((!(TStringGuards.isUTF16(arg4Value))) && (!(TStringGuards.isUTF32(arg4Value)))) {
                        return doNoCompression(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private byte[] executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, AbstractTruffleString arg2Value, Object arg3Value, Encoding arg4Value, int arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if ((TStringGuards.isUTF16(arg4Value) || TStringGuards.isUTF32(arg4Value))) {
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doWithCompression(AbstractTruffleString, Object, AbstractTruffleString, Object, Encoding, int, int) */;
                return doWithCompression(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            if ((!(TStringGuards.isUTF16(arg4Value))) && (!(TStringGuards.isUTF32(arg4Value)))) {
                this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doNoCompression(AbstractTruffleString, Object, AbstractTruffleString, Object, Encoding, int, int) */;
                return doNoCompression(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }
            throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ConcatMaterializeBytesNode create() {
            return new ConcatMaterializeBytesNodeGen();
        }

        public static ConcatMaterializeBytesNode getUncached() {
            return ConcatMaterializeBytesNodeGen.UNCACHED;
        }

        @GeneratedBy(ConcatMaterializeBytesNode.class)
        @DenyReplace
        private static final class Uncached extends ConcatMaterializeBytesNode {

            @TruffleBoundary
            @Override
            byte[] execute(AbstractTruffleString arg0Value, Object arg1Value, AbstractTruffleString arg2Value, Object arg3Value, Encoding arg4Value, int arg5Value, int arg6Value) {
                if ((TStringGuards.isUTF16(arg4Value) || TStringGuards.isUTF32(arg4Value))) {
                    return doWithCompression(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((!(TStringGuards.isUTF16(arg4Value))) && (!(TStringGuards.isUTF32(arg4Value)))) {
                    return doNoCompression(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(RegionEqualsNode.class)
    static final class RegionEqualsNodeGen extends RegionEqualsNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private NextNode decode_nextNodeA_;
        @Child private NextNode decode_nextNodeB_;

        private RegionEqualsNodeGen() {
        }

        @Override
        boolean execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, AbstractTruffleString arg4Value, Object arg5Value, int arg6Value, int arg7Value, int arg8Value, Encoding arg9Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 direct(AbstractTruffleString, Object, int, int, AbstractTruffleString, Object, int, int, int, Encoding) || decode(AbstractTruffleString, Object, int, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, NextNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 direct(AbstractTruffleString, Object, int, int, AbstractTruffleString, Object, int, int, int, Encoding) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value, arg6Value))) {
                        return direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 decode(AbstractTruffleString, Object, int, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, NextNode) */) {
                    if ((!(TStringGuards.isFixedWidth(arg2Value, arg6Value)))) {
                        return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.decode_nextNodeA_, this.decode_nextNodeB_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
        }

        private boolean executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, AbstractTruffleString arg4Value, Object arg5Value, int arg6Value, int arg7Value, int arg8Value, Encoding arg9Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value, arg6Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 direct(AbstractTruffleString, Object, int, int, AbstractTruffleString, Object, int, int, int, Encoding) */;
                    lock.unlock();
                    hasLock = false;
                    return direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value, arg6Value)))) {
                    this.decode_nextNodeA_ = super.insert((NextNode.create()));
                    this.decode_nextNodeB_ = super.insert((NextNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 decode(AbstractTruffleString, Object, int, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.decode_nextNodeA_, this.decode_nextNodeB_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static RegionEqualsNode create() {
            return new RegionEqualsNodeGen();
        }

        public static RegionEqualsNode getUncached() {
            return RegionEqualsNodeGen.UNCACHED;
        }

        @GeneratedBy(RegionEqualsNode.class)
        @DenyReplace
        private static final class Uncached extends RegionEqualsNode {

            @TruffleBoundary
            @Override
            boolean execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, AbstractTruffleString arg4Value, Object arg5Value, int arg6Value, int arg7Value, int arg8Value, Encoding arg9Value) {
                if ((TStringGuards.isFixedWidth(arg2Value, arg6Value))) {
                    return direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value, arg6Value)))) {
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, (NextNode.getUncached()), (NextNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(IndexOfStringNode.class)
    static final class IndexOfStringNodeGen extends IndexOfStringNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawIndexOfStringNode direct_indexOfStringNode_;
        @Child private NextNode decode_nextNodeA_;
        @Child private NextNode decode_nextNodeB_;

        private IndexOfStringNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, Encoding arg8Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 direct(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, RawIndexOfStringNode) || decode(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, NextNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 direct(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, RawIndexOfStringNode) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value, arg5Value))) {
                        return IndexOfStringNode.direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, this.direct_indexOfStringNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 decode(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, NextNode) */) {
                    if ((!(TStringGuards.isFixedWidth(arg2Value, arg5Value)))) {
                        return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, this.decode_nextNodeA_, this.decode_nextNodeB_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, Encoding arg8Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value, arg5Value))) {
                    this.direct_indexOfStringNode_ = super.insert((RawIndexOfStringNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 direct(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, RawIndexOfStringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return IndexOfStringNode.direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, this.direct_indexOfStringNode_);
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value, arg5Value)))) {
                    this.decode_nextNodeA_ = super.insert((NextNode.create()));
                    this.decode_nextNodeB_ = super.insert((NextNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 decode(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, this.decode_nextNodeA_, this.decode_nextNodeB_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static IndexOfStringNode create() {
            return new IndexOfStringNodeGen();
        }

        public static IndexOfStringNode getUncached() {
            return IndexOfStringNodeGen.UNCACHED;
        }

        @GeneratedBy(IndexOfStringNode.class)
        @DenyReplace
        private static final class Uncached extends IndexOfStringNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, Encoding arg8Value) {
                if ((TStringGuards.isFixedWidth(arg2Value, arg5Value))) {
                    return IndexOfStringNode.direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, (RawIndexOfStringNodeGen.getUncached()));
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value, arg5Value)))) {
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, (NextNode.getUncached()), (NextNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(IndexOfStringRawNode.class)
    static final class IndexOfStringRawNodeGen extends IndexOfStringRawNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawIndexOfStringNode supported_indexOfStringNode_;
        @Child private NextNode unsupported_nextNodeA_;
        @Child private NextNode unsupported_nextNodeB_;

        private IndexOfStringRawNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, byte[] arg8Value, Encoding arg9Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 supported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, RawIndexOfStringNode) || unsupported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, NextNode, NextNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 supported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, RawIndexOfStringNode) */) {
                    if ((TStringGuards.isSupportedEncoding(arg9Value) || TStringGuards.isFixedWidth(arg2Value))) {
                        return IndexOfStringRawNode.supported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.supported_indexOfStringNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, NextNode, NextNode) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg9Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                        return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.unsupported_nextNodeA_, this.unsupported_nextNodeB_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, byte[] arg8Value, Encoding arg9Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isSupportedEncoding(arg9Value) || TStringGuards.isFixedWidth(arg2Value))) {
                    this.supported_indexOfStringNode_ = super.insert((RawIndexOfStringNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 supported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, RawIndexOfStringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return IndexOfStringRawNode.supported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.supported_indexOfStringNode_);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg9Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    this.unsupported_nextNodeA_ = super.insert((NextNode.create()));
                    this.unsupported_nextNodeB_ = super.insert((NextNode.create()));
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 unsupported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, NextNode, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.unsupported_nextNodeA_, this.unsupported_nextNodeB_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static IndexOfStringRawNode create() {
            return new IndexOfStringRawNodeGen();
        }

        public static IndexOfStringRawNode getUncached() {
            return IndexOfStringRawNodeGen.UNCACHED;
        }

        @GeneratedBy(IndexOfStringRawNode.class)
        @DenyReplace
        private static final class Uncached extends IndexOfStringRawNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, byte[] arg8Value, Encoding arg9Value) {
                if ((TStringGuards.isSupportedEncoding(arg9Value) || TStringGuards.isFixedWidth(arg2Value))) {
                    return IndexOfStringRawNode.supported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, (RawIndexOfStringNodeGen.getUncached()));
                }
                if ((TStringGuards.isUnsupportedEncoding(arg9Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, (NextNode.getUncached()), (NextNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(LastIndexOfStringNode.class)
    static final class LastIndexOfStringNodeGen extends LastIndexOfStringNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawLastIndexOfStringNode direct_indexOfStringNode_;
        @Child private DecodeData decode_cache;

        private LastIndexOfStringNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, Encoding arg8Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 direct(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, RawLastIndexOfStringNode) || decode(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, PreviousNode, PreviousNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 direct(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, RawLastIndexOfStringNode) */) {
                    if ((TStringGuards.isFixedWidth(arg2Value, arg5Value))) {
                        return LastIndexOfStringNode.direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, this.direct_indexOfStringNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 decode(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, PreviousNode, PreviousNode) */) {
                    DecodeData s1_ = this.decode_cache;
                    if (s1_ != null) {
                        if ((!(TStringGuards.isFixedWidth(arg2Value, arg5Value)))) {
                            return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, s1_.nextNodeA_, s1_.prevNodeA_, s1_.prevNodeB_);
                        }
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, Encoding arg8Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isFixedWidth(arg2Value, arg5Value))) {
                    this.direct_indexOfStringNode_ = super.insert((RawLastIndexOfStringNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 direct(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, RawLastIndexOfStringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return LastIndexOfStringNode.direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, this.direct_indexOfStringNode_);
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value, arg5Value)))) {
                    DecodeData s1_ = super.insert(new DecodeData());
                    s1_.nextNodeA_ = s1_.insertAccessor((NextNode.create()));
                    s1_.prevNodeA_ = s1_.insertAccessor((PreviousNode.create()));
                    s1_.prevNodeB_ = s1_.insertAccessor((PreviousNode.create()));
                    VarHandle.storeStoreFence();
                    this.decode_cache = s1_;
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 decode(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, Encoding, NextNode, PreviousNode, PreviousNode) */;
                    lock.unlock();
                    hasLock = false;
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, s1_.nextNodeA_, s1_.prevNodeA_, s1_.prevNodeB_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static LastIndexOfStringNode create() {
            return new LastIndexOfStringNodeGen();
        }

        public static LastIndexOfStringNode getUncached() {
            return LastIndexOfStringNodeGen.UNCACHED;
        }

        @GeneratedBy(LastIndexOfStringNode.class)
        private static final class DecodeData extends Node {

            @Child NextNode nextNodeA_;
            @Child PreviousNode prevNodeA_;
            @Child PreviousNode prevNodeB_;

            DecodeData() {
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.NONE;
            }

             T insertAccessor(T node) {
                return super.insert(node);
            }

        }
        @GeneratedBy(LastIndexOfStringNode.class)
        @DenyReplace
        private static final class Uncached extends LastIndexOfStringNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, Encoding arg8Value) {
                if ((TStringGuards.isFixedWidth(arg2Value, arg5Value))) {
                    return LastIndexOfStringNode.direct(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, (RawLastIndexOfStringNodeGen.getUncached()));
                }
                if ((!(TStringGuards.isFixedWidth(arg2Value, arg5Value)))) {
                    return decode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, (NextNode.getUncached()), (PreviousNode.getUncached()), (PreviousNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(LastIndexOfStringRawNode.class)
    static final class LastIndexOfStringRawNodeGen extends LastIndexOfStringRawNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private RawLastIndexOfStringNode lios8SameEncoding_indexOfStringNode_;
        @Child private UnsupportedData unsupported_cache;

        private LastIndexOfStringRawNodeGen() {
        }

        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, byte[] arg8Value, Encoding arg9Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 lios8SameEncoding(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, RawLastIndexOfStringNode) || unsupported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, NextNode, PreviousNode, PreviousNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 lios8SameEncoding(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, RawLastIndexOfStringNode) */) {
                    if ((TStringGuards.isSupportedEncoding(arg9Value) || TStringGuards.isFixedWidth(arg2Value))) {
                        return LastIndexOfStringRawNode.lios8SameEncoding(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.lios8SameEncoding_indexOfStringNode_);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, NextNode, PreviousNode, PreviousNode) */) {
                    UnsupportedData s1_ = this.unsupported_cache;
                    if (s1_ != null) {
                        if ((TStringGuards.isUnsupportedEncoding(arg9Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                            return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, s1_.nextNodeA_, s1_.prevNodeA_, s1_.prevNodeB_);
                        }
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, byte[] arg8Value, Encoding arg9Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isSupportedEncoding(arg9Value) || TStringGuards.isFixedWidth(arg2Value))) {
                    this.lios8SameEncoding_indexOfStringNode_ = super.insert((RawLastIndexOfStringNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 lios8SameEncoding(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, RawLastIndexOfStringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return LastIndexOfStringRawNode.lios8SameEncoding(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, this.lios8SameEncoding_indexOfStringNode_);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg9Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    UnsupportedData s1_ = super.insert(new UnsupportedData());
                    s1_.nextNodeA_ = s1_.insertAccessor((NextNode.create()));
                    s1_.prevNodeA_ = s1_.insertAccessor((PreviousNode.create()));
                    s1_.prevNodeB_ = s1_.insertAccessor((PreviousNode.create()));
                    VarHandle.storeStoreFence();
                    this.unsupported_cache = s1_;
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 unsupported(AbstractTruffleString, Object, int, AbstractTruffleString, Object, int, int, int, byte[], Encoding, NextNode, PreviousNode, PreviousNode) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, s1_.nextNodeA_, s1_.prevNodeA_, s1_.prevNodeB_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static LastIndexOfStringRawNode create() {
            return new LastIndexOfStringRawNodeGen();
        }

        public static LastIndexOfStringRawNode getUncached() {
            return LastIndexOfStringRawNodeGen.UNCACHED;
        }

        @GeneratedBy(LastIndexOfStringRawNode.class)
        private static final class UnsupportedData extends Node {

            @Child NextNode nextNodeA_;
            @Child PreviousNode prevNodeA_;
            @Child PreviousNode prevNodeB_;

            UnsupportedData() {
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.NONE;
            }

             T insertAccessor(T node) {
                return super.insert(node);
            }

        }
        @GeneratedBy(LastIndexOfStringRawNode.class)
        @DenyReplace
        private static final class Uncached extends LastIndexOfStringRawNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, AbstractTruffleString arg3Value, Object arg4Value, int arg5Value, int arg6Value, int arg7Value, byte[] arg8Value, Encoding arg9Value) {
                if ((TStringGuards.isSupportedEncoding(arg9Value) || TStringGuards.isFixedWidth(arg2Value))) {
                    return LastIndexOfStringRawNode.lios8SameEncoding(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, (RawLastIndexOfStringNodeGen.getUncached()));
                }
                if ((TStringGuards.isUnsupportedEncoding(arg9Value)) && (!(TStringGuards.isFixedWidth(arg2Value)))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value, (NextNode.getUncached()), (PreviousNode.getUncached()), (PreviousNode.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, arg7Value, arg8Value, arg9Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(StrideFromCodeRangeNode.class)
    static final class StrideFromCodeRangeNodeGen extends StrideFromCodeRangeNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private int state_0_;

        private StrideFromCodeRangeNodeGen() {
        }

        @Override
        int execute(int arg0Value, Encoding arg1Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doUTF16(int, Encoding) || doUTF32(int, Encoding) || doOther(int, Encoding) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doUTF16(int, Encoding) */) {
                    if ((TStringGuards.isUTF16(arg1Value))) {
                        return doUTF16(arg0Value, arg1Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doUTF32(int, Encoding) */) {
                    if ((TStringGuards.isUTF32(arg1Value))) {
                        return doUTF32(arg0Value, arg1Value);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 doOther(int, Encoding) */) {
                    if ((!(TStringGuards.isUTF16(arg1Value))) && (!(TStringGuards.isUTF32(arg1Value)))) {
                        return doOther(arg0Value, arg1Value);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value);
        }

        private int executeAndSpecialize(int arg0Value, Encoding arg1Value) {
            int state_0 = this.state_0_;
            if ((TStringGuards.isUTF16(arg1Value))) {
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doUTF16(int, Encoding) */;
                return doUTF16(arg0Value, arg1Value);
            }
            if ((TStringGuards.isUTF32(arg1Value))) {
                this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doUTF32(int, Encoding) */;
                return doUTF32(arg0Value, arg1Value);
            }
            if ((!(TStringGuards.isUTF16(arg1Value))) && (!(TStringGuards.isUTF32(arg1Value)))) {
                this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 doOther(int, Encoding) */;
                return doOther(arg0Value, arg1Value);
            }
            throw new UnsupportedSpecializationException(this, new Node[] {null, null}, arg0Value, arg1Value);
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static StrideFromCodeRangeNode create() {
            return new StrideFromCodeRangeNodeGen();
        }

        public static StrideFromCodeRangeNode getUncached() {
            return StrideFromCodeRangeNodeGen.UNCACHED;
        }

        @GeneratedBy(StrideFromCodeRangeNode.class)
        @DenyReplace
        private static final class Uncached extends StrideFromCodeRangeNode {

            @TruffleBoundary
            @Override
            int execute(int arg0Value, Encoding arg1Value) {
                if ((TStringGuards.isUTF16(arg1Value))) {
                    return doUTF16(arg0Value, arg1Value);
                }
                if ((TStringGuards.isUTF32(arg1Value))) {
                    return doUTF32(arg0Value, arg1Value);
                }
                if ((!(TStringGuards.isUTF16(arg1Value))) && (!(TStringGuards.isUTF32(arg1Value)))) {
                    return doOther(arg0Value, arg1Value);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null}, arg0Value, arg1Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CalcStringAttributesNode.class)
    static final class CalcStringAttributesNodeGen extends CalcStringAttributesNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private CalcStringAttributesInnerNode notAscii_calcNode_;

        private CalcStringAttributesNodeGen() {
        }

        @Override
        long execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 ascii(AbstractTruffleString, Object, int, int, int, Encoding, int) || notAscii(AbstractTruffleString, Object, int, int, int, Encoding, int, CalcStringAttributesInnerNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 ascii(AbstractTruffleString, Object, int, int, int, Encoding, int) */) {
                    if ((TStringGuards.is7Bit(arg6Value))) {
                        return ascii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 notAscii(AbstractTruffleString, Object, int, int, int, Encoding, int, CalcStringAttributesInnerNode) */) {
                    if ((!(TStringGuards.is7Bit(arg6Value)))) {
                        return notAscii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.notAscii_calcNode_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private long executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.is7Bit(arg6Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 ascii(AbstractTruffleString, Object, int, int, int, Encoding, int) */;
                    lock.unlock();
                    hasLock = false;
                    return ascii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((!(TStringGuards.is7Bit(arg6Value)))) {
                    this.notAscii_calcNode_ = super.insert((CalcStringAttributesInnerNodeGen.create()));
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 notAscii(AbstractTruffleString, Object, int, int, int, Encoding, int, CalcStringAttributesInnerNode) */;
                    lock.unlock();
                    hasLock = false;
                    return notAscii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.notAscii_calcNode_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static CalcStringAttributesNode create() {
            return new CalcStringAttributesNodeGen();
        }

        public static CalcStringAttributesNode getUncached() {
            return CalcStringAttributesNodeGen.UNCACHED;
        }

        @GeneratedBy(CalcStringAttributesNode.class)
        @DenyReplace
        private static final class Uncached extends CalcStringAttributesNode {

            @TruffleBoundary
            @Override
            long execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
                if ((TStringGuards.is7Bit(arg6Value))) {
                    return ascii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((!(TStringGuards.is7Bit(arg6Value)))) {
                    return notAscii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (CalcStringAttributesInnerNodeGen.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CalcStringAttributesInnerNode.class)
    static final class CalcStringAttributesInnerNodeGen extends CalcStringAttributesInnerNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ConditionProfile uTF8_brokenProfile_;
        @CompilationFinal private ConditionProfile generic_validCharacterProfile_;
        @CompilationFinal private ConditionProfile generic_fixedWidthProfile_;

        private CalcStringAttributesInnerNodeGen() {
        }

        @Override
        long execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doLatin1(AbstractTruffleString, Object, int, int, int, Encoding, int) || doBMP(AbstractTruffleString, Object, int, int, int, Encoding, int) || doUTF8(AbstractTruffleString, Object, int, int, int, Encoding, int, ConditionProfile) || doUTF16Valid(AbstractTruffleString, Object, int, int, int, Encoding, int) || doUTF16Unknown(AbstractTruffleString, Object, int, int, int, Encoding, int) || doUTF32(AbstractTruffleString, Object, int, int, int, Encoding, int) || doGeneric(AbstractTruffleString, Object, int, int, int, Encoding, int, ConditionProfile, ConditionProfile) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doLatin1(AbstractTruffleString, Object, int, int, int, Encoding, int) */) {
                    if ((TStringGuards.is8Bit(arg6Value) || TStringGuards.isAsciiBytesOrLatin1(arg5Value)) && (arg4Value == 0)) {
                        return doLatin1(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doBMP(AbstractTruffleString, Object, int, int, int, Encoding, int) */) {
                    if ((TStringGuards.isUpTo16Bit(arg6Value)) && (arg4Value == 1)) {
                        return doBMP(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 doUTF8(AbstractTruffleString, Object, int, int, int, Encoding, int, ConditionProfile) */) {
                    if ((TStringGuards.isUTF8(arg5Value)) && (!(TStringGuards.isFixedWidth(arg6Value)))) {
                        return doUTF8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.uTF8_brokenProfile_);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 doUTF16Valid(AbstractTruffleString, Object, int, int, int, Encoding, int) */) {
                    if ((TStringGuards.isUTF16(arg5Value)) && (TStringGuards.isValidMultiByte(arg6Value))) {
                        return doUTF16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 doUTF16Unknown(AbstractTruffleString, Object, int, int, int, Encoding, int) */) {
                    if ((TStringGuards.isUTF16(arg5Value)) && (TStringGuards.isBrokenMultiByteOrUnknown(arg6Value))) {
                        return doUTF16Unknown(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 doUTF32(AbstractTruffleString, Object, int, int, int, Encoding, int) */) {
                    if ((arg4Value == 2)) {
                        return doUTF32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                    }
                }
                if ((state_0 & 0b1000000) != 0 /* is-state_0 doGeneric(AbstractTruffleString, Object, int, int, int, Encoding, int, ConditionProfile, ConditionProfile) */) {
                    if ((TStringGuards.isUnsupportedEncoding(arg5Value))) {
                        return doGeneric(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.generic_validCharacterProfile_, this.generic_fixedWidthProfile_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
        }

        private long executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.is8Bit(arg6Value) || TStringGuards.isAsciiBytesOrLatin1(arg5Value)) && (arg4Value == 0)) {
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doLatin1(AbstractTruffleString, Object, int, int, int, Encoding, int) */;
                    lock.unlock();
                    hasLock = false;
                    return doLatin1(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUpTo16Bit(arg6Value)) && (arg4Value == 1)) {
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doBMP(AbstractTruffleString, Object, int, int, int, Encoding, int) */;
                    lock.unlock();
                    hasLock = false;
                    return doBMP(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF8(arg5Value)) && (!(TStringGuards.isFixedWidth(arg6Value)))) {
                    this.uTF8_brokenProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 doUTF8(AbstractTruffleString, Object, int, int, int, Encoding, int, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return doUTF8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.uTF8_brokenProfile_);
                }
                if ((TStringGuards.isUTF16(arg5Value)) && (TStringGuards.isValidMultiByte(arg6Value))) {
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 doUTF16Valid(AbstractTruffleString, Object, int, int, int, Encoding, int) */;
                    lock.unlock();
                    hasLock = false;
                    return doUTF16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF16(arg5Value)) && (TStringGuards.isBrokenMultiByteOrUnknown(arg6Value))) {
                    this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 doUTF16Unknown(AbstractTruffleString, Object, int, int, int, Encoding, int) */;
                    lock.unlock();
                    hasLock = false;
                    return doUTF16Unknown(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((arg4Value == 2)) {
                    this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 doUTF32(AbstractTruffleString, Object, int, int, int, Encoding, int) */;
                    lock.unlock();
                    hasLock = false;
                    return doUTF32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg5Value))) {
                    this.generic_validCharacterProfile_ = (ConditionProfile.create());
                    this.generic_fixedWidthProfile_ = (ConditionProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b1000000 /* add-state_0 doGeneric(AbstractTruffleString, Object, int, int, int, Encoding, int, ConditionProfile, ConditionProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return doGeneric(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, this.generic_validCharacterProfile_, this.generic_fixedWidthProfile_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static CalcStringAttributesInnerNode create() {
            return new CalcStringAttributesInnerNodeGen();
        }

        public static CalcStringAttributesInnerNode getUncached() {
            return CalcStringAttributesInnerNodeGen.UNCACHED;
        }

        @GeneratedBy(CalcStringAttributesInnerNode.class)
        @DenyReplace
        private static final class Uncached extends CalcStringAttributesInnerNode {

            @TruffleBoundary
            @Override
            long execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, int arg4Value, Encoding arg5Value, int arg6Value) {
                if ((TStringGuards.is8Bit(arg6Value) || TStringGuards.isAsciiBytesOrLatin1(arg5Value)) && (arg4Value == 0)) {
                    return doLatin1(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUpTo16Bit(arg6Value)) && (arg4Value == 1)) {
                    return doBMP(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF8(arg5Value)) && (!(TStringGuards.isFixedWidth(arg6Value)))) {
                    return doUTF8(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (ConditionProfile.getUncached()));
                }
                if ((TStringGuards.isUTF16(arg5Value)) && (TStringGuards.isValidMultiByte(arg6Value))) {
                    return doUTF16Valid(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUTF16(arg5Value)) && (TStringGuards.isBrokenMultiByteOrUnknown(arg6Value))) {
                    return doUTF16Unknown(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((arg4Value == 2)) {
                    return doUTF32(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg5Value))) {
                    return doGeneric(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value, (ConditionProfile.getUncached()), (ConditionProfile.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, arg6Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ParseIntNode.class)
    static final class ParseIntNodeGen extends ParseIntNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private Do7BitData do7Bit_cache;
        @Child private NextNode generic_nextNode_;
        @CompilationFinal private BranchProfile generic_errorProfile_;

        private ParseIntNodeGen() {
        }

        @ExplodeLoop
        @Override
        int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value) throws NumberFormatException {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) || doGeneric(AbstractTruffleString, Object, int, Encoding, int, NextNode, BranchProfile) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) */ && (TStringGuards.is7Bit(arg2Value))) {
                    Do7BitData s0_ = this.do7Bit_cache;
                    while (s0_ != null) {
                        if ((s0_.cachedStride_ == arg0Value.stride())) {
                            return ParseIntNode.do7Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, s0_.cachedStride_, s0_.errorProfile_);
                        }
                        s0_ = s0_.next_;
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doGeneric(AbstractTruffleString, Object, int, Encoding, int, NextNode, BranchProfile) */) {
                    if ((!(TStringGuards.is7Bit(arg2Value)))) {
                        return ParseIntNode.doGeneric(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, this.generic_nextNode_, this.generic_errorProfile_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
        }

        private int executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value) throws NumberFormatException {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.is7Bit(arg2Value))) {
                    int count0_ = 0;
                    Do7BitData s0_ = this.do7Bit_cache;
                    if ((state_0 & 0b1) != 0 /* is-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) */) {
                        while (s0_ != null) {
                            if ((s0_.cachedStride_ == arg0Value.stride())) {
                                break;
                            }
                            s0_ = s0_.next_;
                            count0_++;
                        }
                    }
                    if (s0_ == null) {
                        {
                            int cachedStride__ = (arg0Value.stride());
                            if ((cachedStride__ == arg0Value.stride()) && count0_ < (3)) {
                                s0_ = new Do7BitData(do7Bit_cache);
                                s0_.cachedStride_ = cachedStride__;
                                s0_.errorProfile_ = (BranchProfile.create());
                                VarHandle.storeStoreFence();
                                this.do7Bit_cache = s0_;
                                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) */;
                            }
                        }
                    }
                    if (s0_ != null) {
                        lock.unlock();
                        hasLock = false;
                        return ParseIntNode.do7Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, s0_.cachedStride_, s0_.errorProfile_);
                    }
                }
                if ((!(TStringGuards.is7Bit(arg2Value)))) {
                    this.generic_nextNode_ = super.insert((NextNode.create()));
                    this.generic_errorProfile_ = (BranchProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doGeneric(AbstractTruffleString, Object, int, Encoding, int, NextNode, BranchProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return ParseIntNode.doGeneric(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, this.generic_nextNode_, this.generic_errorProfile_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    Do7BitData s0_ = this.do7Bit_cache;
                    if ((s0_ == null || s0_.next_ == null)) {
                        return NodeCost.MONOMORPHIC;
                    }
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ParseIntNode create() {
            return new ParseIntNodeGen();
        }

        public static ParseIntNode getUncached() {
            return ParseIntNodeGen.UNCACHED;
        }

        @GeneratedBy(ParseIntNode.class)
        private static final class Do7BitData {

            @CompilationFinal Do7BitData next_;
            @CompilationFinal int cachedStride_;
            @CompilationFinal BranchProfile errorProfile_;

            Do7BitData(Do7BitData next_) {
                this.next_ = next_;
            }

        }
        @GeneratedBy(ParseIntNode.class)
        @DenyReplace
        private static final class Uncached extends ParseIntNode {

            @TruffleBoundary
            @Override
            int execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value) throws NumberFormatException {
                if ((TStringGuards.is7Bit(arg2Value))) {
                    if (((arg0Value.stride()) == arg0Value.stride())) {
                        return ParseIntNode.do7Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, (arg0Value.stride()), (BranchProfile.getUncached()));
                    }
                }
                if ((!(TStringGuards.is7Bit(arg2Value)))) {
                    return ParseIntNode.doGeneric(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, (NextNode.getUncached()), (BranchProfile.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ParseLongNode.class)
    static final class ParseLongNodeGen extends ParseLongNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private Do7BitData do7Bit_cache;
        @Child private NextNode parseLong_nextNode_;
        @CompilationFinal private BranchProfile parseLong_errorProfile_;

        private ParseLongNodeGen() {
        }

        @ExplodeLoop
        @Override
        long execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value) throws NumberFormatException {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) || parseLong(AbstractTruffleString, Object, int, Encoding, int, NextNode, BranchProfile) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) */ && (TStringGuards.is7Bit(arg2Value))) {
                    Do7BitData s0_ = this.do7Bit_cache;
                    while (s0_ != null) {
                        if ((s0_.cachedStride_ == arg0Value.stride())) {
                            return ParseLongNode.do7Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, s0_.cachedStride_, s0_.errorProfile_);
                        }
                        s0_ = s0_.next_;
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 parseLong(AbstractTruffleString, Object, int, Encoding, int, NextNode, BranchProfile) */) {
                    if ((!(TStringGuards.is7Bit(arg2Value)))) {
                        return ParseLongNode.parseLong(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, this.parseLong_nextNode_, this.parseLong_errorProfile_);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
        }

        private long executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value) throws NumberFormatException {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.is7Bit(arg2Value))) {
                    int count0_ = 0;
                    Do7BitData s0_ = this.do7Bit_cache;
                    if ((state_0 & 0b1) != 0 /* is-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) */) {
                        while (s0_ != null) {
                            if ((s0_.cachedStride_ == arg0Value.stride())) {
                                break;
                            }
                            s0_ = s0_.next_;
                            count0_++;
                        }
                    }
                    if (s0_ == null) {
                        {
                            int cachedStride__ = (arg0Value.stride());
                            if ((cachedStride__ == arg0Value.stride()) && count0_ < (3)) {
                                s0_ = new Do7BitData(do7Bit_cache);
                                s0_.cachedStride_ = cachedStride__;
                                s0_.errorProfile_ = (BranchProfile.create());
                                VarHandle.storeStoreFence();
                                this.do7Bit_cache = s0_;
                                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 do7Bit(AbstractTruffleString, Object, int, Encoding, int, int, BranchProfile) */;
                            }
                        }
                    }
                    if (s0_ != null) {
                        lock.unlock();
                        hasLock = false;
                        return ParseLongNode.do7Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, s0_.cachedStride_, s0_.errorProfile_);
                    }
                }
                if ((!(TStringGuards.is7Bit(arg2Value)))) {
                    this.parseLong_nextNode_ = super.insert((NextNode.create()));
                    this.parseLong_errorProfile_ = (BranchProfile.create());
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 parseLong(AbstractTruffleString, Object, int, Encoding, int, NextNode, BranchProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return ParseLongNode.parseLong(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, this.parseLong_nextNode_, this.parseLong_errorProfile_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    Do7BitData s0_ = this.do7Bit_cache;
                    if ((s0_ == null || s0_.next_ == null)) {
                        return NodeCost.MONOMORPHIC;
                    }
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ParseLongNode create() {
            return new ParseLongNodeGen();
        }

        public static ParseLongNode getUncached() {
            return ParseLongNodeGen.UNCACHED;
        }

        @GeneratedBy(ParseLongNode.class)
        private static final class Do7BitData {

            @CompilationFinal Do7BitData next_;
            @CompilationFinal int cachedStride_;
            @CompilationFinal BranchProfile errorProfile_;

            Do7BitData(Do7BitData next_) {
                this.next_ = next_;
            }

        }
        @GeneratedBy(ParseLongNode.class)
        @DenyReplace
        private static final class Uncached extends ParseLongNode {

            @TruffleBoundary
            @Override
            long execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, Encoding arg3Value, int arg4Value) throws NumberFormatException {
                if ((TStringGuards.is7Bit(arg2Value))) {
                    if (((arg0Value.stride()) == arg0Value.stride())) {
                        return ParseLongNode.do7Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, (arg0Value.stride()), (BranchProfile.getUncached()));
                    }
                }
                if ((!(TStringGuards.is7Bit(arg2Value)))) {
                    return ParseLongNode.parseLong(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, (NextNode.getUncached()), (BranchProfile.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ParseDoubleNode.class)
    static final class ParseDoubleNodeGen extends ParseDoubleNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ParseData parse_cache;

        private ParseDoubleNodeGen() {
        }

        @ExplodeLoop
        @Override
        double execute(AbstractTruffleString arg0Value, Object arg1Value) throws NumberFormatException {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doParse(AbstractTruffleString, Object, int, BranchProfile) */) {
                ParseData s0_ = this.parse_cache;
                while (s0_ != null) {
                    if ((s0_.cachedStride_ == arg0Value.stride())) {
                        return doParse(arg0Value, arg1Value, s0_.cachedStride_, s0_.errorProfile_);
                    }
                    s0_ = s0_.next_;
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value);
        }

        private double executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value) throws NumberFormatException {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                int count0_ = 0;
                ParseData s0_ = this.parse_cache;
                if (state_0 != 0 /* is-state_0 doParse(AbstractTruffleString, Object, int, BranchProfile) */) {
                    while (s0_ != null) {
                        if ((s0_.cachedStride_ == arg0Value.stride())) {
                            break;
                        }
                        s0_ = s0_.next_;
                        count0_++;
                    }
                }
                if (s0_ == null) {
                    {
                        int cachedStride__ = (arg0Value.stride());
                        if ((cachedStride__ == arg0Value.stride()) && count0_ < (3)) {
                            s0_ = new ParseData(parse_cache);
                            s0_.cachedStride_ = cachedStride__;
                            s0_.errorProfile_ = (BranchProfile.create());
                            VarHandle.storeStoreFence();
                            this.parse_cache = s0_;
                            this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doParse(AbstractTruffleString, Object, int, BranchProfile) */;
                        }
                    }
                }
                if (s0_ != null) {
                    lock.unlock();
                    hasLock = false;
                    return doParse(arg0Value, arg1Value, s0_.cachedStride_, s0_.errorProfile_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null}, arg0Value, arg1Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    ParseData s0_ = this.parse_cache;
                    if ((s0_ == null || s0_.next_ == null)) {
                        return NodeCost.MONOMORPHIC;
                    }
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ParseDoubleNode create() {
            return new ParseDoubleNodeGen();
        }

        public static ParseDoubleNode getUncached() {
            return ParseDoubleNodeGen.UNCACHED;
        }

        @GeneratedBy(ParseDoubleNode.class)
        private static final class ParseData {

            @CompilationFinal ParseData next_;
            @CompilationFinal int cachedStride_;
            @CompilationFinal BranchProfile errorProfile_;

            ParseData(ParseData next_) {
                this.next_ = next_;
            }

        }
        @GeneratedBy(ParseDoubleNode.class)
        @DenyReplace
        private static final class Uncached extends ParseDoubleNode {

            @TruffleBoundary
            @Override
            double execute(AbstractTruffleString arg0Value, Object arg1Value) throws NumberFormatException {
                if (((arg0Value.stride()) == arg0Value.stride())) {
                    return doParse(arg0Value, arg1Value, (arg0Value.stride()), (BranchProfile.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null}, arg0Value, arg1Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(FromJavaStringUTF16Node.class)
    static final class FromJavaStringUTF16NodeGen extends FromJavaStringUTF16Node {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ConditionProfile utf16CompactProfile_;

        private FromJavaStringUTF16NodeGen() {
        }

        @Override
        TruffleString execute(String arg0Value, int arg1Value, int arg2Value, boolean arg3Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doNonEmpty(String, int, int, boolean, ConditionProfile) */) {
                return doNonEmpty(arg0Value, arg1Value, arg2Value, arg3Value, this.utf16CompactProfile_);
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value);
        }

        private TruffleString executeAndSpecialize(String arg0Value, int arg1Value, int arg2Value, boolean arg3Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                this.utf16CompactProfile_ = (ConditionProfile.create());
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doNonEmpty(String, int, int, boolean, ConditionProfile) */;
                lock.unlock();
                hasLock = false;
                return doNonEmpty(arg0Value, arg1Value, arg2Value, arg3Value, this.utf16CompactProfile_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static FromJavaStringUTF16Node create() {
            return new FromJavaStringUTF16NodeGen();
        }

        public static FromJavaStringUTF16Node getUncached() {
            return FromJavaStringUTF16NodeGen.UNCACHED;
        }

        @GeneratedBy(FromJavaStringUTF16Node.class)
        @DenyReplace
        private static final class Uncached extends FromJavaStringUTF16Node {

            @TruffleBoundary
            @Override
            TruffleString execute(String arg0Value, int arg1Value, int arg2Value, boolean arg3Value) {
                return doNonEmpty(arg0Value, arg1Value, arg2Value, arg3Value, (ConditionProfile.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(ToJavaStringNode.class)
    static final class ToJavaStringNodeGen extends ToJavaStringNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private CreateJavaStringNode createStringNode;
        @Child private GetCodePointLengthNode generic_getCodePointLengthNode_;
        @Child private GetCodeRangeNode generic_getCodeRangeNode_;
        @Child private TransCodeNode generic_transCodeNode_;

        private ToJavaStringNodeGen() {
        }

        @Override
        TruffleString execute(TruffleString arg0Value, Object arg1Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 doUTF16(TruffleString, Object, CreateJavaStringNode) || doGeneric(TruffleString, Object, GetCodePointLengthNode, GetCodeRangeNode, TransCodeNode, CreateJavaStringNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 doUTF16(TruffleString, Object, CreateJavaStringNode) */) {
                    if ((arg0Value.isCompatibleTo(Encoding.UTF_16))) {
                        return ToJavaStringNode.doUTF16(arg0Value, arg1Value, this.createStringNode);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 doGeneric(TruffleString, Object, GetCodePointLengthNode, GetCodeRangeNode, TransCodeNode, CreateJavaStringNode) */) {
                    if ((!(arg0Value.isCompatibleTo(Encoding.UTF_16)))) {
                        return ToJavaStringNode.doGeneric(arg0Value, arg1Value, this.generic_getCodePointLengthNode_, this.generic_getCodeRangeNode_, this.generic_transCodeNode_, this.createStringNode);
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value);
        }

        private TruffleString executeAndSpecialize(TruffleString arg0Value, Object arg1Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((arg0Value.isCompatibleTo(Encoding.UTF_16))) {
                    this.createStringNode = super.insert(this.createStringNode == null ? ((CreateJavaStringNodeGen.create())) : this.createStringNode);
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 doUTF16(TruffleString, Object, CreateJavaStringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return ToJavaStringNode.doUTF16(arg0Value, arg1Value, this.createStringNode);
                }
                if ((!(arg0Value.isCompatibleTo(Encoding.UTF_16)))) {
                    this.generic_getCodePointLengthNode_ = super.insert((GetCodePointLengthNodeGen.create()));
                    this.generic_getCodeRangeNode_ = super.insert((GetCodeRangeNodeGen.create()));
                    this.generic_transCodeNode_ = super.insert((TransCodeNodeGen.create()));
                    this.createStringNode = super.insert(this.createStringNode == null ? ((CreateJavaStringNodeGen.create())) : this.createStringNode);
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 doGeneric(TruffleString, Object, GetCodePointLengthNode, GetCodeRangeNode, TransCodeNode, CreateJavaStringNode) */;
                    lock.unlock();
                    hasLock = false;
                    return ToJavaStringNode.doGeneric(arg0Value, arg1Value, this.generic_getCodePointLengthNode_, this.generic_getCodeRangeNode_, this.generic_transCodeNode_, this.createStringNode);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null}, arg0Value, arg1Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static ToJavaStringNode create() {
            return new ToJavaStringNodeGen();
        }

        public static ToJavaStringNode getUncached() {
            return ToJavaStringNodeGen.UNCACHED;
        }

        @GeneratedBy(ToJavaStringNode.class)
        @DenyReplace
        private static final class Uncached extends ToJavaStringNode {

            @TruffleBoundary
            @Override
            TruffleString execute(TruffleString arg0Value, Object arg1Value) {
                if ((arg0Value.isCompatibleTo(Encoding.UTF_16))) {
                    return ToJavaStringNode.doUTF16(arg0Value, arg1Value, (CreateJavaStringNodeGen.getUncached()));
                }
                if ((!(arg0Value.isCompatibleTo(Encoding.UTF_16)))) {
                    return ToJavaStringNode.doGeneric(arg0Value, arg1Value, (GetCodePointLengthNode.getUncached()), (GetCodeRangeNode.getUncached()), (TransCodeNodeGen.getUncached()), (CreateJavaStringNodeGen.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null}, arg0Value, arg1Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(CreateJavaStringNode.class)
    static final class CreateJavaStringNodeGen extends CreateJavaStringNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ConditionProfile reuseProfile_;
        @Child private GetCodeRangeNode getCodeRangeNode_;

        private CreateJavaStringNodeGen() {
        }

        @Override
        String execute(AbstractTruffleString arg0Value, Object arg1Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 createJavaString(AbstractTruffleString, Object, ConditionProfile, GetCodeRangeNode) */) {
                return createJavaString(arg0Value, arg1Value, this.reuseProfile_, this.getCodeRangeNode_);
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value);
        }

        private String executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                this.reuseProfile_ = (ConditionProfile.create());
                this.getCodeRangeNode_ = super.insert((GetCodeRangeNodeGen.create()));
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 createJavaString(AbstractTruffleString, Object, ConditionProfile, GetCodeRangeNode) */;
                lock.unlock();
                hasLock = false;
                return createJavaString(arg0Value, arg1Value, this.reuseProfile_, this.getCodeRangeNode_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static CreateJavaStringNode create() {
            return new CreateJavaStringNodeGen();
        }

        public static CreateJavaStringNode getUncached() {
            return CreateJavaStringNodeGen.UNCACHED;
        }

        @GeneratedBy(CreateJavaStringNode.class)
        @DenyReplace
        private static final class Uncached extends CreateJavaStringNode {

            @TruffleBoundary
            @Override
            String execute(AbstractTruffleString arg0Value, Object arg1Value) {
                return createJavaString(arg0Value, arg1Value, (ConditionProfile.getUncached()), (GetCodeRangeNode.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(TransCodeNode.class)
    static final class TransCodeNodeGen extends TransCodeNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @CompilationFinal private ConditionProfile asciiBytesInvalidProfile_;
        @Child private TransCodeIntlNode transCodeIntlNode_;

        private TransCodeNodeGen() {
        }

        @Override
        TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, Encoding arg4Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 transcode(AbstractTruffleString, Object, int, int, Encoding, ConditionProfile, TransCodeIntlNode) */) {
                return transcode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, this.asciiBytesInvalidProfile_, this.transCodeIntlNode_);
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value);
        }

        private TruffleString executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, Encoding arg4Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                this.asciiBytesInvalidProfile_ = (ConditionProfile.create());
                this.transCodeIntlNode_ = super.insert((TransCodeIntlNodeGen.create()));
                this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 transcode(AbstractTruffleString, Object, int, int, Encoding, ConditionProfile, TransCodeIntlNode) */;
                lock.unlock();
                hasLock = false;
                return transcode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, this.asciiBytesInvalidProfile_, this.transCodeIntlNode_);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                return NodeCost.MONOMORPHIC;
            }
        }

        public static TransCodeNode create() {
            return new TransCodeNodeGen();
        }

        public static TransCodeNode getUncached() {
            return TransCodeNodeGen.UNCACHED;
        }

        @GeneratedBy(TransCodeNode.class)
        @DenyReplace
        private static final class Uncached extends TransCodeNode {

            @TruffleBoundary
            @Override
            TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, Encoding arg4Value) {
                return transcode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, (ConditionProfile.getUncached()), (TransCodeIntlNodeGen.getUncached()));
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
    @GeneratedBy(TransCodeIntlNode.class)
    static final class TransCodeIntlNodeGen extends TransCodeIntlNode {

        private static final Uncached UNCACHED = new Uncached();

        @CompilationFinal private volatile int state_0_;
        @Child private NextNode iteratorNextNode;
        @CompilationFinal private ConditionProfile brokenProfile;
        @CompilationFinal private BranchProfile outOfMemoryProfile;
        @Child private UnsupportedData unsupported_cache;

        private TransCodeIntlNodeGen() {
        }

        @Override
        TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, Encoding arg4Value, Encoding arg5Value) {
            int state_0 = this.state_0_;
            if (state_0 != 0 /* is-state_0 targetAscii(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) || latin1Transcode(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) || utf8TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, ConditionProfile, BranchProfile) || utf8TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, ConditionProfile, BranchProfile) || utf16Fixed32Bit(AbstractTruffleString, Object, int, int, Encoding, Encoding) || utf16TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, BranchProfile) || utf16TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, BranchProfile) || utf32TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) || utf32TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding) || utf32TranscodeUTF16(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) || unsupported(AbstractTruffleString, Object, int, int, Encoding, Encoding, BranchProfile, ConditionProfile, FromBufferWithStringCompactionNode) */) {
                if ((state_0 & 0b1) != 0 /* is-state_0 targetAscii(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TStringGuards.isAscii(arg5Value) || TStringGuards.isBytes(arg5Value))) {
                        return targetAscii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                    }
                }
                if ((state_0 & 0b10) != 0 /* is-state_0 latin1Transcode(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TStringGuards.isLatin1(arg5Value))) {
                        return latin1Transcode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                    }
                }
                if ((state_0 & 0b100) != 0 /* is-state_0 utf8TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, ConditionProfile, BranchProfile) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF8(arg5Value))) {
                        return utf8TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.brokenProfile, this.outOfMemoryProfile);
                    }
                }
                if ((state_0 & 0b1000) != 0 /* is-state_0 utf8TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, ConditionProfile, BranchProfile) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF8(arg5Value))) {
                        return utf8TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.brokenProfile, this.outOfMemoryProfile);
                    }
                }
                if ((state_0 & 0b10000) != 0 /* is-state_0 utf16Fixed32Bit(AbstractTruffleString, Object, int, int, Encoding, Encoding) */) {
                    if ((TStringGuards.isUTF32(arg4Value)) && (TStringGuards.isUTF16(arg5Value))) {
                        return utf16Fixed32Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b100000) != 0 /* is-state_0 utf16TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, BranchProfile) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF16(arg5Value))) {
                        return utf16TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.outOfMemoryProfile);
                    }
                }
                if ((state_0 & 0b1000000) != 0 /* is-state_0 utf16TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, BranchProfile) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF16(arg5Value))) {
                        return utf16TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.outOfMemoryProfile);
                    }
                }
                if ((state_0 & 0b10000000) != 0 /* is-state_0 utf32TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */) {
                    if ((!(TStringGuards.isUTF16(arg4Value))) && (TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF32(arg5Value))) {
                        return utf32TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                    }
                }
                if ((state_0 & 0b100000000) != 0 /* is-state_0 utf32TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding) */) {
                    if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF32(arg5Value))) {
                        return TransCodeIntlNode.utf32TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                    }
                }
                if ((state_0 & 0b1000000000) != 0 /* is-state_0 utf32TranscodeUTF16(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */) {
                    if ((TStringGuards.isUTF16(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF32(arg5Value))) {
                        return utf32TranscodeUTF16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                    }
                }
                if ((state_0 & 0b10000000000) != 0 /* is-state_0 unsupported(AbstractTruffleString, Object, int, int, Encoding, Encoding, BranchProfile, ConditionProfile, FromBufferWithStringCompactionNode) */) {
                    UnsupportedData s10_ = this.unsupported_cache;
                    if (s10_ != null) {
                        if ((TStringGuards.isUnsupportedEncoding(arg4Value) || TStringGuards.isUnsupportedEncoding(arg5Value))) {
                            return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s10_.outOfMemoryProfile_, s10_.nativeProfile_, s10_.fromBufferWithStringCompactionNode_);
                        }
                    }
                }
            }
            CompilerDirectives.transferToInterpreterAndInvalidate();
            return executeAndSpecialize(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
        }

        private TruffleString executeAndSpecialize(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, Encoding arg4Value, Encoding arg5Value) {
            Lock lock = getLock();
            boolean hasLock = true;
            lock.lock();
            try {
                int state_0 = this.state_0_;
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TStringGuards.isAscii(arg5Value) || TStringGuards.isBytes(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.state_0_ = state_0 = state_0 | 0b1 /* add-state_0 targetAscii(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return targetAscii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TStringGuards.isLatin1(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.state_0_ = state_0 = state_0 | 0b10 /* add-state_0 latin1Transcode(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return latin1Transcode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF8(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.brokenProfile = this.brokenProfile == null ? ((ConditionProfile.create())) : this.brokenProfile;
                    this.outOfMemoryProfile = this.outOfMemoryProfile == null ? ((BranchProfile.create())) : this.outOfMemoryProfile;
                    this.state_0_ = state_0 = state_0 | 0b100 /* add-state_0 utf8TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, ConditionProfile, BranchProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.brokenProfile, this.outOfMemoryProfile);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF8(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.brokenProfile = this.brokenProfile == null ? ((ConditionProfile.create())) : this.brokenProfile;
                    this.outOfMemoryProfile = this.outOfMemoryProfile == null ? ((BranchProfile.create())) : this.outOfMemoryProfile;
                    this.state_0_ = state_0 = state_0 | 0b1000 /* add-state_0 utf8TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, ConditionProfile, BranchProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf8TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.brokenProfile, this.outOfMemoryProfile);
                }
                if ((TStringGuards.isUTF32(arg4Value)) && (TStringGuards.isUTF16(arg5Value))) {
                    this.state_0_ = state_0 = state_0 | 0b10000 /* add-state_0 utf16Fixed32Bit(AbstractTruffleString, Object, int, int, Encoding, Encoding) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16Fixed32Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF16(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.outOfMemoryProfile = this.outOfMemoryProfile == null ? ((BranchProfile.create())) : this.outOfMemoryProfile;
                    this.state_0_ = state_0 = state_0 | 0b100000 /* add-state_0 utf16TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, BranchProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.outOfMemoryProfile);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF16(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.outOfMemoryProfile = this.outOfMemoryProfile == null ? ((BranchProfile.create())) : this.outOfMemoryProfile;
                    this.state_0_ = state_0 = state_0 | 0b1000000 /* add-state_0 utf16TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode, BranchProfile) */;
                    lock.unlock();
                    hasLock = false;
                    return utf16TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode, this.outOfMemoryProfile);
                }
                if ((!(TStringGuards.isUTF16(arg4Value))) && (TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF32(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.state_0_ = state_0 = state_0 | 0b10000000 /* add-state_0 utf32TranscodeRegular(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return utf32TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF32(arg5Value))) {
                    this.state_0_ = state_0 = state_0 | 0b100000000 /* add-state_0 utf32TranscodeLarge(AbstractTruffleString, Object, int, int, Encoding, Encoding) */;
                    lock.unlock();
                    hasLock = false;
                    return TransCodeIntlNode.utf32TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF32(arg5Value))) {
                    this.iteratorNextNode = super.insert(this.iteratorNextNode == null ? ((NextNode.create())) : this.iteratorNextNode);
                    this.state_0_ = state_0 = state_0 | 0b1000000000 /* add-state_0 utf32TranscodeUTF16(AbstractTruffleString, Object, int, int, Encoding, Encoding, NextNode) */;
                    lock.unlock();
                    hasLock = false;
                    return utf32TranscodeUTF16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, this.iteratorNextNode);
                }
                if ((TStringGuards.isUnsupportedEncoding(arg4Value) || TStringGuards.isUnsupportedEncoding(arg5Value))) {
                    UnsupportedData s10_ = super.insert(new UnsupportedData());
                    s10_.outOfMemoryProfile_ = (BranchProfile.create());
                    s10_.nativeProfile_ = (ConditionProfile.create());
                    s10_.fromBufferWithStringCompactionNode_ = s10_.insertAccessor((FromBufferWithStringCompactionNodeGen.create()));
                    VarHandle.storeStoreFence();
                    this.unsupported_cache = s10_;
                    this.state_0_ = state_0 = state_0 | 0b10000000000 /* add-state_0 unsupported(AbstractTruffleString, Object, int, int, Encoding, Encoding, BranchProfile, ConditionProfile, FromBufferWithStringCompactionNode) */;
                    lock.unlock();
                    hasLock = false;
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, s10_.outOfMemoryProfile_, s10_.nativeProfile_, s10_.fromBufferWithStringCompactionNode_);
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            } finally {
                if (hasLock) {
                    lock.unlock();
                }
            }
        }

        @Override
        public NodeCost getCost() {
            int state_0 = this.state_0_;
            if (state_0 == 0) {
                return NodeCost.UNINITIALIZED;
            } else {
                if ((state_0 & (state_0 - 1)) == 0 /* is-single-state_0  */) {
                    return NodeCost.MONOMORPHIC;
                }
            }
            return NodeCost.POLYMORPHIC;
        }

        public static TransCodeIntlNode create() {
            return new TransCodeIntlNodeGen();
        }

        public static TransCodeIntlNode getUncached() {
            return TransCodeIntlNodeGen.UNCACHED;
        }

        @GeneratedBy(TransCodeIntlNode.class)
        private static final class UnsupportedData extends Node {

            @CompilationFinal BranchProfile outOfMemoryProfile_;
            @CompilationFinal ConditionProfile nativeProfile_;
            @Child FromBufferWithStringCompactionNode fromBufferWithStringCompactionNode_;

            UnsupportedData() {
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.NONE;
            }

             T insertAccessor(T node) {
                return super.insert(node);
            }

        }
        @GeneratedBy(TransCodeIntlNode.class)
        @DenyReplace
        private static final class Uncached extends TransCodeIntlNode {

            @TruffleBoundary
            @Override
            TruffleString execute(AbstractTruffleString arg0Value, Object arg1Value, int arg2Value, int arg3Value, Encoding arg4Value, Encoding arg5Value) {
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TStringGuards.isAscii(arg5Value) || TStringGuards.isBytes(arg5Value))) {
                    return targetAscii(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()));
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TStringGuards.isLatin1(arg5Value))) {
                    return latin1Transcode(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()));
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF8(arg5Value))) {
                    return utf8TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()), (ConditionProfile.getUncached()), (BranchProfile.getUncached()));
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF8(arg5Value))) {
                    return utf8TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()), (ConditionProfile.getUncached()), (BranchProfile.getUncached()));
                }
                if ((TStringGuards.isUTF32(arg4Value)) && (TStringGuards.isUTF16(arg5Value))) {
                    return utf16Fixed32Bit(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF16(arg5Value))) {
                    return utf16TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()), (BranchProfile.getUncached()));
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF16(arg5Value))) {
                    return utf16TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()), (BranchProfile.getUncached()));
                }
                if ((!(TStringGuards.isUTF16(arg4Value))) && (TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF32(arg5Value))) {
                    return utf32TranscodeRegular(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()));
                }
                if ((TStringGuards.isSupportedEncoding(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (TransCodeIntlNode.isLarge(arg2Value)) && (TStringGuards.isUTF32(arg5Value))) {
                    return TransCodeIntlNode.utf32TranscodeLarge(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
                }
                if ((TStringGuards.isUTF16(arg4Value)) && (!(TStringGuards.isFixedWidth(arg3Value))) && (!(TransCodeIntlNode.isLarge(arg2Value))) && (TStringGuards.isUTF32(arg5Value))) {
                    return utf32TranscodeUTF16(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (NextNode.getUncached()));
                }
                if ((TStringGuards.isUnsupportedEncoding(arg4Value) || TStringGuards.isUnsupportedEncoding(arg5Value))) {
                    return unsupported(arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value, (BranchProfile.getUncached()), (ConditionProfile.getUncached()), (FromBufferWithStringCompactionNodeGen.getUncached()));
                }
                throw new UnsupportedSpecializationException(this, new Node[] {null, null, null, null, null, null}, arg0Value, arg1Value, arg2Value, arg3Value, arg4Value, arg5Value);
            }

            @Override
            public NodeCost getCost() {
                return NodeCost.MEGAMORPHIC;
            }

            @Override
            public boolean isAdoptable() {
                return false;
            }

        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy