Skip to content

Commit

Permalink
[vm/ffi] Union transform fix offsets
Browse files Browse the repository at this point in the history
TEST=tests/ffi/regress_45988_test.dart

Closes: dart-lang#45988

Change-Id: Ie8bf76bb2cc1781a4b59e508d0e5f2ada85d22a4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/199422
Reviewed-by: Clement Skau <cskau@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
  • Loading branch information
dcharkes authored and commit-bot@chromium.org committed May 12, 2021
1 parent 535b536 commit 3b9bd26
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 2 deletions.
3 changes: 1 addition & 2 deletions pkg/vm/lib/transformations/ffi_definitions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1271,8 +1271,7 @@ class UnionNativeTypeCfe extends CompoundNativeTypeCfe {
unionAlignment = math.max(unionAlignment, alignment);
}
final int size = _alignOffset(unionSize, unionAlignment);
return CompoundLayout(
size, unionAlignment, List.filled(Abi.values.length, 0));
return CompoundLayout(size, unionAlignment, List.filled(types.length, 0));
}
}

Expand Down
21 changes: 21 additions & 0 deletions tests/ffi/regress_45988_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (c) 2021, 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:ffi';

import "package:expect/expect.dart";
import "package:ffi/ffi.dart";

class DartValueFields extends Union {
external Pointer p1;
external Pointer p2;
external Pointer p3;
external Pointer p4;
}

void main() {
final p = calloc<DartValueFields>();
Expect.equals(0, p.ref.p4.address);
calloc.free(p);
}
21 changes: 21 additions & 0 deletions tests/ffi_2/regress_45988_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (c) 2021, 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:ffi';

import "package:expect/expect.dart";
import "package:ffi/ffi.dart";

class DartValueFields extends Union {
Pointer p1;
Pointer p2;
Pointer p3;
Pointer p4;
}

void main() {
final p = calloc<DartValueFields>();
Expect.equals(0, p.ref.p4.address);
calloc.free(p);
}

0 comments on commit 3b9bd26

Please sign in to comment.