f955b82a92
This CL adds support for unboxing of return values of getters and therefore completes the work on unboxing support for normal members (closures are still missing). As with existing unboxing support for methods and setters, we utilize TFA information to proof a getter will always return non-nullable int/double. We then make such a getter return unboxed int/double. If there are dynamic calls to the getter a dyn:get:* forwarder will be created which performs boxing of the return value. Overall this reduces RX by eliminating BoxInt64 instructions. It sometimes increases metadata due to more dyn:get:* function objects. => On our main size benchmark targets show no significant change. Issue https://github.com/dart-lang/sdk/issues/40876 Change-Id: If7450ef7e5e3fc9c2e0eaa6b86ffa817699a7e17 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/154329 Commit-Queue: Martin Kustermann <kustermann@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com>
21 lines
785 B
Dart
21 lines
785 B
Dart
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'dart:typed_data';
|
|
|
|
@pragma('vm:never-inline')
|
|
double getDoubleWithHeapObjectTag() {
|
|
final bd = ByteData(8);
|
|
bd.setUint64(0, 0x8000000180000001, Endian.host);
|
|
final double v = bd.getFloat64(0, Endian.host);
|
|
return v;
|
|
}
|
|
|
|
// Make an integer that would look like an object pointer (irrespective of
|
|
// we compile to 32-bit or 64-bit and whether we use little or big endian
|
|
// encoding of the integer).
|
|
int get integerFieldValue =>
|
|
int.parse('1') == 1 ? constIntegerFieldValue : 0x8000900180009001;
|
|
const int constIntegerFieldValue = 0x8000000180000001;
|