From 1ab705f60c4ae613c07c702ce643be6dbd5da094 Mon Sep 17 00:00:00 2001 From: Aske Simon Christensen Date: Mon, 16 Nov 2020 13:49:50 +0000 Subject: [PATCH] [vm] Require all recognized methods to be marked with pragma. Adds a @pragma("vm:recognized", ) to all recognized methods, where is one of "intrinsic", "graph" or "other", corresponding to the kind of recognized method. When running in debug mode, it is checked that all recognized methods are marked with the correct kind of pragma, and that all methods marked with the pragma are in fact recognized. This enables kernel-level analyses and optimizations to query whether a method is recognized by the VM. TEST=Asserts that check the correspondence both ways, covered by test suite, in particular the various CompileAll tests that compile all code. Change-Id: I12f3305c72a93ecb1aefae2d66e3d9a7dae23b44 Cq-Do-Not-Cancel-Tryjobs: true Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/168951 Reviewed-by: Alexander Markov Reviewed-by: Martin Kustermann --- .../tool/dartdevc_nnbd_sdk_error_golden.txt | 4 +- .../invalid_operator.dart.outline.expect | 10 +- .../invalid_operator.dart.strong.expect | 10 +- .../nnbd/issue42546.dart.outline.expect | 30 +- .../nnbd/issue42603.dart.outline.expect | 2 +- .../nnbd/issue42603.dart.strong.expect | 2 +- .../nnbd/issue42603.dart.weak.expect | 2 +- .../pragmas_recognized_by_compiler.md | 15 + runtime/docs/pragmas.md | 1 + runtime/vm/compiler/frontend/kernel_to_il.cc | 17 + runtime/vm/compiler/method_recognizer.cc | 21 + runtime/vm/compiler/method_recognizer.h | 2 + runtime/vm/compiler/recognized_methods_list.h | 756 +++++++++--------- runtime/vm/object.cc | 59 +- runtime/vm/object.h | 2 +- runtime/vm/symbols.h | 1 + sdk/lib/_internal/vm/lib/array.dart | 7 + sdk/lib/_internal/vm/lib/array_patch.dart | 1 + sdk/lib/_internal/vm/lib/async_patch.dart | 3 + sdk/lib/_internal/vm/lib/bigint_patch.dart | 8 + sdk/lib/_internal/vm/lib/class_id_fasta.dart | 1 + sdk/lib/_internal/vm/lib/compact_hash.dart | 10 + sdk/lib/_internal/vm/lib/convert_patch.dart | 2 +- sdk/lib/_internal/vm/lib/double.dart | 27 + sdk/lib/_internal/vm/lib/ffi_patch.dart | 31 +- sdk/lib/_internal/vm/lib/growable_array.dart | 8 + sdk/lib/_internal/vm/lib/identical_patch.dart | 1 + sdk/lib/_internal/vm/lib/integers.dart | 34 +- sdk/lib/_internal/vm/lib/internal_patch.dart | 9 +- sdk/lib/_internal/vm/lib/math_patch.dart | 13 + sdk/lib/_internal/vm/lib/object_patch.dart | 5 + sdk/lib/_internal/vm/lib/profiler.dart | 3 + sdk/lib/_internal/vm/lib/regexp_patch.dart | 2 + sdk/lib/_internal/vm/lib/string_patch.dart | 15 + sdk/lib/_internal/vm/lib/type_patch.dart | 2 + .../_internal/vm/lib/typed_data_patch.dart | 163 ++++ sdk/lib/async/future.dart | 1 + sdk/lib/async/future_impl.dart | 1 + sdk/lib/core/object.dart | 1 + sdk/lib/developer/timeline.dart | 1 + 40 files changed, 852 insertions(+), 431 deletions(-) diff --git a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt index 39bf88b6228..7803de7b76c 100644 --- a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt +++ b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt @@ -1,11 +1,11 @@ ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|3679|5|94|Const constructors can't throw exceptions. -ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7880|5|97|Const constructors can't throw exceptions. +ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7881|5|97|Const constructors can't throw exceptions. ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|893|5|95|Const constructors can't throw exceptions. ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|926|5|94|Const constructors can't throw exceptions. ERROR|COMPILE_TIME_ERROR|INVALID_ASSIGNMENT|lib/_internal/js_dev_runtime/private/interceptors.dart|1358|18|27|A value of type 'double' can't be assigned to a variable of type 'int'. ERROR|COMPILE_TIME_ERROR|RETURN_OF_INVALID_TYPE|lib/_internal/js_dev_runtime/private/interceptors.dart|1225|14|38|A value of type 'double' can't be returned from method '%' because it has a return type of 'JSNumber'. ERROR|COMPILE_TIME_ERROR|RETURN_OF_INVALID_TYPE|lib/_internal/js_dev_runtime/private/interceptors.dart|1227|14|38|A value of type 'double' can't be returned from method '%' because it has a return type of 'JSNumber'. ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|3677|3|5|Only redirecting factory constructors can be declared to be 'const'. -ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7878|3|5|Only redirecting factory constructors can be declared to be 'const'. +ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7879|3|5|Only redirecting factory constructors can be declared to be 'const'. ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|891|3|5|Only redirecting factory constructors can be declared to be 'const'. ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|924|3|5|Only redirecting factory constructors can be declared to be 'const'. diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect b/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect index 7cd9550541b..9ee095cb64b 100644 --- a/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect +++ b/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect @@ -563,28 +563,28 @@ library; // pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='. // operator ==() => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // // pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='. // operator ==(a, b) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // // pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='. // operator ==({a}) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // // pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='. // operator ==(a) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // @@ -592,7 +592,7 @@ library; // Change to a subtype of 'bool'. // operator ==(a) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect b/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect index 6e9b14049c1..1c0ff496aef 100644 --- a/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect +++ b/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect @@ -563,28 +563,28 @@ library; // pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='. // operator ==() => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // // pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='. // operator ==(a, b) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // // pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='. // operator ==({a}) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // // pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='. // operator ==(a) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // @@ -592,7 +592,7 @@ library; // Change to a subtype of 'bool'. // operator ==(a) => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect index de61651c17b..0857ca05659 100644 --- a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect +++ b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect @@ -28,19 +28,19 @@ static method main() → dynamic Extra constant evaluation status: -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> SymbolConstant(#catchError) -Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> ListConstant(const []) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> SymbolConstant(#test) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:698:13 -> SymbolConstant(#whenComplete) -Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:698:13 -> ListConstant(const []) -Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:698:13 -> InstanceConstant(const _ImmutableMap{_ImmutableMap._kvPairs: const []}) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:725:13 -> SymbolConstant(#timeout) -Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:725:13 -> ListConstant(const []) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:725:13 -> SymbolConstant(#onTimeout) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:622:13 -> SymbolConstant(#then) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:622:13 -> SymbolConstant(#onError) -Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> SymbolConstant(#asStream) -Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> ListConstant(const []) -Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> ListConstant(const []) -Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> InstanceConstant(const _ImmutableMap{_ImmutableMap._kvPairs: const []}) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:662:13 -> SymbolConstant(#catchError) +Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:662:13 -> ListConstant(const []) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:662:13 -> SymbolConstant(#test) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:699:13 -> SymbolConstant(#whenComplete) +Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:699:13 -> ListConstant(const []) +Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:699:13 -> InstanceConstant(const _ImmutableMap{_ImmutableMap._kvPairs: const []}) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:726:13 -> SymbolConstant(#timeout) +Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:726:13 -> ListConstant(const []) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:726:13 -> SymbolConstant(#onTimeout) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:623:13 -> SymbolConstant(#then) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:623:13 -> SymbolConstant(#onError) +Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:710:13 -> SymbolConstant(#asStream) +Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:710:13 -> ListConstant(const []) +Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:710:13 -> ListConstant(const []) +Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:710:13 -> InstanceConstant(const _ImmutableMap{_ImmutableMap._kvPairs: const []}) Extra constant evaluation: evaluated: 61, effectively constant: 15 diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect index 930703f7805..926252c1130 100644 --- a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect +++ b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect @@ -9,7 +9,7 @@ library /*isNonNullableByDefault*/; // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='. // bool operator ==() => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect index e677ee543f5..2d987aca944 100644 --- a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect +++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect @@ -9,7 +9,7 @@ library /*isNonNullableByDefault*/; // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='. // bool operator ==() => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect index e677ee543f5..2d987aca944 100644 --- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect +++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect @@ -9,7 +9,7 @@ library /*isNonNullableByDefault*/; // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='. // bool operator ==() => true; // ^ -// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('=='). +// sdk/lib/_internal/vm/lib/object_patch.dart:21:17: Context: This is the overridden method ('=='). // bool operator ==(Object other) native "Object_equals"; // ^ // diff --git a/runtime/docs/compiler/pragmas_recognized_by_compiler.md b/runtime/docs/compiler/pragmas_recognized_by_compiler.md index 3fded63283f..8c910f8d16e 100644 --- a/runtime/docs/compiler/pragmas_recognized_by_compiler.md +++ b/runtime/docs/compiler/pragmas_recognized_by_compiler.md @@ -135,3 +135,18 @@ class C { final int value; } ``` + +### Marking recognized methods + +```dart +@pragma("vm:recognized", ) +``` + +Marks the method as one of the methods specially recognized by the VM. Here, + is one of `"asm-intrinsic"`, `"graph-intrinsic"` or `"other"`, +corresponding to the category the recognized method belongs to, as defined in +[`recognized_methods_list.h`](../../vm/compiler/recognized_methods_list.h). + +The pragmas must match exactly the set of recognized methods. This enables +kernel-level analyses and optimizations to query whether a method is recognized +by the VM. The correspondence is checked when running in debug mode. diff --git a/runtime/docs/pragmas.md b/runtime/docs/pragmas.md index ad3b987491a..3f7d23bd70e 100644 --- a/runtime/docs/pragmas.md +++ b/runtime/docs/pragmas.md @@ -17,6 +17,7 @@ These pragmas can cause unsound behavior if used incorrectly and therefore are o | Pragma | Meaning | | --- | --- | | `vm:exact-result-type` | [Declaring an exact result type of a method](compiler/pragmas_recognized_by_compiler.md#providing-an-exact-result-type) | +| `vm:recognized` | [Marking this as a recognized method](compiler/pragmas_recognized_by_compiler.md#marking-recognized-methods) | ## Pragmas for internal testing diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc index 48aae11af29..af86e1ef6be 100644 --- a/runtime/vm/compiler/frontend/kernel_to_il.cc +++ b/runtime/vm/compiler/frontend/kernel_to_il.cc @@ -741,6 +741,23 @@ FlowGraph* FlowGraphBuilder::BuildGraph() { KernelProgramInfo::Handle(script.kernel_program_info()); ASSERT(info.IsNull() || info.potential_natives() == GrowableObjectArray::null()); + + // Check that all functions that are explicitly marked as recognized with the + // vm:recognized annotation are in fact recognized. The check can't be done on + // function creation, since the recognized status isn't set until later. + if ((function.IsRecognized() != + MethodRecognizer::IsMarkedAsRecognized(function)) && + !function.IsDynamicInvocationForwarder()) { + if (function.IsRecognized()) { + FATAL1( + "Recognized method %s is not marked with the vm:recognized pragma.", + function.ToQualifiedCString()); + } else { + FATAL1( + "Non-recognized method %s is marked with the vm:recognized pragma.", + function.ToQualifiedCString()); + } + } #endif auto& kernel_data = ExternalTypedData::Handle(Z, function.KernelData()); diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc index 2d4d7d65917..ecd99a14fa8 100644 --- a/runtime/vm/compiler/method_recognizer.cc +++ b/runtime/vm/compiler/method_recognizer.cc @@ -195,6 +195,27 @@ const char* MethodRecognizer::KindToCString(Kind kind) { return "?"; } +// Is this method marked with the vm:recognized pragma? +bool MethodRecognizer::IsMarkedAsRecognized(const Function& function, + const char* kind) { + const Function* functionp = + function.IsDynamicInvocationForwarder() + ? &Function::Handle(function.ForwardingTarget()) + : &function; + Object& options = Object::Handle(); + bool is_recognized = + Library::FindPragma(Thread::Current(), /*only_core=*/true, *functionp, + Symbols::vm_recognized(), &options); + if (!is_recognized) return false; + if (kind == nullptr) return true; + + ASSERT(options.IsString()); + ASSERT(String::Cast(options).Equals("asm-intrinsic") || + String::Cast(options).Equals("graph-intrinsic") || + String::Cast(options).Equals("other")); + return String::Cast(options).Equals(kind); +} + void MethodRecognizer::InitializeState() { GrowableArray libs(3); Libraries(&libs); diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h index 949e031faf5..e9a1067659d 100644 --- a/runtime/vm/compiler/method_recognizer.h +++ b/runtime/vm/compiler/method_recognizer.h @@ -53,6 +53,8 @@ class MethodRecognizer : public AllStatic { static intptr_t MethodKindToReceiverCid(Kind kind); static const char* KindToCString(Kind kind); + static bool IsMarkedAsRecognized(const Function& function, + const char* kind = nullptr); static void InitializeState(); private: diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h index e198f853e5e..57b4bee7a17 100644 --- a/runtime/vm/compiler/recognized_methods_list.h +++ b/runtime/vm/compiler/recognized_methods_list.h @@ -12,365 +12,365 @@ namespace dart { // When adding a new function, add a 0 as the fingerprint and run the build in // debug mode to get the correct fingerprint from the mismatch error. #define OTHER_RECOGNIZED_LIST(V) \ - V(::, identical, ObjectIdentical, 0x8fd6ea58) \ - V(ClassID, getID, ClassIDgetID, 0x0401ffad) \ - V(Object, Object., ObjectConstructor, 0x256e7170) \ - V(List, ., ListFactory, 0xbec87d33) \ - V(_List, ., ObjectArrayAllocate, 0x6de199a1) \ - V(_List, []=, ObjectArraySetIndexed, 0xba15978f) \ - V(_GrowableList, []=, GrowableArraySetIndexed, 0xba15978f) \ - V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 0xc28aff37) \ - V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 0xc3e7212d) \ - V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 0xdaa7b952) \ - V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 0xdc2919bc) \ - V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 0xc57f53af) \ - V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 0xc5c49520) \ - V(_TypedList, _getInt64, ByteArrayBaseGetInt64, 0xa2c7e6a4) \ - V(_TypedList, _getUint64, ByteArrayBaseGetUint64, 0xd8c29ffe) \ - V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 0xaf15f28a) \ - V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 0xbe4987b7) \ - V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 0x76c82c28) \ - V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 0x29abed4e) \ - V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0xfc13ad87) \ - V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 0xc9e4212d) \ - V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0xd570aa0c) \ - V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 0xe8acb234) \ - V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0xd8651525) \ - V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0xd3f10d97) \ - V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 0xe357b95f) \ - V(_TypedList, _setUint64, ByteArrayBaseSetUint64, 0xf4d19bea) \ - V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0xd6272645) \ - V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0xca4af137) \ - V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x71767f7f) \ - V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0xf0483280) \ - V(ByteData, ., ByteDataFactory, 0x63fefa4b) \ - V(_ByteDataView, get:offsetInBytes, ByteDataViewOffsetInBytes, 0xe51b926b) \ - V(_ByteDataView, get:_typedData, ByteDataViewTypedData, 0x3c781fb9) \ - V(_TypedListView, get:offsetInBytes, TypedDataViewOffsetInBytes, 0xe51b926b) \ - V(_TypedListView, get:_typedData, TypedDataViewTypedData, 0x3c781fb9) \ - V(_ByteDataView, ._, TypedData_ByteDataView_factory, 0xe9e9dad9) \ - V(_Int8ArrayView, ._, TypedData_Int8ArrayView_factory, 0x016014a7) \ - V(_Uint8ArrayView, ._, TypedData_Uint8ArrayView_factory, 0x8c3fc232) \ + V(::, identical, ObjectIdentical, 0x8fd6ea77) \ + V(ClassID, getID, ClassIDgetID, 0x0401ffcc) \ + V(Object, Object., ObjectConstructor, 0x89c467da) \ + V(List, ., ListFactory, 0xbec87d52) \ + V(_List, ., ObjectArrayAllocate, 0x6de199c0) \ + V(_List, []=, ObjectArraySetIndexed, 0xba1597ae) \ + V(_GrowableList, []=, GrowableArraySetIndexed, 0xba1597ae) \ + V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 0xc28aff56) \ + V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 0xc3e7214c) \ + V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 0xdaa7b971) \ + V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 0xdc2919db) \ + V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 0xc57f53ce) \ + V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 0xc5c4953f) \ + V(_TypedList, _getInt64, ByteArrayBaseGetInt64, 0xa2c7e6c3) \ + V(_TypedList, _getUint64, ByteArrayBaseGetUint64, 0xd8c2a01d) \ + V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 0xaf15f2a9) \ + V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 0xbe4987d6) \ + V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 0x76c82c47) \ + V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 0x29abed6d) \ + V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0xfc13ada6) \ + V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 0xc9e4214c) \ + V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0xd570aa2b) \ + V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 0xe8acb253) \ + V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0xd8651544) \ + V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0xd3f10db6) \ + V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 0xe357b97e) \ + V(_TypedList, _setUint64, ByteArrayBaseSetUint64, 0xf4d19c09) \ + V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0xd6272664) \ + V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0xca4af156) \ + V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x71767f9e) \ + V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0xf048329f) \ + V(ByteData, ., ByteDataFactory, 0x63fefa6a) \ + V(_ByteDataView, get:offsetInBytes, ByteDataViewOffsetInBytes, 0xe51b928a) \ + V(_ByteDataView, get:_typedData, ByteDataViewTypedData, 0x3c781fd8) \ + V(_TypedListView, get:offsetInBytes, TypedDataViewOffsetInBytes, 0xe51b928a) \ + V(_TypedListView, get:_typedData, TypedDataViewTypedData, 0x3c781fd8) \ + V(_ByteDataView, ._, TypedData_ByteDataView_factory, 0xe9e9daf8) \ + V(_Int8ArrayView, ._, TypedData_Int8ArrayView_factory, 0x016014c6) \ + V(_Uint8ArrayView, ._, TypedData_Uint8ArrayView_factory, 0x8c3fc251) \ V(_Uint8ClampedArrayView, ._, TypedData_Uint8ClampedArrayView_factory, \ - 0x36da9706) \ - V(_Int16ArrayView, ._, TypedData_Int16ArrayView_factory, 0x09a366f8) \ - V(_Uint16ArrayView, ._, TypedData_Uint16ArrayView_factory, 0x8f74c30f) \ - V(_Int32ArrayView, ._, TypedData_Int32ArrayView_factory, 0x8c100d16) \ - V(_Uint32ArrayView, ._, TypedData_Uint32ArrayView_factory, 0x4f7f073e) \ - V(_Int64ArrayView, ._, TypedData_Int64ArrayView_factory, 0xb85546cc) \ - V(_Uint64ArrayView, ._, TypedData_Uint64ArrayView_factory, 0x019c229a) \ - V(_Float32ArrayView, ._, TypedData_Float32ArrayView_factory, 0x2290e5a1) \ - V(_Float64ArrayView, ._, TypedData_Float64ArrayView_factory, 0xbe62c734) \ - V(_Float32x4ArrayView, ._, TypedData_Float32x4ArrayView_factory, 0x5bb7771d) \ - V(_Int32x4ArrayView, ._, TypedData_Int32x4ArrayView_factory, 0x30b9f2a2) \ - V(_Float64x2ArrayView, ._, TypedData_Float64x2ArrayView_factory, 0x96490d01) \ - V(Int8List, ., TypedData_Int8Array_factory, 0x80ad83e1) \ - V(Uint8List, ., TypedData_Uint8Array_factory, 0x252e6768) \ - V(Uint8ClampedList, ., TypedData_Uint8ClampedArray_factory, 0x1ed931ee) \ - V(Int16List, ., TypedData_Int16Array_factory, 0x7ea8630c) \ - V(Uint16List, ., TypedData_Uint16Array_factory, 0x2764f743) \ - V(Int32List, ., TypedData_Int32Array_factory, 0x54a56479) \ - V(Uint32List, ., TypedData_Uint32Array_factory, 0xac4deaa4) \ - V(Int64List, ., TypedData_Int64Array_factory, 0x02d4c748) \ - V(Uint64List, ., TypedData_Uint64Array_factory, 0x08669751) \ - V(Float32List, ., TypedData_Float32Array_factory, 0x8b65b9d7) \ - V(Float64List, ., TypedData_Float64Array_factory, 0x09ede82a) \ - V(Float32x4List, ., TypedData_Float32x4Array_factory, 0xb2a9e6e1) \ - V(Int32x4List, ., TypedData_Int32x4Array_factory, 0xa5292147) \ - V(Float64x2List, ., TypedData_Float64x2Array_factory, 0x20eafb43) \ - V(::, _toClampedUint8, ConvertIntToClampedUint8, 0x143ed675) \ + 0x36da9725) \ + V(_Int16ArrayView, ._, TypedData_Int16ArrayView_factory, 0x09a36717) \ + V(_Uint16ArrayView, ._, TypedData_Uint16ArrayView_factory, 0x8f74c32e) \ + V(_Int32ArrayView, ._, TypedData_Int32ArrayView_factory, 0x8c100d35) \ + V(_Uint32ArrayView, ._, TypedData_Uint32ArrayView_factory, 0x4f7f075d) \ + V(_Int64ArrayView, ._, TypedData_Int64ArrayView_factory, 0xb85546eb) \ + V(_Uint64ArrayView, ._, TypedData_Uint64ArrayView_factory, 0x019c22b9) \ + V(_Float32ArrayView, ._, TypedData_Float32ArrayView_factory, 0x2290e5c0) \ + V(_Float64ArrayView, ._, TypedData_Float64ArrayView_factory, 0xbe62c753) \ + V(_Float32x4ArrayView, ._, TypedData_Float32x4ArrayView_factory, 0x5bb7773c) \ + V(_Int32x4ArrayView, ._, TypedData_Int32x4ArrayView_factory, 0x30b9f2c1) \ + V(_Float64x2ArrayView, ._, TypedData_Float64x2ArrayView_factory, 0x96490d20) \ + V(Int8List, ., TypedData_Int8Array_factory, 0x80ad8400) \ + V(Uint8List, ., TypedData_Uint8Array_factory, 0x252e6787) \ + V(Uint8ClampedList, ., TypedData_Uint8ClampedArray_factory, 0x1ed9320d) \ + V(Int16List, ., TypedData_Int16Array_factory, 0x7ea8632b) \ + V(Uint16List, ., TypedData_Uint16Array_factory, 0x2764f762) \ + V(Int32List, ., TypedData_Int32Array_factory, 0x54a56498) \ + V(Uint32List, ., TypedData_Uint32Array_factory, 0xac4deac3) \ + V(Int64List, ., TypedData_Int64Array_factory, 0x02d4c767) \ + V(Uint64List, ., TypedData_Uint64Array_factory, 0x08669770) \ + V(Float32List, ., TypedData_Float32Array_factory, 0x8b65b9f6) \ + V(Float64List, ., TypedData_Float64Array_factory, 0x09ede849) \ + V(Float32x4List, ., TypedData_Float32x4Array_factory, 0xb2a9e700) \ + V(Int32x4List, ., TypedData_Int32x4Array_factory, 0xa5292166) \ + V(Float64x2List, ., TypedData_Float64x2Array_factory, 0x20eafb62) \ + V(::, _toClampedUint8, ConvertIntToClampedUint8, 0x143ed694) \ V(::, copyRangeFromUint8ListToOneByteString, \ - CopyRangeFromUint8ListToOneByteString, 0x89d6a60a) \ - V(_StringBase, _interpolate, StringBaseInterpolate, 0xd5a58efc) \ - V(_IntegerImplementation, toDouble, IntegerToDouble, 0x5f8db5f5) \ - V(_Double, _add, DoubleAdd, 0x4326962a) \ - V(_Double, _sub, DoubleSub, 0x81077f31) \ - V(_Double, _mul, DoubleMul, 0x7858fa6f) \ - V(_Double, _div, DoubleDiv, 0x813d6a94) \ - V(::, min, MathMin, 0xe6a2f504) \ - V(::, max, MathMax, 0x4cfa6f6b) \ - V(::, _doublePow, MathDoublePow, 0x9772a8c1) \ - V(::, _intPow, MathIntPow, 0x65762a89) \ - V(Float32x4, _Float32x4FromDoubles, Float32x4FromDoubles, 0x4ddbf1d0) \ - V(Float32x4, Float32x4.zero, Float32x4Zero, 0x730d827d) \ - V(Float32x4, _Float32x4Splat, Float32x4Splat, 0x36ae87e8) \ - V(Float32x4, Float32x4.fromInt32x4Bits, Int32x4ToFloat32x4, 0x8704457d) \ - V(Float32x4, Float32x4.fromFloat64x2, Float64x2ToFloat32x4, 0x71ab7a48) \ - V(_Float32x4, shuffle, Float32x4Shuffle, 0x6f8cd72e) \ - V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 0xd9fe42cf) \ - V(_Float32x4, get:signMask, Float32x4GetSignMask, 0x00b7b96d) \ - V(_Float32x4, equal, Float32x4Equal, 0x77b31279) \ - V(_Float32x4, greaterThan, Float32x4GreaterThan, 0x85a5a282) \ - V(_Float32x4, greaterThanOrEqual, Float32x4GreaterThanOrEqual, 0x81c686ba) \ - V(_Float32x4, lessThan, Float32x4LessThan, 0x7d709620) \ - V(_Float32x4, lessThanOrEqual, Float32x4LessThanOrEqual, 0x79cf7843) \ - V(_Float32x4, notEqual, Float32x4NotEqual, 0x97a75a46) \ - V(_Float32x4, min, Float32x4Min, 0x0ad96995) \ - V(_Float32x4, max, Float32x4Max, 0xed08eb66) \ - V(_Float32x4, scale, Float32x4Scale, 0xfdf348c5) \ - V(_Float32x4, sqrt, Float32x4Sqrt, 0x84853df5) \ - V(_Float32x4, reciprocalSqrt, Float32x4ReciprocalSqrt, 0x7d66357b) \ - V(_Float32x4, reciprocal, Float32x4Reciprocal, 0x73e065b5) \ - V(_Float32x4, unary-, Float32x4Negate, 0x86111def) \ - V(_Float32x4, abs, Float32x4Abs, 0x8ad4c18b) \ - V(_Float32x4, clamp, Float32x4Clamp, 0x374a9da0) \ - V(_Float32x4, _withX, Float32x4WithX, 0xfd53a072) \ - V(_Float32x4, _withY, Float32x4WithY, 0xf5f5b506) \ - V(_Float32x4, _withZ, Float32x4WithZ, 0xf2122f63) \ - V(_Float32x4, _withW, Float32x4WithW, 0xef6f231e) \ - V(Float64x2, _Float64x2FromDoubles, Float64x2FromDoubles, 0x9688f476) \ - V(Float64x2, Float64x2.zero, Float64x2Zero, 0x35f71913) \ - V(Float64x2, _Float64x2Splat, Float64x2Splat, 0xf2e6bce9) \ - V(Float64x2, Float64x2.fromFloat32x4, Float32x4ToFloat64x2, 0xa936b421) \ - V(_Float64x2, get:x, Float64x2GetX, 0xd83e5791) \ - V(_Float64x2, get:y, Float64x2GetY, 0xc5cfb2b4) \ - V(_Float64x2, unary-, Float64x2Negate, 0x48fab485) \ - V(_Float64x2, abs, Float64x2Abs, 0x4dbe5821) \ - V(_Float64x2, sqrt, Float64x2Sqrt, 0x476ed48b) \ - V(_Float64x2, get:signMask, Float64x2GetSignMask, 0x00b7b96d) \ - V(_Float64x2, scale, Float64x2Scale, 0xc0dcdf5b) \ - V(_Float64x2, _withX, Float64x2WithX, 0xc03d3708) \ - V(_Float64x2, _withY, Float64x2WithY, 0xb8df4b9c) \ - V(_Float64x2, min, Float64x2Min, 0x6b5e1755) \ - V(_Float64x2, max, Float64x2Max, 0x4d8d9926) \ - V(Int32x4, _Int32x4FromInts, Int32x4FromInts, 0xa646ec55) \ - V(Int32x4, _Int32x4FromBools, Int32x4FromBools, 0x5e05beed) \ - V(Int32x4, Int32x4.fromFloat32x4Bits, Float32x4ToInt32x4, 0x7893999c) \ - V(_Int32x4, get:flagX, Int32x4GetFlagX, 0x7713cbb9) \ - V(_Int32x4, get:flagY, Int32x4GetFlagY, 0x92840299) \ - V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 0xa02d9dec) \ - V(_Int32x4, get:flagW, Int32x4GetFlagW, 0xa94db02d) \ - V(_Int32x4, get:signMask, Int32x4GetSignMask, 0x00b7b96d) \ - V(_Int32x4, shuffle, Int32x4Shuffle, 0x149a8b16) \ - V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 0xd017e89f) \ - V(_Int32x4, select, Int32x4Select, 0x2847cb63) \ - V(_Int32x4, _withFlagX, Int32x4WithFlagX, 0xa365d5a6) \ - V(_Int32x4, _withFlagY, Int32x4WithFlagY, 0x945670e9) \ - V(_Int32x4, _withFlagZ, Int32x4WithFlagZ, 0x938c5d97) \ - V(_Int32x4, _withFlagW, Int32x4WithFlagW, 0x9ebace9b) \ - V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0xe161439b) \ - V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x8c899997) \ - V(_HashVMBase, get:_data, LinkedHashMap_getData, 0xb1d039ec) \ - V(_HashVMBase, set:_data, LinkedHashMap_setData, 0x7c713c68) \ - V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 0xcb55342c) \ - V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 0x4b6bbba8) \ - V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 0xd35b67db) \ - V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 0x5371ef57) \ - V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 0xd55a64df) \ - V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 0x5570ec5b) \ - V(::, _classRangeCheck, ClassRangeCheck, 0x5ee76871) \ - V(::, _asyncStackTraceHelper, AsyncStackTraceHelper, 0x92cea920) \ - V(::, _abi, FfiAbi, 0x00a48dda) \ - V(::, _asFunctionInternal, FfiAsFunctionInternal, 0x4ea3f661) \ - V(::, _nativeCallbackFunction, FfiNativeCallbackFunction, 0xe7a60ce3) \ - V(::, _loadInt8, FfiLoadInt8, 0x7b779ed3) \ - V(::, _loadInt16, FfiLoadInt16, 0x58b6f02a) \ - V(::, _loadInt32, FfiLoadInt32, 0x5a94fec0) \ - V(::, _loadInt64, FfiLoadInt64, 0x4b627ea0) \ - V(::, _loadUint8, FfiLoadUint8, 0x4dc0dbce) \ - V(::, _loadUint16, FfiLoadUint16, 0x79491be7) \ - V(::, _loadUint32, FfiLoadUint32, 0x62e14f52) \ - V(::, _loadUint64, FfiLoadUint64, 0x7178bcc9) \ - V(::, _loadIntPtr, FfiLoadIntPtr, 0x584c733b) \ - V(::, _loadFloat, FfiLoadFloat, 0x7f0471da) \ - V(::, _loadDouble, FfiLoadDouble, 0x7d37b396) \ - V(::, _loadPointer, FfiLoadPointer, 0x3691c04d) \ - V(::, _storeInt8, FfiStoreInt8, 0x118e5bc9) \ - V(::, _storeInt16, FfiStoreInt16, 0x0a8b9fef) \ - V(::, _storeInt32, FfiStoreInt32, 0x2e23d91a) \ - V(::, _storeInt64, FfiStoreInt64, 0x2411ba37) \ - V(::, _storeUint8, FfiStoreUint8, 0x37ab7fb3) \ - V(::, _storeUint16, FfiStoreUint16, 0x153b579b) \ - V(::, _storeUint32, FfiStoreUint32, 0x18159582) \ - V(::, _storeUint64, FfiStoreUint64, 0x1516def6) \ - V(::, _storeIntPtr, FfiStoreIntPtr, 0x3a401365) \ - V(::, _storeFloat, FfiStoreFloat, 0x23292bbb) \ - V(::, _storeDouble, FfiStoreDouble, 0x013dc7a1) \ - V(::, _storePointer, FfiStorePointer, 0x43c38f62) \ - V(::, _fromAddress, FfiFromAddress, 0xab4ae553) \ - V(Pointer, get:address, FfiGetAddress, 0x012b2b9f) \ - V(::, reachabilityFence, ReachabilityFence, 0xad39d0a6) \ - V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x288d0078) \ - V(_Future, timeout, FutureTimeout, 0xdea67258) \ - V(Future, wait, FutureWait, 0x6c0c3295) \ + CopyRangeFromUint8ListToOneByteString, 0x89d6a629) \ + V(_StringBase, _interpolate, StringBaseInterpolate, 0xd5a58f1b) \ + V(_IntegerImplementation, toDouble, IntegerToDouble, 0x5f8db614) \ + V(_Double, _add, DoubleAdd, 0x43269649) \ + V(_Double, _sub, DoubleSub, 0x81077f50) \ + V(_Double, _mul, DoubleMul, 0x7858fa8e) \ + V(_Double, _div, DoubleDiv, 0x813d6ab3) \ + V(::, min, MathMin, 0xe6a2f523) \ + V(::, max, MathMax, 0x4cfa6f8a) \ + V(::, _doublePow, MathDoublePow, 0x9772a8e0) \ + V(::, _intPow, MathIntPow, 0x65762aa8) \ + V(Float32x4, _Float32x4FromDoubles, Float32x4FromDoubles, 0x4ddbf1ef) \ + V(Float32x4, Float32x4.zero, Float32x4Zero, 0x730d829c) \ + V(Float32x4, _Float32x4Splat, Float32x4Splat, 0x36ae8807) \ + V(Float32x4, Float32x4.fromInt32x4Bits, Int32x4ToFloat32x4, 0x8704459c) \ + V(Float32x4, Float32x4.fromFloat64x2, Float64x2ToFloat32x4, 0x71ab7a67) \ + V(_Float32x4, shuffle, Float32x4Shuffle, 0x6f8cd74d) \ + V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 0xd9fe42ee) \ + V(_Float32x4, get:signMask, Float32x4GetSignMask, 0x00b7b98c) \ + V(_Float32x4, equal, Float32x4Equal, 0x77b31298) \ + V(_Float32x4, greaterThan, Float32x4GreaterThan, 0x85a5a2a1) \ + V(_Float32x4, greaterThanOrEqual, Float32x4GreaterThanOrEqual, 0x81c686d9) \ + V(_Float32x4, lessThan, Float32x4LessThan, 0x7d70963f) \ + V(_Float32x4, lessThanOrEqual, Float32x4LessThanOrEqual, 0x79cf7862) \ + V(_Float32x4, notEqual, Float32x4NotEqual, 0x97a75a65) \ + V(_Float32x4, min, Float32x4Min, 0x0ad969b4) \ + V(_Float32x4, max, Float32x4Max, 0xed08eb85) \ + V(_Float32x4, scale, Float32x4Scale, 0xfdf348e4) \ + V(_Float32x4, sqrt, Float32x4Sqrt, 0x84853e14) \ + V(_Float32x4, reciprocalSqrt, Float32x4ReciprocalSqrt, 0x7d66359a) \ + V(_Float32x4, reciprocal, Float32x4Reciprocal, 0x73e065d4) \ + V(_Float32x4, unary-, Float32x4Negate, 0x86111e0e) \ + V(_Float32x4, abs, Float32x4Abs, 0x8ad4c1aa) \ + V(_Float32x4, clamp, Float32x4Clamp, 0x374a9dbf) \ + V(_Float32x4, _withX, Float32x4WithX, 0xfd53a091) \ + V(_Float32x4, _withY, Float32x4WithY, 0xf5f5b525) \ + V(_Float32x4, _withZ, Float32x4WithZ, 0xf2122f82) \ + V(_Float32x4, _withW, Float32x4WithW, 0xef6f233d) \ + V(Float64x2, _Float64x2FromDoubles, Float64x2FromDoubles, 0x9688f495) \ + V(Float64x2, Float64x2.zero, Float64x2Zero, 0x35f71932) \ + V(Float64x2, _Float64x2Splat, Float64x2Splat, 0xf2e6bd08) \ + V(Float64x2, Float64x2.fromFloat32x4, Float32x4ToFloat64x2, 0xa936b440) \ + V(_Float64x2, get:x, Float64x2GetX, 0xd83e57b0) \ + V(_Float64x2, get:y, Float64x2GetY, 0xc5cfb2d3) \ + V(_Float64x2, unary-, Float64x2Negate, 0x48fab4a4) \ + V(_Float64x2, abs, Float64x2Abs, 0x4dbe5840) \ + V(_Float64x2, sqrt, Float64x2Sqrt, 0x476ed4aa) \ + V(_Float64x2, get:signMask, Float64x2GetSignMask, 0x00b7b98c) \ + V(_Float64x2, scale, Float64x2Scale, 0xc0dcdf7a) \ + V(_Float64x2, _withX, Float64x2WithX, 0xc03d3727) \ + V(_Float64x2, _withY, Float64x2WithY, 0xb8df4bbb) \ + V(_Float64x2, min, Float64x2Min, 0x6b5e1774) \ + V(_Float64x2, max, Float64x2Max, 0x4d8d9945) \ + V(Int32x4, _Int32x4FromInts, Int32x4FromInts, 0xa646ec74) \ + V(Int32x4, _Int32x4FromBools, Int32x4FromBools, 0x5e05bf0c) \ + V(Int32x4, Int32x4.fromFloat32x4Bits, Float32x4ToInt32x4, 0x789399bb) \ + V(_Int32x4, get:flagX, Int32x4GetFlagX, 0x7713cbd8) \ + V(_Int32x4, get:flagY, Int32x4GetFlagY, 0x928402b8) \ + V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 0xa02d9e0b) \ + V(_Int32x4, get:flagW, Int32x4GetFlagW, 0xa94db04c) \ + V(_Int32x4, get:signMask, Int32x4GetSignMask, 0x00b7b98c) \ + V(_Int32x4, shuffle, Int32x4Shuffle, 0x149a8b35) \ + V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 0xd017e8be) \ + V(_Int32x4, select, Int32x4Select, 0x2847cb82) \ + V(_Int32x4, _withFlagX, Int32x4WithFlagX, 0xa365d5c5) \ + V(_Int32x4, _withFlagY, Int32x4WithFlagY, 0x94567108) \ + V(_Int32x4, _withFlagZ, Int32x4WithFlagZ, 0x938c5db6) \ + V(_Int32x4, _withFlagW, Int32x4WithFlagW, 0x9ebaceba) \ + V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0xe16143ba) \ + V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x8c8999b6) \ + V(_HashVMBase, get:_data, LinkedHashMap_getData, 0xb1d03a0b) \ + V(_HashVMBase, set:_data, LinkedHashMap_setData, 0x7c713c87) \ + V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 0xcb55344b) \ + V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 0x4b6bbbc7) \ + V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 0xd35b67fa) \ + V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 0x5371ef76) \ + V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 0xd55a64fe) \ + V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 0x5570ec7a) \ + V(::, _classRangeCheck, ClassRangeCheck, 0x5ee76890) \ + V(::, _asyncStackTraceHelper, AsyncStackTraceHelper, 0x92cea93f) \ + V(::, _abi, FfiAbi, 0x00a48df9) \ + V(::, _asFunctionInternal, FfiAsFunctionInternal, 0x4ea3f680) \ + V(::, _nativeCallbackFunction, FfiNativeCallbackFunction, 0xe7a60d02) \ + V(::, _loadInt8, FfiLoadInt8, 0x7b779ef2) \ + V(::, _loadInt16, FfiLoadInt16, 0x58b6f049) \ + V(::, _loadInt32, FfiLoadInt32, 0x5a94fedf) \ + V(::, _loadInt64, FfiLoadInt64, 0x4b627ebf) \ + V(::, _loadUint8, FfiLoadUint8, 0x4dc0dbed) \ + V(::, _loadUint16, FfiLoadUint16, 0x79491c06) \ + V(::, _loadUint32, FfiLoadUint32, 0x62e14f71) \ + V(::, _loadUint64, FfiLoadUint64, 0x7178bce8) \ + V(::, _loadIntPtr, FfiLoadIntPtr, 0x584c735a) \ + V(::, _loadFloat, FfiLoadFloat, 0x7f0471f9) \ + V(::, _loadDouble, FfiLoadDouble, 0x7d37b3b5) \ + V(::, _loadPointer, FfiLoadPointer, 0x3691c06c) \ + V(::, _storeInt8, FfiStoreInt8, 0x118e5be8) \ + V(::, _storeInt16, FfiStoreInt16, 0x0a8ba00e) \ + V(::, _storeInt32, FfiStoreInt32, 0x2e23d939) \ + V(::, _storeInt64, FfiStoreInt64, 0x2411ba56) \ + V(::, _storeUint8, FfiStoreUint8, 0x37ab7fd2) \ + V(::, _storeUint16, FfiStoreUint16, 0x153b57ba) \ + V(::, _storeUint32, FfiStoreUint32, 0x181595a1) \ + V(::, _storeUint64, FfiStoreUint64, 0x1516df15) \ + V(::, _storeIntPtr, FfiStoreIntPtr, 0x3a401384) \ + V(::, _storeFloat, FfiStoreFloat, 0x23292bda) \ + V(::, _storeDouble, FfiStoreDouble, 0x013dc7c0) \ + V(::, _storePointer, FfiStorePointer, 0x43c38f81) \ + V(::, _fromAddress, FfiFromAddress, 0xab4ae572) \ + V(Pointer, get:address, FfiGetAddress, 0x012b2bbe) \ + V(::, reachabilityFence, ReachabilityFence, 0xad39d0c5) \ + V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x288d0097) \ + V(_Future, timeout, FutureTimeout, 0xdea67277) \ + V(Future, wait, FutureWait, 0x6c0c32b4) \ // List of intrinsics: // (class-name, function-name, intrinsification method, fingerprint). #define CORE_LIB_INTRINSIC_LIST(V) \ - V(_Smi, ~, Smi_bitNegate, 0x068652b8) \ - V(_Smi, get:bitLength, Smi_bitLength, 0xff01b0cc) \ - V(_Smi, _bitAndFromSmi, Smi_bitAndFromSmi, 0xa483e093) \ - V(_BigIntImpl, _lsh, Bigint_lsh, 0x772fb5fd) \ - V(_BigIntImpl, _rsh, Bigint_rsh, 0xb52a24b8) \ - V(_BigIntImpl, _absAdd, Bigint_absAdd, 0x90dc61a8) \ - V(_BigIntImpl, _absSub, Bigint_absSub, 0x76887330) \ - V(_BigIntImpl, _mulAdd, Bigint_mulAdd, 0xb2741296) \ - V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, 0xcee0facc) \ + V(_Smi, ~, Smi_bitNegate, 0x068652d7) \ + V(_Smi, get:bitLength, Smi_bitLength, 0xff01b0eb) \ + V(_Smi, _bitAndFromSmi, Smi_bitAndFromSmi, 0xa483e0b2) \ + V(_BigIntImpl, _lsh, Bigint_lsh, 0x772fb61c) \ + V(_BigIntImpl, _rsh, Bigint_rsh, 0xb52a24d7) \ + V(_BigIntImpl, _absAdd, Bigint_absAdd, 0x90dc61c7) \ + V(_BigIntImpl, _absSub, Bigint_absSub, 0x7688734f) \ + V(_BigIntImpl, _mulAdd, Bigint_mulAdd, 0xb27412b5) \ + V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, 0xcee0faeb) \ V(_BigIntImpl, _estimateQuotientDigit, Bigint_estimateQuotientDigit, \ - 0x14527ed9) \ - V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, 0x08df2795) \ - V(_Double, >, Double_greaterThan, 0xe88b6ffc) \ - V(_Double, >=, Double_greaterEqualThan, 0x1fb70bae) \ - V(_Double, <, Double_lessThan, 0xae875025) \ - V(_Double, <=, Double_lessEqualThan, 0xc87a5050) \ - V(_Double, ==, Double_equal, 0x5299f1d2) \ - V(_Double, +, Double_add, 0x783a47d4) \ - V(_Double, -, Double_sub, 0x493f1465) \ - V(_Double, *, Double_mul, 0xae0df2e2) \ - V(_Double, /, Double_div, 0xed535dde) \ - V(_Double, get:hashCode, Double_hashCode, 0xfa2d7816) \ - V(_Double, get:_identityHashCode, Double_identityHash, 0xcbf20cd4) \ - V(_Double, get:isNaN, Double_getIsNaN, 0x88fdcef4) \ - V(_Double, get:isInfinite, Double_getIsInfinite, 0x796f93b3) \ - V(_Double, get:isNegative, Double_getIsNegative, 0x88e61872) \ - V(_Double, _mulFromInteger, Double_mulFromInteger, 0xc5afaa28) \ - V(_Double, .fromInteger, DoubleFromInteger, 0x9d1ad7f6) \ - V(_GrowableList, ._withData, GrowableArray_Allocate, 0x00be5928) \ - V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, 0x6817556e) \ - V(_RegExp, _ExecuteMatchSticky, RegExp_ExecuteMatchSticky, 0x60e30834) \ - V(Object, ==, ObjectEquals, 0xbc3cad49) \ - V(Object, get:runtimeType, ObjectRuntimeType, 0x6461c691) \ - V(Object, _haveSameRuntimeType, ObjectHaveSameRuntimeType, 0xa66bfc58) \ - V(_StringBase, get:hashCode, String_getHashCode, 0xfa2d7835) \ - V(_StringBase, get:_identityHashCode, String_identityHash, 0xcbf20cf3) \ - V(_StringBase, get:isEmpty, StringBaseIsEmpty, 0xbdfe9c92) \ - V(_StringBase, _substringMatches, StringBaseSubstringMatches, 0xf5c3c873) \ - V(_StringBase, [], StringBaseCharAt, 0xfa3bf7be) \ - V(_OneByteString, get:hashCode, OneByteString_getHashCode, 0xfa2d7835) \ + 0x14527ef8) \ + V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, 0x08df27b4) \ + V(_Double, >, Double_greaterThan, 0xe88b701b) \ + V(_Double, >=, Double_greaterEqualThan, 0x1fb70bcd) \ + V(_Double, <, Double_lessThan, 0xae875044) \ + V(_Double, <=, Double_lessEqualThan, 0xc87a506f) \ + V(_Double, ==, Double_equal, 0x5299f1f1) \ + V(_Double, +, Double_add, 0x783a47f3) \ + V(_Double, -, Double_sub, 0x493f1484) \ + V(_Double, *, Double_mul, 0xae0df301) \ + V(_Double, /, Double_div, 0xed535dfd) \ + V(_Double, get:hashCode, Double_hashCode, 0xfa2d7835) \ + V(_Double, get:_identityHashCode, Double_identityHash, 0xcbf20cf3) \ + V(_Double, get:isNaN, Double_getIsNaN, 0x88fdcf13) \ + V(_Double, get:isInfinite, Double_getIsInfinite, 0x796f93d2) \ + V(_Double, get:isNegative, Double_getIsNegative, 0x88e61891) \ + V(_Double, _mulFromInteger, Double_mulFromInteger, 0xc5afaa47) \ + V(_Double, .fromInteger, DoubleFromInteger, 0x9d1ad815) \ + V(_GrowableList, ._withData, GrowableArray_Allocate, 0x00be5947) \ + V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, 0x6817558d) \ + V(_RegExp, _ExecuteMatchSticky, RegExp_ExecuteMatchSticky, 0x60e30853) \ + V(Object, ==, ObjectEquals, 0xbc3cad68) \ + V(Object, get:runtimeType, ObjectRuntimeType, 0x6461c6b0) \ + V(Object, _haveSameRuntimeType, ObjectHaveSameRuntimeType, 0xa66bfc77) \ + V(_StringBase, get:hashCode, String_getHashCode, 0xfa2d7854) \ + V(_StringBase, get:_identityHashCode, String_identityHash, 0xcbf20d12) \ + V(_StringBase, get:isEmpty, StringBaseIsEmpty, 0xbdfe9cb1) \ + V(_StringBase, _substringMatches, StringBaseSubstringMatches, 0xf5c3c892) \ + V(_StringBase, [], StringBaseCharAt, 0xfa3bf7dd) \ + V(_OneByteString, get:hashCode, OneByteString_getHashCode, 0xfa2d7854) \ V(_OneByteString, _substringUncheckedNative, \ - OneByteString_substringUnchecked, 0x0d39e4a1) \ - V(_OneByteString, ==, OneByteString_equality, 0x3399ded1) \ - V(_TwoByteString, ==, TwoByteString_equality, 0x3399ded1) \ - V(_Type, get:hashCode, Type_getHashCode, 0xfa2d7835) \ - V(_Type, ==, Type_equality, 0xbc3cad0b) \ - V(::, _getHash, Object_getHash, 0x87e0c73d) \ - V(::, _setHash, Object_setHash, 0xcb4f51d2) \ + OneByteString_substringUnchecked, 0x0d39e4c0) \ + V(_OneByteString, ==, OneByteString_equality, 0x3399def0) \ + V(_TwoByteString, ==, TwoByteString_equality, 0x3399def0) \ + V(_Type, get:hashCode, Type_getHashCode, 0xfa2d7854) \ + V(_Type, ==, Type_equality, 0xbc3cad2a) \ + V(::, _getHash, Object_getHash, 0x87e0c75c) \ + V(::, _setHash, Object_setHash, 0xcb4f51f1) \ #define CORE_INTEGER_LIB_INTRINSIC_LIST(V) \ V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger, \ - 0xdb88076e) \ - V(_IntegerImplementation, +, Integer_add, 0x9b2718c0) \ + 0xdb88078d) \ + V(_IntegerImplementation, +, Integer_add, 0x9b2718df) \ V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, \ - 0xa1d87562) \ - V(_IntegerImplementation, -, Integer_sub, 0x6c350eb1) \ + 0xa1d87581) \ + V(_IntegerImplementation, -, Integer_sub, 0x6c350ed0) \ V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger, \ - 0xa93fad01) \ - V(_IntegerImplementation, *, Integer_mul, 0x4197ce8e) \ + 0xa93fad20) \ + V(_IntegerImplementation, *, Integer_mul, 0x4197cead) \ V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger, \ - 0xd040918e) \ - V(_IntegerImplementation, ~/, Integer_truncDivide, 0x79adb402) \ - V(_IntegerImplementation, unary-, Integer_negate, 0xf07a7709) \ + 0xd04091ad) \ + V(_IntegerImplementation, ~/, Integer_truncDivide, 0x79adb421) \ + V(_IntegerImplementation, unary-, Integer_negate, 0xf07a7728) \ V(_IntegerImplementation, _bitAndFromInteger, Integer_bitAndFromInteger, \ - 0xcbb1b792) \ - V(_IntegerImplementation, &, Integer_bitAnd, 0x2b385f64) \ + 0xcbb1b7b1) \ + V(_IntegerImplementation, &, Integer_bitAnd, 0x2b385f83) \ V(_IntegerImplementation, _bitOrFromInteger, Integer_bitOrFromInteger, \ - 0xbd3f946a) \ - V(_IntegerImplementation, |, Integer_bitOr, 0x19dc9b1c) \ + 0xbd3f9489) \ + V(_IntegerImplementation, |, Integer_bitOr, 0x19dc9b3b) \ V(_IntegerImplementation, _bitXorFromInteger, Integer_bitXorFromInteger, \ - 0xae7f642e) \ - V(_IntegerImplementation, ^, Integer_bitXor, 0x139d6723) \ + 0xae7f644d) \ + V(_IntegerImplementation, ^, Integer_bitXor, 0x139d6742) \ V(_IntegerImplementation, _greaterThanFromInteger, \ - Integer_greaterThanFromInt, 0x47319226) \ - V(_IntegerImplementation, >, Integer_greaterThan, 0xc9d374cc) \ - V(_IntegerImplementation, ==, Integer_equal, 0xca4e7087) \ + Integer_greaterThanFromInt, 0x47319245) \ + V(_IntegerImplementation, >, Integer_greaterThan, 0xc9d374eb) \ + V(_IntegerImplementation, ==, Integer_equal, 0xca4e70a6) \ V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger, \ - 0x4d9e5fc5) \ - V(_IntegerImplementation, <, Integer_lessThan, 0xae875025) \ - V(_IntegerImplementation, <=, Integer_lessEqualThan, 0xc87a5050) \ - V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x1fb70bae) \ - V(_IntegerImplementation, <<, Integer_shl, 0xe8da5296) \ - V(_IntegerImplementation, >>, Integer_sar, 0x4fb2013b) \ - V(_Double, toInt, DoubleToInteger, 0xebc963eb) \ + 0x4d9e5fe4) \ + V(_IntegerImplementation, <, Integer_lessThan, 0xae875044) \ + V(_IntegerImplementation, <=, Integer_lessEqualThan, 0xc87a506f) \ + V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x1fb70bcd) \ + V(_IntegerImplementation, <<, Integer_shl, 0xe8da52b5) \ + V(_IntegerImplementation, >>, Integer_sar, 0x4fb2015a) \ + V(_Double, toInt, DoubleToInteger, 0xebc9640a) \ #define MATH_LIB_INTRINSIC_LIST(V) \ - V(::, sqrt, MathSqrt, 0x98d7cb39) \ - V(_Random, _nextState, Random_nextState, 0x2c1cf0e2) \ + V(::, sqrt, MathSqrt, 0x98d7cb58) \ + V(_Random, _nextState, Random_nextState, 0x2c1cf101) \ #define GRAPH_MATH_LIB_INTRINSIC_LIST(V) \ - V(::, sin, MathSin, 0x859e6680) \ - V(::, cos, MathCos, 0xd2dae38e) \ - V(::, tan, MathTan, 0xa23c1122) \ - V(::, asin, MathAsin, 0x1cdb139f) \ - V(::, acos, MathAcos, 0x830d84ba) \ - V(::, atan, MathAtan, 0x35d5ecd7) \ - V(::, atan2, MathAtan2, 0xb4e03ae8) \ + V(::, sin, MathSin, 0x859e669f) \ + V(::, cos, MathCos, 0xd2dae3ad) \ + V(::, tan, MathTan, 0xa23c1141) \ + V(::, asin, MathAsin, 0x1cdb13be) \ + V(::, acos, MathAcos, 0x830d84d9) \ + V(::, atan, MathAtan, 0x35d5ecf6) \ + V(::, atan2, MathAtan2, 0xb4e03b07) \ #define GRAPH_TYPED_DATA_INTRINSICS_LIST(V) \ - V(_Int8List, [], Int8ArrayGetIndexed, 0xd61e79bd) \ - V(_Int8List, []=, Int8ArraySetIndexed, 0x6e0b2e72) \ - V(_Uint8List, [], Uint8ArrayGetIndexed, 0xe1a67dfd) \ - V(_Uint8List, []=, Uint8ArraySetIndexed, 0x89499a2e) \ - V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 0xe1a67dfd) \ - V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 0x89499a2e) \ - V(_Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, 0xe1a67dfd) \ - V(_Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, 0x5facb08e) \ + V(_Int8List, [], Int8ArrayGetIndexed, 0xd61e79dc) \ + V(_Int8List, []=, Int8ArraySetIndexed, 0x6e0b2e91) \ + V(_Uint8List, [], Uint8ArrayGetIndexed, 0xe1a67e1c) \ + V(_Uint8List, []=, Uint8ArraySetIndexed, 0x89499a4d) \ + V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 0xe1a67e1c) \ + V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 0x89499a4d) \ + V(_Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, 0xe1a67e1c) \ + V(_Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, 0x5facb0ad) \ V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed, \ - 0xe1a67dfd) \ + 0xe1a67e1c) \ V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed, \ - 0x5facb08e) \ - V(_Int16List, [], Int16ArrayGetIndexed, 0x1726ae5d) \ - V(_Int16List, []=, Int16ArraySetIndexed, 0xde0f4d87) \ - V(_Uint16List, [], Uint16ArrayGetIndexed, 0x26c2525d) \ - V(_Uint16List, []=, Uint16ArraySetIndexed, 0x69ae5b30) \ - V(_Int32List, [], Int32ArrayGetIndexed, 0x407e58de) \ - V(_Int32List, []=, Int32ArraySetIndexed, 0x61194108) \ - V(_Uint32List, [], Uint32ArrayGetIndexed, 0xf078bf3e) \ - V(_Uint32List, []=, Uint32ArraySetIndexed, 0x70f53c88) \ - V(_Int64List, [], Int64ArrayGetIndexed, 0x7c21b69e) \ - V(_Int64List, []=, Int64ArraySetIndexed, 0xcaa7c6ca) \ - V(_Uint64List, [], Uint64ArrayGetIndexed, 0x0a7aa11e) \ - V(_Uint64List, []=, Uint64ArraySetIndexed, 0xd1374e92) \ - V(_Float64List, [], Float64ArrayGetIndexed, 0x9e4b2403) \ - V(_Float64List, []=, Float64ArraySetIndexed, 0x0a43d538) \ - V(_Float32List, [], Float32ArrayGetIndexed, 0xbdf87ee3) \ - V(_Float32List, []=, Float32ArraySetIndexed, 0x2e3e1a4a) \ - V(_Float32x4List, [], Float32x4ArrayGetIndexed, 0xa90520bc) \ - V(_Float32x4List, []=, Float32x4ArraySetIndexed, 0xb9c7400f) \ - V(_Int32x4List, [], Int32x4ArrayGetIndexed, 0xfbcc0e74) \ - V(_Int32x4List, []=, Int32x4ArraySetIndexed, 0x79152aaf) \ - V(_Float64x2List, [], Float64x2ArrayGetIndexed, 0xd90a31e6) \ - V(_Float64x2List, []=, Float64x2ArraySetIndexed, 0x4fd191fb) \ - V(_TypedList, get:length, TypedListLength, 0xdc9d90aa) \ - V(_TypedListView, get:length, TypedListViewLength, 0xdc9d90aa) \ - V(_ByteDataView, get:length, ByteDataViewLength, 0xdc9d90aa) \ - V(_Float32x4, get:x, Float32x4ShuffleX, 0xd83e5791) \ - V(_Float32x4, get:y, Float32x4ShuffleY, 0xc5cfb2b4) \ - V(_Float32x4, get:z, Float32x4ShuffleZ, 0xfb9b1e4a) \ - V(_Float32x4, get:w, Float32x4ShuffleW, 0xdddb62cc) \ - V(_Float32x4, *, Float32x4Mul, 0x0be25e24) \ - V(_Float32x4, /, Float32x4Div, 0xe73114a1) \ - V(_Float32x4, -, Float32x4Sub, 0x03c44de7) \ - V(_Float32x4, +, Float32x4Add, 0xde8b8376) \ - V(_Float64x2, *, Float64x2Mul, 0x6c670bc5) \ - V(_Float64x2, /, Float64x2Div, 0x47b5c261) \ - V(_Float64x2, -, Float64x2Sub, 0x6448fb88) \ - V(_Float64x2, +, Float64x2Add, 0x3f103117) \ + 0x5facb0ad) \ + V(_Int16List, [], Int16ArrayGetIndexed, 0x1726ae7c) \ + V(_Int16List, []=, Int16ArraySetIndexed, 0xde0f4da6) \ + V(_Uint16List, [], Uint16ArrayGetIndexed, 0x26c2527c) \ + V(_Uint16List, []=, Uint16ArraySetIndexed, 0x69ae5b4f) \ + V(_Int32List, [], Int32ArrayGetIndexed, 0x407e58fd) \ + V(_Int32List, []=, Int32ArraySetIndexed, 0x61194127) \ + V(_Uint32List, [], Uint32ArrayGetIndexed, 0xf078bf5d) \ + V(_Uint32List, []=, Uint32ArraySetIndexed, 0x70f53ca7) \ + V(_Int64List, [], Int64ArrayGetIndexed, 0x7c21b6bd) \ + V(_Int64List, []=, Int64ArraySetIndexed, 0xcaa7c6e9) \ + V(_Uint64List, [], Uint64ArrayGetIndexed, 0x0a7aa13d) \ + V(_Uint64List, []=, Uint64ArraySetIndexed, 0xd1374eb1) \ + V(_Float64List, [], Float64ArrayGetIndexed, 0x9e4b2422) \ + V(_Float64List, []=, Float64ArraySetIndexed, 0x0a43d557) \ + V(_Float32List, [], Float32ArrayGetIndexed, 0xbdf87f02) \ + V(_Float32List, []=, Float32ArraySetIndexed, 0x2e3e1a69) \ + V(_Float32x4List, [], Float32x4ArrayGetIndexed, 0xa90520db) \ + V(_Float32x4List, []=, Float32x4ArraySetIndexed, 0xb9c7402e) \ + V(_Int32x4List, [], Int32x4ArrayGetIndexed, 0xfbcc0e93) \ + V(_Int32x4List, []=, Int32x4ArraySetIndexed, 0x79152ace) \ + V(_Float64x2List, [], Float64x2ArrayGetIndexed, 0xd90a3205) \ + V(_Float64x2List, []=, Float64x2ArraySetIndexed, 0x4fd1921a) \ + V(_TypedList, get:length, TypedListLength, 0xdc9d90c9) \ + V(_TypedListView, get:length, TypedListViewLength, 0xdc9d90c9) \ + V(_ByteDataView, get:length, ByteDataViewLength, 0xdc9d90c9) \ + V(_Float32x4, get:x, Float32x4ShuffleX, 0xd83e57b0) \ + V(_Float32x4, get:y, Float32x4ShuffleY, 0xc5cfb2d3) \ + V(_Float32x4, get:z, Float32x4ShuffleZ, 0xfb9b1e69) \ + V(_Float32x4, get:w, Float32x4ShuffleW, 0xdddb62eb) \ + V(_Float32x4, *, Float32x4Mul, 0x0be25e43) \ + V(_Float32x4, /, Float32x4Div, 0xe73114c0) \ + V(_Float32x4, -, Float32x4Sub, 0x03c44e06) \ + V(_Float32x4, +, Float32x4Add, 0xde8b8395) \ + V(_Float64x2, *, Float64x2Mul, 0x6c670be4) \ + V(_Float64x2, /, Float64x2Div, 0x47b5c280) \ + V(_Float64x2, -, Float64x2Sub, 0x6448fba7) \ + V(_Float64x2, +, Float64x2Add, 0x3f103136) \ #define GRAPH_CORE_INTRINSICS_LIST(V) \ - V(_List, get:length, ObjectArrayLength, 0xdc9d90aa) \ - V(_List, [], ObjectArrayGetIndexed, 0xd159dece) \ - V(_List, _setIndexed, ObjectArraySetIndexedUnchecked, 0xf5780f43) \ - V(_ImmutableList, get:length, ImmutableArrayLength, 0xdc9d90aa) \ - V(_ImmutableList, [], ImmutableArrayGetIndexed, 0xd159dece) \ - V(_GrowableList, get:length, GrowableArrayLength, 0xdc9d90aa) \ - V(_GrowableList, get:_capacity, GrowableArrayCapacity, 0x01ec3c31) \ - V(_GrowableList, _setData, GrowableArraySetData, 0x8ecf0a40) \ - V(_GrowableList, _setLength, GrowableArraySetLength, 0x63da779b) \ - V(_GrowableList, [], GrowableArrayGetIndexed, 0xd159dece) \ - V(_GrowableList, _setIndexed, GrowableArraySetIndexedUnchecked, 0x012e9e24) \ - V(_StringBase, get:length, StringBaseLength, 0xdc9d90aa) \ - V(_OneByteString, codeUnitAt, OneByteStringCodeUnitAt, 0xc4602c13) \ - V(_TwoByteString, codeUnitAt, TwoByteStringCodeUnitAt, 0xc4602c13) \ + V(_List, get:length, ObjectArrayLength, 0xdc9d90c9) \ + V(_List, [], ObjectArrayGetIndexed, 0xd159deed) \ + V(_List, _setIndexed, ObjectArraySetIndexedUnchecked, 0xf5780f62) \ + V(_ImmutableList, get:length, ImmutableArrayLength, 0xdc9d90c9) \ + V(_ImmutableList, [], ImmutableArrayGetIndexed, 0xd159deed) \ + V(_GrowableList, get:length, GrowableArrayLength, 0xdc9d90c9) \ + V(_GrowableList, get:_capacity, GrowableArrayCapacity, 0x01ec3c50) \ + V(_GrowableList, _setData, GrowableArraySetData, 0x8ecf0a5f) \ + V(_GrowableList, _setLength, GrowableArraySetLength, 0x63da77ba) \ + V(_GrowableList, [], GrowableArrayGetIndexed, 0xd159deed) \ + V(_GrowableList, _setIndexed, GrowableArraySetIndexedUnchecked, 0x012e9e43) \ + V(_StringBase, get:length, StringBaseLength, 0xdc9d90c9) \ + V(_OneByteString, codeUnitAt, OneByteStringCodeUnitAt, 0xc4602c32) \ + V(_TwoByteString, codeUnitAt, TwoByteStringCodeUnitAt, 0xc4602c32) \ V(_ExternalOneByteString, codeUnitAt, ExternalOneByteStringCodeUnitAt, \ - 0xc4602c13) \ + 0xc4602c32) \ V(_ExternalTwoByteString, codeUnitAt, ExternalTwoByteStringCodeUnitAt, \ - 0xc4602c13) \ - V(_Double, unary-, DoubleFlipSignBit, 0xdb229448) \ - V(_Double, truncateToDouble, DoubleTruncate, 0x00e6f81b) \ - V(_Double, roundToDouble, DoubleRound, 0xf45c3bc2) \ - V(_Double, floorToDouble, DoubleFloor, 0xf2c73d0a) \ - V(_Double, ceilToDouble, DoubleCeil, 0xfd2e409b) \ - V(_Double, _modulo, DoubleMod, 0x5673c731) + 0xc4602c32) \ + V(_Double, unary-, DoubleFlipSignBit, 0xdb229467) \ + V(_Double, truncateToDouble, DoubleTruncate, 0x00e6f83a) \ + V(_Double, roundToDouble, DoubleRound, 0xf45c3be1) \ + V(_Double, floorToDouble, DoubleFloor, 0xf2c73d29) \ + V(_Double, ceilToDouble, DoubleCeil, 0xfd2e40ba) \ + V(_Double, _modulo, DoubleMod, 0x5673c750) #define GRAPH_INTRINSICS_LIST(V) \ GRAPH_CORE_INTRINSICS_LIST(V) \ @@ -378,20 +378,20 @@ namespace dart { GRAPH_MATH_LIB_INTRINSIC_LIST(V) \ #define DEVELOPER_LIB_INTRINSIC_LIST(V) \ - V(_UserTag, makeCurrent, UserTag_makeCurrent, 0x1eb344b3) \ - V(::, _getDefaultTag, UserTag_defaultTag, 0x2ef2e42c) \ - V(::, _getCurrentTag, Profiler_getCurrentTag, 0x33c3ec15) \ - V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, 0x7dfcaa18) \ + V(_UserTag, makeCurrent, UserTag_makeCurrent, 0x1eb344d2) \ + V(::, _getDefaultTag, UserTag_defaultTag, 0x2ef2e44b) \ + V(::, _getCurrentTag, Profiler_getCurrentTag, 0x33c3ec34) \ + V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, 0x7dfcaa37) \ #define ASYNC_LIB_INTRINSIC_LIST(V) \ - V(::, _clearAsyncThreadStackTrace, ClearAsyncThreadStackTrace, 0x20fecac6) \ - V(::, _setAsyncThreadStackTrace, SetAsyncThreadStackTrace, 0x39346953) \ + V(::, _clearAsyncThreadStackTrace, ClearAsyncThreadStackTrace, 0x20fecae5) \ + V(::, _setAsyncThreadStackTrace, SetAsyncThreadStackTrace, 0x39346972) \ #define INTERNAL_LIB_INTRINSIC_LIST(V) \ - V(::, allocateOneByteString, AllocateOneByteString, 0xc86bebfa) \ - V(::, allocateTwoByteString, AllocateTwoByteString, 0xd0312797) \ - V(::, writeIntoOneByteString, WriteIntoOneByteString, 0xe0d28307) \ - V(::, writeIntoTwoByteString, WriteIntoTwoByteString, 0xd82789d0) \ + V(::, allocateOneByteString, AllocateOneByteString, 0xc86bec19) \ + V(::, allocateTwoByteString, AllocateTwoByteString, 0xd03127b6) \ + V(::, writeIntoOneByteString, WriteIntoOneByteString, 0xe0d28326) \ + V(::, writeIntoTwoByteString, WriteIntoTwoByteString, 0xd82789ef) \ #define ALL_INTRINSICS_NO_INTEGER_LIB_LIST(V) \ ASYNC_LIB_INTRINSIC_LIST(V) \ @@ -411,38 +411,38 @@ namespace dart { // A list of core functions that internally dispatch based on received id. #define POLYMORPHIC_TARGET_LIST(V) \ - V(_StringBase, [], StringBaseCharAt, 0xfa3bf7be) \ - V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 0xc28aff37) \ - V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 0xc3e7212d) \ - V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 0xdaa7b952) \ - V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 0xdc2919bc) \ - V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 0xc57f53af) \ - V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 0xc5c49520) \ - V(_TypedList, _getInt64, ByteArrayBaseGetInt64, 0xa2c7e6a4) \ - V(_TypedList, _getUint64, ByteArrayBaseGetUint64, 0xd8c29ffe) \ - V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 0xaf15f28a) \ - V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 0xbe4987b7) \ - V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 0x76c82c28) \ - V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 0x29abed4e) \ - V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0xfc13ad87) \ - V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 0xc9e4212d) \ - V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0xd570aa0c) \ - V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 0xe8acb234) \ - V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0xd8651525) \ - V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0xd3f10d97) \ - V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 0xe357b95f) \ - V(_TypedList, _setUint64, ByteArrayBaseSetUint64, 0xf4d19bea) \ - V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0xd6272645) \ - V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0xca4af137) \ - V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x71767f7f) \ - V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0xf0483280) \ - V(Object, get:runtimeType, ObjectRuntimeType, 0x6461c691) + V(_StringBase, [], StringBaseCharAt, 0xfa3bf7dd) \ + V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 0xc28aff56) \ + V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 0xc3e7214c) \ + V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 0xdaa7b971) \ + V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 0xdc2919db) \ + V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 0xc57f53ce) \ + V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 0xc5c4953f) \ + V(_TypedList, _getInt64, ByteArrayBaseGetInt64, 0xa2c7e6c3) \ + V(_TypedList, _getUint64, ByteArrayBaseGetUint64, 0xd8c2a01d) \ + V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 0xaf15f2a9) \ + V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 0xbe4987d6) \ + V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 0x76c82c47) \ + V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 0x29abed6d) \ + V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0xfc13ada6) \ + V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 0xc9e4214c) \ + V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0xd570aa2b) \ + V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 0xe8acb253) \ + V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0xd8651544) \ + V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0xd3f10db6) \ + V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 0xe357b97e) \ + V(_TypedList, _setUint64, ByteArrayBaseSetUint64, 0xf4d19c09) \ + V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0xd6272664) \ + V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0xca4af156) \ + V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x71767f9e) \ + V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0xf048329f) \ + V(Object, get:runtimeType, ObjectRuntimeType, 0x6461c6b0) // List of recognized list factories: // (factory-name-symbol, class-name-string, constructor-name-string, // result-cid, fingerprint). #define RECOGNIZED_LIST_FACTORY_LIST(V) \ - V(_ListFactory, _List, ., kArrayCid, 0x6de199a1) \ + V(_ListFactory, _List, ., kArrayCid, 0x6de199c0) \ V(_ListFilledFactory, _List, .filled, kArrayCid, 0x871c7eb6) \ V(_ListGenerateFactory, _List, .generate, kArrayCid, 0x045b9063) \ V(_GrowableListFactory, _GrowableList, ., kGrowableObjectArrayCid, \ @@ -452,23 +452,23 @@ namespace dart { V(_GrowableListGenerateFactory, _GrowableList, .generate, \ kGrowableObjectArrayCid, 0xf6fbbee3) \ V(_GrowableListWithData, _GrowableList, ._withData, kGrowableObjectArrayCid, \ - 0x00be5928) \ - V(_Int8ArrayFactory, Int8List, ., kTypedDataInt8ArrayCid, 0x80ad83e1) \ - V(_Uint8ArrayFactory, Uint8List, ., kTypedDataUint8ArrayCid, 0x252e6768) \ + 0x00be5947) \ + V(_Int8ArrayFactory, Int8List, ., kTypedDataInt8ArrayCid, 0x80ad8400) \ + V(_Uint8ArrayFactory, Uint8List, ., kTypedDataUint8ArrayCid, 0x252e6787) \ V(_Uint8ClampedArrayFactory, Uint8ClampedList, ., \ - kTypedDataUint8ClampedArrayCid, 0x1ed931ee) \ - V(_Int16ArrayFactory, Int16List, ., kTypedDataInt16ArrayCid, 0x7ea8630c) \ - V(_Uint16ArrayFactory, Uint16List, ., kTypedDataUint16ArrayCid, 0x2764f743) \ - V(_Int32ArrayFactory, Int32List, ., kTypedDataInt32ArrayCid, 0x54a56479) \ - V(_Uint32ArrayFactory, Uint32List, ., kTypedDataUint32ArrayCid, 0xac4deaa4) \ - V(_Int64ArrayFactory, Int64List, ., kTypedDataInt64ArrayCid, 0x02d4c748) \ - V(_Uint64ArrayFactory, Uint64List, ., kTypedDataUint64ArrayCid, 0x08669751) \ + kTypedDataUint8ClampedArrayCid, 0x1ed9320d) \ + V(_Int16ArrayFactory, Int16List, ., kTypedDataInt16ArrayCid, 0x7ea8632b) \ + V(_Uint16ArrayFactory, Uint16List, ., kTypedDataUint16ArrayCid, 0x2764f762) \ + V(_Int32ArrayFactory, Int32List, ., kTypedDataInt32ArrayCid, 0x54a56498) \ + V(_Uint32ArrayFactory, Uint32List, ., kTypedDataUint32ArrayCid, 0xac4deac3) \ + V(_Int64ArrayFactory, Int64List, ., kTypedDataInt64ArrayCid, 0x02d4c767) \ + V(_Uint64ArrayFactory, Uint64List, ., kTypedDataUint64ArrayCid, 0x08669770) \ V(_Float64ArrayFactory, Float64List, ., kTypedDataFloat64ArrayCid, \ - 0x09ede82a) \ + 0x09ede849) \ V(_Float32ArrayFactory, Float32List, ., kTypedDataFloat32ArrayCid, \ - 0x8b65b9d7) \ + 0x8b65b9f6) \ V(_Float32x4ArrayFactory, Float32x4List, ., kTypedDataFloat32x4ArrayCid, \ - 0xb2a9e6e1) + 0xb2a9e700) // clang-format on diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index ddba562f439..33955872f5d 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc @@ -2306,9 +2306,6 @@ ErrorPtr Object::Init(Isolate* isolate, // Set up the intrinsic state of all functions (core, math and typed data). compiler::Intrinsifier::InitializeState(); - // Set up recognized state of all functions (core, math and typed data). - MethodRecognizer::InitializeState(); - // Adds static const fields (class ids) to the class 'ClassID'); lib = Library::LookupLibrary(thread, Symbols::DartInternal()); ASSERT(!lib.IsNull()); @@ -2318,6 +2315,9 @@ ErrorPtr Object::Init(Isolate* isolate, ASSERT(injected); isolate->object_store()->InitKnownObjects(); + + // Set up recognized state of all functions (core, math and typed data). + MethodRecognizer::InitializeState(); #endif // !defined(DART_PRECOMPILED_RUNTIME) } else { // Object::Init version when we are running in a version of dart that has a @@ -9578,11 +9578,24 @@ void Function::SetDeoptReasonForAll(intptr_t deopt_id, } } -bool Function::CheckSourceFingerprint(int32_t fp) const { +bool Function::CheckSourceFingerprint(int32_t fp, const char* kind) const { #if !defined(DEBUG) return true; // Only check on debug. #endif +#if !defined(DART_PRECOMPILED_RUNTIME) + // Check that the function is marked as recognized via the vm:recognized + // pragma. This is so that optimizations that change the signature will know + // not to touch it. + if (kind != nullptr && !MethodRecognizer::IsMarkedAsRecognized(*this, kind)) { + OS::PrintErr( + "Recognized method %s should be marked with: " + "@pragma(\"vm:recognized\", \"%s\")\n", + ToQualifiedCString(), kind); + return false; + } +#endif + if (Isolate::Current()->obfuscate() || FLAG_precompiled_mode || (Dart::vm_snapshot_kind() != Snapshot::kNone)) { return true; // The kernel structure has been altered, skip checking. @@ -13925,22 +13938,31 @@ void Library::CheckFunctionFingerprints() { Function& func = Function::Handle(); bool fingerprints_match = true; -#define CHECK_FINGERPRINTS(class_name, function_name, dest, fp) \ +#define CHECK_FINGERPRINTS_INNER(class_name, function_name, dest, fp, kind) \ func = GetFunction(all_libs, #class_name, #function_name); \ if (func.IsNull()) { \ fingerprints_match = false; \ OS::PrintErr("Function not found %s.%s\n", #class_name, #function_name); \ } else { \ fingerprints_match = \ - func.CheckSourceFingerprint(fp) && fingerprints_match; \ + func.CheckSourceFingerprint(fp, kind) && fingerprints_match; \ } -#define CHECK_FINGERPRINTS2(class_name, function_name, dest, fp) \ - CHECK_FINGERPRINTS(class_name, function_name, dest, fp) +#define CHECK_FINGERPRINTS(class_name, function_name, dest, fp) \ + CHECK_FINGERPRINTS_INNER(class_name, function_name, dest, fp, nullptr) +#define CHECK_FINGERPRINTS_ASM_INTRINSIC(class_name, function_name, dest, fp) \ + CHECK_FINGERPRINTS_INNER(class_name, function_name, dest, fp, "asm-intrinsic") +#define CHECK_FINGERPRINTS_GRAPH_INTRINSIC(class_name, function_name, dest, \ + fp) \ + CHECK_FINGERPRINTS_INNER(class_name, function_name, dest, fp, \ + "graph-intrinsic") +#define CHECK_FINGERPRINTS_OTHER(class_name, function_name, dest, fp) \ + CHECK_FINGERPRINTS_INNER(class_name, function_name, dest, fp, "other") all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary())); - CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2); - CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2); + CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC); + CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC); + GRAPH_CORE_INTRINSICS_LIST(CHECK_FINGERPRINTS_GRAPH_INTRINSIC); all_libs.Add(&Library::ZoneHandle(Library::AsyncLibrary())); all_libs.Add(&Library::ZoneHandle(Library::MathLibrary())); @@ -13949,21 +13971,26 @@ void Library::CheckFunctionFingerprints() { all_libs.Add(&Library::ZoneHandle(Library::ConvertLibrary())); all_libs.Add(&Library::ZoneHandle(Library::InternalLibrary())); all_libs.Add(&Library::ZoneHandle(Library::FfiLibrary())); - ASYNC_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2); - INTERNAL_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2); - OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS2); + ASYNC_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC); + INTERNAL_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC); + OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS_OTHER); POLYMORPHIC_TARGET_LIST(CHECK_FINGERPRINTS); + GRAPH_TYPED_DATA_INTRINSICS_LIST(CHECK_FINGERPRINTS_GRAPH_INTRINSIC); all_libs.Clear(); all_libs.Add(&Library::ZoneHandle(Library::DeveloperLibrary())); - DEVELOPER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2); + DEVELOPER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC); all_libs.Clear(); all_libs.Add(&Library::ZoneHandle(Library::MathLibrary())); - MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2); + MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_ASM_INTRINSIC); + GRAPH_MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS_GRAPH_INTRINSIC); +#undef CHECK_FINGERPRINTS_INNER #undef CHECK_FINGERPRINTS -#undef CHECK_FINGERPRINTS2 +#undef CHECK_FINGERPRINTS_ASM_INTRINSIC +#undef CHECK_FINGERPRINTS_GRAPH_INTRINSIC +#undef CHECK_FINGERPRINTS_OTHER #define CHECK_FACTORY_FINGERPRINTS(symbol, class_name, factory_name, cid, fp) \ func = GetFunction(all_libs, #class_name, #factory_name); \ diff --git a/runtime/vm/object.h b/runtime/vm/object.h index 988de23e7e9..11fed21a42d 100644 --- a/runtime/vm/object.h +++ b/runtime/vm/object.h @@ -3584,7 +3584,7 @@ class Function : public Object { int32_t SourceFingerprint() const; // Return false and report an error if the fingerprint does not match. - bool CheckSourceFingerprint(int32_t fp) const; + bool CheckSourceFingerprint(int32_t fp, const char* kind = nullptr) const; // Works with map [deopt-id] -> ICData. void SaveICDataMap( diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h index bcb4057fe82..443daa2bf1a 100644 --- a/runtime/vm/symbols.h +++ b/runtime/vm/symbols.h @@ -494,6 +494,7 @@ class ObjectPointerVisitor; V(vm_inferred_type_metadata, "vm.inferred-type.metadata") \ V(vm_never_inline, "vm:never-inline") \ V(vm_non_nullable_result_type, "vm:non-nullable-result-type") \ + V(vm_recognized, "vm:recognized") \ V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn") \ V(vm_procedure_attributes_metadata, "vm.procedure-attributes.metadata") diff --git a/sdk/lib/_internal/vm/lib/array.dart b/sdk/lib/_internal/vm/lib/array.dart index d615f7b9404..1e2f9c027df 100644 --- a/sdk/lib/_internal/vm/lib/array.dart +++ b/sdk/lib/_internal/vm/lib/array.dart @@ -6,6 +6,7 @@ @pragma("vm:entry-point") class _List extends FixedLengthListBase { + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", [_List, "result-type-uses-passed-type-arguments"]) @pragma("vm:prefer-inline") @@ -34,14 +35,18 @@ class _List extends FixedLengthListBase { return result; } + @pragma("vm:recognized", "graph-intrinsic") E operator [](int index) native "List_getIndexed"; + @pragma("vm:recognized", "other") void operator []=(int index, E value) { _setIndexed(index, value); } + @pragma("vm:recognized", "graph-intrinsic") void _setIndexed(int index, E value) native "List_setIndexed"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "List_getLength"; @@ -188,8 +193,10 @@ class _ImmutableList extends UnmodifiableListBase { factory _ImmutableList._from(List from, int offset, int length) native "ImmutableList_from"; + @pragma("vm:recognized", "graph-intrinsic") E operator [](int index) native "List_getIndexed"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "List_getLength"; diff --git a/sdk/lib/_internal/vm/lib/array_patch.dart b/sdk/lib/_internal/vm/lib/array_patch.dart index ef181bee908..51fe2887aea 100644 --- a/sdk/lib/_internal/vm/lib/array_patch.dart +++ b/sdk/lib/_internal/vm/lib/array_patch.dart @@ -12,6 +12,7 @@ class List { } @patch + @pragma("vm:recognized", "other") factory List([int? length]) native "List_new"; @patch diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart index 659f31f53c6..8659e793b7f 100644 --- a/sdk/lib/_internal/vm/lib/async_patch.dart +++ b/sdk/lib/_internal/vm/lib/async_patch.dart @@ -270,16 +270,19 @@ void _completeOnAsyncError( // // This method is recognized. It performs a runtime call if // FLAG_causal_async_stacks is enabled or returns `null` otherwise. +@pragma("vm:recognized", "other") @pragma("vm:prefer-inline") Object _asyncStackTraceHelper(Function async_op) native "StackTrace_asyncStackTraceHelper"; // This method is asm intrinsified. +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") void _clearAsyncThreadStackTrace() native "StackTrace_clearAsyncThreadStackTrace"; // This method is asm intrinsified. +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") void _setAsyncThreadStackTrace(StackTrace stackTrace) native "StackTrace_setAsyncThreadStackTrace"; diff --git a/sdk/lib/_internal/vm/lib/bigint_patch.dart b/sdk/lib/_internal/vm/lib/bigint_patch.dart index 5cc0befd8ee..dd627df2672 100644 --- a/sdk/lib/_internal/vm/lib/bigint_patch.dart +++ b/sdk/lib/_internal/vm/lib/bigint_patch.dart @@ -559,6 +559,7 @@ class _BigIntImpl implements BigInt { /// Does *not* clear digits below ds. /// /// Note: This function may be intrinsified. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:never-inline") static void _lsh( Uint32List xDigits, int xUsed, int n, Uint32List resultDigits) { @@ -635,6 +636,7 @@ class _BigIntImpl implements BigInt { /// resultDigits[0..resultUsed-1] = xDigits[0..xUsed-1] >> n. /// /// Note: This function may be intrinsified. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:never-inline") static void _rsh( Uint32List xDigits, int xUsed, int n, Uint32List resultDigits) { @@ -763,6 +765,7 @@ class _BigIntImpl implements BigInt { /// used >= otherUsed > 0. /// /// Note: This function may be intrinsified. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:never-inline") static void _absAdd(Uint32List digits, int used, Uint32List otherDigits, int otherUsed, Uint32List resultDigits) { @@ -785,6 +788,7 @@ class _BigIntImpl implements BigInt { /// used >= otherUsed > 0. /// /// Note: This function may be intrinsified. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:never-inline") static void _absSub(Uint32List digits, int used, Uint32List otherDigits, int otherUsed, Uint32List resultDigits) { @@ -1114,6 +1118,7 @@ class _BigIntImpl implements BigInt { /// /// Note: This function may be intrinsified. Intrinsics on 64-bit platforms /// process digit pairs at even indices and returns 2. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:never-inline") static int _mulAdd( @@ -1166,6 +1171,7 @@ class _BigIntImpl implements BigInt { /// /// Note: This function may be intrinsified. Intrinsics on 64-bit platforms /// process digit pairs at even indices and returns 2. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:never-inline") static int _sqrAdd( @@ -1288,6 +1294,7 @@ class _BigIntImpl implements BigInt { /// Estimate `args[_quotientDigit.._quotientHighDigit] = digits[i-3..i] ~/ /// args[_divisorLowTopDigit.._divisorTopDigit]`. /// Returns 2. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:never-inline") static int _estimateQuotientDigit(Uint32List args, Uint32List digits, int i) { @@ -2642,6 +2649,7 @@ class _BigIntMontgomeryReduction implements _BigIntReduction { // args[_muDigit.._muHighDigit] = // args[_rhoDigit.._rhoHighDigit] * digits[i..i+1] mod _digitBase^2. // Returns 2. + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:never-inline") static int _mulMod(Uint32List args, Uint32List digits, int i) { diff --git a/sdk/lib/_internal/vm/lib/class_id_fasta.dart b/sdk/lib/_internal/vm/lib/class_id_fasta.dart index c81bd60f69a..10280839575 100644 --- a/sdk/lib/_internal/vm/lib/class_id_fasta.dart +++ b/sdk/lib/_internal/vm/lib/class_id_fasta.dart @@ -6,6 +6,7 @@ @pragma("vm:entry-point") class ClassID { + @pragma("vm:recognized", "other") @pragma("vm:entry-point", "call") @pragma("vm:exact-result-type", "dart:core#_Smi") static int getID(Object value) native "ClassID_getID"; diff --git a/sdk/lib/_internal/vm/lib/compact_hash.dart b/sdk/lib/_internal/vm/lib/compact_hash.dart index 67ba9b2f202..db903e4c3e6 100644 --- a/sdk/lib/_internal/vm/lib/compact_hash.dart +++ b/sdk/lib/_internal/vm/lib/compact_hash.dart @@ -46,33 +46,43 @@ abstract class _HashFieldBase { // Base class for VM-internal classes; keep in sync with _HashFieldBase. abstract class _HashVMBase { + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:typed_data#_Uint32List") @pragma("vm:prefer-inline") Uint32List get _index native "LinkedHashMap_getIndex"; + @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") void set _index(Uint32List value) native "LinkedHashMap_setIndex"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get _hashMask native "LinkedHashMap_getHashMask"; + @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") void set _hashMask(int value) native "LinkedHashMap_setHashMask"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_List") @pragma("vm:prefer-inline") List get _data native "LinkedHashMap_getData"; + @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") void set _data(List value) native "LinkedHashMap_setData"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get _usedData native "LinkedHashMap_getUsedData"; + @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") void set _usedData(int value) native "LinkedHashMap_setUsedData"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get _deletedKeys native "LinkedHashMap_getDeletedKeys"; + @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") void set _deletedKeys(int value) native "LinkedHashMap_setDeletedKeys"; } diff --git a/sdk/lib/_internal/vm/lib/convert_patch.dart b/sdk/lib/_internal/vm/lib/convert_patch.dart index 6f823376fb8..851c5543145 100644 --- a/sdk/lib/_internal/vm/lib/convert_patch.dart +++ b/sdk/lib/_internal/vm/lib/convert_patch.dart @@ -1700,7 +1700,7 @@ class _Utf8Decoder { return size; } - // This method is recognized by the VM and compiled into specialized code. + @pragma("vm:recognized", "other") @pragma("vm:prefer-inline") int _scan(Uint8List bytes, int start, int end, String scanTable) { int size = 0; diff --git a/sdk/lib/_internal/vm/lib/double.dart b/sdk/lib/_internal/vm/lib/double.dart index 83b32623c45..7500050660d 100644 --- a/sdk/lib/_internal/vm/lib/double.dart +++ b/sdk/lib/_internal/vm/lib/double.dart @@ -6,36 +6,45 @@ @pragma("vm:entry-point") class _Double implements double { + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", _Double) factory _Double.fromInteger(int value) native "Double_doubleFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") int get hashCode native "Double_hashCode"; + @pragma("vm:recognized", "asm-intrinsic") int get _identityHashCode native "Double_hashCode"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", _Double) @pragma("vm:never-inline") double operator +(num other) { return _add(other.toDouble()); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Double) double _add(double other) native "Double_add"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", _Double) @pragma("vm:never-inline") double operator -(num other) { return _sub(other.toDouble()); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Double) double _sub(double other) native "Double_sub"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", _Double) @pragma("vm:never-inline") double operator *(num other) { return _mul(other.toDouble()); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Double) double _mul(double other) native "Double_mul"; @@ -46,12 +55,14 @@ class _Double implements double { @pragma("vm:non-nullable-result-type") int _trunc_div(double other) native "Double_trunc_div"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", _Double) @pragma("vm:never-inline") double operator /(num other) { return _div(other.toDouble()); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Double) double _div(double other) native "Double_div"; @@ -59,6 +70,7 @@ class _Double implements double { return _modulo(other.toDouble()); } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Double) double _modulo(double other) native "Double_modulo"; @@ -68,9 +80,11 @@ class _Double implements double { double _remainder(double other) native "Double_remainder"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Double) double operator -() native "Double_flipSignBit"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator ==(Object other) { @@ -82,12 +96,14 @@ class _Double implements double { @pragma("vm:exact-result-type", bool) bool _equalToInteger(int other) native "Double_equalToInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator <(num other) { return other > this; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator >(num other) { @@ -97,12 +113,14 @@ class _Double implements double { @pragma("vm:exact-result-type", bool) bool _greaterThan(double other) native "Double_greaterThan"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator >=(num other) { return (this == other) || (this > other); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator <=(num other) { @@ -117,6 +135,7 @@ class _Double implements double { return new _Double.fromInteger(other)._sub(this); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double _mulFromInteger(int other) { return new _Double.fromInteger(other)._mul(this); @@ -137,10 +156,13 @@ class _Double implements double { bool _greaterThanFromInteger(int other) native "Double_greaterThanFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool get isNegative native "Double_getIsNegative"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool get isInfinite native "Double_getIsInfinite"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool get isNaN native "Double_getIsNaN"; bool get isFinite => !isInfinite && !isNaN; // Can be optimized. @@ -162,12 +184,16 @@ class _Double implements double { int ceil() => ceilToDouble().toInt(); int truncate() => truncateToDouble().toInt(); + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Double) double roundToDouble() native "Double_round"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Double) double floorToDouble() native "Double_floor"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Double) double ceilToDouble() native "Double_ceil"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Double) double truncateToDouble() native "Double_truncate"; @@ -188,6 +214,7 @@ class _Double implements double { return this; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int toInt() native "Double_toInt"; diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart index 02bc8c7b2a5..79fc3a3d581 100644 --- a/sdk/lib/_internal/vm/lib/ffi_patch.dart +++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart @@ -39,12 +39,13 @@ int sizeOf() { int _sizeOf() native "Ffi_sizeOf"; -// Implemented in the method recognizer. +@pragma("vm:recognized", "other") Pointer _fromAddress(int ptr) native "Ffi_fromAddress"; // The real implementation of this function (for interface calls) lives in // BuildFfiAsFunctionCall in the Kernel frontend. No calls can actually reach // this function. +@pragma("vm:recognized", "other") DS _asFunctionInternal( Pointer> ptr) native "Ffi_asFunctionInternal"; @@ -67,6 +68,7 @@ dynamic _asExternalTypedData(Pointer ptr, int count) // // Function objects returned by this native method are not Dart instances, // so we need to use top type as a return type to avoid type check. +@pragma("vm:recognized", "other") dynamic _nativeCallbackFunction(Function target, Object? exceptionalReturn) native "Ffi_nativeCallbackFunction"; @@ -92,8 +94,8 @@ class Pointer { "Pointer.fromFunction cannot be called dynamically."); } - // Implemented in the method recognizer. @patch + @pragma("vm:recognized", "other") int get address native "Ffi_address"; // For statically known types, this is rewired. @@ -112,6 +114,7 @@ class Pointer { /// Returns an integer encoding the ABI used for size and alignment /// calculations. See pkg/vm/lib/transformations/ffi.dart. +@pragma("vm:recognized", "other") @pragma('vm:prefer-inline') int _abi() native "Recognized method: IR graph is built in the flow graph builder."; @@ -122,67 +125,91 @@ int _abi() // allocating a Pointer with in elementAt/offsetBy. Allocating these pointers // and GCing new spaces takes a lot of the benchmark time. The next speedup is // getting rid of these allocations by inlining these functions. +@pragma("vm:recognized", "other") int _loadInt8(Pointer pointer, int offsetInBytes) native "Ffi_loadInt8"; +@pragma("vm:recognized", "other") int _loadInt16(Pointer pointer, int offsetInBytes) native "Ffi_loadInt16"; +@pragma("vm:recognized", "other") int _loadInt32(Pointer pointer, int offsetInBytes) native "Ffi_loadInt32"; +@pragma("vm:recognized", "other") int _loadInt64(Pointer pointer, int offsetInBytes) native "Ffi_loadInt64"; +@pragma("vm:recognized", "other") int _loadUint8(Pointer pointer, int offsetInBytes) native "Ffi_loadUint8"; +@pragma("vm:recognized", "other") int _loadUint16(Pointer pointer, int offsetInBytes) native "Ffi_loadUint16"; +@pragma("vm:recognized", "other") int _loadUint32(Pointer pointer, int offsetInBytes) native "Ffi_loadUint32"; +@pragma("vm:recognized", "other") int _loadUint64(Pointer pointer, int offsetInBytes) native "Ffi_loadUint64"; +@pragma("vm:recognized", "other") int _loadIntPtr(Pointer pointer, int offsetInBytes) native "Ffi_loadIntPtr"; +@pragma("vm:recognized", "other") double _loadFloat(Pointer pointer, int offsetInBytes) native "Ffi_loadFloat"; +@pragma("vm:recognized", "other") double _loadDouble(Pointer pointer, int offsetInBytes) native "Ffi_loadDouble"; +@pragma("vm:recognized", "other") Pointer _loadPointer( Pointer pointer, int offsetInBytes) native "Ffi_loadPointer"; S _loadStruct(Pointer pointer, int index) native "Ffi_loadStruct"; +@pragma("vm:recognized", "other") void _storeInt8(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeInt8"; +@pragma("vm:recognized", "other") void _storeInt16(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeInt16"; +@pragma("vm:recognized", "other") void _storeInt32(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeInt32"; +@pragma("vm:recognized", "other") void _storeInt64(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeInt64"; +@pragma("vm:recognized", "other") void _storeUint8(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeUint8"; +@pragma("vm:recognized", "other") void _storeUint16(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeUint16"; +@pragma("vm:recognized", "other") void _storeUint32(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeUint32"; +@pragma("vm:recognized", "other") void _storeUint64(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeUint64"; +@pragma("vm:recognized", "other") void _storeIntPtr(Pointer pointer, int offsetInBytes, int value) native "Ffi_storeIntPtr"; +@pragma("vm:recognized", "other") void _storeFloat(Pointer pointer, int offsetInBytes, double value) native "Ffi_storeFloat"; +@pragma("vm:recognized", "other") void _storeDouble(Pointer pointer, int offsetInBytes, double value) native "Ffi_storeDouble"; +@pragma("vm:recognized", "other") void _storePointer(Pointer pointer, int offsetInBytes, Pointer value) native "Ffi_storePointer"; diff --git a/sdk/lib/_internal/vm/lib/growable_array.dart b/sdk/lib/_internal/vm/lib/growable_array.dart index 0e63557121c..62b81967e49 100644 --- a/sdk/lib/_internal/vm/lib/growable_array.dart +++ b/sdk/lib/_internal/vm/lib/growable_array.dart @@ -130,14 +130,17 @@ class _GrowableList extends ListBase { return result; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", [_GrowableList, "result-type-uses-passed-type-arguments"]) factory _GrowableList._withData(_List data) native "GrowableList_allocate"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get _capacity native "GrowableList_getCapacity"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "GrowableList_getLength"; @@ -170,16 +173,21 @@ class _GrowableList extends ListBase { _setLength(new_length); } + @pragma("vm:recognized", "graph-intrinsic") void _setLength(int new_length) native "GrowableList_setLength"; + @pragma("vm:recognized", "graph-intrinsic") void _setData(_List array) native "GrowableList_setData"; + @pragma("vm:recognized", "graph-intrinsic") T operator [](int index) native "GrowableList_getIndexed"; + @pragma("vm:recognized", "other") void operator []=(int index, T value) { _setIndexed(index, value); } + @pragma("vm:recognized", "graph-intrinsic") void _setIndexed(int index, T? value) native "GrowableList_setIndexed"; @pragma("vm:entry-point", "call") diff --git a/sdk/lib/_internal/vm/lib/identical_patch.dart b/sdk/lib/_internal/vm/lib/identical_patch.dart index 4b5743084c7..9a9ff566f37 100644 --- a/sdk/lib/_internal/vm/lib/identical_patch.dart +++ b/sdk/lib/_internal/vm/lib/identical_patch.dart @@ -5,6 +5,7 @@ // part of "core_patch.dart"; @patch +@pragma("vm:recognized", "other") @pragma("vm:exact-result-type", bool) bool identical(Object? a, Object? b) native "Identical_comparison"; diff --git a/sdk/lib/_internal/vm/lib/integers.dart b/sdk/lib/_internal/vm/lib/integers.dart index 9fd3a76d013..3ce3af5126d 100644 --- a/sdk/lib/_internal/vm/lib/integers.dart +++ b/sdk/lib/_internal/vm/lib/integers.dart @@ -5,16 +5,20 @@ // part of "core_patch.dart"; abstract class _IntegerImplementation implements int { + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") num operator +(num other) => other._addFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") num operator -(num other) => other._subFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") num operator *(num other) => other._mulFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator ~/(num other) { @@ -36,6 +40,7 @@ abstract class _IntegerImplementation implements int { return other._moduloFromInteger(this); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator -() { @@ -44,12 +49,15 @@ abstract class _IntegerImplementation implements int { return unsafeCast(0 - this); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator &(int other) => other._bitAndFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator |(int other) => other._bitOrFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator ^(int other) => other._bitXorFromInteger(this); @@ -60,24 +68,31 @@ abstract class _IntegerImplementation implements int { @pragma("vm:non-nullable-result-type") int _bitAndFromSmi(_Smi other) native "Integer_bitAndFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _bitAndFromInteger(int other) native "Integer_bitAndFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _bitOrFromInteger(int other) native "Integer_bitOrFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _bitXorFromInteger(int other) native "Integer_bitXorFromInteger"; @pragma("vm:non-nullable-result-type") int _shrFromInteger(int other) native "Integer_shrFromInteger"; @pragma("vm:non-nullable-result-type") int _shlFromInteger(int other) native "Integer_shlFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _addFromInteger(int other) native "Integer_addFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _subFromInteger(int other) native "Integer_subFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _mulFromInteger(int other) native "Integer_mulFromInteger"; @pragma("vm:non-nullable-result-type") int _truncDivFromInteger(int other) native "Integer_truncDivFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") int _moduloFromInteger(int other) native "Integer_moduloFromInteger"; int _remainderFromInteger(int other) { @@ -86,41 +101,49 @@ abstract class _IntegerImplementation implements int { return unsafeCast(other - (other ~/ this) * this); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator >>(int other) => other._shrFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:non-nullable-result-type") @pragma("vm:never-inline") int operator <<(int other) => other._shlFromInteger(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator <(num other) { return other > this; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator >(num other) { return other._greaterThanFromInteger(this); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator >=(num other) { return (this == other) || (this > other); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator <=(num other) { return (this == other) || (this < other); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool _greaterThanFromInteger(int other) native "Integer_greaterThanFromInteger"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:never-inline") bool operator ==(Object other) { @@ -130,6 +153,7 @@ abstract class _IntegerImplementation implements int { return false; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool _equalToInteger(int other) native "Integer_equalToInteger"; int abs() { @@ -137,7 +161,11 @@ abstract class _IntegerImplementation implements int { } int get sign { - return (this > 0) ? 1 : (this < 0) ? -1 : 0; + return (this > 0) + ? 1 + : (this < 0) + ? -1 + : 0; } bool get isEven => ((this & 1) == 0); @@ -268,6 +296,7 @@ abstract class _IntegerImplementation implements int { return this; } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Double) double toDouble() { return new _Double.fromInteger(this); @@ -515,13 +544,16 @@ class _Smi extends _IntegerImplementation { int get hashCode => this; int get _identityHashCode => this; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator ~() native "Smi_bitNegate"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int get bitLength native "Smi_bitLength"; int operator &(int other) => other._bitAndFromSmi(this); + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int _bitAndFromSmi(_Smi other) native "Smi_bitAndFromSmi"; diff --git a/sdk/lib/_internal/vm/lib/internal_patch.dart b/sdk/lib/_internal/vm/lib/internal_patch.dart index ad5f5b799aa..c30344268e2 100644 --- a/sdk/lib/_internal/vm/lib/internal_patch.dart +++ b/sdk/lib/_internal/vm/lib/internal_patch.dart @@ -36,19 +36,21 @@ Object? extractTypeArguments(T instance, Function extract) native "Internal_extractTypeArguments"; /// The returned string is a [_OneByteString] with uninitialized content. +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") String allocateOneByteString(int length) native "Internal_allocateOneByteString"; /// The [string] must be a [_OneByteString]. The [index] must be valid. +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") void writeIntoOneByteString(String string, int index, int codePoint) native "Internal_writeIntoOneByteString"; -/// This function is recognized by the VM and compiled into specialized code. /// It is assumed that [from] is a native [Uint8List] class and [to] is a /// [_OneByteString]. The [fromStart] and [toStart] indices together with the /// [length] must specify ranges within the bounds of the list / string. +@pragma("vm:recognized", "other") @pragma("vm:prefer-inline") void copyRangeFromUint8ListToOneByteString( Uint8List from, String to, int fromStart, int toStart, int length) { @@ -58,11 +60,13 @@ void copyRangeFromUint8ListToOneByteString( } /// The returned string is a [_TwoByteString] with uninitialized content. +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") String allocateTwoByteString(int length) native "Internal_allocateTwoByteString"; /// The [string] must be a [_TwoByteString]. The [index] must be valid. +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") void writeIntoTwoByteString(String string, int index, int codePoint) native "Internal_writeIntoTwoByteString"; @@ -106,6 +110,7 @@ final bool is64Bit = _inquireIs64Bit(); bool _inquireIs64Bit() native "Internal_inquireIs64Bit"; +@pragma("vm:recognized", "other") @pragma("vm:entry-point", "call") @pragma("vm:exact-result-type", bool) @pragma("vm:prefer-inline") @@ -163,7 +168,7 @@ T unsafeCast(Object? v) native "Internal_unsafeCast"; // This function can be used to keep an object alive til that point. // -// This is implemented by a recognized method. +@pragma("vm:recognized", "other") @pragma('vm:prefer-inline') void reachabilityFence(Object object) native "Internal_reachabilityFence"; diff --git a/sdk/lib/_internal/vm/lib/math_patch.dart b/sdk/lib/_internal/vm/lib/math_patch.dart index b41daad7009..0e384ca9096 100644 --- a/sdk/lib/_internal/vm/lib/math_patch.dart +++ b/sdk/lib/_internal/vm/lib/math_patch.dart @@ -14,6 +14,7 @@ import "dart:typed_data" show Uint32List; /// There are no parts of this patch library. @patch +@pragma("vm:recognized", "other") @pragma("vm:prefer-inline") T min(T a, T b) { if (a > b) return b; @@ -38,6 +39,7 @@ T min(T a, T b) { } @patch +@pragma("vm:recognized", "other") @pragma("vm:prefer-inline") T max(T a, T b) { if (a > b) return a; @@ -74,6 +76,7 @@ num pow(num x, num exponent) { return _doublePow(x.toDouble(), exponent.toDouble()); } +@pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Double") double _doublePow(double base, double exponent) { if (exponent == 0.0) { @@ -100,6 +103,7 @@ double _doublePow(double base, double exponent) { double _pow(double base, double exponent) native "Math_doublePow"; +@pragma("vm:recognized", "other") int _intPow(int base, int exponent) { // Exponentiation by squaring. int result = 1; @@ -117,34 +121,42 @@ int _intPow(int base, int exponent) { } @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble()); @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double sin(num radians) => _sin(radians.toDouble()); @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double cos(num radians) => _cos(radians.toDouble()); @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double tan(num radians) => _tan(radians.toDouble()); @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double acos(num x) => _acos(x.toDouble()); @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double asin(num x) => _asin(x.toDouble()); @patch +@pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double atan(num x) => _atan(x.toDouble()); @patch +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") @pragma("vm:never-inline") double sqrt(num x) => _sqrt(x.toDouble()); @@ -208,6 +220,7 @@ class _Random implements Random { // This is a native to prevent 64-bit operations in Dart, which // fail with --throw_on_javascript_int_overflow. // TODO(regis): Implement in Dart and remove Random_nextState in math.cc. + @pragma("vm:recognized", "asm-intrinsic") void _nextState() native "Random_nextState"; int nextInt(int max) { diff --git a/sdk/lib/_internal/vm/lib/object_patch.dart b/sdk/lib/_internal/vm/lib/object_patch.dart index e862e5cd1a5..fe230699a2e 100644 --- a/sdk/lib/_internal/vm/lib/object_patch.dart +++ b/sdk/lib/_internal/vm/lib/object_patch.dart @@ -4,8 +4,10 @@ // part of "core_patch.dart"; +@pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int _getHash(obj) native "Object_getHash"; +@pragma("vm:recognized", "asm-intrinsic") void _setHash(obj, hash) native "Object_setHash"; @patch @@ -13,6 +15,7 @@ void _setHash(obj, hash) native "Object_setHash"; class Object { // The VM has its own implementation of equals. @patch + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) @pragma("vm:prefer-inline") bool operator ==(Object other) native "Object_equals"; @@ -52,9 +55,11 @@ class Object { } @patch + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Type") Type get runtimeType native "Object_runtimeType"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:entry-point", "call") @pragma("vm:exact-result-type", bool) static bool _haveSameRuntimeType(a, b) native "Object_haveSameRuntimeType"; diff --git a/sdk/lib/_internal/vm/lib/profiler.dart b/sdk/lib/_internal/vm/lib/profiler.dart index 745eaa5f175..812916e648d 100644 --- a/sdk/lib/_internal/vm/lib/profiler.dart +++ b/sdk/lib/_internal/vm/lib/profiler.dart @@ -18,11 +18,14 @@ class UserTag { class _UserTag implements UserTag { factory _UserTag(String label) native "UserTag_new"; String get label native "UserTag_label"; + @pragma("vm:recognized", "asm-intrinsic") UserTag makeCurrent() native "UserTag_makeCurrent"; } @patch UserTag getCurrentTag() => _getCurrentTag(); +@pragma("vm:recognized", "asm-intrinsic") UserTag _getCurrentTag() native "Profiler_getCurrentTag"; +@pragma("vm:recognized", "asm-intrinsic") UserTag _getDefaultTag() native "UserTag_defaultTag"; diff --git a/sdk/lib/_internal/vm/lib/regexp_patch.dart b/sdk/lib/_internal/vm/lib/regexp_patch.dart index 153080ba39c..73e38a1791c 100644 --- a/sdk/lib/_internal/vm/lib/regexp_patch.dart +++ b/sdk/lib/_internal/vm/lib/regexp_patch.dart @@ -350,9 +350,11 @@ class _RegExp implements RegExp { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]; + @pragma("vm:recognized", "asm-intrinsic") List? _ExecuteMatch(String str, int start_index) native "RegExp_ExecuteMatch"; + @pragma("vm:recognized", "asm-intrinsic") List? _ExecuteMatchSticky(String str, int start_index) native "RegExp_ExecuteMatchSticky"; } diff --git a/sdk/lib/_internal/vm/lib/string_patch.dart b/sdk/lib/_internal/vm/lib/string_patch.dart index 5d6612d1051..18c1b56a183 100644 --- a/sdk/lib/_internal/vm/lib/string_patch.dart +++ b/sdk/lib/_internal/vm/lib/string_patch.dart @@ -94,9 +94,11 @@ abstract class _StringBase implements String { throw new UnsupportedError("_StringBase can't be instaniated"); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int get hashCode native "String_getHashCode"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int get _identityHashCode native "String_getHashCode"; @@ -249,14 +251,17 @@ abstract class _StringBase implements String { static String _createFromCodePoints(List codePoints, int start, int end) native "StringBase_createFromCodePoints"; + @pragma("vm:recognized", "asm-intrinsic") String operator [](int index) native "String_charAt"; int codeUnitAt(int index); // Implemented in the subclasses. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "String_getLength"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool get isEmpty { return this.length == 0; @@ -306,6 +311,7 @@ abstract class _StringBase implements String { return 0; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool _substringMatches(int start, String other) { if (other.isEmpty) return true; @@ -838,6 +844,7 @@ abstract class _StringBase implements String { * into a result string. * Modifies the input list if it contains non-`String` values. */ + @pragma("vm:recognized", "other") @pragma("vm:entry-point", "call") static String _interpolate(final List values) { final numValues = values.length; @@ -955,9 +962,11 @@ class _OneByteString extends _StringBase { throw "Unreachable"; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int get hashCode native "String_getHashCode"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int codeUnitAt(int index) native "String_codeUnitAt"; @@ -965,11 +974,13 @@ class _OneByteString extends _StringBase { return _StringBase._isOneByteWhitespace(codeUnit); } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool operator ==(Object other) { return super == other; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", _OneByteString) String _substringUncheckedNative(int startIndex, int endIndex) native "OneByteString_substringUnchecked"; @@ -1291,9 +1302,11 @@ class _TwoByteString extends _StringBase { return _StringBase._isTwoByteWhitespace(codeUnit); } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int codeUnitAt(int index) native "String_codeUnitAt"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool operator ==(Object other) { return super == other; @@ -1310,6 +1323,7 @@ class _ExternalOneByteString extends _StringBase { return _StringBase._isOneByteWhitespace(codeUnit); } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int codeUnitAt(int index) native "String_codeUnitAt"; @@ -1328,6 +1342,7 @@ class _ExternalTwoByteString extends _StringBase { return _StringBase._isTwoByteWhitespace(codeUnit); } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int codeUnitAt(int index) native "String_codeUnitAt"; diff --git a/sdk/lib/_internal/vm/lib/type_patch.dart b/sdk/lib/_internal/vm/lib/type_patch.dart index 1b8f3c1cab9..52be7752587 100644 --- a/sdk/lib/_internal/vm/lib/type_patch.dart +++ b/sdk/lib/_internal/vm/lib/type_patch.dart @@ -18,9 +18,11 @@ class _Type extends _AbstractType { throw "Unreachable"; } + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int get hashCode native "Type_getHashCode"; + @pragma("vm:recognized", "asm-intrinsic") @pragma("vm:exact-result-type", bool) bool operator ==(other) native "Type_equality"; } diff --git a/sdk/lib/_internal/vm/lib/typed_data_patch.dart b/sdk/lib/_internal/vm/lib/typed_data_patch.dart index ccd3183dee3..8139cb5f435 100644 --- a/sdk/lib/_internal/vm/lib/typed_data_patch.dart +++ b/sdk/lib/_internal/vm/lib/typed_data_patch.dart @@ -36,6 +36,7 @@ import 'dart:math' show Random; @patch class ByteData implements TypedData { @patch + @pragma("vm:recognized", "other") @pragma("vm:entry-point") factory ByteData(int length) { final list = new Uint8List(length) as _TypedList; @@ -2066,57 +2067,82 @@ abstract class _TypedList extends _TypedListBase { // Methods implementing the collection interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "TypedData_length"; // Internal utility methods. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") int _getInt8(int offsetInBytes) native "TypedData_GetInt8"; + @pragma("vm:recognized", "other") void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") int _getUint8(int offsetInBytes) native "TypedData_GetUint8"; + @pragma("vm:recognized", "other") void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") int _getInt16(int offsetInBytes) native "TypedData_GetInt16"; + @pragma("vm:recognized", "other") void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") int _getUint16(int offsetInBytes) native "TypedData_GetUint16"; + @pragma("vm:recognized", "other") void _setUint16(int offsetInBytes, int value) native "TypedData_SetUint16"; + @pragma("vm:recognized", "other") int _getInt32(int offsetInBytes) native "TypedData_GetInt32"; + @pragma("vm:recognized", "other") void _setInt32(int offsetInBytes, int value) native "TypedData_SetInt32"; + @pragma("vm:recognized", "other") int _getUint32(int offsetInBytes) native "TypedData_GetUint32"; + @pragma("vm:recognized", "other") void _setUint32(int offsetInBytes, int value) native "TypedData_SetUint32"; + @pragma("vm:recognized", "other") int _getInt64(int offsetInBytes) native "TypedData_GetInt64"; + @pragma("vm:recognized", "other") void _setInt64(int offsetInBytes, int value) native "TypedData_SetInt64"; + @pragma("vm:recognized", "other") int _getUint64(int offsetInBytes) native "TypedData_GetUint64"; + @pragma("vm:recognized", "other") void _setUint64(int offsetInBytes, int value) native "TypedData_SetUint64"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Double") double _getFloat32(int offsetInBytes) native "TypedData_GetFloat32"; + @pragma("vm:recognized", "other") void _setFloat32(int offsetInBytes, double value) native "TypedData_SetFloat32"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Double") double _getFloat64(int offsetInBytes) native "TypedData_GetFloat64"; + @pragma("vm:recognized", "other") void _setFloat64(int offsetInBytes, double value) native "TypedData_SetFloat64"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 _getFloat32x4(int offsetInBytes) native "TypedData_GetFloat32x4"; + @pragma("vm:recognized", "other") void _setFloat32x4(int offsetInBytes, Float32x4 value) native "TypedData_SetFloat32x4"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4"; + @pragma("vm:recognized", "other") void _setInt32x4(int offsetInBytes, Int32x4 value) native "TypedData_SetInt32x4"; @@ -2145,6 +2171,7 @@ abstract class _TypedList extends _TypedListBase { @patch class Int8List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int8List) @pragma("vm:prefer-inline") factory Int8List(int length) native "TypedData_Int8Array_new"; @@ -2165,6 +2192,7 @@ class _Int8List extends _TypedList } // Method(s) implementing List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -2173,6 +2201,7 @@ class _Int8List extends _TypedList return _getInt8(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2194,6 +2223,7 @@ class _Int8List extends _TypedList @patch class Uint8List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint8List) @pragma("vm:prefer-inline") factory Uint8List(int length) native "TypedData_Uint8Array_new"; @@ -2214,6 +2244,7 @@ class _Uint8List extends _TypedList } // Methods implementing List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -2222,6 +2253,7 @@ class _Uint8List extends _TypedList return _getUint8(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2243,6 +2275,7 @@ class _Uint8List extends _TypedList @patch class Uint8ClampedList { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint8ClampedList) @pragma("vm:prefer-inline") factory Uint8ClampedList(int length) native "TypedData_Uint8ClampedArray_new"; @@ -2263,6 +2296,7 @@ class _Uint8ClampedList extends _TypedList } // Methods implementing List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -2271,6 +2305,7 @@ class _Uint8ClampedList extends _TypedList return _getUint8(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2292,6 +2327,7 @@ class _Uint8ClampedList extends _TypedList @patch class Int16List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int16List) @pragma("vm:prefer-inline") factory Int16List(int length) native "TypedData_Int16Array_new"; @@ -2312,6 +2348,7 @@ class _Int16List extends _TypedList } // Method(s) implementing List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -2320,6 +2357,7 @@ class _Int16List extends _TypedList return _getIndexedInt16(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2361,6 +2399,7 @@ class _Int16List extends _TypedList @patch class Uint16List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint16List) @pragma("vm:prefer-inline") factory Uint16List(int length) native "TypedData_Uint16Array_new"; @@ -2381,6 +2420,7 @@ class _Uint16List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -2389,6 +2429,7 @@ class _Uint16List extends _TypedList return _getIndexedUint16(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2430,6 +2471,7 @@ class _Uint16List extends _TypedList @patch class Int32List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32List) @pragma("vm:prefer-inline") factory Int32List(int length) native "TypedData_Int32Array_new"; @@ -2450,6 +2492,7 @@ class _Int32List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") int operator [](int index) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2457,6 +2500,7 @@ class _Int32List extends _TypedList return _getIndexedInt32(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2486,6 +2530,7 @@ class _Int32List extends _TypedList @patch class Uint32List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint32List) @pragma("vm:prefer-inline") factory Uint32List(int length) native "TypedData_Uint32Array_new"; @@ -2506,6 +2551,7 @@ class _Uint32List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") int operator [](int index) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2513,6 +2559,7 @@ class _Uint32List extends _TypedList return _getIndexedUint32(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2542,6 +2589,7 @@ class _Uint32List extends _TypedList @patch class Int64List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int64List) @pragma("vm:prefer-inline") factory Int64List(int length) native "TypedData_Int64Array_new"; @@ -2562,6 +2610,7 @@ class _Int64List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") int operator [](int index) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2569,6 +2618,7 @@ class _Int64List extends _TypedList return _getIndexedInt64(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2598,6 +2648,7 @@ class _Int64List extends _TypedList @patch class Uint64List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint64List) @pragma("vm:prefer-inline") factory Uint64List(int length) native "TypedData_Uint64Array_new"; @@ -2618,6 +2669,7 @@ class _Uint64List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") int operator [](int index) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2625,6 +2677,7 @@ class _Uint64List extends _TypedList return _getIndexedUint64(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2654,6 +2707,7 @@ class _Uint64List extends _TypedList @patch class Float32List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32List) @pragma("vm:prefer-inline") factory Float32List(int length) native "TypedData_Float32Array_new"; @@ -2674,6 +2728,7 @@ class _Float32List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double operator [](int index) { if (index < 0 || index >= length) { @@ -2682,6 +2737,7 @@ class _Float32List extends _TypedList return _getIndexedFloat32(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, double value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2711,6 +2767,7 @@ class _Float32List extends _TypedList @patch class Float64List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64List) @pragma("vm:prefer-inline") factory Float64List(int length) native "TypedData_Float64Array_new"; @@ -2731,6 +2788,7 @@ class _Float64List extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double operator [](int index) { if (index < 0 || index >= length) { @@ -2739,6 +2797,7 @@ class _Float64List extends _TypedList return _getIndexedFloat64(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, double value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2768,6 +2827,7 @@ class _Float64List extends _TypedList @patch class Float32x4List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4List) @pragma("vm:prefer-inline") factory Float32x4List(int length) native "TypedData_Float32x4Array_new"; @@ -2787,6 +2847,7 @@ class _Float32x4List extends _TypedList throw "Unreachable"; } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Float32x4) Float32x4 operator [](int index) { if (index < 0 || index >= length) { @@ -2795,6 +2856,7 @@ class _Float32x4List extends _TypedList return _getIndexedFloat32x4(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, Float32x4 value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2824,6 +2886,7 @@ class _Float32x4List extends _TypedList @patch class Int32x4List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4List) @pragma("vm:prefer-inline") factory Int32x4List(int length) native "TypedData_Int32x4Array_new"; @@ -2843,6 +2906,7 @@ class _Int32x4List extends _TypedList throw "Unreachable"; } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Int32x4) Int32x4 operator [](int index) { if (index < 0 || index >= length) { @@ -2851,6 +2915,7 @@ class _Int32x4List extends _TypedList return _getIndexedInt32x4(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, Int32x4 value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2880,6 +2945,7 @@ class _Int32x4List extends _TypedList @patch class Float64x2List { @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2List) @pragma("vm:prefer-inline") factory Float64x2List(int length) native "TypedData_Float64x2Array_new"; @@ -2899,6 +2965,7 @@ class _Float64x2List extends _TypedList throw "Unreachable"; } + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Float64x2) Float64x2 operator [](int index) { if (index < 0 || index >= length) { @@ -2907,6 +2974,7 @@ class _Float64x2List extends _TypedList return _getIndexedFloat64x2(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, Float64x2 value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -2976,6 +3044,7 @@ class _ExternalUint8Array extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -2984,6 +3053,7 @@ class _ExternalUint8Array extends _TypedList return _getUint8(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -3011,6 +3081,7 @@ class _ExternalUint8ClampedArray extends _TypedList } // Method(s) implementing the List interface. + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { if (index < 0 || index >= length) { @@ -3019,6 +3090,7 @@ class _ExternalUint8ClampedArray extends _TypedList return _getUint8(index); } + @pragma("vm:recognized", "graph-intrinsic") void operator []=(int index, int value) { if (index < 0 || index >= length) { throw new RangeError.index(index, this, "index"); @@ -3511,6 +3583,7 @@ class Float32x4 { return _Float32x4FromDoubles(x, y, z, w); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) static _Float32x4 _Float32x4FromDoubles( double x, double y, double z, double w) native "Float32x4_fromDoubles"; @@ -3522,65 +3595,90 @@ class Float32x4 { return _Float32x4Splat(v); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) static _Float32x4 _Float32x4Splat(double v) native "Float32x4_splat"; @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) factory Float32x4.zero() native "Float32x4_zero"; @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) factory Float32x4.fromInt32x4Bits(Int32x4 x) native "Float32x4_fromInt32x4Bits"; @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) factory Float32x4.fromFloat64x2(Float64x2 v) native "Float32x4_fromFloat64x2"; } @pragma("vm:entry-point") class _Float32x4 implements Float32x4 { + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Float32x4) Float32x4 operator +(Float32x4 other) native "Float32x4_add"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 operator -() native "Float32x4_negate"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Float32x4) Float32x4 operator -(Float32x4 other) native "Float32x4_sub"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", _Float32x4) Float32x4 operator *(Float32x4 other) native "Float32x4_mul"; + @pragma("vm:recognized", "graph-intrinsic") Float32x4 operator /(Float32x4 other) native "Float32x4_div"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 lessThan(Float32x4 other) native "Float32x4_cmplt"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 lessThanOrEqual(Float32x4 other) native "Float32x4_cmplte"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 greaterThan(Float32x4 other) native "Float32x4_cmpgt"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 greaterThanOrEqual(Float32x4 other) native "Float32x4_cmpgte"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 equal(Float32x4 other) native "Float32x4_cmpequal"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 notEqual(Float32x4 other) native "Float32x4_cmpnequal"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 scale(double s) native "Float32x4_scale"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 abs() native "Float32x4_abs"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit) native "Float32x4_clamp"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double get x native "Float32x4_getX"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double get y native "Float32x4_getY"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double get z native "Float32x4_getZ"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Double") double get w native "Float32x4_getW"; + @pragma("vm:recognized", "other") int get signMask native "Float32x4_getSignMask"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 shuffle(int mask) native "Float32x4_shuffle"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 shuffleMix(Float32x4 zw, int mask) native "Float32x4_shuffleMix"; @@ -3590,6 +3688,7 @@ class _Float32x4 implements Float32x4 { return _withX(x); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 _withX(double x) native "Float32x4_setX"; @@ -3599,6 +3698,7 @@ class _Float32x4 implements Float32x4 { return _withY(y); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 _withY(double y) native "Float32x4_setY"; @@ -3608,6 +3708,7 @@ class _Float32x4 implements Float32x4 { return _withZ(z); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 _withZ(double z) native "Float32x4_setZ"; @@ -3617,17 +3718,23 @@ class _Float32x4 implements Float32x4 { return _withW(w); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 _withW(double w) native "Float32x4_setW"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 min(Float32x4 other) native "Float32x4_min"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 max(Float32x4 other) native "Float32x4_max"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 sqrt() native "Float32x4_sqrt"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 reciprocal() native "Float32x4_reciprocal"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 reciprocalSqrt() native "Float32x4_reciprocalSqrt"; } @@ -3644,6 +3751,7 @@ class Int32x4 { return _Int32x4FromInts(x, y, z, w); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) static _Int32x4 _Int32x4FromInts(int x, int y, int z, int w) native "Int32x4_fromInts"; @@ -3658,11 +3766,13 @@ class Int32x4 { return _Int32x4FromBools(x, y, z, w); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) static _Int32x4 _Int32x4FromBools(bool x, bool y, bool z, bool w) native "Int32x4_fromBools"; @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) factory Int32x4.fromFloat32x4Bits(Float32x4 x) native "Int32x4_fromFloat32x4Bits"; @@ -3679,9 +3789,12 @@ class _Int32x4 implements Int32x4 { int get y native "Int32x4_getY"; int get z native "Int32x4_getZ"; int get w native "Int32x4_getW"; + @pragma("vm:recognized", "other") int get signMask native "Int32x4_getSignMask"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 shuffle(int mask) native "Int32x4_shuffle"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 shuffleMix(Int32x4 zw, int mask) native "Int32x4_shuffleMix"; @@ -3721,12 +3834,16 @@ class _Int32x4 implements Int32x4 { @pragma("vm:exact-result-type", _Int32x4) Int32x4 _withW(int w) native "Int32x4_setW"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", bool) bool get flagX native "Int32x4_getFlagX"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", bool) bool get flagY native "Int32x4_getFlagY"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", bool) bool get flagZ native "Int32x4_getFlagZ"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", bool) bool get flagW native "Int32x4_getFlagW"; @@ -3736,6 +3853,7 @@ class _Int32x4 implements Int32x4 { return _withFlagX(x); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 _withFlagX(bool x) native "Int32x4_setFlagX"; @@ -3745,6 +3863,7 @@ class _Int32x4 implements Int32x4 { return _withFlagY(y); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 _withFlagY(bool y) native "Int32x4_setFlagY"; @@ -3754,6 +3873,7 @@ class _Int32x4 implements Int32x4 { return _withFlagZ(z); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 _withFlagZ(bool z) native "Int32x4_setFlagZ"; @@ -3763,9 +3883,11 @@ class _Int32x4 implements Int32x4 { return _withFlagW(w); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4) Int32x4 _withFlagW(bool w) native "Int32x4_setFlagW"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4) Float32x4 select(Float32x4 trueValue, Float32x4 falseValue) native "Int32x4_select"; @@ -3781,6 +3903,7 @@ class Float64x2 { return _Float64x2FromDoubles(x, y); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) static _Float64x2 _Float64x2FromDoubles(double x, double y) native "Float64x2_fromDoubles"; @@ -3792,36 +3915,49 @@ class Float64x2 { return _Float64x2Splat(v); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) static _Float64x2 _Float64x2Splat(double v) native "Float64x2_splat"; @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) factory Float64x2.zero() native "Float64x2_zero"; @patch + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) factory Float64x2.fromFloat32x4(Float32x4 v) native "Float64x2_fromFloat32x4"; } @pragma("vm:entry-point") class _Float64x2 implements Float64x2 { + @pragma("vm:recognized", "graph-intrinsic") Float64x2 operator +(Float64x2 other) native "Float64x2_add"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 operator -() native "Float64x2_negate"; + @pragma("vm:recognized", "graph-intrinsic") Float64x2 operator -(Float64x2 other) native "Float64x2_sub"; + @pragma("vm:recognized", "graph-intrinsic") Float64x2 operator *(Float64x2 other) native "Float64x2_mul"; + @pragma("vm:recognized", "graph-intrinsic") Float64x2 operator /(Float64x2 other) native "Float64x2_div"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 scale(double s) native "Float64x2_scale"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 abs() native "Float64x2_abs"; Float64x2 clamp(Float64x2 lowerLimit, Float64x2 upperLimit) native "Float64x2_clamp"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Double") double get x native "Float64x2_getX"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Double") double get y native "Float64x2_getY"; + @pragma("vm:recognized", "other") int get signMask native "Float64x2_getSignMask"; @pragma("vm:prefer-inline") @@ -3830,6 +3966,7 @@ class _Float64x2 implements Float64x2 { return _withX(x); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 _withX(double x) native "Float64x2_setX"; @@ -3839,13 +3976,17 @@ class _Float64x2 implements Float64x2 { return _withY(y); } + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 _withY(double y) native "Float64x2_setY"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 min(Float64x2 other) native "Float64x2_min"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 max(Float64x2 other) native "Float64x2_max"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2) Float64x2 sqrt() native "Float64x2_sqrt"; } @@ -3892,14 +4033,17 @@ abstract class _TypedListView extends _TypedListBase implements TypedData { return _typedData.buffer; } + @pragma("vm:recognized", "other") @pragma("vm:non-nullable-result-type") @pragma("vm:prefer-inline") _TypedList get _typedData native "TypedDataView_typedData"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get offsetInBytes native "TypedDataView_offsetInBytes"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "TypedDataView_length"; @@ -3910,6 +4054,7 @@ class _Int8ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Int8List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int8ArrayView) factory _Int8ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Int8ArrayView_new"; @@ -3949,6 +4094,7 @@ class _Uint8ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Uint8List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint8ArrayView) factory _Uint8ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Uint8ArrayView_new"; @@ -3988,6 +4134,7 @@ class _Uint8ClampedArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Uint8ClampedList { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint8ClampedArrayView) factory _Uint8ClampedArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Uint8ClampedArrayView_new"; @@ -4027,6 +4174,7 @@ class _Int16ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Int16List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int16ArrayView) factory _Int16ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Int16ArrayView_new"; @@ -4079,6 +4227,7 @@ class _Uint16ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Uint16List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint16ArrayView) factory _Uint16ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Uint16ArrayView_new"; @@ -4132,6 +4281,7 @@ class _Int32ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Int32List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32ArrayView) factory _Int32ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Int32ArrayView_new"; @@ -4171,6 +4321,7 @@ class _Uint32ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Uint32List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint32ArrayView) factory _Uint32ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Uint32ArrayView_new"; @@ -4210,6 +4361,7 @@ class _Int64ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Int64List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int64ArrayView) factory _Int64ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Int64ArrayView_new"; @@ -4249,6 +4401,7 @@ class _Uint64ArrayView extends _TypedListView with _IntListMixin, _TypedIntListMixin implements Uint64List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Uint64ArrayView) factory _Uint64ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Uint64ArrayView_new"; @@ -4288,6 +4441,7 @@ class _Float32ArrayView extends _TypedListView with _DoubleListMixin, _TypedDoubleListMixin implements Float32List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32ArrayView) factory _Float32ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Float32ArrayView_new"; @@ -4327,6 +4481,7 @@ class _Float64ArrayView extends _TypedListView with _DoubleListMixin, _TypedDoubleListMixin implements Float64List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64ArrayView) factory _Float64ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Float64ArrayView_new"; @@ -4366,6 +4521,7 @@ class _Float32x4ArrayView extends _TypedListView with _Float32x4ListMixin implements Float32x4List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float32x4ArrayView) factory _Float32x4ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Float32x4ArrayView_new"; @@ -4403,6 +4559,7 @@ class _Int32x4ArrayView extends _TypedListView with _Int32x4ListMixin implements Int32x4List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Int32x4ArrayView) factory _Int32x4ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Int32x4ArrayView_new"; @@ -4440,6 +4597,7 @@ class _Float64x2ArrayView extends _TypedListView with _Float64x2ListMixin implements Float64x2List { // Constructor. + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _Float64x2ArrayView) factory _Float64x2ArrayView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_Float64x2ArrayView_new"; @@ -4474,6 +4632,7 @@ class _Float64x2ArrayView extends _TypedListView @pragma("vm:entry-point") class _ByteDataView implements ByteData { + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", _ByteDataView) factory _ByteDataView._(_TypedList buffer, int offsetInBytes, int length) native "TypedDataView_ByteDataView_new"; @@ -4720,14 +4879,17 @@ class _ByteDataView implements ByteData { _typedData._setFloat32x4(offsetInBytes + byteOffset, value); } + @pragma("vm:recognized", "other") @pragma("vm:non-nullable-result-type") @pragma("vm:prefer-inline") _TypedList get _typedData native "TypedDataView_typedData"; + @pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get offsetInBytes native "TypedDataView_offsetInBytes"; + @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") @pragma("vm:prefer-inline") int get length native "TypedDataView_length"; @@ -4773,6 +4935,7 @@ int _toUint8(int value) { return value & 0xFF; } +@pragma("vm:recognized", "other") @pragma("vm:exact-result-type", "dart:core#_Smi") int _toClampedUint8(int value) { if (value < 0) return 0; diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart index 0e92b2e3943..0d64fc805c1 100644 --- a/sdk/lib/async/future.dart +++ b/sdk/lib/async/future.dart @@ -361,6 +361,7 @@ abstract class Future { * The call to [cleanUp] should not throw. If it does, the error will be an * uncaught asynchronous error. */ + @pragma("vm:recognized", "other") @pragma("vm:entry-point") static Future> wait(Iterable> futures, {bool eagerError = false, void cleanUp(T successValue)?}) { diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart index 0d38c61cdde..1b3e02f3ae6 100644 --- a/sdk/lib/async/future_impl.dart +++ b/sdk/lib/async/future_impl.dart @@ -768,6 +768,7 @@ class _Future implements Future { } } + @pragma("vm:recognized", "other") @pragma("vm:entry-point") Future timeout(Duration timeLimit, {FutureOr onTimeout()?}) { if (_isComplete) return new _Future.immediate(this); diff --git a/sdk/lib/core/object.dart b/sdk/lib/core/object.dart index 0f7d97bdc8e..b55d80ddad4 100644 --- a/sdk/lib/core/object.dart +++ b/sdk/lib/core/object.dart @@ -27,6 +27,7 @@ class Object { * through their identity. An [Object] instance is equal to itself * only. */ + @pragma("vm:recognized", "other") const Object(); /** diff --git a/sdk/lib/developer/timeline.dart b/sdk/lib/developer/timeline.dart index cc9cf4045ee..aaa0ee4b9a8 100644 --- a/sdk/lib/developer/timeline.dart +++ b/sdk/lib/developer/timeline.dart @@ -364,6 +364,7 @@ String _argumentsAsJson(Map? arguments) { } /// Returns true if the Dart Timeline stream is enabled. +@pragma("vm:recognized", "asm-intrinsic") external bool _isDartStreamEnabled(); /// Returns the next async task id.