forked from M-Labs/nac3
core/object: add RangeObject & RangeObject::len
This commit is contained in:
parent
c0cace843d
commit
122f55e615
@ -208,4 +208,17 @@ template <typename T> struct Slice
|
||||
return this->indices<SizeT>(length);
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
extern "C"
|
||||
{
|
||||
int32_t __nac3_range_len_i32(int32_t start, int32_t stop, int32_t step)
|
||||
{
|
||||
range::len<int32_t>(start, stop, step);
|
||||
}
|
||||
|
||||
int32_t __nac3_range_len_i3264(int32_t start, int32_t stop, int32_t step)
|
||||
{
|
||||
range::len<int64_t>(start, stop, step);
|
||||
}
|
||||
}
|
@ -609,6 +609,21 @@ pub fn setup_irrt_exceptions<'ctx>(
|
||||
}
|
||||
}
|
||||
|
||||
pub fn call_nac3_range_len_i32<'ctx, G: CodeGenerator + ?Sized>(
|
||||
generator: &mut G,
|
||||
ctx: &mut CodeGenContext<'ctx, '_>,
|
||||
start: Instance<'ctx, Int<Int32>>,
|
||||
stop: Instance<'ctx, Int<Int32>>,
|
||||
step: Instance<'ctx, Int<Int32>>,
|
||||
) -> Instance<'ctx, Int<Int32>> {
|
||||
let name = get_sizet_dependent_function_name(generator, ctx, "__nac3_range_len_i32");
|
||||
CallFunction::begin(generator, ctx, &name)
|
||||
.arg(start)
|
||||
.arg(stop)
|
||||
.arg(step)
|
||||
.returning_auto("range_len")
|
||||
}
|
||||
|
||||
pub fn call_nac3_ndarray_util_assert_shape_no_negative<'ctx, G: CodeGenerator + ?Sized>(
|
||||
generator: &mut G,
|
||||
ctx: &mut CodeGenContext<'ctx, '_>,
|
||||
|
@ -1,4 +1,5 @@
|
||||
pub mod any;
|
||||
pub mod list;
|
||||
pub mod ndarray;
|
||||
pub mod range;
|
||||
pub mod tuple;
|
||||
|
@ -22,10 +22,12 @@ impl<'ctx, N: IntKind<'ctx>> Instance<'ctx, Ptr<Range<N>>> {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: `RangeObject` in the future will have range32, range64
|
||||
|
||||
/// A NAC3 Python range object.
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct RangeObject<'ctx> {
|
||||
pub instance: Instance<'ctx, Ptr<Range<Int32>>>, // TODO: Ptr<Range<AnyInt>> in the future when there is range32, range64
|
||||
pub instance: Instance<'ctx, Ptr<Range<Int32>>>,
|
||||
}
|
||||
|
||||
impl<'ctx> RangeObject<'ctx> {
|
||||
@ -35,17 +37,12 @@ impl<'ctx> RangeObject<'ctx> {
|
||||
ctx: &mut CodeGenContext<'ctx, '_>,
|
||||
object: AnyObject<'ctx>,
|
||||
) -> RangeObject<'ctx> {
|
||||
assert!(RangeObject::is_instance(ctx, object));
|
||||
assert!(ctx.unifier.unioned(object.ty, ctx.primitives.range));
|
||||
|
||||
let instance = Ptr(Range::default()).check_value(generator, ctx.ctx, object.value).unwrap();
|
||||
RangeObject { instance }
|
||||
}
|
||||
|
||||
/// Check if an object can be converted into a range.
|
||||
pub fn is_instance(ctx: &mut CodeGenContext<'ctx, '_>, object: AnyObject<'ctx>) -> bool {
|
||||
ctx.unifier.unioned(object.ty, ctx.primitives.range)
|
||||
}
|
||||
|
||||
/// Get the `len()` of this range.
|
||||
pub fn len<G: CodeGenerator + ?Sized>(
|
||||
&self,
|
||||
|
Loading…
Reference in New Issue
Block a user