Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Truffle] Add TruffleBoundary to RubyString.toString(). #2200

Merged
merged 1 commit into from Nov 29, 2014

Conversation

bpot
Copy link
Contributor

@bpot bpot commented Nov 15, 2014

It looks like toString() is triggering some code that truffle refuses to compile.

A script like 1_000_000.times { [1,2,3].inspect } triggers:

Found illegal recursive call to HotSpotMethod<Utility.recursiveAppendNumber(StringBuffer, int, int, int)>, must annotate such calls with @TruffleBoundary!

Not sure if this is the best fix, still trying to wrap my head around truffle/graal. The full backtrace is below.

Context obj com.oracle.graal.nodes.util.GraphUtil$2: Found illegal recursive call to HotSpotMethod<Utility.recursiveAppendNumber(StringBuffer, int, int, int)>, must annotate such calls with @TruffleBoundary!
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Utility.recursiveAppendNumber(StringBuffer, int, int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Utility.appendNumber(StringBuffer, int, int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Utility.hex(int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<UnicodeSet.complement(int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<UnicodeSet.<init>(int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerImpl.internalGetNXHangul()>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerImpl.internalGetNX(int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerImpl.getNX(int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerBase.decompose(String, boolean, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerBase$NFKDMode.normalize(String, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerBase.normalize(String, Normalizer$Form, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<NormalizerBase.normalize(String, Normalizer$Form)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Normalizer.normalize(CharSequence, Normalizer$Form)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Pattern.normalize()>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Pattern.compile()>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Pattern.<init>(String, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Pattern.compile(String)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<String.split(String, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<String.split(String)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<ExtendedCharsets.init()>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<AbstractCharsetProvider.charsetForName(String)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Charset.lookupExtendedCharset(String)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Charset.lookup2(String)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Charset.lookup(String)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Charset.defaultCharset()>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<StringCoding.decode(byte[], int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<String.<init>(byte[], int, int)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<String.<init>(byte[])>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Encoding.toString()>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<EncodingService.charsetForEncoding(Encoding)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<Helpers.decodeByteList(Ruby, ByteList)>
                                                                            Context obj com.oracle.graal.hotspot.meta.HotSpotMetaAccessProvider@19e332a3
                                                                            Context obj HotSpotMethod<RubyString.toString()>

chrisseaton added a commit that referenced this pull request Nov 29, 2014
[Truffle] Add TruffleBoundary to RubyString.toString().
@chrisseaton chrisseaton merged commit 13629b8 into jruby:truffle-head Nov 29, 2014
@chrisseaton
Copy link
Contributor

Hi! Thanks very much of this - sorry I didn't respond earlier but for some reason the email didn't catch my eye.

The problem behind this is that Truffle cannot compile unbound recursion. The partial evaluation technique we use is sort of like exhaustive inlining, so recursion is a problem, and for some reason the standard JDK toString methods are often implemented recursively.

You are correct that we probably need @TruffleBoundary here. There is already a RubyNode.notDesignedForCompilation() which should have given you a more sensible error, but for some reason this directive is sometimes missed at the moment.

Thanks again.

@bpot bpot deleted the truffle_to_string_boundary branch December 2, 2014 01:58
@bpot
Copy link
Contributor Author

bpot commented Dec 2, 2014

Cool! Thanks for the explanation.

@chrisseaton chrisseaton modified the milestone: truffle-dev May 4, 2015
@enebo enebo added this to the Non-Release milestone Dec 7, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants