Implement enum types in VM

Fully support enum types as per language spec version 1.6.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//735723003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@41815 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
hausner@google.com 2014-11-18 23:10:07 +00:00
parent 438fbd7f6b
commit 4bf624ebc0
15 changed files with 656 additions and 261 deletions

View file

@ -10,3 +10,14 @@ import "dart:typed_data";
void _asyncCatchHelper(catchFunction, continuation) {
catchFunction((e) => continuation(null, e));
}
// The members of this class are cloned and added to each class that
// represents an enum type.
class _EnumHelper {
// Declare the list of enum value names private. When this field is
// cloned into a user-defined enum class, the field will be inaccessible
// because of the library-specific name suffix. The toString() function
// below can access it because it uses the same name suffix.
static const List<String> _enum_names = null;
String toString() => _enum_names[index];
}

View file

@ -2346,6 +2346,50 @@ void ClassFinalizer::FinalizeClass(const Class& cls) {
CollectImmediateSuperInterfaces(cls, &cids);
RemoveCHAOptimizedCode(cids);
}
if (cls.is_enum_class()) {
AllocateEnumValues(cls);
}
}
// Allocate instances for each enumeration value, and populate the
// static field 'values'.
// By allocating the instances programmatically, we save an implicit final
// getter function object for each enumeration value and for the
// values field. We also don't have to generate the code for these getters
// from thin air (no source code is available).
void ClassFinalizer::AllocateEnumValues(const Class &enum_cls) {
const Field& index_field =
Field::Handle(enum_cls.LookupInstanceField(Symbols::Index()));
ASSERT(!index_field.IsNull());
const Field& values_field =
Field::Handle(enum_cls.LookupStaticField(Symbols::Values()));
ASSERT(!values_field.IsNull());
ASSERT(Instance::Handle(values_field.value()).IsArray());
Array& values_list = Array::Handle(Array::RawCast(values_field.value()));
const Array& fields = Array::Handle(enum_cls.fields());
Field& field = Field::Handle();
Instance& ordinal_value = Instance::Handle();
Instance& enum_value = Instance::Handle();
for (intptr_t i = 0; i < fields.Length(); i++) {
field = Field::RawCast(fields.At(i));
if (!field.is_static()) continue;
ordinal_value = field.value();
// The static fields that need to be initialized with enum instances
// contain the smi value of the ordinal number, which was stored in
// the field by the parser. Other fields contain non-smi values.
if (!ordinal_value.IsSmi()) continue;
enum_value = Instance::New(enum_cls, Heap::kOld);
enum_value.SetField(index_field, ordinal_value);
field.set_value(enum_value);
field.RecordStore(enum_value);
intptr_t ord = Smi::Cast(ordinal_value).Value();
ASSERT(ord < values_list.Length());
values_list.SetAt(ord, enum_value);
}
values_list.MakeImmutable();
}
@ -2726,7 +2770,13 @@ void ClassFinalizer::ResolveSuperTypeAndInterfaces(
"class '%s' may not extend function type alias '%s'",
String::Handle(isolate, cls.Name()).ToCString(),
String::Handle(isolate,
super_type.UserVisibleName()).ToCString());
super_type.UserVisibleName()).ToCString());
}
if (interface_class.is_enum_class()) {
ReportError(cls, cls.token_pos(),
"class '%s' may not extend enum '%s'",
String::Handle(isolate, cls.Name()).ToCString(),
String::Handle(isolate, interface_class.Name()).ToCString());
}
// If cls belongs to core lib or to core lib's implementation, restrictions
@ -2803,6 +2853,13 @@ void ClassFinalizer::ResolveSuperTypeAndInterfaces(
"function type alias '%s' may not be used as interface",
interface_name.ToCString());
}
if (interface_class.is_enum_class()) {
const String& interface_name = String::Handle(isolate,
interface_class.Name());
ReportError(cls, cls.token_pos(),
"enum '%s' may not be used as interface",
interface_name.ToCString());
}
// Verify that unless cls belongs to core lib, it cannot extend, implement,
// or mixin any of Null, bool, num, int, double, String, dynamic.
if (!cls_belongs_to_core_lib) {

View file

@ -109,6 +109,7 @@ class ClassFinalizer : public AllStatic {
GrowableObjectArray* pending_types = NULL);
private:
static void AllocateEnumValues(const Class& enum_cls);
static bool IsSuperCycleFree(const Class& cls);
static bool IsTypeCycleFree(const Class& cls,
const AbstractType& type,

View file

@ -32,21 +32,21 @@ class TestGraphVisitor;
// (factory-name-symbol, result-cid, fingerprint).
// TODO(srdjan): Store the values in the snapshot instead.
#define RECOGNIZED_LIST_FACTORY_LIST(V) \
V(_ListFactory, kArrayCid, 1595327584) \
V(_GrowableListWithData, kGrowableObjectArrayCid, 732923072) \
V(_GrowableListFactory, kGrowableObjectArrayCid, 1956565810) \
V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 1499010120) \
V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 354210806) \
V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 231626935) \
V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 1044203454) \
V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 616427808) \
V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 26656923) \
V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 297463966) \
V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 105050331) \
V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 1469861670) \
V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 342242776) \
V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 105860920) \
V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 1217848993) \
V(_ListFactory, kArrayCid, 335347617) \
V(_GrowableListWithData, kGrowableObjectArrayCid, 536409567) \
V(_GrowableListFactory, kGrowableObjectArrayCid, 619206641) \
V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 1234236264) \
V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 89436950) \
V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 2114336727) \
V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 779429598) \
V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 351653952) \
V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 1909366715) \
V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 32690110) \
V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 1987760123) \
V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 1205087814) \
V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 77468920) \
V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 1988570712) \
V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 953075137) \
// Class that recognizes factories and returns corresponding result cid.

View file

@ -14,9 +14,9 @@ namespace dart {
// correct fingerprint from the mismatch error.
#define OTHER_RECOGNIZED_LIST(V) \
V(::, identical, ObjectIdentical, 496869842) \
V(ClassID, getID, ClassIDgetID, 1322490980) \
V(ClassID, getID, ClassIDgetID, 1662520165) \
V(Object, Object., ObjectConstructor, 1066669787) \
V(_List, ., ObjectArrayAllocate, 1595327584) \
V(_List, ., ObjectArrayAllocate, 335347617) \
V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498) \
V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349) \
V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990) \
@ -28,19 +28,19 @@ namespace dart {
V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200) \
V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857) \
V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805) \
V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464) \
V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 149406583) \
V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162) \
V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 888580944) \
V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181) \
V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792) \
V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 1473080053) \
V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855) \
V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980) \
V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310) \
V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078) \
V(_StringBase, _interpolate, StringBaseInterpolate, 1540062866) \
V(_IntegerImplementation, toDouble, IntegerToDouble, 1084977108) \
V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 783880753) \
V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 499938872) \
V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 1156009451) \
V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 1239113233) \
V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 2058780470) \
V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 66201433) \
V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 1823612342) \
V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1499236144) \
V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 1323416269) \
V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1301054599) \
V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1651670367) \
V(_StringBase, _interpolate, StringBaseInterpolate, 1503544722) \
V(_IntegerImplementation, toDouble, IntegerToDouble, 1020333941) \
V(_IntegerImplementation, _leftShiftWithMask32, IntegerLeftShiftWithMask32, \
597111055) \
V(_Double, truncateToDouble, DoubleTruncate, 2117801967) \
@ -54,22 +54,22 @@ namespace dart {
V(_Double, _div, DoubleDiv, 1201505037) \
V(::, sin, MathSin, 1741396147) \
V(::, cos, MathCos, 1951197905) \
V(::, min, MathMin, 1022567780) \
V(::, max, MathMax, 612058870) \
V(::, _doublePow, MathDoublePow, 823139975) \
V(Float32x4, Float32x4., Float32x4Constructor, 1755873079) \
V(Float32x4, Float32x4.zero, Float32x4Zero, 1494069379) \
V(Float32x4, Float32x4.splat, Float32x4Splat, 916211464) \
V(::, min, MathMin, 214919172) \
V(::, max, MathMax, 989552054) \
V(::, _doublePow, MathDoublePow, 275712742) \
V(Float32x4, Float32x4., Float32x4Constructor, 137170840) \
V(Float32x4, Float32x4.zero, Float32x4Zero, 1336967908) \
V(Float32x4, Float32x4.splat, Float32x4Splat, 2001978631) \
V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits, \
640076216) \
V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1279591344) \
1725843383) \
V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 217874863) \
V(_Float32x4, shuffle, Float32x4Shuffle, 1636488139) \
V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 597555927) \
V(_Float32x4, get:x, Float32x4ShuffleX, 384850558) \
V(_Float32x4, get:y, Float32x4ShuffleY, 1398002778) \
V(_Float32x4, get:z, Float32x4ShuffleZ, 1178056441) \
V(_Float32x4, get:w, Float32x4ShuffleW, 480831839) \
V(_Float32x4, get:signMask, Float32x4GetSignMask, 630761511) \
V(_Float32x4, get:x, Float32x4ShuffleX, 384880349) \
V(_Float32x4, get:y, Float32x4ShuffleY, 1398032569) \
V(_Float32x4, get:z, Float32x4ShuffleZ, 1178086232) \
V(_Float32x4, get:w, Float32x4ShuffleW, 480861630) \
V(_Float32x4, get:signMask, Float32x4GetSignMask, 630791302) \
V(_Float32x4, _cmpequal, Float32x4Equal, 571062952) \
V(_Float32x4, _cmpgt, Float32x4GreaterThan, 1613543295) \
V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 589402909) \
@ -89,205 +89,205 @@ namespace dart {
V(_Float32x4, withY, Float32x4WithY, 309844761) \
V(_Float32x4, withZ, Float32x4WithZ, 971921505) \
V(_Float32x4, withW, Float32x4WithW, 1759699726) \
V(Float64x2, Float64x2., Float64x2Constructor, 1399581872) \
V(Float64x2, Float64x2.zero, Float64x2Zero, 1836770587) \
V(Float64x2, Float64x2.splat, Float64x2Splat, 939291159) \
V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1499726406) \
V(_Float64x2, get:x, Float64x2GetX, 261044094) \
V(_Float64x2, get:y, Float64x2GetY, 1942257886) \
V(Float64x2, Float64x2., Float64x2Constructor, 490465873) \
V(Float64x2, Float64x2.zero, Float64x2Zero, 1679669116) \
V(Float64x2, Float64x2.splat, Float64x2Splat, 2025058326) \
V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 438009925) \
V(_Float64x2, get:x, Float64x2GetX, 261073885) \
V(_Float64x2, get:y, Float64x2GetY, 1942287677) \
V(_Float64x2, _negate, Float64x2Negate, 2133212774) \
V(_Float64x2, abs, Float64x2Abs, 1224776282) \
V(_Float64x2, sqrt, Float64x2Sqrt, 1037569520) \
V(_Float64x2, get:signMask, Float64x2GetSignMask, 252936800) \
V(_Float64x2, get:signMask, Float64x2GetSignMask, 252966591) \
V(_Float64x2, scale, Float64x2Scale, 1199438744) \
V(_Float64x2, withX, Float64x2WithX, 1042725932) \
V(_Float64x2, withY, Float64x2WithY, 1496958947) \
V(_Float64x2, min, Float64x2Min, 485240583) \
V(_Float64x2, max, Float64x2Max, 2146148204) \
V(Int32x4, Int32x4., Int32x4Constructor, 665986284) \
V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 87082660) \
V(Int32x4, Int32x4., Int32x4Constructor, 1194767693) \
V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 1052882565) \
V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits, \
372517418) \
V(_Int32x4, get:flagX, Int32x4GetFlagX, 1077555238) \
V(_Int32x4, get:flagY, Int32x4GetFlagY, 779160284) \
V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 181912283) \
V(_Int32x4, get:flagW, Int32x4GetFlagW, 977675534) \
V(_Int32x4, get:signMask, Int32x4GetSignMask, 1929271914) \
1458284585) \
V(_Int32x4, get:flagX, Int32x4GetFlagX, 1077585029) \
V(_Int32x4, get:flagY, Int32x4GetFlagY, 779190075) \
V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 181942074) \
V(_Int32x4, get:flagW, Int32x4GetFlagW, 977705325) \
V(_Int32x4, get:signMask, Int32x4GetSignMask, 1929301705) \
V(_Int32x4, shuffle, Int32x4Shuffle, 1870018702) \
V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 967644870) \
V(_Int32x4, select, Int32x4Select, 1696037681) \
V(_Int32x4, select, Int32x4Select, 1291364368) \
V(_Int32x4, withFlagX, Int32x4WithFlagX, 467852789) \
V(_Int32x4, withFlagY, Int32x4WithFlagY, 1903359978) \
V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 862460960) \
V(_Int32x4, withFlagW, Int32x4WithFlagW, 1095242907) \
V(_Float32Array, [], Float32ArrayGetIndexed, 856653338) \
V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464) \
V(_Int8Array, [], Int8ArrayGetIndexed, 321230586) \
V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685) \
V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063) \
V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340) \
V(_Float32Array, [], Float32ArrayGetIndexed, 1092936601) \
V(_Float32Array, []=, Float32ArraySetIndexed, 102284991) \
V(_Int8Array, [], Int8ArrayGetIndexed, 557513849) \
V(_Int8Array, []=, Int8ArraySetIndexed, 1135113150) \
V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 666955326) \
V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 2053292453) \
V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed, \
1346536303) \
1582819566) \
V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed, \
1794849214) \
V(_Int16Array, [], Int16ArrayGetIndexed, 74127855) \
V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345) \
V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953) \
V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040) \
V(_Int32Array, [], Int32ArrayGetIndexed, 203101370) \
V(_Int32Array, []=, Int32ArraySetIndexed, 338968571) \
V(_Uint32Array, [], Uint32ArrayGetIndexed, 1640672852) \
V(_Uint32Array, []=, Uint32ArraySetIndexed, 1472976717) \
V(_Int64Array, [], Int64ArrayGetIndexed, 206855782) \
V(_Int64Array, []=, Int64ArraySetIndexed, 1258282177) \
V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1466627059) \
V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 2141660076) \
V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 818792056) \
V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1021474038) \
V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 288114492) \
V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 941746736) \
V(_Bigint, get:_neg, Bigint_getNeg, 1151514099) \
V(_Bigint, get:_used, Bigint_getUsed, 1308529543) \
V(_Bigint, get:_digits, Bigint_getDigits, 1408062672) \
879363679) \
V(_Int16Array, [], Int16ArrayGetIndexed, 310411118) \
V(_Int16Array, []=, Int16ArraySetIndexed, 694766810) \
V(_Uint16Array, [], Uint16ArrayGetIndexed, 706695216) \
V(_Uint16Array, []=, Uint16ArraySetIndexed, 733443505) \
V(_Int32Array, [], Int32ArrayGetIndexed, 439384633) \
V(_Int32Array, []=, Int32ArraySetIndexed, 1570966684) \
V(_Uint32Array, [], Uint32ArrayGetIndexed, 1876956115) \
V(_Uint32Array, []=, Uint32ArraySetIndexed, 557491182) \
V(_Int64Array, [], Int64ArrayGetIndexed, 443139045) \
V(_Int64Array, []=, Int64ArraySetIndexed, 342796642) \
V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1702910322) \
V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 157778603) \
V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1055075319) \
V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1185076213) \
V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 524397755) \
V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 1105348911) \
V(_Bigint, get:_neg, Bigint_getNeg, 1151543890) \
V(_Bigint, get:_used, Bigint_getUsed, 1308559334) \
V(_Bigint, get:_digits, Bigint_getDigits, 1408092463) \
// List of intrinsics:
// (class-name, function-name, intrinsification method, fingerprint).
#define CORE_LIB_INTRINSIC_LIST(V) \
V(_Smi, ~, Smi_bitNegate, 105519892) \
V(_Smi, get:bitLength, Smi_bitLength, 869956497) \
V(_Bigint, set:_neg, Bigint_setNeg, 920204960) \
V(_Bigint, set:_used, Bigint_setUsed, 1857576743) \
V(_Bigint, _set_digits, Bigint_setDigits, 582835804) \
V(_Bigint, _absAdd, Bigint_absAdd, 233965936) \
V(_Bigint, _absSub, Bigint_absSub, 1401148862) \
V(_Bigint, _mulAdd, Bigint_mulAdd, 1283124653) \
V(_Bigint, _sqrAdd, Bigint_sqrAdd, 1665155090) \
V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 643982609) \
V(_Montgomery, _mulMod, Montgomery_mulMod, 149127024) \
V(_Double, >, Double_greaterThan, 381325711) \
V(_Double, >=, Double_greaterEqualThan, 1409267140) \
V(_Double, <, Double_lessThan, 2080387973) \
V(_Double, <=, Double_lessEqualThan, 106225572) \
V(_Double, ==, Double_equal, 2093918133) \
V(_Double, +, Double_add, 1646350451) \
V(_Double, -, Double_sub, 1477459276) \
V(_Double, *, Double_mul, 1334580777) \
V(_Double, /, Double_div, 1938037155) \
V(_Double, get:isNaN, Double_getIsNaN, 843050033) \
V(_Double, get:isNegative, Double_getIsNegative, 1637875580) \
V(_Double, _mulFromInteger, Double_mulFromInteger, 1594796483) \
V(_Double, .fromInteger, DoubleFromInteger, 999771940) \
V(_List, []=, ObjectArraySetIndexed, 1288827575) \
V(_GrowableList, .withData, GrowableArray_Allocate, 732923072) \
V(_GrowableList, [], GrowableArrayGetIndexed, 919108233) \
V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853) \
V(_GrowableList, _setLength, GrowableArraySetLength, 89389299) \
V(_GrowableList, _setData, GrowableArraySetData, 2126927509) \
V(_GrowableList, add, GrowableArray_add, 1899133961) \
V(Object, ==, ObjectEquals, 1068471689) \
V(_StringBase, get:hashCode, String_getHashCode, 2102906241) \
V(_StringBase, get:isEmpty, StringBaseIsEmpty, 49873871) \
V(_Smi, ~, Smi_bitNegate, 134149043) \
V(_Smi, get:bitLength, Smi_bitLength, 869986288) \
V(_Bigint, set:_neg, Bigint_setNeg, 855560832) \
V(_Bigint, set:_used, Bigint_setUsed, 1792932615) \
V(_Bigint, _set_digits, Bigint_setDigits, 178162491) \
V(_Bigint, _absAdd, Bigint_absAdd, 97148049) \
V(_Bigint, _absSub, Bigint_absSub, 159012285) \
V(_Bigint, _mulAdd, Bigint_mulAdd, 101252203) \
V(_Bigint, _sqrAdd, Bigint_sqrAdd, 1684445648) \
V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 649845040) \
V(_Montgomery, _mulMod, Montgomery_mulMod, 1551846228) \
V(_Double, >, Double_greaterThan, 1538121903) \
V(_Double, >=, Double_greaterEqualThan, 1058495718) \
V(_Double, <, Double_lessThan, 62910596) \
V(_Double, <=, Double_lessEqualThan, 1902937798) \
V(_Double, ==, Double_equal, 793601203) \
V(_Double, +, Double_add, 655662995) \
V(_Double, -, Double_sub, 486771820) \
V(_Double, *, Double_mul, 343893321) \
V(_Double, /, Double_div, 947349699) \
V(_Double, get:isNaN, Double_getIsNaN, 843079824) \
V(_Double, get:isNegative, Double_getIsNegative, 1637905371) \
V(_Double, _mulFromInteger, Double_mulFromInteger, 1748815298) \
V(_Double, .fromInteger, DoubleFromInteger, 803258435) \
V(_List, []=, ObjectArraySetIndexed, 1768442583) \
V(_GrowableList, .withData, GrowableArray_Allocate, 536409567) \
V(_GrowableList, [], GrowableArrayGetIndexed, 514434920) \
V(_GrowableList, []=, GrowableArraySetIndexed, 1698264861) \
V(_GrowableList, _setLength, GrowableArraySetLength, 1832199634) \
V(_GrowableList, _setData, GrowableArraySetData, 1722254196) \
V(_GrowableList, add, GrowableArray_add, 422087403) \
V(Object, ==, ObjectEquals, 1955975370) \
V(_StringBase, get:hashCode, String_getHashCode, 2102936032) \
V(_StringBase, get:isEmpty, StringBaseIsEmpty, 769493198) \
V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324) \
V(_StringBase, [], StringBaseCharAt, 1512210677) \
V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111837929) \
V(_StringBase, [], StringBaseCharAt, 1107537364) \
V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111867720) \
V(_OneByteString, _substringUncheckedNative, \
OneByteString_substringUnchecked, 1527498975) \
V(_OneByteString, _setAt, OneByteStringSetAt, 468605749) \
V(_OneByteString, _allocate, OneByteString_allocate, 2035417022) \
V(_OneByteString, ==, OneByteString_equality, 1727047023) \
V(_TwoByteString, ==, TwoByteString_equality, 951149689) \
V(_OneByteString, _setAt, OneByteStringSetAt, 819138038) \
V(_OneByteString, _allocate, OneByteString_allocate, 227962559) \
V(_OneByteString, ==, OneByteString_equality, 1857083054) \
V(_TwoByteString, ==, TwoByteString_equality, 1081185720) \
#define CORE_INTEGER_LIB_INTRINSIC_LIST(V) \
V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger, \
438687793) \
V(_IntegerImplementation, +, Integer_add, 501253666) \
V(_IntegerImplementation, +, Integer_add, 1324179652) \
V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, \
562800077) \
V(_IntegerImplementation, -, Integer_sub, 1819430179) \
V(_IntegerImplementation, -, Integer_sub, 494872517) \
V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger, \
67891834) \
V(_IntegerImplementation, *, Integer_mul, 1787870724) \
V(_IntegerImplementation, *, Integer_mul, 463313062) \
V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger, \
93478264) \
V(_IntegerImplementation, ~/, Integer_truncDivide, 1309867000) \
V(_IntegerImplementation, unary-, Integer_negate, 2095203689) \
V(_IntegerImplementation, ~/, Integer_truncDivide, 300412283) \
V(_IntegerImplementation, unary-, Integer_negate, 1899613736) \
V(_IntegerImplementation, _bitAndFromInteger, \
Integer_bitAndFromInteger, 504496713) \
V(_IntegerImplementation, &, Integer_bitAnd, 648886925) \
V(_IntegerImplementation, &, Integer_bitAnd, 1471812911) \
V(_IntegerImplementation, _bitOrFromInteger, \
Integer_bitOrFromInteger, 1763728073) \
V(_IntegerImplementation, |, Integer_bitOr, 1473764427) \
V(_IntegerImplementation, |, Integer_bitOr, 149206765) \
V(_IntegerImplementation, _bitXorFromInteger, \
Integer_bitXorFromInteger, 281425907) \
V(_IntegerImplementation, ^, Integer_bitXor, 99980524) \
V(_IntegerImplementation, ^, Integer_bitXor, 922906510) \
V(_IntegerImplementation, \
_greaterThanFromInteger, \
Integer_greaterThanFromInt, 787426822) \
V(_IntegerImplementation, >, Integer_greaterThan, 123961041) \
V(_IntegerImplementation, ==, Integer_equal, 1423724294) \
V(_IntegerImplementation, >, Integer_greaterThan, 1226840498) \
V(_IntegerImplementation, ==, Integer_equal, 1155579943) \
V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger, \
1790821042) \
V(_IntegerImplementation, <, Integer_lessThan, 425560117) \
V(_IntegerImplementation, <=, Integer_lessEqualThan, 1512735828) \
V(_IntegerImplementation, >=, Integer_greaterEqualThan, 668293748) \
V(_IntegerImplementation, <<, Integer_shl, 656407087) \
V(_IntegerImplementation, >>, Integer_sar, 487746736) \
V(_IntegerImplementation, <, Integer_lessThan, 555566388) \
V(_IntegerImplementation, <=, Integer_lessEqualThan, 1161964406) \
V(_IntegerImplementation, >=, Integer_greaterEqualThan, 317522326) \
V(_IntegerImplementation, <<, Integer_shl, 1479333073) \
V(_IntegerImplementation, >>, Integer_sar, 1310672722) \
V(_Double, toInt, DoubleToInteger, 1547535151)
#define MATH_LIB_INTRINSIC_LIST(V) \
V(::, sqrt, MathSqrt, 101545548) \
V(_Random, _nextState, Random_nextState, 55890711) \
V(_Random, _nextState, Random_nextState, 84519862) \
#define TYPED_DATA_LIB_INTRINSIC_LIST(V) \
V(_Int8Array, _new, TypedData_Int8Array_new, 1150131819) \
V(_Uint8Array, _new, TypedData_Uint8Array_new, 2019665760) \
V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 726412668) \
V(_Int16Array, _new, TypedData_Int16Array_new, 1879541015) \
V(_Uint16Array, _new, TypedData_Uint16Array_new, 189496401) \
V(_Int32Array, _new, TypedData_Int32Array_new, 1725327048) \
V(_Uint32Array, _new, TypedData_Uint32Array_new, 10306485) \
V(_Int64Array, _new, TypedData_Int64Array_new, 1299501918) \
V(_Uint64Array, _new, TypedData_Uint64Array_new, 1635318703) \
V(_Float32Array, _new, TypedData_Float32Array_new, 577737480) \
V(_Float64Array, _new, TypedData_Float64Array_new, 645355686) \
V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 596639418) \
V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 496358233) \
V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1506975080) \
V(_Int8Array, ., TypedData_Int8Array_factory, 1499010120) \
V(_Uint8Array, ., TypedData_Uint8Array_factory, 354210806) \
V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 231626935) \
V(_Int16Array, ., TypedData_Int16Array_factory, 1044203454) \
V(_Uint16Array, ., TypedData_Uint16Array_factory, 616427808) \
V(_Int32Array, ., TypedData_Int32Array_factory, 26656923) \
V(_Uint32Array, ., TypedData_Uint32Array_factory, 297463966) \
V(_Int64Array, ., TypedData_Int64Array_factory, 105050331) \
V(_Uint64Array, ., TypedData_Uint64Array_factory, 1469861670) \
V(_Float32Array, ., TypedData_Float32Array_factory, 105860920) \
V(_Float64Array, ., TypedData_Float64Array_factory, 342242776) \
V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1217848993) \
V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 100825417) \
V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 611308575) \
V(_Int8Array, _new, TypedData_Int8Array_new, 1490161004) \
V(_Uint8Array, _new, TypedData_Uint8Array_new, 212211297) \
V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 1066441853) \
V(_Int16Array, _new, TypedData_Int16Array_new, 72086552) \
V(_Uint16Array, _new, TypedData_Uint16Array_new, 529525586) \
V(_Int32Array, _new, TypedData_Int32Array_new, 2065356233) \
V(_Uint32Array, _new, TypedData_Uint32Array_new, 350335670) \
V(_Int64Array, _new, TypedData_Int64Array_new, 1639531103) \
V(_Uint64Array, _new, TypedData_Uint64Array_new, 1975347888) \
V(_Float32Array, _new, TypedData_Float32Array_new, 917766665) \
V(_Float64Array, _new, TypedData_Float64Array_new, 985384871) \
V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 936668603) \
V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 836387418) \
V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1847004265) \
V(_Int8Array, ., TypedData_Int8Array_factory, 1234236264) \
V(_Uint8Array, ., TypedData_Uint8Array_factory, 89436950) \
V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 2114336727) \
V(_Int16Array, ., TypedData_Int16Array_factory, 779429598) \
V(_Uint16Array, ., TypedData_Uint16Array_factory, 351653952) \
V(_Int32Array, ., TypedData_Int32Array_factory, 1909366715) \
V(_Uint32Array, ., TypedData_Uint32Array_factory, 32690110) \
V(_Int64Array, ., TypedData_Int64Array_factory, 1987760123) \
V(_Uint64Array, ., TypedData_Uint64Array_factory, 1205087814) \
V(_Float32Array, ., TypedData_Float32Array_factory, 1988570712) \
V(_Float64Array, ., TypedData_Float64Array_factory, 77468920) \
V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 953075137) \
V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 1983535209) \
V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 346534719) \
#define GRAPH_TYPED_DATA_INTRINSICS_LIST(V) \
V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140) \
V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553) \
V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951) \
V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513) \
V(_Float64Array, []=, Float64ArraySetIndexed, 243929230) \
V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297) \
V(_TypedList, get:length, TypedDataLength, 522565357) \
V(_Uint8Array, [], Uint8ArrayGetIndexed, 252408403) \
V(_Uint8Array, []=, Uint8ArraySetIndexed, 1102579018) \
V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1915061214) \
V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 2992978) \
V(_Float64Array, []=, Float64ArraySetIndexed, 407531405) \
V(_Float64Array, [], Float64ArrayGetIndexed, 2015337560) \
V(_TypedList, get:length, TypedDataLength, 522595148) \
#define GRAPH_CORE_INTRINSICS_LIST(V) \
V(_List, get:length, ObjectArrayLength, 1181352729) \
V(_List, [], ObjectArrayGetIndexed, 795612476) \
V(_ImmutableList, get:length, ImmutableArrayLength, 274917727) \
V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341) \
V(_GrowableList, get:length, GrowableArrayLength, 778505107) \
V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075) \
V(_StringBase, get:length, StringBaseLength, 784399628) \
V(_List, get:length, ObjectArrayLength, 1181382520) \
V(_List, [], ObjectArrayGetIndexed, 390939163) \
V(_ImmutableList, get:length, ImmutableArrayLength, 274947518) \
V(_ImmutableList, [], ImmutableArrayGetIndexed, 1585504028) \
V(_GrowableList, get:length, GrowableArrayLength, 778534898) \
V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555169866) \
V(_StringBase, get:length, StringBaseLength, 784429419) \
#define GRAPH_INTRINSICS_LIST(V) \
GRAPH_CORE_INTRINSICS_LIST(V) \
@ -315,50 +315,50 @@ namespace dart {
// A list of core function that should always be inlined.
#define INLINE_WHITE_LIST(V) \
V(Object, ==, ObjectEquals, 1068471689) \
V(_List, get:length, ObjectArrayLength, 1181352729) \
V(_ImmutableList, get:length, ImmutableArrayLength, 274917727) \
V(_TypedList, get:length, TypedDataLength, 522565357) \
V(_GrowableList, get:length, GrowableArrayLength, 778505107) \
V(_StringBase, get:length, StringBaseLength, 784399628) \
V(ListIterator, moveNext, ListIteratorMoveNext, 210829138) \
V(_FixedSizeArrayIterator, moveNext, FixedListIteratorMoveNext, 1147271335) \
V(_GrowableList, get:iterator, GrowableArrayIterator, 1812933946) \
V(_GrowableList, forEach, GrowableArrayForEach, 2085943947) \
V(_List, ., ObjectArrayAllocate, 1595327584) \
V(_List, [], ObjectArrayGetIndexed, 795612476) \
V(_List, []=, ObjectArraySetIndexed, 1288827575) \
V(_List, get:isEmpty, ObjectArrayIsEmpty, 2130247737) \
V(_List, get:iterator, ObjectArrayIterator, 458612415) \
V(_List, forEach, ObjectArrayForEach, 592525445) \
V(_List, _slice, ObjectArraySlice, 1891508040) \
V(_ImmutableList, get:iterator, ImmutableArrayIterator, 362084797) \
V(_ImmutableList, forEach, ImmutableArrayForEach, 63658053) \
V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341) \
V(_GrowableList, [], GrowableArrayGetIndexed, 919108233) \
V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853) \
V(_Float32Array, [], Float32ArrayGetIndexed, 856653338) \
V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464) \
V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297) \
V(_Float64Array, []=, Float64ArraySetIndexed, 243929230) \
V(_Int8Array, [], Int8ArrayGetIndexed, 321230586) \
V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685) \
V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140) \
V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553) \
V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063) \
V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340) \
V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953) \
V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040) \
V(_Int16Array, [], Int16ArrayGetIndexed, 74127855) \
V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345) \
V(_Int32Array, [], Int32ArrayGetIndexed, 203101370) \
V(_Int32Array, []=, Int32ArraySetIndexed, 338968571) \
V(_Int64Array, [], Int64ArrayGetIndexed, 206855782) \
V(_Int64Array, []=, Int64ArraySetIndexed, 1258282177) \
V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 1543480955) \
V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 936729641) \
V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1898018934) \
V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 111684506) \
V(Object, ==, ObjectEquals, 1955975370) \
V(_List, get:length, ObjectArrayLength, 1181382520) \
V(_ImmutableList, get:length, ImmutableArrayLength, 274947518) \
V(_TypedList, get:length, TypedDataLength, 522595148) \
V(_GrowableList, get:length, GrowableArrayLength, 778534898) \
V(_StringBase, get:length, StringBaseLength, 784429419) \
V(ListIterator, moveNext, ListIteratorMoveNext, 1001265875) \
V(_FixedSizeArrayIterator, moveNext, FixedListIteratorMoveNext, 890839431) \
V(_GrowableList, get:iterator, GrowableArrayIterator, 1663047580) \
V(_GrowableList, forEach, GrowableArrayForEach, 605873384) \
V(_List, ., ObjectArrayAllocate, 335347617) \
V(_List, [], ObjectArrayGetIndexed, 390939163) \
V(_List, []=, ObjectArraySetIndexed, 1768442583) \
V(_List, get:isEmpty, ObjectArrayIsEmpty, 702383416) \
V(_List, get:iterator, ObjectArrayIterator, 308726049) \
V(_List, forEach, ObjectArrayForEach, 1720909126) \
V(_List, _slice, ObjectArraySlice, 1738717516) \
V(_ImmutableList, get:iterator, ImmutableArrayIterator, 212198431) \
V(_ImmutableList, forEach, ImmutableArrayForEach, 1192041734) \
V(_ImmutableList, [], ImmutableArrayGetIndexed, 1585504028) \
V(_GrowableList, [], GrowableArrayGetIndexed, 514434920) \
V(_GrowableList, []=, GrowableArraySetIndexed, 1698264861) \
V(_Float32Array, [], Float32ArrayGetIndexed, 1092936601) \
V(_Float32Array, []=, Float32ArraySetIndexed, 102284991) \
V(_Float64Array, [], Float64ArrayGetIndexed, 2015337560) \
V(_Float64Array, []=, Float64ArraySetIndexed, 407531405) \
V(_Int8Array, [], Int8ArrayGetIndexed, 557513849) \
V(_Int8Array, []=, Int8ArraySetIndexed, 1135113150) \
V(_Uint8Array, [], Uint8ArrayGetIndexed, 252408403) \
V(_Uint8Array, []=, Uint8ArraySetIndexed, 1102579018) \
V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 666955326) \
V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 2053292453) \
V(_Uint16Array, [], Uint16ArrayGetIndexed, 706695216) \
V(_Uint16Array, []=, Uint16ArraySetIndexed, 733443505) \
V(_Int16Array, [], Int16ArrayGetIndexed, 310411118) \
V(_Int16Array, []=, Int16ArraySetIndexed, 694766810) \
V(_Int32Array, [], Int32ArrayGetIndexed, 439384633) \
V(_Int32Array, []=, Int32ArraySetIndexed, 1570966684) \
V(_Int64Array, [], Int64ArrayGetIndexed, 443139045) \
V(_Int64Array, []=, Int64ArraySetIndexed, 342796642) \
V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 735017274) \
V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 1913230218) \
V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1089555253) \
V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 1088185083) \
V(::, asin, MathASin, 1651042633) \
V(::, acos, MathACos, 1139647090) \
V(::, atan, MathATan, 1668754384) \
@ -366,30 +366,30 @@ namespace dart {
V(::, cos, MathCos, 1951197905) \
V(::, exp, MathExp, 1809210829) \
V(::, log, MathLog, 1620336448) \
V(::, max, MathMax, 612058870) \
V(::, min, MathMin, 1022567780) \
V(::, pow, MathPow, 930962530) \
V(::, max, MathMax, 989552054) \
V(::, min, MathMin, 214919172) \
V(::, pow, MathPow, 1381728863) \
V(::, sin, MathSin, 1741396147) \
V(::, sqrt, MathSqrt, 101545548) \
V(::, tan, MathTan, 982072809) \
V(Lists, copy, ListsCopy, 902244797) \
V(_Bigint, get:_neg, Bigint_getNeg, 1151514099) \
V(_Bigint, get:_used, Bigint_getUsed, 1308529543) \
V(_Bigint, get:_digits, Bigint_getDigits, 1408062672) \
V(_Bigint, set:_digits, Bigint_setDigits, 1135754410) \
V(Lists, copy, ListsCopy, 605584668) \
V(_Bigint, get:_neg, Bigint_getNeg, 1151543890) \
V(_Bigint, get:_used, Bigint_getUsed, 1308559334) \
V(_Bigint, get:_digits, Bigint_getDigits, 1408092463) \
V(_Bigint, set:_digits, Bigint_setDigits, 1625268649) \
// A list of core function that should never be inlined.
#define INLINE_BLACK_LIST(V) \
V(_Bigint, _absAdd, Bigint_absAdd, 233965936) \
V(_Bigint, _absSub, Bigint_absSub, 1401148862) \
V(_Bigint, _mulAdd, Bigint_mulAdd, 1283124653) \
V(_Bigint, _sqrAdd, Bigint_sqrAdd, 1665155090) \
V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 643982609) \
V(_Montgomery, _mulMod, Montgomery_mulMod, 149127024) \
V(_Bigint, _absAdd, Bigint_absAdd, 97148049) \
V(_Bigint, _absSub, Bigint_absSub, 159012285) \
V(_Bigint, _mulAdd, Bigint_mulAdd, 101252203) \
V(_Bigint, _sqrAdd, Bigint_sqrAdd, 1684445648) \
V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 649845040) \
V(_Montgomery, _mulMod, Montgomery_mulMod, 1551846228) \
// A list of core functions that internally dispatch based on received id.
#define POLYMORPHIC_TARGET_LIST(V) \
V(_StringBase, [], StringBaseCharAt, 1512210677) \
V(_StringBase, [], StringBaseCharAt, 1107537364) \
V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324) \
V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498) \
V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349) \
@ -401,16 +401,16 @@ namespace dart {
V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200) \
V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857) \
V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805) \
V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464) \
V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 149406583) \
V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162) \
V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 888580944) \
V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181) \
V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792) \
V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855) \
V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980) \
V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310) \
V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078) \
V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 783880753) \
V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 499938872) \
V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 1156009451) \
V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 1239113233) \
V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 2058780470) \
V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 66201433) \
V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1499236144) \
V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 1323416269) \
V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1301054599) \
V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1651670367) \
// Forward declarations.
class Function;

View file

@ -3405,6 +3405,11 @@ void Class::set_is_synthesized_class() const {
}
void Class::set_is_enum_class() const {
set_state_bits(EnumBit::update(true, raw_ptr()->state_bits_));
}
void Class::set_is_const() const {
set_state_bits(ConstBit::update(true, raw_ptr()->state_bits_));
}
@ -6690,7 +6695,7 @@ bool Function::CheckSourceFingerprint(int32_t fp) const {
if (recalculatingFingerprints) {
// This output can be copied into a file, then used with sed
// to replace the old values.
// sed -i .bak -f /tmp/newkeys runtime/vm/intrinsifier.h
// sed -i .bak -f /tmp/newkeys runtime/vm/method_recognizer.h
// sed -i .bak -f /tmp/newkeys runtime/vm/intermediate_language.h
// sed -i .bak -f /tmp/newkeys runtime/vm/flow_graph_builder.h
OS::Print("s/%d/%d/\n", fp, SourceFingerprint());

View file

@ -1172,6 +1172,11 @@ class Class : public Object {
}
void set_is_synthesized_class() const;
bool is_enum_class() const {
return EnumBit::decode(raw_ptr()->state_bits_);
}
void set_is_enum_class() const;
bool is_finalized() const {
return ClassFinalizedBits::decode(raw_ptr()->state_bits_)
== RawClass::kFinalized;
@ -1329,6 +1334,7 @@ class Class : public Object {
kMixinTypeAppliedBit = 10,
kFieldsMarkedNullableBit = 11,
kCycleFreeBit = 12,
kEnumBit = 13,
};
class ConstBit : public BitField<bool, kConstBit, 1> {};
class ImplementedBit : public BitField<bool, kImplementedBit, 1> {};
@ -1344,6 +1350,7 @@ class Class : public Object {
class FieldsMarkedNullableBit : public BitField<bool,
kFieldsMarkedNullableBit, 1> {}; // NOLINT
class CycleFreeBit : public BitField<bool, kCycleFreeBit, 1> {};
class EnumBit : public BitField<bool, kEnumBit, 1> {};
void set_name(const String& value) const;
void set_pretty_name(const String& value) const;

View file

@ -732,6 +732,14 @@ void Parser::ParseClass(const Class& cls) {
const Library& lib = Library::Handle(isolate, cls.library());
Parser parser(script, lib, cls.token_pos());
parser.ParseClassDefinition(cls);
} else if (cls.is_enum_class()) {
Isolate* isolate = Isolate::Current();
TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
ASSERT(isolate->long_jump_base()->IsSafeToJump());
const Script& script = Script::Handle(isolate, cls.script());
const Library& lib = Library::Handle(isolate, cls.library());
Parser parser(script, lib, cls.token_pos());
parser.ParseEnumDefinition(cls);
}
}
@ -1125,11 +1133,13 @@ SequenceNode* Parser::ParseInstanceGetter(const Function& func) {
// Receiver is local 0.
LocalVariable* receiver = current_block_->scope->VariableAt(0);
LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
ASSERT(IsIdentifier());
const String& field_name = *CurrentLiteral();
String& field_name = String::Handle(I, func.name());
field_name = Field::NameFromGetter(field_name);
const Class& field_class = Class::Handle(I, func.Owner());
const Field& field =
Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
ASSERT(!field.IsNull());
LoadInstanceFieldNode* load_field =
new LoadInstanceFieldNode(ident_pos, load_receiver, field);
@ -3051,8 +3061,7 @@ SequenceNode* Parser::ParseFunc(const Function& func,
intptr_t end_token_pos = 0;
if (CurrentToken() == Token::kLBRACE) {
ConsumeToken();
if (String::Handle(I, func.name()).Equals(
Symbols::EqualOperator())) {
if (String::Handle(I, func.name()).Equals(Symbols::EqualOperator())) {
const Class& owner = Class::Handle(I, func.Owner());
if (!owner.IsObjectClass()) {
AddEqualityNullCheck();
@ -4002,6 +4011,54 @@ void Parser::ParseClassMemberDefinition(ClassDesc* members,
}
void Parser::ParseEnumDeclaration(const GrowableObjectArray& pending_classes,
const Class& toplevel_class,
intptr_t metadata_pos) {
TRACE_PARSER("ParseEnumDeclaration");
ConsumeToken();
const intptr_t enum_pos = TokenPos();
String* enum_name =
ExpectUserDefinedTypeIdentifier("enum type name expected");
if (FLAG_trace_parser) {
OS::Print("TopLevel parsing enum '%s'\n", enum_name->ToCString());
}
ExpectToken(Token::kLBRACE);
if (!IsIdentifier()) {
ReportError("Enumeration must have at least one name");
}
while (IsIdentifier()) {
ConsumeToken();
if (CurrentToken() == Token::kCOMMA) {
ConsumeToken();
if (CurrentToken() == Token::kRBRACE) {
break;
}
} else if (CurrentToken() == Token::kRBRACE) {
break;
} else {
ReportError(", or } expected");
}
}
ExpectToken(Token::kRBRACE);
Object& obj = Object::Handle(I, library_.LookupLocalObject(*enum_name));
if (!obj.IsNull()) {
ReportError(enum_pos, "'%s' is already defined", enum_name->ToCString());
}
Class& cls = Class::Handle(I);
cls = Class::New(*enum_name, script_, enum_pos);
cls.set_library(library_);
library_.AddClass(cls);
cls.set_is_synthesized_class();
cls.set_is_enum_class();
if (metadata_pos >= 0) {
library_.AddClassMetadata(cls, toplevel_class, metadata_pos);
}
cls.set_super_type(Type::Handle(I, Type::ObjectType()));
pending_classes.Add(cls, Heap::kOld);
}
void Parser::ParseClassDeclaration(const GrowableObjectArray& pending_classes,
const Class& toplevel_class,
intptr_t metadata_pos) {
@ -4244,6 +4301,168 @@ void Parser::ParseClassDefinition(const Class& cls) {
}
void Parser::ParseEnumDefinition(const Class& cls) {
TRACE_PARSER("ParseEnumDefinition");
CompilerStats::num_classes_compiled++;
const String& enum_name = String::Handle(I, cls.Name());
ClassDesc enum_members(cls, enum_name, false, cls.token_pos());
// Add instance field 'final int index'.
Field& index_field = Field::ZoneHandle(I);
const Type& int_type = Type::Handle(I, Type::IntType());
const Type& dynamic_type = Type::Handle(Type::DynamicType());
index_field = Field::New(Symbols::Index(),
false, // Not static.
true, // Field is final.
false, // Not const.
false, // Not synthetic.
cls,
cls.token_pos());
index_field.set_type(int_type);
enum_members.AddField(index_field);
// Add implicit getter for index field.
const String& getter_name =
String::Handle(I, Field::GetterSymbol(Symbols::Index()));
Function& getter = Function::Handle(I);
getter = Function::New(getter_name,
RawFunction::kImplicitGetter,
/* is_static = */ false,
/* is_const = */ true,
/* is_abstract = */ false,
/* is_external = */ false,
/* is_native = */ false,
cls,
cls.token_pos());
getter.set_result_type(int_type);
ParamList params;
params.AddReceiver(&dynamic_type, cls.token_pos());
AddFormalParamsToFunction(&params, getter);
enum_members.AddFunction(getter);
GrowableObjectArray& enum_names = GrowableObjectArray::Handle(I,
GrowableObjectArray::New(8, Heap::kOld));
const String& name_prefix =
String::Handle(String::Concat(enum_name, Symbols::Dot()));
ASSERT(IsIdentifier());
ASSERT(CurrentLiteral()->raw() == cls.Name());
ConsumeToken(); // Enum type name.
ExpectToken(Token::kLBRACE);
Field& enum_value = Field::Handle(I);
String& enum_value_name = String::Handle(I);
intptr_t i = 0;
GrowableArray<String*> declared_names(8);
while (IsIdentifier()) {
String* enum_ident = CurrentLiteral();
// Check for name conflicts.
if (enum_ident->raw() == cls.Name()) {
ReportError("enum identifier '%s' cannot be equal to enum type name",
CurrentLiteral()->ToCString());
} else if (enum_ident->raw() == Symbols::Index().raw()) {
ReportError("enum identifier conflicts with "
"implicit instance field 'index'");
} else if (enum_ident->raw() == Symbols::Values().raw()) {
ReportError("enum identifier conflicts with "
"implicit static field 'values'");
} else if (enum_ident->raw() == Symbols::toString().raw()) {
ReportError("enum identifier conflicts with "
"implicit instance method 'toString()'");
}
for (intptr_t i = 0; i < declared_names.length(); i++) {
if (enum_ident->Equals(*declared_names[i])) {
ReportError("Duplicate name '%s' in enum definition '%s'",
enum_ident->ToCString(),
enum_name.ToCString());
}
}
declared_names.Add(enum_ident);
// Create the static const field for the enumeration value.
enum_value = Field::New(*enum_ident,
/* is_static = */ true,
/* is_final = */ true,
/* is_const = */ true,
/* is_synthetic = */ false,
cls,
cls.token_pos());
enum_value.set_type(dynamic_type);
enum_value.set_has_initializer(false);
enum_members.AddField(enum_value);
// Initialize the field with the ordinal value. It will be patched
// later with the enum constant instance.
const Smi& ordinal_value = Smi::Handle(I, Smi::New(i));
enum_value.set_value(ordinal_value);
enum_value.RecordStore(ordinal_value);
i++;
// For the user-visible name of the enumeration value, we need to
// unmangle private names.
if (enum_ident->CharAt(0) == '_') {
*enum_ident = String::IdentifierPrettyName(*enum_ident);
}
enum_value_name = Symbols::FromConcat(name_prefix, *enum_ident);
enum_names.Add(enum_value_name, Heap::kOld);
ConsumeToken(); // Enum value name.
if (CurrentToken() == Token::kCOMMA) {
ConsumeToken();
}
}
ExpectToken(Token::kRBRACE);
const Class& helper_class =
Class::Handle(I, Library::LookupCoreClass(Symbols::_EnumHelper()));
ASSERT(!helper_class.IsNull());
// Add static field 'const List values'.
Field& values_field = Field::ZoneHandle(I);
values_field = Field::New(Symbols::Values(),
/* is_static = */ true,
/* is_final = */ true,
/* is_const = */ true,
/* is_synthetic = */ false,
cls,
cls.token_pos());
values_field.set_type(Type::Handle(I, Type::ArrayType()));
enum_members.AddField(values_field);
// Allocate the immutable array containing the enumeration values.
// The actual enum instance values will be patched in later.
const Array& values_array = Array::Handle(I, Array::New(i, Heap::kOld));
values_field.set_value(values_array);
values_field.RecordStore(values_array);
// Create a static field that contains the list of enumeration names.
// Clone the _enum_names field from the helper class.
Field& names_field = Field::Handle(I,
helper_class.LookupStaticField(Symbols::_EnumNames()));
ASSERT(!names_field.IsNull());
names_field = names_field.Clone(cls);
enum_members.AddField(names_field);
const Array& names_array = Array::Handle(Array::MakeArray(enum_names));
names_field.set_value(names_array);
names_field.RecordStore(names_array);
// Clone the toString() function from the helper class.
Function& to_string_func = Function::Handle(I,
helper_class.LookupDynamicFunctionAllowPrivate(Symbols::toString()));
ASSERT(!to_string_func.IsNull());
to_string_func = to_string_func.Clone(cls);
to_string_func.set_is_visible(false);
enum_members.AddFunction(to_string_func);
cls.AddFields(enum_members.fields());
const Array& functions =
Array::Handle(I, Array::MakeArray(enum_members.functions()));
cls.SetFunctions(functions);
}
// Add an implicit constructor to the given class.
void Parser::AddImplicitConstructor(const Class& cls) {
// The implicit constructor is unnamed, has no explicit parameter.
@ -5426,6 +5645,8 @@ void Parser::ParseTopLevel() {
intptr_t metadata_pos = SkipMetadata();
if (CurrentToken() == Token::kCLASS) {
ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos);
} else if (CurrentToken() == Token::kENUM) {
ParseEnumDeclaration(pending_classes, toplevel_class, metadata_pos);
} else if ((CurrentToken() == Token::kTYPEDEF) &&
(LookaheadToken(1) != Token::kLPAREN)) {
set_current_class(toplevel_class);
@ -10986,6 +11207,12 @@ AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
String::Handle(I, type.UserVisibleName()).ToCString() :
"dynamic");
}
// Attempting to instantiate an enum type is a compile-time error.
Class& type_class = Class::Handle(I, type.type_class());
if (type_class.is_enum_class()) {
ReportError(new_pos, "enum type '%s' can not be instantiated",
String::Handle(I, type_class.Name()).ToCString());
}
// The grammar allows for an optional ('.' identifier)? after the type, which
// is a named constructor. Note that we tell ParseType() above not to
@ -11013,7 +11240,6 @@ AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
}
// Resolve the type and optional identifier to a constructor or factory.
Class& type_class = Class::Handle(I, type.type_class());
String& type_class_name = String::Handle(I, type_class.Name());
TypeArguments& type_arguments =
TypeArguments::ZoneHandle(I, type.arguments());

View file

@ -388,6 +388,10 @@ class Parser : public ValueObject {
// Support for parsing of scripts.
void ParseTopLevel();
void ParseEnumDeclaration(const GrowableObjectArray& pending_classes,
const Class& toplevel_class,
intptr_t metadata_pos);
void ParseEnumDefinition(const Class& cls);
void ParseClassDeclaration(const GrowableObjectArray& pending_classes,
const Class& toplevel_class,
intptr_t metadata_pos);

View file

@ -31,6 +31,9 @@ class ObjectPointerVisitor;
V(Current, "current") \
V(MoveNext, "moveNext") \
V(Value, "value") \
V(_EnumHelper, "_EnumHelper") \
V(Values, "values") \
V(_EnumNames, "_enum_names") \
V(ExprTemp, ":expr_temp") \
V(AnonymousClosure, "<anonymous closure>") \
V(ClosureParameter, ":closure") \
@ -285,6 +288,7 @@ class ObjectPointerVisitor;
V(SetterPrefix, "set:") \
V(InitPrefix, "init:") \
V(_New, "_new") \
V(Index, "index") \
V(DartScheme, "dart:") \
V(DartSchemePrivate, "dart:_") \
V(DartNativeWrappers, "dart:nativewrappers") \

View file

@ -152,6 +152,7 @@ namespace dart {
KW(kDEFAULT, "default", 0, kKeyword) \
KW(kDO, "do", 0, kKeyword) \
KW(kELSE, "else", 0, kKeyword) \
KW(kENUM, "enum", 0, kKeyword) \
KW(kEXPORT, "export", 0, kPseudoKeyword) \
KW(kEXTENDS, "extends", 0, kKeyword) \
KW(kEXTERNAL, "external", 0, kPseudoKeyword) \

View file

@ -0,0 +1,72 @@
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// SharedOptions=--enable-enum
// Basic syntax test for enumeration types
import 'package:expect/expect.dart';
enum Color { red, orange, yellow, green }
// Additional comma at end of list is ok.
enum Veggies { carrot, bean, broccolo, }
// Need at least one enumeration identifier.
enum Nada {} /// 01: compile-time error
// Duplicate entries are a compile-time error
enum ComeAgain { ahau, knust, zipfel, knust, gupf } /// 02: compile-time error
// Enum entries must not collide with implicitly defined members.
enum ComeAgain { ahau, knust, zipfel, index } /// 03: compile-time error
enum ComeAgain { ahau, knust, zipfel, values } /// 04: compile-time error
enum ComeAgain { ahau, knust, zipfel, toString } /// 05: compile-time error
// Enum entry must not collide with enum type name.
enum ComeAgain { ahau, knust, zipfel, ComeAgain } /// 06: compile-time error
// Missing comma.
enum Numbers { one, two, three four, five } /// 07: compile-time error
// Missing enum type name.
enum { eins, zwei, drei } /// 08: compile-time error
// Duplicate name in library scope.
topLevelFunction() => null;
enum topLevelFunction { bla, blah } /// 09: compile-time error
class C {}
enum C { bla, blah } /// 10: compile-time error
var zzTop;
enum zzTop { Billy, Dusty, Frank } /// 11: compile-time error
// Enum type cannot be super type or interface type.
class Rainbow extends Color {} /// 20: compile-time error
class Rainbow implements Color {} /// 21: compile-time error
class Rainbow extends List with Color {} /// 22: compile-time error
main() {
var x = ComeAgain.zipfel; /// 02: continued
var x = ComeAgain.zipfel; /// 03: continued
var x = ComeAgain.zipfel; /// 04: continued
var x = ComeAgain.zipfel; /// 05: continued
var x = ComeAgain.zipfel; /// 06: continued
var x = Numbers.four; /// 07: continued
var x = topLevelFunction.bla; /// 09: continued
var x = C.bla; /// 10: continued
var x = zzTop.Frank; /// 11: continued
var x = new Rainbow(); /// 20: continued
var x = new Rainbow(); /// 21: continued
var x = new Rainbow(); /// 22: continued
// It is a compile-time error to explicitly instantiate an enum instance.
var x = new Color(); /// 30: compile-time error
}

View file

@ -7,7 +7,6 @@
[ $compiler == none ]
built_in_identifier_prefix_test: Fail # Issue 6970
enum_test: Fail # Issue 21416
# These bugs refer currently ongoing language discussions.
constructor_initializer_test/none: Fail # Issue 12633

View file

@ -6,6 +6,12 @@
# Runtime negative test. No static errors or warnings.
closure_call_wrong_argument_count_negative_test: skip
enum_syntax_test/02: Fail # 21649
enum_syntax_test/03: Fail # 21649
enum_syntax_test/04: Fail # 21649
enum_syntax_test/05: Fail # 21649
enum_syntax_test/06: Fail # 21649
# Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)
built_in_identifier_prefix_test: CompileTimeError # Issue 12694

View file

@ -43,6 +43,8 @@ ref_before_declaration_test/06: MissingCompileTimeError
external_test/10: Fail
external_test/20: Fail
enum_syntax_test/01: Fail # Issue 21648
# VM specific tests that should not be run by dart2js.
vm/*: Skip # Issue 12699