65
65
66
66
import com .oracle .truffle .api .CallTarget ;
67
67
import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
68
+ import com .oracle .truffle .api .TruffleOptions ;
68
69
import com .oracle .truffle .api .dsl .Bind ;
69
70
import com .oracle .truffle .api .dsl .Cached ;
70
71
import com .oracle .truffle .api .dsl .GenerateCached ;
@@ -1703,52 +1704,61 @@ static PolyglotValueDispatch createHostNull(PolyglotImpl polyglot) {
1703
1704
}
1704
1705
1705
1706
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 );
1717
1717
}
1718
1718
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 ));
1721
1721
}
1722
1722
1723
1723
static final class PrimitiveValue extends PolyglotValueDispatch {
1724
1724
1725
- private final InteropLibrary interop ;
1725
+ private InteropLibrary interop ;
1726
1726
private final PolyglotLanguage language ;
1727
1727
1728
- private PrimitiveValue (PolyglotImpl impl , PolyglotLanguageInstance instance , Object primitiveValue ) {
1728
+ private PrimitiveValue (PolyglotImpl impl , PolyglotLanguageInstance instance ) {
1729
1729
super (impl , instance );
1730
1730
/*
1731
1731
* No caching needed for primitives. We do that to avoid the overhead of crossing a
1732
1732
* Truffle call boundary.
1733
1733
*/
1734
- this .interop = InteropLibrary .getUncached (primitiveValue );
1735
1734
this .language = instance != null ? instance .language : null ;
1736
1735
}
1737
1736
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
+
1738
1748
@ Override
1739
1749
public boolean isString (Object languageContext , Object receiver ) {
1740
- return interop .isString (receiver );
1750
+ return getInterop ( receiver ) .isString (receiver );
1741
1751
}
1742
1752
1743
1753
@ Override
1744
1754
public boolean isBoolean (Object languageContext , Object receiver ) {
1745
- return interop .isBoolean (receiver );
1755
+ return getInterop ( receiver ) .isBoolean (receiver );
1746
1756
}
1747
1757
1748
1758
@ Override
1749
1759
public boolean asBoolean (Object languageContext , Object receiver ) {
1750
1760
try {
1751
- return interop .asBoolean (receiver );
1761
+ return getInterop ( receiver ) .asBoolean (receiver );
1752
1762
} catch (UnsupportedMessageException e ) {
1753
1763
return super .asBoolean (languageContext , receiver );
1754
1764
}
@@ -1757,7 +1767,7 @@ public boolean asBoolean(Object languageContext, Object receiver) {
1757
1767
@ Override
1758
1768
public String asString (Object languageContext , Object receiver ) {
1759
1769
try {
1760
- return interop .asString (receiver );
1770
+ return getInterop ( receiver ) .asString (receiver );
1761
1771
} catch (UnsupportedMessageException e ) {
1762
1772
return super .asString (languageContext , receiver );
1763
1773
}
@@ -1766,7 +1776,7 @@ public String asString(Object languageContext, Object receiver) {
1766
1776
@ Override
1767
1777
public byte [] asStringBytes (Object languageContext , Object receiver , int encoding ) {
1768
1778
try {
1769
- TruffleString s = interop .asTruffleString (receiver );
1779
+ TruffleString s = getInterop ( receiver ) .asTruffleString (receiver );
1770
1780
TruffleString .Encoding e = PolyglotImpl .mapStringEncoding (encoding );
1771
1781
return s .switchEncodingUncached (e ).copyToByteArrayUncached (e );
1772
1782
} catch (UnsupportedMessageException e ) {
@@ -1776,48 +1786,48 @@ public byte[] asStringBytes(Object languageContext, Object receiver, int encodin
1776
1786
1777
1787
@ Override
1778
1788
public boolean isNumber (Object languageContext , Object receiver ) {
1779
- return interop .isNumber (receiver );
1789
+ return getInterop ( receiver ) .isNumber (receiver );
1780
1790
}
1781
1791
1782
1792
@ Override
1783
1793
public boolean fitsInByte (Object languageContext , Object receiver ) {
1784
- return interop .fitsInByte (receiver );
1794
+ return getInterop ( receiver ) .fitsInByte (receiver );
1785
1795
}
1786
1796
1787
1797
@ Override
1788
1798
public boolean fitsInShort (Object languageContext , Object receiver ) {
1789
- return interop .fitsInShort (receiver );
1799
+ return getInterop ( receiver ) .fitsInShort (receiver );
1790
1800
}
1791
1801
1792
1802
@ Override
1793
1803
public boolean fitsInInt (Object languageContext , Object receiver ) {
1794
- return interop .fitsInInt (receiver );
1804
+ return getInterop ( receiver ) .fitsInInt (receiver );
1795
1805
}
1796
1806
1797
1807
@ Override
1798
1808
public boolean fitsInLong (Object languageContext , Object receiver ) {
1799
- return interop .fitsInLong (receiver );
1809
+ return getInterop ( receiver ) .fitsInLong (receiver );
1800
1810
}
1801
1811
1802
1812
@ Override
1803
1813
public boolean fitsInBigInteger (Object languageContext , Object receiver ) {
1804
- return interop .fitsInBigInteger (receiver );
1814
+ return getInterop ( receiver ) .fitsInBigInteger (receiver );
1805
1815
}
1806
1816
1807
1817
@ Override
1808
1818
public boolean fitsInFloat (Object languageContext , Object receiver ) {
1809
- return interop .fitsInFloat (receiver );
1819
+ return getInterop ( receiver ) .fitsInFloat (receiver );
1810
1820
}
1811
1821
1812
1822
@ Override
1813
1823
public boolean fitsInDouble (Object languageContext , Object receiver ) {
1814
- return interop .fitsInDouble (receiver );
1824
+ return getInterop ( receiver ) .fitsInDouble (receiver );
1815
1825
}
1816
1826
1817
1827
@ Override
1818
1828
public byte asByte (Object languageContext , Object receiver ) {
1819
1829
try {
1820
- return interop .asByte (receiver );
1830
+ return getInterop ( receiver ) .asByte (receiver );
1821
1831
} catch (UnsupportedMessageException e ) {
1822
1832
return super .asByte (languageContext , receiver );
1823
1833
}
@@ -1826,7 +1836,7 @@ public byte asByte(Object languageContext, Object receiver) {
1826
1836
@ Override
1827
1837
public short asShort (Object languageContext , Object receiver ) {
1828
1838
try {
1829
- return interop .asShort (receiver );
1839
+ return getInterop ( receiver ) .asShort (receiver );
1830
1840
} catch (UnsupportedMessageException e ) {
1831
1841
return super .asShort (languageContext , receiver );
1832
1842
}
@@ -1835,7 +1845,7 @@ public short asShort(Object languageContext, Object receiver) {
1835
1845
@ Override
1836
1846
public int asInt (Object languageContext , Object receiver ) {
1837
1847
try {
1838
- return interop .asInt (receiver );
1848
+ return getInterop ( receiver ) .asInt (receiver );
1839
1849
} catch (UnsupportedMessageException e ) {
1840
1850
return super .asInt (languageContext , receiver );
1841
1851
}
@@ -1844,7 +1854,7 @@ public int asInt(Object languageContext, Object receiver) {
1844
1854
@ Override
1845
1855
public long asLong (Object languageContext , Object receiver ) {
1846
1856
try {
1847
- return interop .asLong (receiver );
1857
+ return getInterop ( receiver ) .asLong (receiver );
1848
1858
} catch (UnsupportedMessageException e ) {
1849
1859
return super .asLong (languageContext , receiver );
1850
1860
}
@@ -1853,7 +1863,7 @@ public long asLong(Object languageContext, Object receiver) {
1853
1863
@ Override
1854
1864
public BigInteger asBigInteger (Object languageContext , Object receiver ) {
1855
1865
try {
1856
- return interop .asBigInteger (receiver );
1866
+ return getInterop ( receiver ) .asBigInteger (receiver );
1857
1867
} catch (UnsupportedMessageException e ) {
1858
1868
return super .asBigInteger (languageContext , receiver );
1859
1869
}
@@ -1862,7 +1872,7 @@ public BigInteger asBigInteger(Object languageContext, Object receiver) {
1862
1872
@ Override
1863
1873
public float asFloat (Object languageContext , Object receiver ) {
1864
1874
try {
1865
- return interop .asFloat (receiver );
1875
+ return getInterop ( receiver ) .asFloat (receiver );
1866
1876
} catch (UnsupportedMessageException e ) {
1867
1877
return super .asFloat (languageContext , receiver );
1868
1878
}
@@ -1871,7 +1881,7 @@ public float asFloat(Object languageContext, Object receiver) {
1871
1881
@ Override
1872
1882
public double asDouble (Object languageContext , Object receiver ) {
1873
1883
try {
1874
- return interop .asDouble (receiver );
1884
+ return getInterop ( receiver ) .asDouble (receiver );
1875
1885
} catch (UnsupportedMessageException e ) {
1876
1886
return super .asDouble (languageContext , receiver );
1877
1887
}
0 commit comments