Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
jemc committed Jul 7, 2022
1 parent 669797f commit c4f7a43
Show file tree
Hide file tree
Showing 8 changed files with 601 additions and 151 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -210,11 +210,11 @@ endif

test-full-programs-release: all
@mkdir -p $(outDir)/runner-tests/release
$(SILENT)cd '$(outDir)' && $(buildDir)/test/libponyc-run/runner/runner --timeout_s=60 --max_parallel=$(num_cores) --exclude=runner --ponyc=$(outDir)/ponyc --output=$(outDir)/runner-tests/release --test_lib=$(outDir)/test_lib $(srcDir)/test/libponyc-run
$(SILENT)cd '$(outDir)' && $(buildDir)/test/libponyc-run/runner/runner --timeout_s=60 --max_parallel=$(num_cores) --exclude=runner --ponyc=$(outDir)/ponyc --output=$(outDir)/runner-tests/release --test_lib=$(outDir)/test_lib $(srcDir)/test/libponyc-run $(extra_args)

test-full-programs-debug: all
@mkdir -p $(outDir)/runner-tests/debug
$(SILENT)cd '$(outDir)' && $(buildDir)/test/libponyc-run/runner/runner --timeout_s=60 --max_parallel=$(num_cores) --exclude=runner --ponyc=$(outDir)/ponyc --debug --output=$(outDir)/runner-tests/debug --test_lib=$(outDir)/test_lib $(srcDir)/test/libponyc-run --only ffi-tuple-parameters
$(SILENT)cd '$(outDir)' && $(buildDir)/test/libponyc-run/runner/runner --timeout_s=60 --max_parallel=$(num_cores) --exclude=runner --ponyc=$(outDir)/ponyc --debug --output=$(outDir)/runner-tests/debug --test_lib=$(outDir)/test_lib $(srcDir)/test/libponyc-run $(extra_args)

test-stdlib-release: all
$(SILENT)cd '$(outDir)' && PONYPATH=.:$(PONYPATH) ./ponyc -b stdlib-release --pic --checktree --verify $(cross_args) ../../packages/stdlib && echo Built `pwd`/stdlib-release && $(cross_runner) ./stdlib-release --sequential
Expand Down
414 changes: 299 additions & 115 deletions src/libponyc/codegen/genffi.c

Large diffs are not rendered by default.

69 changes: 60 additions & 9 deletions test/libponyc-run/ffi-tuple-parameters/additional.c
Original file line number Diff line number Diff line change
@@ -1,37 +1,88 @@
// additional.c
#include <stdio.h>
#include <stdint.h>

struct Vector2U32 {
uint32_t x;
uint32_t y;
};
struct Vector2U32 build_vector2_u32(uint32_t x, uint32_t y) {
return (struct Vector2U32) { .x = x, .y = y };
int sum_vector2_u32(struct Vector2U32 vec) {
return (int)vec.x + (int)vec.y;
}

struct Vector3U32 {
uint32_t x;
uint32_t y;
uint32_t z;
};
struct Vector3U32 build_vector3_u32(uint32_t x, uint32_t y, uint32_t z) {
return (struct Vector3U32) { .x = x, .y = y, .z = z };
int sum_vector3_u32(struct Vector3U32 vec) {
return (int)vec.x + (int)vec.y + (int)vec.z;
}

struct Vector2U64 {
uint64_t x;
uint64_t y;
};
struct Vector2U64 build_vector2_u64(uint64_t x, uint64_t y) {
return (struct Vector2U64) { .x = x, .y = y };
int sum_vector2_u64(struct Vector2U64 vec) {
return (int)vec.x + (int)vec.y;
}

struct Vector3U64 {
uint64_t x;
uint64_t y;
uint64_t z;
};
struct Vector3U64 build_vector3_u64(uint64_t x, uint64_t y, uint64_t z) {
return (struct Vector3U64) { .x = x, .y = y, .z = z };
int sum_vector3_u64(struct Vector3U64 vec) {
return (int)vec.x + (int)vec.y + (int)vec.z;
}

struct Vector2F32 {
float x;
float y;
};
int sum_vector2_f32(struct Vector2F32 vec) {
return (int)vec.x + (int)vec.y;
}

struct Vector3F32 {
float x;
float y;
float z;
};
int sum_vector3_f32(struct Vector3F32 vec) {
return (int)vec.x + (int)vec.y + (int)vec.z;
}

struct Vector2F64 {
double x;
double y;
};
int sum_vector2_f64(struct Vector2F64 vec) {
return (int)vec.x + (int)vec.y;
}

struct Vector3F64 {
double x;
double y;
double z;
};
int sum_vector3_f64(struct Vector3F64 vec) {
return (int)vec.x + (int)vec.y + (int)vec.z;
}

struct Vector3MixA {
uint8_t x;
float y;
uint64_t z;
};
int sum_vector3_mix_a(struct Vector3MixA vec) {
return (int)vec.x + (int)vec.y + (int)vec.z;
}

struct Vector3MixB {
float x;
float y;
double z;
};
int sum_vector3_mix_b(struct Vector3MixB vec) {
return (int)vec.x + (int)vec.y + (int)vec.z;
}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
55
95
88 changes: 64 additions & 24 deletions test/libponyc-run/ffi-tuple-parameters/main.pony
Original file line number Diff line number Diff line change
@@ -1,40 +1,80 @@
// main.pony
use "lib:ffi-tuple-parameters-additional"
use @build_vector2_u32[Vector2U32](x: U32, y: U32)
use @build_vector3_u32[Vector3U32](x: U32, y: U32, z: U32)
use @build_vector2_u64[Vector2U64](x: U64, y: U64)
use @build_vector3_u64[Vector3U64](x: U64, y: U64, z: U64)
use @sum_vector2_u32[I32](vec: Vector2U32)
use @sum_vector3_u32[I32](vec: Vector3U32)
use @sum_vector2_u64[I32](vec: Vector2U64)
use @sum_vector3_u64[I32](vec: Vector3U64)
use @sum_vector2_f32[I32](vec: Vector2F32)
use @sum_vector3_f32[I32](vec: Vector3F32)
use @sum_vector2_f64[I32](vec: Vector2F64)
use @sum_vector3_f64[I32](vec: Vector3F64)
use @sum_vector3_mix_a[I32](vec: Vector3MixA)
use @sum_vector3_mix_b[I32](vec: Vector3MixB)
use @pony_exitcode[None](code: I32)

type Vector2U32 is (U32, U32)
type Vector3U32 is (U32, U32, U32)
type Vector2U64 is (U64, U64)
type Vector3U64 is (U64, U64, U64)
type Vector2F32 is (F32, F32)
type Vector3F32 is (F32, F32, F32)
type Vector2F64 is (F64, F64)
type Vector3F64 is (F64, F64, F64)
type Vector3MixA is (U8, F32, U64)
type Vector3MixB is (F32, F32, F64)

actor Main
new create(env: Env) =>
let vector2_u32 = @build_vector2_u32(1, 2)
env.out.print(vector2_u32._1.string())
env.out.print(vector2_u32._2.string())
let vector2_u32: Vector2U32 = (1, 2)
let vector2_u32_sum = @sum_vector2_u32(vector2_u32)
env.out.print(vector2_u32_sum.string() + " (expected 3)")

let vector3_u32 = @build_vector3_u32(3, 4, 5)
env.out.print(vector3_u32._1.string())
env.out.print(vector3_u32._2.string())
env.out.print(vector3_u32._3.string())
let vector3_u32: Vector3U32 = (3, 4, 5)
let vector3_u32_sum = @sum_vector3_u32(vector3_u32)
env.out.print(vector3_u32_sum.string() + " (expected 12)")

let vector2_u64 = @build_vector2_u64(6, 7)
env.out.print(vector2_u64._1.string())
env.out.print(vector2_u64._2.string())
let vector2_u64: Vector2U64 = (6, 7)
let vector2_u64_sum = @sum_vector2_u64(vector2_u64)
env.out.print(vector2_u64_sum.string() + " (expected 13)")

let vector3_u64 = @build_vector3_u64(8, 9, 10)
env.out.print(vector3_u64._1.string())
env.out.print(vector3_u64._2.string())
env.out.print(vector3_u64._3.string())
let vector3_u64: Vector3U64 = (8, 9, 10)
let vector3_u64_sum = @sum_vector3_u64(vector3_u64)
env.out.print(vector3_u64_sum.string() + " (expected 27)")

let vector2_f32: Vector2F32 = (11, 12)
let vector2_f32_sum = @sum_vector2_f32(vector2_f32)
env.out.print(vector2_f32_sum.string() + " (expected 23)")

let vector3_f32: Vector3F32 = (13, 14, 15)
let vector3_f32_sum = @sum_vector3_f32(vector3_f32)
env.out.print(vector3_f32_sum.string() + " (expected 42)")

let vector2_f64: Vector2F64 = (16, 17)
let vector2_f64_sum = @sum_vector2_f64(vector2_f64)
env.out.print(vector2_f64_sum.string() + " (expected 33)")

let vector3_f64: Vector3F64 = (18, 19, 20)
let vector3_f64_sum = @sum_vector3_f64(vector3_f64)
env.out.print(vector3_f64_sum.string() + " (expected 57)")

let vector3_mix_a: Vector3MixA = (21, 22, 23)
let vector3_mix_a_sum = @sum_vector3_mix_a(vector3_mix_a)
env.out.print(vector3_mix_a_sum.string() + " (expected 66)")

let vector3_mix_b: Vector3MixB = (24, 25, 26)
let vector3_mix_b_sum = @sum_vector3_mix_b(vector3_mix_b)
env.out.print(vector3_mix_b_sum.string() + " (expected 75)")

let total_sum: I32 =
(vector2_u32._1 + vector2_u32._2).i32() +
(vector3_u32._1 + vector3_u32._2 + vector3_u32._3).i32() +
(vector2_u64._1 + vector2_u64._2).i32() +
(vector3_u64._1 + vector3_u64._2 + vector3_u64._3).i32()
vector2_u32_sum +
vector3_u32_sum +
vector2_u64_sum +
vector3_u64_sum +
vector2_f32_sum +
vector3_f32_sum +
vector2_f64_sum +
vector3_f64_sum +
vector3_mix_a_sum +
vector3_mix_b_sum

@pony_exitcode(total_sum) // expect 1 + 2 + ... + 10 == 55
let exit_code = total_sum % 256
@pony_exitcode(exit_code) // expect (1 + 2 + 3 + ... + 26) % 256 == 95
88 changes: 88 additions & 0 deletions test/libponyc-run/ffi-tuple-return/additional.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#include <stdio.h>
#include <stdint.h>

struct Vector2U32 {
uint32_t x;
uint32_t y;
};
struct Vector2U32 build_vector2_u32(uint32_t x, uint32_t y) {
return (struct Vector2U32) { .x = x, .y = y };
}

struct Vector3U32 {
uint32_t x;
uint32_t y;
uint32_t z;
};
struct Vector3U32 build_vector3_u32(uint32_t x, uint32_t y, uint32_t z) {
return (struct Vector3U32) { .x = x, .y = y, .z = z };
}

struct Vector2U64 {
uint64_t x;
uint64_t y;
};
struct Vector2U64 build_vector2_u64(uint64_t x, uint64_t y) {
return (struct Vector2U64) { .x = x, .y = y };
}

struct Vector3U64 {
uint64_t x;
uint64_t y;
uint64_t z;
};
struct Vector3U64 build_vector3_u64(uint64_t x, uint64_t y, uint64_t z) {
return (struct Vector3U64) { .x = x, .y = y, .z = z };
}

struct Vector2F32 {
float x;
float y;
};
struct Vector2F32 build_vector2_f32(float x, float y) {
return (struct Vector2F32) { .x = x, .y = y };
}

struct Vector3F32 {
float x;
float y;
float z;
};
struct Vector3F32 build_vector3_f32(float x, float y, float z) {
return (struct Vector3F32) { .x = x, .y = y, .z = z };
}

struct Vector2F64 {
double x;
double y;
};
struct Vector2F64 build_vector2_f64(double x, double y) {
return (struct Vector2F64) { .x = x, .y = y };
}

struct Vector3F64 {
double x;
double y;
double z;
};
struct Vector3F64 build_vector3_f64(double x, double y, double z) {
return (struct Vector3F64) { .x = x, .y = y, .z = z };
}

struct Vector3MixA {
uint8_t x;
float y;
uint64_t z;
};
struct Vector3MixA build_vector3_mix_a(uint8_t x, float y, uint64_t z) {
return (struct Vector3MixA) { .x = x, .y = y, .z = z };
}

struct Vector3MixB {
float x;
float y;
double z;
};
struct Vector3MixB build_vector3_mix_b(float x, float y, double z) {
return (struct Vector3MixB) { .x = x, .y = y, .z = z };
}
1 change: 1 addition & 0 deletions test/libponyc-run/ffi-tuple-return/expected-exit-code.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
95
86 changes: 86 additions & 0 deletions test/libponyc-run/ffi-tuple-return/main.pony
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
use "lib:ffi-tuple-return-additional"
use @build_vector2_u32[Vector2U32](x: U32, y: U32)
use @build_vector3_u32[Vector3U32](x: U32, y: U32, z: U32)
use @build_vector2_u64[Vector2U64](x: U64, y: U64)
use @build_vector3_u64[Vector3U64](x: U64, y: U64, z: U64)
use @build_vector2_f32[Vector2F32](x: F32, y: F32)
use @build_vector3_f32[Vector3F32](x: F32, y: F32, z: F32)
use @build_vector2_f64[Vector2F64](x: F64, y: F64)
use @build_vector3_f64[Vector3F64](x: F64, y: F64, z: F64)
use @build_vector3_mix_a[Vector3MixA](x: U8, y: F32, z: U64)
use @build_vector3_mix_b[Vector3MixB](x: F32, y: F32, z: F64)
use @pony_exitcode[None](code: I32)

type Vector2U32 is (U32, U32)
type Vector3U32 is (U32, U32, U32)
type Vector2U64 is (U64, U64)
type Vector3U64 is (U64, U64, U64)
type Vector2F32 is (F32, F32)
type Vector3F32 is (F32, F32, F32)
type Vector2F64 is (F64, F64)
type Vector3F64 is (F64, F64, F64)
type Vector3MixA is (U8, F32, U64)
type Vector3MixB is (F32, F32, F64)

actor Main
new create(env: Env) =>
let vector2_u32 = @build_vector2_u32(1, 2)
env.out.print(vector2_u32._1.string())
env.out.print(vector2_u32._2.string())

let vector3_u32 = @build_vector3_u32(3, 4, 5)
env.out.print(vector3_u32._1.string())
env.out.print(vector3_u32._2.string())
env.out.print(vector3_u32._3.string())

let vector2_u64 = @build_vector2_u64(6, 7)
env.out.print(vector2_u64._1.string())
env.out.print(vector2_u64._2.string())

let vector3_u64 = @build_vector3_u64(8, 9, 10)
env.out.print(vector3_u64._1.string())
env.out.print(vector3_u64._2.string())
env.out.print(vector3_u64._3.string())

let vector2_f32 = @build_vector2_f32(11, 12)
env.out.print(vector2_f32._1.string())
env.out.print(vector2_f32._2.string())

let vector3_f32 = @build_vector3_f32(13, 14, 15)
env.out.print(vector3_f32._1.string())
env.out.print(vector3_f32._2.string())
env.out.print(vector3_f32._3.string())

let vector2_f64 = @build_vector2_f64(16, 17)
env.out.print(vector2_f64._1.string())
env.out.print(vector2_f64._2.string())

let vector3_f64 = @build_vector3_f64(18, 19, 20)
env.out.print(vector3_f64._1.string())
env.out.print(vector3_f64._2.string())
env.out.print(vector3_f64._3.string())

let vector3_a = @build_vector3_mix_a(21, 22, 23)
env.out.print(vector3_a._1.string())
env.out.print(vector3_a._2.string())
env.out.print(vector3_a._3.string())

let vector3_b = @build_vector3_mix_b(24, 25, 26)
env.out.print(vector3_b._1.string())
env.out.print(vector3_b._2.string())
env.out.print(vector3_b._3.string())

let total_sum: I32 =
(vector2_u32._1 + vector2_u32._2).i32() +
(vector3_u32._1 + vector3_u32._2 + vector3_u32._3).i32() +
(vector2_u64._1 + vector2_u64._2).i32() +
(vector3_u64._1 + vector3_u64._2 + vector3_u64._3).i32() +
(vector2_f32._1 + vector2_f32._2).i32() +
(vector3_f32._1 + vector3_f32._2 + vector3_f32._3).i32() +
(vector2_f64._1 + vector2_f64._2).i32() +
(vector3_f64._1 + vector3_f64._2 + vector3_f64._3).i32() +
(vector3_a._1.i32() + vector3_a._2.i32() + vector3_a._3.i32()) +
(vector3_b._1.i32() + vector3_b._2.i32() + vector3_b._3.i32())

let exit_code = total_sum % 256
@pony_exitcode(exit_code) // expect (1 + 2 + 3 + ... + 26) % 256 == 95

0 comments on commit c4f7a43

Please sign in to comment.