// 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. // // Truncation and sign extension of small ints, tested with something else than // equality. // // SharedObjects=ffi_test_functions import 'dart:ffi'; import "package:expect/expect.dart"; import "dylib_utils.dart"; main() { variant1Negative(); variant1Positive(); variant2Negative(); variant2Positive(); variant3Negative(); } /// `return x == 249 ? 1 : 0`. /// /// This doesn't catch the error. final regress40537 = ffiTestFunctions .lookupFunction("Regress40537"); variant1Negative() { // 0xF9 = -7 in 2s complement. // 0xF9 = 249 in unsigned. final result = regress40537(-7); print(result); Expect.equals(1, result); } variant1Positive() { // 0xF9 = 249 in unsigned. final result = regress40537(0xFFFFFFF9); print(result); Expect.equals(1, result); } /// `return x`. /// /// This does. final regress40537Variant2 = ffiTestFunctions.lookupFunction( "Regress40537Variant2"); variant2Negative() { // The 32 bit representation of -7 is 0xFFFFFFF9. // Only the lowest byte, 0xF9, should be interpreted by calling convention, // or it should be truncated and zero extended before calling. final result = regress40537Variant2(-7); print(result); Expect.equals(249, result); } variant2Positive() { // Only the lowest byte, 0xF9, should be interpreted by calling convention, // or it should be truncated and zero extended before calling. final result = regress40537Variant2(0xFFFFFFF9); print(result); Expect.equals(249, result); } /// `return x`. final regress40537Variant3 = ffiTestFunctions.lookupFunction( "Regress40537Variant3"); variant3Negative() { // This really passes -7 its intptr_t. final result = regress40537Variant3(-7); print(result); Expect.equals(249, result); } final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");