Skip to content

Commit 80f8c1b

Browse files
committed
Remove some unnecessary protections against Emacs bug #31238
1 parent 7a022a7 commit 80f8c1b

File tree

5 files changed

+25
-4
lines changed

5 files changed

+25
-4
lines changed

src/types/float.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ impl FromLisp<'_> for f64 {
88

99
impl IntoLisp<'_> for f64 {
1010
fn into_lisp(self, env: &Env) -> Result<Value<'_>> {
11-
unsafe_raw_call_value!(env, make_float, self)
11+
unsafe_raw_call_value_unprotected!(env, make_float, self)
1212
}
1313
}

src/types/integer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ int_from_lisp!(usize);
3939

4040
impl IntoLisp<'_> for i64 {
4141
fn into_lisp(self, env: &Env) -> Result<Value<'_>> {
42-
unsafe_raw_call_value!(env, make_integer, self)
42+
unsafe_raw_call_value_unprotected!(env, make_integer, self)
4343
}
4444
}
4545

src/types/vector.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@ impl<'e> Vector<'e> {
4141
pub fn get<T: FromLisp<'e>>(&self, i: usize) -> Result<T> {
4242
let v = self.value;
4343
let env = v.env;
44-
// Safety: Same lifetime. Emacs does bound checking.
45-
unsafe_raw_call_value!(env, vec_get, v.raw, i as isize)?.into_rust()
44+
// Safety:
45+
// - Same lifetime.
46+
// - Emacs does bound checking.
47+
// - Value doesn't need protection because we are done with it while the vector still lives.
48+
unsafe_raw_call_value_unprotected!(env, vec_get, v.raw, i as isize)?.into_rust()
4649
}
4750

4851
pub fn set<T: IntoLisp<'e>>(&self, i: usize, value: T) -> Result<()> {

test-module/src/test_lifetime.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,22 @@ fn gc_after_new_string(env: &Env) -> Result<Value<'_>> {
5757
}, print)
5858
}
5959

60+
// Primitive types supposedly have no issue.
61+
#[defun(mod_in_name = false)]
62+
fn gc_after_new_int(env: &Env) -> Result<Value<'_>> {
63+
create_collect_use(env, 2, || {
64+
5.into_lisp(env)
65+
}, print)
66+
}
67+
68+
// Primitive types supposedly have no issue.
69+
#[defun(mod_in_name = false)]
70+
fn gc_after_new_float(env: &Env) -> Result<Value<'_>> {
71+
create_collect_use(env, 2, || {
72+
5.8.into_lisp(env)
73+
}, print)
74+
}
75+
6076
// Before fixing:
6177
// - macOS: Segmentation fault
6278
// - Linux: Segmentation fault

test-module/tests/main.el

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@
297297
(lambda () (error "abc"))))
298298

299299
(destructive-test gc-after-new-string lifetime)
300+
(destructive-test gc-after-new-int lifetime)
301+
(destructive-test gc-after-new-float lifetime)
300302
(destructive-test gc-after-uninterning lifetime)
301303
(destructive-test gc-after-retrieving lifetime)
302304
(destructive-test gc-after-catching lifetime)

0 commit comments

Comments
 (0)