Version 2.11.0-229.0.dev
Merge commit '3191b4599878f793616c72cec2fb9cf479e6f5a0' into 'dev'
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
index 2a3bf26..c1e27d7 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
@@ -14,7 +14,7 @@
field ffi::Pointer<self::Coordinate*>* next;
static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate*
;
- abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
index 0e669c0..a853421 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
@@ -20,7 +20,7 @@
#t1.{self::Coordinate::next} = next;
} =>#t1;
}
- abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
index c402dca..324ae5f 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
@@ -8,9 +8,10 @@
import "package:ffi/ffi.dart";
@#C3
+@#C8
class Coordinate extends ffi::Struct {
@#C3
- static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
+ static final field core::int* #sizeOf = (#C11).{core::List::[]}(ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super ffi::Struct::_fromPointer(#pointer)
@@ -22,7 +23,7 @@
#t1.{self::Coordinate::next} = next;
} =>#t1;
}
- abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -34,17 +35,17 @@
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
get x() → core::double*
- return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
+ return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()));
set x(core::double* #v) → void
- return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
+ return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()), #v);
get y() → core::double*
- return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
+ return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
set y(core::double* #v) → void
- return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+ return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #v);
get next() → ffi::Pointer<self::Coordinate*>*
- return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
+ return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi())));
set next(ffi::Pointer<self::Coordinate*>* #v) → void
- return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+ return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
}
static method main() → dynamic {}
@@ -52,13 +53,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(ffi::Double)
+ #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
+ #C7 = <core::Type>[#C5, #C5, #C6]
+ #C8 = core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
index 0e669c0..a853421 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
@@ -20,7 +20,7 @@
#t1.{self::Coordinate::next} = next;
} =>#t1;
}
- abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
index c402dca..324ae5f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
@@ -8,9 +8,10 @@
import "package:ffi/ffi.dart";
@#C3
+@#C8
class Coordinate extends ffi::Struct {
@#C3
- static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
+ static final field core::int* #sizeOf = (#C11).{core::List::[]}(ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super ffi::Struct::_fromPointer(#pointer)
@@ -22,7 +23,7 @@
#t1.{self::Coordinate::next} = next;
} =>#t1;
}
- abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -34,17 +35,17 @@
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
get x() → core::double*
- return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
+ return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()));
set x(core::double* #v) → void
- return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
+ return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()), #v);
get y() → core::double*
- return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
+ return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
set y(core::double* #v) → void
- return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+ return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #v);
get next() → ffi::Pointer<self::Coordinate*>*
- return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
+ return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi())));
set next(ffi::Pointer<self::Coordinate*>* #v) → void
- return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+ return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
}
static method main() → dynamic {}
@@ -52,13 +53,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(ffi::Double)
+ #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
+ #C7 = <core::Type>[#C5, #C5, #C6]
+ #C8 = core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
index 07b6c80..0fc8261 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
@@ -4,9 +4,10 @@
import "dart:ffi";
@#C3
+ @#C8
class Coordinate extends dart.ffi::Struct {
@#C3
- static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+ static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
return null;
}
- abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
get x() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
set x(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get y() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
set y(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get next() → dart.ffi::Pointer<lib::Coordinate*>*
- return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+ return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
- return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+ return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
}
}
library from "org-dartlang-test:///main.dart" as main {
@@ -54,13 +55,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = dart.core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <dart.core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <dart.core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <dart.core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <dart.core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(dart.ffi::Double)
+ #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+ #C7 = <dart.core::Type>[#C5, #C5, #C6]
+ #C8 = dart.core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <dart.core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <dart.core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
index c592dbf..4926750 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
@@ -4,9 +4,10 @@
import "dart:ffi";
@#C3
+ @#C8
class Coordinate extends dart.ffi::Struct {
@#C3
- static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+ static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
return null;
}
- abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
get x() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
set x(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get y() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
set y(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get next() → dart.ffi::Pointer<lib::Coordinate*>*
- return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+ return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
- return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+ return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
}
}
library from "org-dartlang-test:///main.dart" as main {
@@ -58,13 +59,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = dart.core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <dart.core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <dart.core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <dart.core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <dart.core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(dart.ffi::Double)
+ #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+ #C7 = <dart.core::Type>[#C5, #C5, #C6]
+ #C8 = dart.core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <dart.core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <dart.core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
index fae41df..afc46dc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
@@ -4,9 +4,10 @@
import "dart:ffi";
@#C3
+ @#C8
class Coordinate extends dart.ffi::Struct {
@#C3
- static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+ static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
return null;
}
- abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
get x() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
set x(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get y() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
set y(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get next() → dart.ffi::Pointer<lib::Coordinate*>*
- return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+ return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
- return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+ return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
}
}
library from "org-dartlang-test:///main.dart" as main {
@@ -55,13 +56,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = dart.core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <dart.core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <dart.core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <dart.core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <dart.core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(dart.ffi::Double)
+ #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+ #C7 = <dart.core::Type>[#C5, #C5, #C6]
+ #C8 = dart.core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <dart.core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <dart.core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
index 07b6c80..0fc8261 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
@@ -4,9 +4,10 @@
import "dart:ffi";
@#C3
+ @#C8
class Coordinate extends dart.ffi::Struct {
@#C3
- static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+ static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
return null;
}
- abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
get x() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
set x(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get y() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
set y(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get next() → dart.ffi::Pointer<lib::Coordinate*>*
- return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+ return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
- return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+ return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
}
}
library from "org-dartlang-test:///main.dart" as main {
@@ -54,13 +55,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = dart.core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <dart.core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <dart.core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <dart.core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <dart.core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(dart.ffi::Double)
+ #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+ #C7 = <dart.core::Type>[#C5, #C5, #C6]
+ #C8 = dart.core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <dart.core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <dart.core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
index 879c497..b4e9544 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
@@ -4,9 +4,10 @@
import "dart:ffi";
@#C3
+ @#C8
class Coordinate extends dart.ffi::Struct {
@#C3
- static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+ static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
return null;
}
- abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
get x() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
set x(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get y() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
set y(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get next() → dart.ffi::Pointer<lib::Coordinate*>*
- return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+ return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
- return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+ return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
}
}
library from "org-dartlang-test:///main.dart" as main {
@@ -55,13 +56,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = dart.core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <dart.core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <dart.core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <dart.core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <dart.core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(dart.ffi::Double)
+ #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+ #C7 = <dart.core::Type>[#C5, #C5, #C6]
+ #C8 = dart.core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <dart.core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <dart.core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
index c31f270..3c5ae83 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
@@ -4,9 +4,10 @@
import "dart:ffi";
@#C3
+ @#C8
class Coordinate extends dart.ffi::Struct {
@#C3
- static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+ static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
@#C3
constructor #fromPointer(dynamic #pointer) → dynamic
: super dart.ffi::Struct::_fromPointer(#pointer)
@@ -15,7 +16,7 @@
dart.core::print("hello");
return null;
}
- abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+ abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -27,17 +28,17 @@
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
get x() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
set x(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get y() → dart.core::double*
- return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
set y(dart.core::double* #v) → void
- return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+ return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
get next() → dart.ffi::Pointer<lib::Coordinate*>*
- return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+ return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
- return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+ return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
}
}
library from "org-dartlang-test:///main.dart" as main {
@@ -56,13 +57,18 @@
#C1 = "vm:entry-point"
#C2 = null
#C3 = dart.core::pragma {name:#C1, options:#C2}
- #C4 = 24
- #C5 = 20
- #C6 = <dart.core::int*>[#C4, #C5, #C4]
- #C7 = 0
- #C8 = <dart.core::int*>[#C7, #C7, #C7]
- #C9 = 8
- #C10 = <dart.core::int*>[#C9, #C9, #C9]
- #C11 = 16
- #C12 = <dart.core::int*>[#C11, #C11, #C11]
+ #C4 = "vm:ffi:struct-fields"
+ #C5 = TypeLiteralConstant(dart.ffi::Double)
+ #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+ #C7 = <dart.core::Type>[#C5, #C5, #C6]
+ #C8 = dart.core::pragma {name:#C4, options:#C7}
+ #C9 = 24
+ #C10 = 20
+ #C11 = <dart.core::int*>[#C9, #C10, #C9]
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 8
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = 16
+ #C17 = <dart.core::int*>[#C16, #C16, #C16]
}
diff --git a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
index c96a472..bed1d87 100644
--- a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
@@ -124,8 +124,8 @@
/// Processes the non-source files of the package rooted at [pkgFolder].
///
- /// This means updating the pubspec.yaml file and the package_config.json
- /// file, if necessary.
+ /// This means updating the pubspec.yaml file, the package_config.json
+ /// file, and the analysis_options.yaml file, each only if necessary.
void processPackage(Folder pkgFolder) {
if (!_packageIsNNBD) {
return;
@@ -133,13 +133,14 @@
var pubspecFile = pkgFolder.getChildAssumingFile('pubspec.yaml');
if (!pubspecFile.exists) {
- // TODO(srawlins): Handle other package types, such as Bazel.
+ // If the pubspec file cannot be found, we do not attempt to change the
+ // Package Config file, nor the analysis options file.
return;
}
- _Pubspec pubspec;
+ _YamlFile pubspec;
try {
- pubspec = _Pubspec.parseFrom(pubspecFile);
+ pubspec = _YamlFile._parseFrom(pubspecFile);
} on FileSystemException catch (e) {
_processPubspecException('read', pubspecFile.path, e);
return;
@@ -149,10 +150,12 @@
}
var updated = _processPubspec(pubspec);
-
if (updated) {
_processConfigFile(pkgFolder, pubspec);
}
+ // TODO(https://github.com/dart-lang/sdk/issues/43806): stop processing
+ // analysis options file when the experiment is no longer needed.
+ _processAnalysisOptionsFile(pkgFolder);
}
Future<void> processUnit(ResolvedUnitResult result) async {
@@ -209,15 +212,102 @@
}
}
+ void _processAnalysisOptionsException(
+ String action, String analysisOptionsPath, error) {
+ listener.addRecommendation('''Failed to $action analysis options file
+ $analysisOptionsPath
+ $error
+
+ Manually update this file to enable the Null Safety language feature in static
+ analysis by adding:
+
+ analyzer:
+ enable-experiment:
+ - non-nullable
+''');
+ }
+
+ void _processAnalysisOptionsFile(Folder pkgFolder) {
+ var analysisOptionsFile =
+ pkgFolder.getChildAssumingFile('analysis_options.yaml');
+ if (!analysisOptionsFile.exists) {
+ // A source file edit cannot be made for a file which doesn't exist.
+ // Instead of using the fix listener, just write the file directly.
+ analysisOptionsFile.writeAsStringSync('''
+analyzer:
+ enable-experiment:
+ - non-nullable
+
+''');
+ return;
+ }
+
+ _YamlFile analysisOptions;
+ try {
+ analysisOptions = _YamlFile._parseFrom(analysisOptionsFile);
+ } on FileSystemException catch (e) {
+ _processAnalysisOptionsException('read', analysisOptionsFile.path, e);
+ return;
+ } on FormatException catch (e) {
+ _processAnalysisOptionsException('parse', analysisOptionsFile.path, e);
+ return;
+ }
+
+ var analysisOptionsMap = analysisOptions.content;
+ YamlNode analyzerOptions;
+ if (analysisOptionsMap is YamlMap) {
+ analyzerOptions = analysisOptionsMap.nodes['analyzer'];
+ }
+ if (analyzerOptions == null) {
+ // There is no top-level "analyzer" section. We can write one in its
+ // entirety, and use a 2-space indentation. This is a valid indentation,
+ // even if the file contains another top-level section (perhaps "linter")
+ // which uses a different indentation.
+ var start = SourceLocation(0, line: 0, column: 0);
+ var content = '''
+analyzer:
+ enable-experiment:
+ - non-nullable
+
+''';
+ analysisOptions._insertAfterParent(
+ SourceSpan(start, start, ''), content, listener);
+ } else if (analyzerOptions is YamlMap) {
+ var enableExperiment = analyzerOptions.nodes['enable-experiment'];
+ if (enableExperiment == null) {
+ var analyzerIndentation =
+ analysisOptions._getMapEntryIndentation(analyzerOptions);
+ var indent = ' ' * analyzerIndentation;
+ var content = '\n'
+ '${indent}enable-experiment:\n'
+ '$indent - non-nullable';
+ analysisOptions._insertAfterParent(
+ analyzerOptions.span, content, listener);
+ } else if (enableExperiment is YamlList) {
+ var enableExperimentIndentation =
+ analysisOptions._getListIndentation(enableExperiment);
+ var indent = ' ' * enableExperimentIndentation;
+ var nonNullableIsEnabled = enableExperiment.value
+ .any((experiment) => experiment == 'non-nullable');
+ if (nonNullableIsEnabled) return;
+ var content = '\n' '$indent- non-nullable';
+ analysisOptions._insertAfterParent(
+ enableExperiment.span, content, listener);
+ }
+ }
+ }
+
/// Updates the Package Config file to specify a minimum Dart SDK version
/// which supports null safety.
- void _processConfigFile(Folder pkgFolder, _Pubspec pubspec) {
+ void _processConfigFile(Folder pkgFolder, _YamlFile pubspec) {
if (!_packageIsNNBD) {
return;
}
var packageName = pubspec._getName();
- if (packageName == null) {}
+ if (packageName == null) {
+ return;
+ }
var packageConfigFile = pkgFolder
.getChildAssumingFolder('.dart_tool')
@@ -295,41 +385,7 @@
/// Updates the pubspec.yaml file to specify a minimum Dart SDK version which
/// supports null safety.
- bool _processPubspec(_Pubspec pubspec) {
- /// Inserts [content] into [pubspecFile], immediately after [parentSpan].
- void insertAfterParent(SourceSpan parentSpan, String content) {
- var line = parentSpan.end.line;
- var offset = parentSpan.end.offset;
- // Walk [offset] and [line] back to the first non-whitespace character
- // before [offset].
- while (offset > 0) {
- var ch = pubspec.textContent.codeUnitAt(offset - 1);
- if (ch == $space || ch == $cr) {
- --offset;
- } else if (ch == $lf) {
- --offset;
- --line;
- } else {
- break;
- }
- }
- var edit = SourceEdit(offset, 0, content);
- listener.addSourceFileEdit(
- 'enable Null Safety language feature',
- Location(pubspec.path, offset, content.length, line, 0),
- SourceFileEdit(pubspec.path, 0, edits: [edit]));
- }
-
- void replaceSpan(SourceSpan span, String content) {
- var line = span.start.line;
- var offset = span.start.offset;
- var edit = SourceEdit(offset, span.length, content);
- listener.addSourceFileEdit(
- 'enable Null Safety language feature',
- Location(pubspec.path, offset, content.length, line, 0),
- SourceFileEdit(pubspec.path, 0, edits: [edit]));
- }
-
+ bool _processPubspec(_YamlFile pubspec) {
var pubspecMap = pubspec.content;
YamlNode environmentOptions;
if (pubspecMap is YamlMap) {
@@ -342,14 +398,15 @@
sdk: '$_intendedSdkVersionConstraint'
''';
- insertAfterParent(SourceSpan(start, start, ''), content);
+ pubspec._insertAfterParent(
+ SourceSpan(start, start, ''), content, listener);
} else if (environmentOptions is YamlMap) {
var sdk = environmentOptions.nodes['sdk'];
if (sdk == null) {
var content = """
sdk: '$_intendedSdkVersionConstraint'""";
- insertAfterParent(environmentOptions.span, content);
+ pubspec._insertAfterParent(environmentOptions.span, content, listener);
} else if (sdk is YamlScalar) {
VersionConstraint currentConstraint;
if (sdk.value is String) {
@@ -363,7 +420,8 @@
// TODO(srawlins): This overwrites the current maximum version. In
// the uncommon situation that the maximum is not '<3.0.0', it
// should not.
- replaceSpan(sdk.span, "'$_intendedSdkVersionConstraint'");
+ pubspec._replaceSpan(
+ sdk.span, "'$_intendedSdkVersionConstraint'", listener);
}
} else {
// Something is odd with the SDK constraint we've found in
@@ -457,22 +515,41 @@
}
}
-class _Pubspec {
+class _YamlFile {
final String path;
final String textContent;
final YamlNode content;
- factory _Pubspec.parseFrom(File file) {
- var textContent = file.readAsStringSync();
- var content = loadYaml(textContent);
- if (content is YamlNode) {
- return _Pubspec._(file.path, textContent, content);
- } else {
- throw FormatException('pubspec.yaml is not a YAML map.');
- }
+ _YamlFile._(this.path, this.textContent, this.content);
+
+ /// Returns the indentation of the entries in [node].
+ int _getListIndentation(YamlList node) {
+ return node.span.start.column;
}
- _Pubspec._(this.path, this.textContent, this.content);
+ static final _newlineCharacter = RegExp('[\r\n]');
+
+ /// Returns the indentation of the first (and presumably all) entry of [node].
+ int _getMapEntryIndentation(YamlMap node) {
+ if (node.isEmpty) return 2;
+
+ var value = node.nodes.values.first;
+ if (value is YamlScalar) {
+ // A YamlScalar value indicates that a "key: value" pair is on a single
+ // line. The span's start column is the start column of the value, not the
+ // key.
+ var offset = value.span.start.offset;
+ var firstSpaceIndex =
+ textContent.lastIndexOf(_newlineCharacter, offset) + 1;
+ var index = firstSpaceIndex;
+ while (textContent.codeUnitAt(index) == $space) {
+ index++;
+ }
+ return index - firstSpaceIndex;
+ } else {
+ return value.span.start.column;
+ }
+ }
String _getName() {
YamlNode packageNameNode;
@@ -489,4 +566,49 @@
return null;
}
}
+
+ /// Inserts [content] into this file, immediately after [parentSpan].
+ void _insertAfterParent(
+ SourceSpan parentSpan, String content, DartFixListener listener) {
+ var line = parentSpan.end.line;
+ var offset = parentSpan.end.offset;
+ // Walk [offset] and [line] back to the first non-whitespace character
+ // before [offset].
+ while (offset > 0) {
+ var ch = textContent.codeUnitAt(offset - 1);
+ if (ch == $space || ch == $cr) {
+ --offset;
+ } else if (ch == $lf) {
+ --offset;
+ --line;
+ } else {
+ break;
+ }
+ }
+ var edit = SourceEdit(offset, 0, content);
+ listener.addSourceFileEdit(
+ 'enable Null Safety language feature',
+ Location(path, offset, content.length, line, 0),
+ SourceFileEdit(path, 0, edits: [edit]));
+ }
+
+ void _replaceSpan(SourceSpan span, String content, DartFixListener listener) {
+ var line = span.start.line;
+ var offset = span.start.offset;
+ var edit = SourceEdit(offset, span.length, content);
+ listener.addSourceFileEdit(
+ 'enable Null Safety language feature',
+ Location(path, offset, content.length, line, 0),
+ SourceFileEdit(path, 0, edits: [edit]));
+ }
+
+ static _YamlFile _parseFrom(File file) {
+ var textContent = file.readAsStringSync();
+ var content = loadYaml(textContent);
+ if (content is YamlNode) {
+ return _YamlFile._(file.path, textContent, content);
+ } else {
+ throw FormatException('pubspec.yaml is not a YAML map.');
+ }
+ }
}
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 42325ee..736ea52 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -421,7 +421,8 @@
{bool migrated = false,
String sourceText,
String pubspecText,
- String packageConfigText}) {
+ String packageConfigText,
+ String analysisOptionsText}) {
return {
'pubspec.yaml': pubspecText ??
'''
@@ -446,7 +447,9 @@
'lib/test.dart': sourceText ??
'''
int${migrated ? '?' : ''} f() => null;
-'''
+''',
+ if (analysisOptionsText != null)
+ 'analysis_options.yaml': analysisOptionsText,
};
}
@@ -454,6 +457,187 @@
NonNullableFix.shutdownAllServers();
}
+ test_analysis_options_analyzer_is_missing_enable_experiment() async {
+ var projectContents = simpleProject(analysisOptionsText: '''
+analyzer:
+ foo: 1
+''');
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+ foo: 1
+ enable-experiment:
+ - non-nullable
+'''));
+ }
+
+ test_analysis_options_analyzer_is_missing_enable_experiment_big_indent() async {
+ var projectContents = simpleProject(analysisOptionsText: '''
+analyzer:
+ foo: 1
+''');
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+ foo: 1
+ enable-experiment:
+ - non-nullable
+'''));
+ }
+
+ test_analysis_options_analyzer_is_not_a_map() async {
+ var analysisOptionsText = '''
+analyzer: 1
+''';
+ var projectContents =
+ simpleProject(analysisOptionsText: analysisOptionsText);
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir,
+ simpleProject(
+ migrated: true, analysisOptionsText: analysisOptionsText));
+ }
+
+ test_analysis_options_does_not_exist() async {
+ var projectContents = simpleProject();
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+ enable-experiment:
+ - non-nullable
+
+'''));
+ }
+
+ test_analysis_options_enable_experiment_contains_non_nullable() async {
+ var analysisOptionsText = '''
+analyzer:
+ enable-experiment:
+ - non-nullable
+''';
+ var projectContents =
+ simpleProject(analysisOptionsText: analysisOptionsText);
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir,
+ simpleProject(
+ migrated: true, analysisOptionsText: analysisOptionsText));
+ }
+
+ test_analysis_options_enable_experiment_is_not_list() async {
+ var analysisOptionsText = '''
+analyzer:
+ enable-experiment: 1
+''';
+ var projectContents =
+ simpleProject(analysisOptionsText: analysisOptionsText);
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir,
+ simpleProject(
+ migrated: true, analysisOptionsText: analysisOptionsText));
+ }
+
+ test_analysis_options_enable_experiment_missing_non_nullable() async {
+ var analysisOptionsText = '''
+analyzer:
+ enable-experiment:
+ - foo
+''';
+ var projectContents =
+ simpleProject(analysisOptionsText: analysisOptionsText);
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+ enable-experiment:
+ - foo
+ - non-nullable
+'''));
+ }
+
+ test_analysis_options_enable_experiment_missing_non_nullable_big_indent() async {
+ var analysisOptionsText = '''
+analyzer:
+ enable-experiment:
+ - foo
+''';
+ var projectContents =
+ simpleProject(analysisOptionsText: analysisOptionsText);
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+ enable-experiment:
+ - foo
+ - non-nullable
+'''));
+ }
+
+ test_analysis_options_is_missing_analyzer() async {
+ var projectContents = simpleProject(analysisOptionsText: '''
+name: test
+''');
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ await cliRunner.run();
+ // The Dart source code should still be migrated.
+ assertProjectContents(
+ projectDir, simpleProject(migrated: true, analysisOptionsText:
+ // This is strange-looking, but valid.
+ '''
+analyzer:
+ enable-experiment:
+ - non-nullable
+
+name: test
+'''));
+ }
+
+ test_analysis_options_is_not_a_map() async {
+ var projectContents = simpleProject(analysisOptionsText: 'not-a-map');
+ var projectDir = createProjectDir(projectContents);
+ var cliRunner = _createCli().decodeCommandLineArgs(
+ _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+ expect(() async => await cliRunner.run(), throwsUnsupportedError);
+ }
+
test_default_logger() {
// When running normally, we don't override the logger; make sure it has a
// non-null default so that there won't be a crash.
@@ -569,16 +753,16 @@
expect(assertParseArgsSuccess([]).skipPubOutdated, isTrue);
}
- test_flag_skip_pub_outdated_negated() async {
- expect(assertParseArgsSuccess(['--no-skip-pub-outdated']).skipPubOutdated,
- isFalse);
- }
-
test_flag_skip_pub_outdated_enable() {
expect(assertParseArgsSuccess(['--skip-pub-outdated']).skipPubOutdated,
isTrue);
}
+ test_flag_skip_pub_outdated_negated() async {
+ expect(assertParseArgsSuccess(['--no-skip-pub-outdated']).skipPubOutdated,
+ isFalse);
+ }
+
test_flag_web_preview_default() {
expect(assertParseArgsSuccess([]).webPreview, isTrue);
}
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index 716ba06..2752c23 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -192,6 +192,7 @@
final Class intClass;
final Class doubleClass;
final Class listClass;
+ final Class typeClass;
final Class pragmaClass;
final Field pragmaName;
final Field pragmaOptions;
@@ -233,6 +234,7 @@
intClass = coreTypes.intClass,
doubleClass = coreTypes.doubleClass,
listClass = coreTypes.listClass,
+ typeClass = coreTypes.typeClass,
pragmaClass = coreTypes.pragmaClass,
pragmaName = coreTypes.pragmaName,
pragmaOptions = coreTypes.pragmaOptions,
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 13498bc..b8a3e62 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -227,9 +227,9 @@
f.fileUri);
} else {
final DartType nativeType = InterfaceType(
- nativeTypesClasses[nativeTypeAnnos.first.index],
+ nativeTypesClasses[_getFieldType(nativeTypeAnnos.first).index],
Nullability.legacy);
- // TODO(36730): Support structs inside structs.
+ // TODO(dartbug.com/37271): Support structs inside structs.
final DartType shouldBeDartType = convertNativeTypeToDartType(
nativeType, /*allowStructs=*/ false, /*allowHandle=*/ false);
if (shouldBeDartType == null ||
@@ -294,6 +294,7 @@
///
/// Returns the total size of the struct (for all ABIs).
Map<Abi, int> _replaceFields(Class node, IndexedClass indexedClass) {
+ final classes = <Class>[];
final types = <NativeType>[];
final fields = <int, Field>{};
final getters = <int, Procedure>{};
@@ -304,18 +305,22 @@
final dartType = _structFieldMemberType(m);
NativeType nativeType;
+ Class clazz;
if (_isPointerType(dartType)) {
nativeType = NativeType.kPointer;
+ clazz = pointerClass;
} else {
final nativeTypeAnnos = _getNativeTypeAnnotations(m).toList();
if (nativeTypeAnnos.length == 1) {
- nativeType = nativeTypeAnnos.first;
+ clazz = nativeTypeAnnos.first;
+ nativeType = _getFieldType(clazz);
}
}
if ((m is Field || (m is Procedure && m.isGetter)) &&
nativeType != null) {
types.add(nativeType);
+ classes.add(clazz);
if (m is Field) {
fields[i] = m;
}
@@ -332,6 +337,8 @@
}
}
+ _annoteStructWithFields(node, classes);
+
final sizeAndOffsets = <Abi, SizeAndOffsets>{};
for (final Abi abi in Abi.values) {
sizeAndOffsets[abi] = _calculateSizeAndOffsets(types, abi);
@@ -377,6 +384,29 @@
return sizeAndOffsets.map((k, v) => MapEntry(k, v.size));
}
+ void _annoteStructWithFields(Class node, List<Class> fieldTypes) {
+ final types = fieldTypes.map((Class c) {
+ List<DartType> typeArg = const [];
+ if (c == pointerClass) {
+ typeArg = [
+ InterfaceType(pointerClass.superclass, Nullability.nonNullable)
+ ];
+ }
+ return TypeLiteralConstant(
+ InterfaceType(c, Nullability.nonNullable, typeArg));
+ }).toList();
+
+ node.addAnnotation(ConstantExpression(
+ InstanceConstant(pragmaClass.reference, [], {
+ pragmaName.reference: StringConstant("vm:ffi:struct-fields"),
+ // TODO(dartbug.com/38158): Wrap list in class to be able to encode
+ // more information when needed.
+ pragmaOptions.reference: ListConstant(
+ InterfaceType(typeClass, Nullability.nonNullable), types)
+ }),
+ InterfaceType(pragmaClass, Nullability.nonNullable, [])));
+ }
+
/// Expression that queries VM internals at runtime to figure out on which ABI
/// we are.
Expression _runtimeBranchOnLayout(Map<Abi, int> values) {
@@ -571,14 +601,13 @@
return fieldType;
}
- Iterable<NativeType> _getNativeTypeAnnotations(Member node) {
+ Iterable<Class> _getNativeTypeAnnotations(Member node) {
return node.annotations
.whereType<ConstantExpression>()
.map((expr) => expr.constant)
.whereType<InstanceConstant>()
.map((constant) => constant.classNode)
- .map((klass) => _getFieldType(klass))
- .where((type) => type != null);
+ .where((klass) => _getFieldType(klass) != null);
}
}
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index e198b10..b0926a1 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -171,17 +171,18 @@
nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
final DartType dartType = node.arguments.types[1];
- _ensureNativeTypeValid(nativeType, node);
- _ensureNativeTypeToDartType(nativeType, dartType, node);
-
+ _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+ _ensureNativeTypeToDartType(nativeType, dartType, node,
+ allowStructs: false);
return _replaceLookupFunction(node);
} else if (target == asFunctionMethod) {
final DartType dartType = node.arguments.types[1];
final DartType nativeType = InterfaceType(
nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
- _ensureNativeTypeValid(nativeType, node);
- _ensureNativeTypeToDartType(nativeType, dartType, node);
+ _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+ _ensureNativeTypeToDartType(nativeType, dartType, node,
+ allowStructs: false);
final DartType nativeSignature =
(nativeType as InterfaceType).typeArguments[0];
@@ -198,20 +199,22 @@
_ensureIsStaticFunction(func);
- // TODO(36730): Allow passing/returning structs by value.
- _ensureNativeTypeValid(nativeType, node);
- _ensureNativeTypeToDartType(nativeType, dartType, node);
+ _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+ _ensureNativeTypeToDartType(nativeType, dartType, node,
+ allowStructs: false);
// Check `exceptionalReturn`'s type.
final FunctionType funcType = dartType;
- final NativeType expectedReturn = getType(
+ final Class expectedReturnClass =
((node.arguments.types[0] as FunctionType).returnType
as InterfaceType)
- .classNode);
+ .classNode;
+ final NativeType expectedReturn = getType(expectedReturnClass);
if (expectedReturn == NativeType.kVoid ||
expectedReturn == NativeType.kPointer ||
- expectedReturn == NativeType.kHandle) {
+ expectedReturn == NativeType.kHandle ||
+ expectedReturnClass.superclass == structClass) {
if (node.arguments.positional.length > 1) {
diagnosticReporter.report(
templateFfiExpectedNoExceptionalReturn.withArguments(
diff --git a/sdk/lib/ffi/struct.dart b/sdk/lib/ffi/struct.dart
index f4cb315..0faf7ca 100644
--- a/sdk/lib/ffi/struct.dart
+++ b/sdk/lib/ffi/struct.dart
@@ -18,7 +18,7 @@
/// by native memory. The may allocated via allocation or loaded from a
/// [Pointer], but not by a generative constructor.
abstract class Struct extends NativeType {
- final Pointer<Struct> _addressOf;
+ final Object _addressOf;
/// Construct a reference to the [nullptr].
///
diff --git a/tools/VERSION b/tools/VERSION
index f603700..354a040 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 228
+PRERELEASE 229
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/flutter/compile_flutter.sh b/tools/bots/flutter/compile_flutter.sh
index 5f27241..0ab0869 100755
--- a/tools/bots/flutter/compile_flutter.sh
+++ b/tools/bots/flutter/compile_flutter.sh
@@ -63,11 +63,11 @@
popd # flutter
# Directly in temp directory again.
-mkdir src
+git clone --single-branch --depth=1 -vv \
+ https://dart.googlesource.com/external/github.com/flutter/buildroot src
pushd src
git clone --single-branch --depth=1 -vv \
https://dart.googlesource.com/external/github.com/flutter/engine flutter
-mkdir third_party
pushd third_party
ln -s $checkout dart
popd # third_party