Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.

Commit 00f6049

Browse files
Godhudawagenet
Godhuda
authored andcommitted
Fix extern static warning
See rust-lang/rust#35112
1 parent 4c45ec5 commit 00f6049

File tree

9 files changed

+280
-17
lines changed

9 files changed

+280
-17
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
target
22
Cargo.lock
33
.vscode
4+
*.o
5+
*.a
6+
*.so
7+
*.dylib
8+
*.bundle

crates/libcruby-sys/src/lib.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ extern "C" {
5454
#[link_name = "HELIX_RSTRING_PTR"]
5555
pub fn RSTRING_PTR(string: VALUE) -> c_string;
5656

57+
#[link_name = "HELIX_rb_utf8_str_new"]
58+
pub fn rb_utf8_str_new(string: c_string, len: libc::c_long) -> VALUE;
59+
5760
#[link_name = "HELIX_RARRAY_LEN"]
5861
pub fn RARRAY_LEN(array: VALUE) -> isize;
5962

6063
#[link_name = "HELIX_RARRAY_PTR"]
6164
pub fn RARRAY_PTR(array: VALUE) -> void_ptr;
6265

63-
#[link_name = "helix_rb_utf8_str_new"]
64-
pub fn rb_utf8_str_new(string: c_string, len: libc::c_long) -> VALUE;
65-
6666
#[link_name = "HELIX_RB_TYPE_P"]
6767
pub fn RB_TYPE_P(val: VALUE, rb_type: isize) -> bool;
6868

@@ -88,11 +88,21 @@ extern "C" {
8888
pub fn rb_define_module_under(namespace: VALUE, name: c_string) -> VALUE;
8989
pub fn rb_define_class(name: c_string, superclass: VALUE) -> VALUE;
9090
pub fn rb_define_class_under(namespace: VALUE, name: c_string, superclass: VALUE) -> VALUE;
91+
pub fn rb_define_alloc_func(klass: VALUE, func: extern "C" fn(klass: VALUE) -> VALUE);
9192
pub fn rb_define_method(class: VALUE, name: c_string, func: void_ptr, arity: isize);
9293
pub fn rb_intern(string: c_string) -> ID;
9394
pub fn rb_jump_tag(state: RubyException) -> !;
9495
pub fn rb_protect(try: extern "C" fn(v: void_ptr) -> VALUE,
9596
arg: void_ptr,
9697
state: *mut RubyException)
9798
-> VALUE;
99+
100+
#[link_name = "HELIX_Data_Wrap_Struct"]
101+
pub fn Data_Wrap_Struct(klass: VALUE, mark: extern "C" fn(void_ptr), free: extern "C" fn(void_ptr), data: void_ptr) -> VALUE;
102+
103+
#[link_name = "HELIX_Data_Get_Struct_Value"]
104+
pub fn Data_Get_Struct_Value(obj: VALUE) -> void_ptr;
105+
106+
#[link_name = "HELIX_Data_Set_Struct_Value"]
107+
pub fn Data_Set_Struct_Value(obj: VALUE, data: void_ptr);
98108
}

examples/console/Cargo.lock

Lines changed: 10 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ruby/ext/helix_runtime/native/helix_runtime.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,28 @@ VALUE HELIX_FIX2INT(VALUE v) {
3535
return FIX2INT(v);
3636
}
3737

38-
VALUE helix_rb_utf8_str_new(const char* str, long len) {
38+
VALUE HELIX_rb_utf8_str_new(const char* str, long len) {
3939
return rb_utf8_str_new(str, len);
4040
}
4141

42+
VALUE HELIX_Data_Wrap_Struct(VALUE klass, HELIX_RUBY_DATA_FUNC mark, HELIX_RUBY_DATA_FUNC free, void* data) {
43+
return Data_Wrap_Struct(klass, mark, free, data);
44+
}
45+
46+
void* HELIX_Data_Get_Struct_Value(VALUE obj) {
47+
void* data;
48+
Data_Get_Struct(obj, void*, data);
49+
return data;
50+
}
51+
52+
void HELIX_Data_Set_Struct_Value(VALUE obj, void* data) {
53+
DATA_PTR(obj) = data;
54+
}
55+
56+
// void HELIX_rb_define_alloc_func(VALUE klass, HELIX_rb_alloc_func_t func) {
57+
// rb_define_alloc_func(klass, func);
58+
// }
59+
4260
int HELIX_TYPE(VALUE v) {
4361
return TYPE(v);
4462
}

ruby/ext/helix_runtime/native/helix_runtime.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,16 @@ int HELIX_TYPE(VALUE v);
2121
VALUE HELIX_INT2FIX(int c_int);
2222
VALUE HELIX_FIX2INT(VALUE fix);
2323

24-
VALUE helix_rb_utf8_str_new(const char* str, long len);
24+
VALUE HELIX_rb_utf8_str_new(const char* str, long len);
25+
26+
// typedef VALUE (*HELIX_rb_alloc_func_t)(VALUE);
27+
// void HELIX_rb_define_alloc_func(VALUE klass, HELIX_rb_alloc_func_t func);
28+
29+
typedef void (*HELIX_RUBY_DATA_FUNC)(void*);
30+
31+
VALUE HELIX_Data_Wrap_Struct(VALUE klass, HELIX_RUBY_DATA_FUNC mark, HELIX_RUBY_DATA_FUNC free, void* data);
32+
void* HELIX_Data_Get_Struct_Value(VALUE obj);
33+
void HELIX_Data_Set_Struct_Value(VALUE obj, void* data);
2534

2635
extern int HELIX_T_NONE;
2736
extern int HELIX_T_NIL;

ruby/spec/helix_runtime_spec.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,5 +113,52 @@ module TYPES
113113
# expect(Dummy.TYPE({})).to eq(Dummy::T_HASH)
114114
# expect(Dummy.TYPE([])).to_not eq(Dummy::T_OBJECT)
115115
# end
116+
117+
describe "helix_rb_utf8_str_new" do
118+
it "allocates a new string" do
119+
str1 = "hello world"
120+
str2 = Dummy.STR2STR(str1, 5)
121+
122+
expect(str2).to eq("hello")
123+
124+
str1[0...5] = "goodbye"
125+
126+
expect(str1).to eq("goodbye world")
127+
expect(str2).to eq("hello")
128+
129+
str2 << " world!"
130+
131+
expect(str1).to eq("goodbye world")
132+
expect(str2).to eq("hello world!")
133+
end
134+
end
135+
136+
describe "Data_{Wrap,Get,Set}_Struct" do
137+
it "can allocate then change the data" do
138+
wrapper = Dummy::Wrapper.new
139+
140+
expect(Dummy.get_data(wrapper)).to eq(0)
141+
142+
ptr = Dummy.get_data_ptr(wrapper)
143+
144+
expect(Dummy.set_data(wrapper, 1)).to eq(1)
145+
146+
expect(Dummy.get_data(wrapper)).to eq(1)
147+
expect(Dummy.get_data_ptr(wrapper)).to eq(ptr)
148+
end
149+
150+
it "can allocate then replace the data" do
151+
wrapper = Dummy::Wrapper.new
152+
153+
expect(Dummy.get_data(wrapper)).to eq(0)
154+
155+
ptr = Dummy.get_data_ptr(wrapper)
156+
157+
expect(Dummy.replace_data(wrapper, 1)).to eq(1)
158+
159+
expect(Dummy.get_data(wrapper)).to eq(1)
160+
expect(Dummy.get_data_ptr(wrapper)).not_to eq(ptr)
161+
end
162+
end
116163
end
117164

ruby/spec/support/dummy/ext/dummy/dummy.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,56 @@ static VALUE TEST_FIX2INT(VALUE _self, VALUE val) {
4848
return INT2FIX(HELIX_FIX2INT(val));
4949
}
5050

51+
static VALUE TEST_STR2STR(VALUE _self, VALUE str, VALUE len) {
52+
return HELIX_rb_utf8_str_new(RSTRING_PTR(str), FIX2LONG(len));
53+
}
54+
55+
void deallocate_wrapper(void* num) {
56+
free(num);
57+
}
58+
59+
VALUE allocate_wrapper(VALUE klass) {
60+
int* num = malloc(sizeof(int));
61+
62+
*num = 0;
63+
64+
return HELIX_Data_Wrap_Struct(klass, NULL, deallocate_wrapper, num);
65+
}
66+
67+
static VALUE TEST_get_data(VALUE _self, VALUE wrapped) {
68+
int* num = HELIX_Data_Get_Struct_Value(wrapped);
69+
return INT2FIX(*num);
70+
}
71+
72+
static VALUE TEST_get_data_ptr(VALUE _self, VALUE wrapped) {
73+
int* num = HELIX_Data_Get_Struct_Value(wrapped);
74+
return INT2FIX(num);
75+
}
76+
77+
static VALUE TEST_set_data(VALUE _self, VALUE wrapped, VALUE value) {
78+
int* num = HELIX_Data_Get_Struct_Value(wrapped);
79+
*num = FIX2INT(value);
80+
return value;
81+
}
82+
83+
static VALUE TEST_replace_data(VALUE _self, VALUE wrapped, VALUE value) {
84+
int* old = HELIX_Data_Get_Struct_Value(wrapped);
85+
int* new = malloc(sizeof(int));
86+
87+
*new = FIX2INT(value);
88+
89+
HELIX_Data_Set_Struct_Value(wrapped, new);
90+
91+
free(old);
92+
93+
return value;
94+
}
95+
5196
void Init_dummy() {
5297
VALUE mDummy = rb_define_module("Dummy");
5398
VALUE mRuby = rb_define_module_under(mDummy, "Ruby");
99+
VALUE cWrapper = rb_define_class_under(mDummy, "Wrapper", rb_cObject);
100+
rb_define_alloc_func(cWrapper, allocate_wrapper);
54101

55102
EXPORT_VALUE(Qtrue);
56103
EXPORT_VALUE(Qfalse);
@@ -93,4 +140,11 @@ void Init_dummy() {
93140
EXPORT_FUNC(TYPE, 1);
94141
EXPORT_FUNC(INT2FIX, 1);
95142
EXPORT_FUNC(FIX2INT, 1);
143+
144+
EXPORT_FUNC(STR2STR, 2);
145+
146+
EXPORT_FUNC(get_data, 1);
147+
EXPORT_FUNC(get_data_ptr, 1);
148+
EXPORT_FUNC(set_data, 2);
149+
EXPORT_FUNC(replace_data, 2);
96150
}

src/class_definition.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ impl ClassDefinition {
2424
ClassDefinition { class: Class(raw_class) }
2525
}
2626

27+
pub fn wrapped(name: &str, alloc_func: extern "C" fn(klass: sys::VALUE) -> sys::VALUE) -> ClassDefinition {
28+
let raw_class = unsafe { sys::rb_define_class(CString::new(name).unwrap().as_ptr(), sys::rb_cObject) };
29+
unsafe { sys::rb_define_alloc_func(raw_class, alloc_func) };
30+
ClassDefinition { class: Class(raw_class) }
31+
}
32+
2733
pub fn reopen(name: &str) -> ClassDefinition {
2834
let raw_class = unsafe {
2935
let class_id = sys::rb_intern(CString::new(name).unwrap().as_ptr());

0 commit comments

Comments
 (0)