Skip to content

Commit aeed233

Browse files
author
Christopher Doris
committed
adds numeric operations to julia.AnyValue (only between wrapped values)
1 parent 99e3a6c commit aeed233

File tree

2 files changed

+98
-3
lines changed

2 files changed

+98
-3
lines changed

src/cpython/juliaany.jl

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,24 @@ PyJuliaAnyValue_Type() = begin
2323
ass_subscript = pyjlany_setitem,
2424
),
2525
as_sequence = (contains = pyjlany_contains,),
26+
as_number = (
27+
positive = pyjlany_positive,
28+
negative = pyjlany_negative,
29+
absolute = pyjlany_absolute,
30+
power = pyjlany_power,
31+
add = pyjlany_binop(+),
32+
subtract = pyjlany_binop(-),
33+
multiply = pyjlany_binop(*),
34+
truedivide = pyjlany_binop(/),
35+
divmod = pyjlany_binop((x, y) -> (fld(x, y), mod(x, y))),
36+
floordivide = pyjlany_binop(fld),
37+
remainder = pyjlany_binop(mod),
38+
lshift = pyjlany_binop(<<),
39+
rshift = pyjlany_binop(>>),
40+
and = pyjlany_binop(&),
41+
xor = pyjlany_binop(xor),
42+
or = pyjlany_binop(|),
43+
),
2644
methods = [
2745
(name = "__dir__", flags = Py_METH_NOARGS, meth = pyjlany_dir),
2846
(name = "_repr_mimebundle_", flags = Py_METH_VARARGS | Py_METH_KEYWORDS, meth = pyjlany_repr_mimebundle),
@@ -458,3 +476,79 @@ pyjlany_help(xo::PyPtr, ::PyPtr) =
458476
PyErr_SetJuliaError(err)
459477
PyNULL
460478
end
479+
480+
pyjlany_positive(xo::PyPtr) =
481+
try
482+
PyObject_From(+(PyJuliaValue_GetValue(xo)))
483+
catch err
484+
PyErr_SetJuliaError(err)
485+
PyNULL
486+
end
487+
488+
pyjlany_negative(xo::PyPtr) =
489+
try
490+
PyObject_From(-(PyJuliaValue_GetValue(xo)))
491+
catch err
492+
PyErr_SetJuliaError(err)
493+
PyNULL
494+
end
495+
496+
pyjlany_absolute(xo::PyPtr) =
497+
try
498+
PyObject_From(abs(PyJuliaValue_GetValue(xo)))
499+
catch err
500+
PyErr_SetJuliaError(err)
501+
PyNULL
502+
end
503+
504+
struct pyjlany_binop{F}
505+
f::F
506+
end
507+
(f::pyjlany_binop)(xo::PyPtr, yo::PyPtr) = begin
508+
PyJuliaValue_Check(xo) || return PyNotImplemented_New()
509+
PyJuliaValue_Check(yo) || return PyNotImplemented_New()
510+
x = PyJuliaValue_GetValue(xo)
511+
y = PyJuliaValue_GetValue(yo)
512+
try
513+
PyObject_From(f.f(x, y))
514+
catch err
515+
if err isa MethodError && err.f === f.f
516+
PyNotImplemented_New()
517+
else
518+
PyErr_SetJuliaError(err)
519+
PyNULL
520+
end
521+
end
522+
end
523+
524+
pyjlany_power(xo::PyPtr, yo::PyPtr, zo::PyPtr) = begin
525+
PyJuliaValue_Check(xo) || return PyNotImplemented_New()
526+
PyJuliaValue_Check(yo) || return PyNotImplemented_New()
527+
x = PyJuliaValue_GetValue(xo)
528+
y = PyJuliaValue_GetValue(yo)
529+
if PyNone_Check(zo)
530+
try
531+
PyObject_From(x^y)
532+
catch err
533+
if err isa MethodError && err.f === ^
534+
PyNotImplemented_New()
535+
else
536+
PyErr_SetJuliaError(err)
537+
PyNULL
538+
end
539+
end
540+
else
541+
PyJuliaValue_Check(zo) || return PyNotImplemented_New()
542+
z = PyJuliaValue_GetValue(zo)
543+
try
544+
PyObject_From(powermod(x, y, z))
545+
catch err
546+
if err isa MethodError && err.f === powermod
547+
PyNotImplemented_New()
548+
else
549+
PyErr_SetJuliaError(err)
550+
PyNULL
551+
end
552+
end
553+
end
554+
end

src/cpython/julianumber.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ PyJuliaNumberValue_Type() = begin
1515
positive = pyjlnumber_positive,
1616
negative = pyjlnumber_negative,
1717
absolute = pyjlnumber_absolute,
18+
power = pyjlnumber_power,
1819
add = pyjlnumber_binop(+),
1920
subtract = pyjlnumber_binop(-),
2021
multiply = pyjlnumber_binop(*),
@@ -250,7 +251,7 @@ end
250251
try
251252
PyObject_From(f.f(x, y))
252253
catch err
253-
if err isa MethodError && err.f == f.f
254+
if err isa MethodError && err.f === f.f
254255
PyNotImplemented_New()
255256
else
256257
PyErr_SetJuliaError(err)
@@ -272,7 +273,7 @@ pyjlnumber_power(xo::PyPtr, yo::PyPtr, zo::PyPtr) = begin
272273
try
273274
PyObject_From(x^y)
274275
catch err
275-
if err isa MethodError && err.f == ^
276+
if err isa MethodError && err.f === ^
276277
PyNotImplemented_New()
277278
else
278279
PyErr_SetJuliaError(err)
@@ -287,7 +288,7 @@ pyjlnumber_power(xo::PyPtr, yo::PyPtr, zo::PyPtr) = begin
287288
try
288289
PyObject_From(powermod(x, y, z))
289290
catch err
290-
if err isa MethodError && err.f == powermod
291+
if err isa MethodError && err.f === powermod
291292
PyNotImplemented_New()
292293
else
293294
PyErr_SetJuliaError(err)

0 commit comments

Comments
 (0)