Skip to content

Commit 54c45cd

Browse files
committed
Improve polyglot value startup initialization.
1 parent b5f6509 commit 54c45cd

File tree

1 file changed

+46
-36
lines changed

1 file changed

+46
-36
lines changed

truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/PolyglotValueDispatch.java

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565

6666
import com.oracle.truffle.api.CallTarget;
6767
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
68+
import com.oracle.truffle.api.TruffleOptions;
6869
import com.oracle.truffle.api.dsl.Bind;
6970
import com.oracle.truffle.api.dsl.Cached;
7071
import com.oracle.truffle.api.dsl.GenerateCached;
@@ -1703,52 +1704,61 @@ static PolyglotValueDispatch createHostNull(PolyglotImpl polyglot) {
17031704
}
17041705

17051706
static void createDefaultValues(PolyglotImpl polyglot, PolyglotLanguageInstance languageInstance, Map<Class<?>, PolyglotValueDispatch> valueCache) {
1706-
addDefaultValue(polyglot, languageInstance, valueCache, false);
1707-
addDefaultValue(polyglot, languageInstance, valueCache, "");
1708-
addDefaultValue(polyglot, languageInstance, valueCache, TruffleString.fromJavaStringUncached("",
1709-
TruffleString.Encoding.UTF_16));
1710-
addDefaultValue(polyglot, languageInstance, valueCache, 'a');
1711-
addDefaultValue(polyglot, languageInstance, valueCache, (byte) 0);
1712-
addDefaultValue(polyglot, languageInstance, valueCache, (short) 0);
1713-
addDefaultValue(polyglot, languageInstance, valueCache, 0);
1714-
addDefaultValue(polyglot, languageInstance, valueCache, 0L);
1715-
addDefaultValue(polyglot, languageInstance, valueCache, 0F);
1716-
addDefaultValue(polyglot, languageInstance, valueCache, 0D);
1707+
addDefaultValue(polyglot, languageInstance, valueCache, Boolean.class);
1708+
addDefaultValue(polyglot, languageInstance, valueCache, String.class);
1709+
addDefaultValue(polyglot, languageInstance, valueCache, TruffleString.class);
1710+
addDefaultValue(polyglot, languageInstance, valueCache, Character.class);
1711+
addDefaultValue(polyglot, languageInstance, valueCache, Byte.class);
1712+
addDefaultValue(polyglot, languageInstance, valueCache, Short.class);
1713+
addDefaultValue(polyglot, languageInstance, valueCache, Integer.class);
1714+
addDefaultValue(polyglot, languageInstance, valueCache, Long.class);
1715+
addDefaultValue(polyglot, languageInstance, valueCache, Float.class);
1716+
addDefaultValue(polyglot, languageInstance, valueCache, Double.class);
17171717
}
17181718

1719-
static void addDefaultValue(PolyglotImpl polyglot, PolyglotLanguageInstance languageInstance, Map<Class<?>, PolyglotValueDispatch> valueCache, Object primitive) {
1720-
valueCache.put(primitive.getClass(), new PrimitiveValue(polyglot, languageInstance, primitive));
1719+
static void addDefaultValue(PolyglotImpl polyglot, PolyglotLanguageInstance languageInstance, Map<Class<?>, PolyglotValueDispatch> valueCache, Class<?> type) {
1720+
valueCache.put(type, new PrimitiveValue(polyglot, languageInstance));
17211721
}
17221722

17231723
static final class PrimitiveValue extends PolyglotValueDispatch {
17241724

1725-
private final InteropLibrary interop;
1725+
private InteropLibrary interop;
17261726
private final PolyglotLanguage language;
17271727

1728-
private PrimitiveValue(PolyglotImpl impl, PolyglotLanguageInstance instance, Object primitiveValue) {
1728+
private PrimitiveValue(PolyglotImpl impl, PolyglotLanguageInstance instance) {
17291729
super(impl, instance);
17301730
/*
17311731
* No caching needed for primitives. We do that to avoid the overhead of crossing a
17321732
* Truffle call boundary.
17331733
*/
1734-
this.interop = InteropLibrary.getUncached(primitiveValue);
17351734
this.language = instance != null ? instance.language : null;
17361735
}
17371736

1737+
private InteropLibrary getInterop(Object receiver) {
1738+
InteropLibrary l = this.interop;
1739+
if (l == null) {
1740+
this.interop = l = InteropLibrary.getUncached(receiver);
1741+
}
1742+
// this assertion does not work with aux engine caching enabled
1743+
// the uncached instance might actually be different there
1744+
assert TruffleOptions.AOT || l == InteropLibrary.getUncached(receiver);
1745+
return l;
1746+
}
1747+
17381748
@Override
17391749
public boolean isString(Object languageContext, Object receiver) {
1740-
return interop.isString(receiver);
1750+
return getInterop(receiver).isString(receiver);
17411751
}
17421752

17431753
@Override
17441754
public boolean isBoolean(Object languageContext, Object receiver) {
1745-
return interop.isBoolean(receiver);
1755+
return getInterop(receiver).isBoolean(receiver);
17461756
}
17471757

17481758
@Override
17491759
public boolean asBoolean(Object languageContext, Object receiver) {
17501760
try {
1751-
return interop.asBoolean(receiver);
1761+
return getInterop(receiver).asBoolean(receiver);
17521762
} catch (UnsupportedMessageException e) {
17531763
return super.asBoolean(languageContext, receiver);
17541764
}
@@ -1757,7 +1767,7 @@ public boolean asBoolean(Object languageContext, Object receiver) {
17571767
@Override
17581768
public String asString(Object languageContext, Object receiver) {
17591769
try {
1760-
return interop.asString(receiver);
1770+
return getInterop(receiver).asString(receiver);
17611771
} catch (UnsupportedMessageException e) {
17621772
return super.asString(languageContext, receiver);
17631773
}
@@ -1766,7 +1776,7 @@ public String asString(Object languageContext, Object receiver) {
17661776
@Override
17671777
public byte[] asStringBytes(Object languageContext, Object receiver, int encoding) {
17681778
try {
1769-
TruffleString s = interop.asTruffleString(receiver);
1779+
TruffleString s = getInterop(receiver).asTruffleString(receiver);
17701780
TruffleString.Encoding e = PolyglotImpl.mapStringEncoding(encoding);
17711781
return s.switchEncodingUncached(e).copyToByteArrayUncached(e);
17721782
} catch (UnsupportedMessageException e) {
@@ -1776,48 +1786,48 @@ public byte[] asStringBytes(Object languageContext, Object receiver, int encodin
17761786

17771787
@Override
17781788
public boolean isNumber(Object languageContext, Object receiver) {
1779-
return interop.isNumber(receiver);
1789+
return getInterop(receiver).isNumber(receiver);
17801790
}
17811791

17821792
@Override
17831793
public boolean fitsInByte(Object languageContext, Object receiver) {
1784-
return interop.fitsInByte(receiver);
1794+
return getInterop(receiver).fitsInByte(receiver);
17851795
}
17861796

17871797
@Override
17881798
public boolean fitsInShort(Object languageContext, Object receiver) {
1789-
return interop.fitsInShort(receiver);
1799+
return getInterop(receiver).fitsInShort(receiver);
17901800
}
17911801

17921802
@Override
17931803
public boolean fitsInInt(Object languageContext, Object receiver) {
1794-
return interop.fitsInInt(receiver);
1804+
return getInterop(receiver).fitsInInt(receiver);
17951805
}
17961806

17971807
@Override
17981808
public boolean fitsInLong(Object languageContext, Object receiver) {
1799-
return interop.fitsInLong(receiver);
1809+
return getInterop(receiver).fitsInLong(receiver);
18001810
}
18011811

18021812
@Override
18031813
public boolean fitsInBigInteger(Object languageContext, Object receiver) {
1804-
return interop.fitsInBigInteger(receiver);
1814+
return getInterop(receiver).fitsInBigInteger(receiver);
18051815
}
18061816

18071817
@Override
18081818
public boolean fitsInFloat(Object languageContext, Object receiver) {
1809-
return interop.fitsInFloat(receiver);
1819+
return getInterop(receiver).fitsInFloat(receiver);
18101820
}
18111821

18121822
@Override
18131823
public boolean fitsInDouble(Object languageContext, Object receiver) {
1814-
return interop.fitsInDouble(receiver);
1824+
return getInterop(receiver).fitsInDouble(receiver);
18151825
}
18161826

18171827
@Override
18181828
public byte asByte(Object languageContext, Object receiver) {
18191829
try {
1820-
return interop.asByte(receiver);
1830+
return getInterop(receiver).asByte(receiver);
18211831
} catch (UnsupportedMessageException e) {
18221832
return super.asByte(languageContext, receiver);
18231833
}
@@ -1826,7 +1836,7 @@ public byte asByte(Object languageContext, Object receiver) {
18261836
@Override
18271837
public short asShort(Object languageContext, Object receiver) {
18281838
try {
1829-
return interop.asShort(receiver);
1839+
return getInterop(receiver).asShort(receiver);
18301840
} catch (UnsupportedMessageException e) {
18311841
return super.asShort(languageContext, receiver);
18321842
}
@@ -1835,7 +1845,7 @@ public short asShort(Object languageContext, Object receiver) {
18351845
@Override
18361846
public int asInt(Object languageContext, Object receiver) {
18371847
try {
1838-
return interop.asInt(receiver);
1848+
return getInterop(receiver).asInt(receiver);
18391849
} catch (UnsupportedMessageException e) {
18401850
return super.asInt(languageContext, receiver);
18411851
}
@@ -1844,7 +1854,7 @@ public int asInt(Object languageContext, Object receiver) {
18441854
@Override
18451855
public long asLong(Object languageContext, Object receiver) {
18461856
try {
1847-
return interop.asLong(receiver);
1857+
return getInterop(receiver).asLong(receiver);
18481858
} catch (UnsupportedMessageException e) {
18491859
return super.asLong(languageContext, receiver);
18501860
}
@@ -1853,7 +1863,7 @@ public long asLong(Object languageContext, Object receiver) {
18531863
@Override
18541864
public BigInteger asBigInteger(Object languageContext, Object receiver) {
18551865
try {
1856-
return interop.asBigInteger(receiver);
1866+
return getInterop(receiver).asBigInteger(receiver);
18571867
} catch (UnsupportedMessageException e) {
18581868
return super.asBigInteger(languageContext, receiver);
18591869
}
@@ -1862,7 +1872,7 @@ public BigInteger asBigInteger(Object languageContext, Object receiver) {
18621872
@Override
18631873
public float asFloat(Object languageContext, Object receiver) {
18641874
try {
1865-
return interop.asFloat(receiver);
1875+
return getInterop(receiver).asFloat(receiver);
18661876
} catch (UnsupportedMessageException e) {
18671877
return super.asFloat(languageContext, receiver);
18681878
}
@@ -1871,7 +1881,7 @@ public float asFloat(Object languageContext, Object receiver) {
18711881
@Override
18721882
public double asDouble(Object languageContext, Object receiver) {
18731883
try {
1874-
return interop.asDouble(receiver);
1884+
return getInterop(receiver).asDouble(receiver);
18751885
} catch (UnsupportedMessageException e) {
18761886
return super.asDouble(languageContext, receiver);
18771887
}

0 commit comments

Comments
 (0)