Affix
view release on metacpan or search on metacpan
t/050_affix_build.t view on Meta::CPAN
end function
run_test( 'nim', 'Nim', <<~'', 'add_nim', 'nim' );
proc add_nim(a, b: cint): cint {.exportc, dynlib.} =
return a + b
run_test( 'v', 'V', <<~'', 'add_v', 'v' );
[export: 'add_v']
fn add_v(a int, b int) int {
return a + b
}
run_test( 'pascal', 'Pascal', <<~'', 'add_pas', 'fpc' );
library test_pas;
function add_pas(a, b: LongInt): LongInt; cdecl; export;
begin
add_pas := a + b;
end;
exports add_pas;
begin end.
run_test( 'cr', 'Crystal', <<~'', 'add_cr', 'crystal' );
fun add_cr(a : Int32, b : Int32) : Int32
a + b
end
run_test( 'swift', 'Swift', <<~'', 'add_swift', 'swiftc' );
@_cdecl("add_swift")
public func add_swift(a: Int32, b: Int32) -> Int32 {
return a + b
}
run_test( 'assembly', 'Assembly', $Config{archname} =~ /arm64|aarch64/ ? <<~'' : $^O eq 'MSWin32' ? <<~'': <<~'', 'add_asm', 'nasm' );
; ARM64: add w0, w0, w1
.global add_asm
.text
.align 2
add_asm:
add w0, w0, w1
ret
; Win64 x86_64: RCX + RDX -> RAX
global add_asm
section .text
add_asm:
mov eax, ecx
add eax, edx
ret
; SysV x86_64: RDI + RSI -> RAX
global add_asm
section .text
add_asm:
mov eax, edi
add eax, esi
ret
run_test( 'cobol', 'Cobol', <<~'', 'add_cob', 'cobc' );
IDENTIFICATION DIVISION.
PROGRAM-ID. add_cob.
DATA DIVISION.
LINKAGE SECTION.
01 A PIC 9(9) USAGE COMP-5.
01 B PIC 9(9) USAGE COMP-5.
01 R PIC 9(9) USAGE COMP-5.
PROCEDURE DIVISION USING A, B, R.
ADD A TO B GIVING R.
GOBACK.
END PROGRAM add_cob.
subtest 'Polyglot: Number Cruncher (C + Fortran + ASM)' => sub {
skip_all "Missing compilers" unless bin_path( $Config{cc} ) && bin_path('gfortran');
# C is our orchestrator
my $c_src = $TMP_DIR->child('math_core.c');
$c_src->spew_utf8(<<~'C');
#include <stdio.h>
#ifdef _WIN32
__declspec(dllexport)
#endif
int core_version() { return 1; }
C
# Fortran does the math
my $f_src = $TMP_DIR->child('math_algos.f90');
$f_src->spew_utf8(<<~'F90');
function fortran_add(a, b) bind(c, name='fortran_add')
use iso_c_binding
integer(c_int), value :: a, b
integer(c_int) :: fortran_add
fortran_add = a + b
end function
F90
# Assembly for optimization
my $asm_bin;
my $asm_src;
my $asm_file_name;
if ( $Config{archname} =~ /arm64|aarch64/ ) {
$asm_bin = $Config{cc};
$asm_file_name = 'fast.s';
$asm_src = <<~'' }
.global asm_inc
.text
.align 2
asm_inc:
add w0, w0, #1
ret
elsif ( $^O eq 'MSWin32' ) {
$asm_bin = 'nasm';
$asm_file_name = 'fast.asm';
$asm_src = <<~'' }
global asm_inc
section .text
asm_inc:
mov eax, ecx
inc eax
ret
else {
( run in 0.334 second using v1.01-cache-2.11-cpan-140bd7fdf52 )