Skip to content

Commit 64feb29

Browse files
Add more number functions to c-api (#8158)
1 parent f81c320 commit 64feb29

1 file changed

Lines changed: 202 additions & 0 deletions

File tree

‎crates/capi/src/abstract_/number.rs‎

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,217 @@
11
use crate::{PyObject, pystate::with_vm};
2+
use core::ffi::c_int;
3+
use rustpython_vm::protocol::PyNumber;
24

35
#[unsafe(no_mangle)]
46
pub unsafe extern "C" fn PyNumber_Add(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
57
with_vm(|vm| vm._add(unsafe { &*o1 }, unsafe { &*o2 }))
68
}
79

10+
#[unsafe(no_mangle)]
11+
pub unsafe extern "C" fn PyIndex_Check(obj: *mut PyObject) -> c_int {
12+
with_vm(|_vm| unsafe { obj.as_ref() }.is_some_and(|obj| obj.number().is_index()))
13+
}
14+
15+
#[unsafe(no_mangle)]
16+
pub unsafe extern "C" fn PyNumber_Absolute(o: *mut PyObject) -> *mut PyObject {
17+
with_vm(|vm| vm._abs(unsafe { &*o }))
18+
}
19+
20+
#[unsafe(no_mangle)]
21+
pub unsafe extern "C" fn PyNumber_And(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
22+
with_vm(|vm| vm._and(unsafe { &*o1 }, unsafe { &*o2 }))
23+
}
24+
25+
#[unsafe(no_mangle)]
26+
pub unsafe extern "C" fn PyNumber_Check(o: *mut PyObject) -> c_int {
27+
with_vm(|_vm| unsafe { o.as_ref() }.is_some_and(PyNumber::check))
28+
}
29+
30+
#[unsafe(no_mangle)]
31+
pub unsafe extern "C" fn PyNumber_Divmod(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
32+
with_vm(|vm| vm._divmod(unsafe { &*o1 }, unsafe { &*o2 }))
33+
}
34+
35+
#[unsafe(no_mangle)]
36+
pub unsafe extern "C" fn PyNumber_Float(o: *mut PyObject) -> *mut PyObject {
37+
with_vm(|vm| unsafe { &*o }.try_float(vm))
38+
}
39+
40+
#[unsafe(no_mangle)]
41+
pub unsafe extern "C" fn PyNumber_FloorDivide(
42+
o1: *mut PyObject,
43+
o2: *mut PyObject,
44+
) -> *mut PyObject {
45+
with_vm(|vm| vm._floordiv(unsafe { &*o1 }, unsafe { &*o2 }))
46+
}
47+
48+
#[unsafe(no_mangle)]
49+
pub unsafe extern "C" fn PyNumber_InPlaceAdd(
50+
o1: *mut PyObject,
51+
o2: *mut PyObject,
52+
) -> *mut PyObject {
53+
with_vm(|vm| vm._iadd(unsafe { &*o1 }, unsafe { &*o2 }))
54+
}
55+
56+
#[unsafe(no_mangle)]
57+
pub unsafe extern "C" fn PyNumber_InPlaceAnd(
58+
o1: *mut PyObject,
59+
o2: *mut PyObject,
60+
) -> *mut PyObject {
61+
with_vm(|vm| vm._iand(unsafe { &*o1 }, unsafe { &*o2 }))
62+
}
63+
64+
#[unsafe(no_mangle)]
65+
pub unsafe extern "C" fn PyNumber_InPlaceFloorDivide(
66+
o1: *mut PyObject,
67+
o2: *mut PyObject,
68+
) -> *mut PyObject {
69+
with_vm(|vm| vm._ifloordiv(unsafe { &*o1 }, unsafe { &*o2 }))
70+
}
71+
72+
#[unsafe(no_mangle)]
73+
pub unsafe extern "C" fn PyNumber_InPlaceLshift(
74+
o1: *mut PyObject,
75+
o2: *mut PyObject,
76+
) -> *mut PyObject {
77+
with_vm(|vm| vm._ilshift(unsafe { &*o1 }, unsafe { &*o2 }))
78+
}
79+
80+
#[unsafe(no_mangle)]
81+
pub unsafe extern "C" fn PyNumber_InPlaceMatrixMultiply(
82+
o1: *mut PyObject,
83+
o2: *mut PyObject,
84+
) -> *mut PyObject {
85+
with_vm(|vm| vm._imatmul(unsafe { &*o1 }, unsafe { &*o2 }))
86+
}
87+
88+
#[unsafe(no_mangle)]
89+
pub unsafe extern "C" fn PyNumber_InPlaceMultiply(
90+
o1: *mut PyObject,
91+
o2: *mut PyObject,
92+
) -> *mut PyObject {
93+
with_vm(|vm| vm._imul(unsafe { &*o1 }, unsafe { &*o2 }))
94+
}
95+
96+
#[unsafe(no_mangle)]
97+
pub unsafe extern "C" fn PyNumber_InPlaceOr(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
98+
with_vm(|vm| vm._ior(unsafe { &*o1 }, unsafe { &*o2 }))
99+
}
100+
101+
#[unsafe(no_mangle)]
102+
pub unsafe extern "C" fn PyNumber_InPlacePower(
103+
o1: *mut PyObject,
104+
o2: *mut PyObject,
105+
o3: *mut PyObject,
106+
) -> *mut PyObject {
107+
with_vm(|vm| vm._ipow(unsafe { &*o1 }, unsafe { &*o2 }, unsafe { &*o3 }))
108+
}
109+
110+
#[unsafe(no_mangle)]
111+
pub unsafe extern "C" fn PyNumber_InPlaceRemainder(
112+
o1: *mut PyObject,
113+
o2: *mut PyObject,
114+
) -> *mut PyObject {
115+
with_vm(|vm| vm._imod(unsafe { &*o1 }, unsafe { &*o2 }))
116+
}
117+
118+
#[unsafe(no_mangle)]
119+
pub unsafe extern "C" fn PyNumber_InPlaceRshift(
120+
o1: *mut PyObject,
121+
o2: *mut PyObject,
122+
) -> *mut PyObject {
123+
with_vm(|vm| vm._irshift(unsafe { &*o1 }, unsafe { &*o2 }))
124+
}
125+
126+
#[unsafe(no_mangle)]
127+
pub unsafe extern "C" fn PyNumber_InPlaceSubtract(
128+
o1: *mut PyObject,
129+
o2: *mut PyObject,
130+
) -> *mut PyObject {
131+
with_vm(|vm| vm._isub(unsafe { &*o1 }, unsafe { &*o2 }))
132+
}
133+
134+
#[unsafe(no_mangle)]
135+
pub unsafe extern "C" fn PyNumber_InPlaceTrueDivide(
136+
o1: *mut PyObject,
137+
o2: *mut PyObject,
138+
) -> *mut PyObject {
139+
with_vm(|vm| vm._itruediv(unsafe { &*o1 }, unsafe { &*o2 }))
140+
}
141+
142+
#[unsafe(no_mangle)]
143+
pub unsafe extern "C" fn PyNumber_InPlaceXor(
144+
o1: *mut PyObject,
145+
o2: *mut PyObject,
146+
) -> *mut PyObject {
147+
with_vm(|vm| vm._ixor(unsafe { &*o1 }, unsafe { &*o2 }))
148+
}
149+
150+
#[unsafe(no_mangle)]
151+
pub unsafe extern "C" fn PyNumber_Invert(o: *mut PyObject) -> *mut PyObject {
152+
with_vm(|vm| vm._invert(unsafe { &*o }))
153+
}
154+
8155
#[unsafe(no_mangle)]
9156
pub unsafe extern "C" fn PyNumber_Index(obj: *mut PyObject) -> *mut PyObject {
10157
with_vm(|vm| unsafe { &*obj }.try_index(vm))
11158
}
12159

160+
#[unsafe(no_mangle)]
161+
pub unsafe extern "C" fn PyNumber_MatrixMultiply(
162+
o1: *mut PyObject,
163+
o2: *mut PyObject,
164+
) -> *mut PyObject {
165+
with_vm(|vm| vm._matmul(unsafe { &*o1 }, unsafe { &*o2 }))
166+
}
167+
168+
#[unsafe(no_mangle)]
169+
pub unsafe extern "C" fn PyNumber_Multiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
170+
with_vm(|vm| vm._mul(unsafe { &*o1 }, unsafe { &*o2 }))
171+
}
172+
173+
#[unsafe(no_mangle)]
174+
pub unsafe extern "C" fn PyNumber_Negative(o: *mut PyObject) -> *mut PyObject {
175+
with_vm(|vm| vm._neg(unsafe { &*o }))
176+
}
177+
178+
#[unsafe(no_mangle)]
179+
pub unsafe extern "C" fn PyNumber_Positive(o: *mut PyObject) -> *mut PyObject {
180+
with_vm(|vm| vm._pos(unsafe { &*o }))
181+
}
182+
183+
#[unsafe(no_mangle)]
184+
pub unsafe extern "C" fn PyNumber_Power(
185+
o1: *mut PyObject,
186+
o2: *mut PyObject,
187+
o3: *mut PyObject,
188+
) -> *mut PyObject {
189+
with_vm(|vm| vm._pow(unsafe { &*o1 }, unsafe { &*o2 }, unsafe { &*o3 }))
190+
}
191+
192+
#[unsafe(no_mangle)]
193+
pub unsafe extern "C" fn PyNumber_Remainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
194+
with_vm(|vm| vm._mod(unsafe { &*o1 }, unsafe { &*o2 }))
195+
}
196+
197+
#[unsafe(no_mangle)]
198+
pub unsafe extern "C" fn PyNumber_TrueDivide(
199+
o1: *mut PyObject,
200+
o2: *mut PyObject,
201+
) -> *mut PyObject {
202+
with_vm(|vm| vm._truediv(unsafe { &*o1 }, unsafe { &*o2 }))
203+
}
204+
205+
#[unsafe(no_mangle)]
206+
pub unsafe extern "C" fn PyNumber_Xor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
207+
with_vm(|vm| vm._xor(unsafe { &*o1 }, unsafe { &*o2 }))
208+
}
209+
210+
#[unsafe(no_mangle)]
211+
pub unsafe extern "C" fn PyNumber_Long(obj: *mut PyObject) -> *mut PyObject {
212+
with_vm(|vm| unsafe { &*obj }.try_int(vm))
213+
}
214+
13215
#[unsafe(no_mangle)]
14216
pub unsafe extern "C" fn PyNumber_Lshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject {
15217
with_vm(|vm| vm._lshift(unsafe { &*o1 }, unsafe { &*o2 }))

0 commit comments

Comments
 (0)