Skip to content

Commit

Permalink
feat: ffi.rawData
Browse files Browse the repository at this point in the history
  • Loading branch information
giann committed Jan 21, 2025
1 parent 8288868 commit 3586f9d
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/buzz_api.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1512,6 +1512,10 @@ export fn bz_foreignContainerSlice(container_value: Value, len: *usize) [*]u8 {
return container.data.ptr;
}

export fn bz_valueIsForeignContainer(value: Value) bool {
return value.isObj() and value.obj().obj_type == .ForeignContainer;
}

export fn bz_newForeignContainerFromSlice(vm: *VM, type_def: Value, ptr: [*]u8, len: usize) Value {
var container = (vm.gc.allocateObject(
ObjForeignContainer,
Expand Down
1 change: 1 addition & 0 deletions src/lib/buzz_api.zig
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ pub const Value = packed struct {
pub extern fn bz_valueToString(value: Value, len: *usize) ?[*]const u8;
pub extern fn bz_valueToCString(value: Value) ?[*:0]const u8;
pub extern fn bz_valueToForeignContainerPtr(value: Value) [*]u8;
pub extern fn bz_valueIsForeignContainer(value: Value) bool;
pub extern fn bz_valueDump(value: Value, vm: *VM) void;
pub extern fn bz_valueEqual(self: Value, other: Value) Value;
pub extern fn bz_valueIs(self: Value, type_def: Value) Value;
Expand Down
19 changes: 19 additions & 0 deletions src/lib/buzz_ffi.zig
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,22 @@ pub export fn alignOfStruct(ctx: *api.NativeCtx) c_int {

return 1;
}

pub export fn rawData(ctx: *api.NativeCtx) c_int {
const data = ctx.vm.bz_peek(0);

if (!data.bz_valueIsForeignContainer()) {
ctx.vm.pushError("ffi.ValueNotForeignContainer", null);

return -1;
}

var len: usize = 0;
const data_ptr = data.bz_foreignContainerSlice(&len);

ctx.vm.bz_push(
ctx.vm.bz_stringToValue(data_ptr, len),
);

return 1;
}
6 changes: 6 additions & 0 deletions src/lib/ffi.buzz
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,16 @@ export object FFIZigTypeParseError {
message: str = "Could not parse zig type",
}

export object ValueNotForeignContainer {
message: str = "Value is not a foreign container",
}

export extern fun alignOf(zigType: str) > int;

export extern fun sizeOf(zigType: str) > int;

export extern fun sizeOfStruct(structType: type) > int;

export extern fun alignOfStruct(structType: type) > int;

export extern fun rawData(data: any) > str;
2 changes: 1 addition & 1 deletion tests/058-ffi.buzz
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ zdef("tests/utils/libforeign", `
const Data = extern struct {
id: i32,
msg: [*:0]const u8,
value: f32,
value: f64,
};

fn get_data_msg(data: *Data) [*:0]const u8;
Expand Down
1 change: 1 addition & 0 deletions tests/utils/foreign.zig
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export fn sum(values: [*]i32, len: i32) i32 {
pub const Data = extern struct {
id: i32,
msg: [*:0]u8,
value: f64,
};

export fn get_data_msg(data: *Data) [*:0]u8 {
Expand Down

0 comments on commit 3586f9d

Please sign in to comment.