Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
71d3112f
Commit
71d3112f
authored
Apr 17, 2014
by
Damien George
Browse files
py: Make built-in 'range' a class.
Addresses issue #487.
parent
d553be59
Changes
5
Hide whitespace changes
Inline
Side-by-side
py/builtin.c
View file @
71d3112f
...
...
@@ -362,17 +362,6 @@ STATIC mp_obj_t mp_builtin_print(uint n_args, const mp_obj_t *args, mp_map_t *kw
MP_DEFINE_CONST_FUN_OBJ_KW
(
mp_builtin_print_obj
,
0
,
mp_builtin_print
);
STATIC
mp_obj_t
mp_builtin_range
(
uint
n_args
,
const
mp_obj_t
*
args
)
{
assert
(
1
<=
n_args
&&
n_args
<=
3
);
switch
(
n_args
)
{
case
1
:
return
mp_obj_new_range
(
0
,
mp_obj_get_int
(
args
[
0
]),
1
);
case
2
:
return
mp_obj_new_range
(
mp_obj_get_int
(
args
[
0
]),
mp_obj_get_int
(
args
[
1
]),
1
);
default:
return
mp_obj_new_range
(
mp_obj_get_int
(
args
[
0
]),
mp_obj_get_int
(
args
[
1
]),
mp_obj_get_int
(
args
[
2
]));
}
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
(
mp_builtin_range_obj
,
1
,
3
,
mp_builtin_range
);
STATIC
mp_obj_t
mp_builtin_repr
(
mp_obj_t
o_in
)
{
vstr_t
*
vstr
=
vstr_new
();
mp_obj_print_helper
((
void
(
*
)(
void
*
env
,
const
char
*
fmt
,
...))
vstr_printf
,
vstr
,
o_in
,
PRINT_REPR
);
...
...
py/builtin.h
View file @
71d3112f
...
...
@@ -31,7 +31,6 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_oct_obj);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_ord_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_pow_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_print_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_range_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_repr_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_sorted_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_builtin_sum_obj
);
...
...
py/builtintables.c
View file @
71d3112f
...
...
@@ -34,6 +34,7 @@ STATIC const mp_map_elem_t mp_builtin_object_table[] = {
#if MICROPY_ENABLE_PROPERTY
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_property
),
(
mp_obj_t
)
&
mp_type_property
},
#endif
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_range
),
(
mp_obj_t
)
&
mp_type_range
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_set
),
(
mp_obj_t
)
&
mp_type_set
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_str
),
(
mp_obj_t
)
&
mp_type_str
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_super
),
(
mp_obj_t
)
&
mp_type_super
},
...
...
@@ -75,7 +76,6 @@ STATIC const mp_map_elem_t mp_builtin_object_table[] = {
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_ord
),
(
mp_obj_t
)
&
mp_builtin_ord_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_pow
),
(
mp_obj_t
)
&
mp_builtin_pow_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_print
),
(
mp_obj_t
)
&
mp_builtin_print_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_range
),
(
mp_obj_t
)
&
mp_builtin_range_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_repr
),
(
mp_obj_t
)
&
mp_builtin_repr_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_sorted
),
(
mp_obj_t
)
&
mp_builtin_sorted_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_sum
),
(
mp_obj_t
)
&
mp_builtin_sum_obj
},
...
...
py/obj.h
View file @
71d3112f
...
...
@@ -272,6 +272,7 @@ extern const mp_obj_type_t mp_type_map; // map (the python builtin, not the dict
extern
const
mp_obj_type_t
mp_type_enumerate
;
extern
const
mp_obj_type_t
mp_type_filter
;
extern
const
mp_obj_type_t
mp_type_dict
;
extern
const
mp_obj_type_t
mp_type_range
;
extern
const
mp_obj_type_t
mp_type_set
;
extern
const
mp_obj_type_t
mp_type_slice
;
extern
const
mp_obj_type_t
mp_type_zip
;
...
...
@@ -346,8 +347,6 @@ mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type);
mp_obj_t
mp_obj_new_exception_args
(
const
mp_obj_type_t
*
exc_type
,
uint
n_args
,
const
mp_obj_t
*
args
);
mp_obj_t
mp_obj_new_exception_msg
(
const
mp_obj_type_t
*
exc_type
,
const
char
*
msg
);
mp_obj_t
mp_obj_new_exception_msg_varg
(
const
mp_obj_type_t
*
exc_type
,
const
char
*
fmt
,
...);
// counts args by number of % symbols in fmt, excluding %%; can only handle void* sizes (ie no float/double!)
mp_obj_t
mp_obj_new_range
(
int
start
,
int
stop
,
int
step
);
mp_obj_t
mp_obj_new_range_iterator
(
int
cur
,
int
stop
,
int
step
);
mp_obj_t
mp_obj_new_fun_bc
(
uint
scope_flags
,
qstr
*
args
,
uint
n_args
,
mp_obj_t
def_args
,
const
byte
*
code
);
mp_obj_t
mp_obj_new_fun_asm
(
uint
n_args
,
void
*
fun
);
mp_obj_t
mp_obj_new_gen_wrap
(
mp_obj_t
fun
);
...
...
py/objrange.c
View file @
71d3112f
...
...
@@ -5,38 +5,7 @@
#include
"mpconfig.h"
#include
"qstr.h"
#include
"obj.h"
/******************************************************************************/
/* range */
typedef
struct
_mp_obj_range_t
{
mp_obj_base_t
base
;
// TODO make these values generic objects or something
machine_int_t
start
;
machine_int_t
stop
;
machine_int_t
step
;
}
mp_obj_range_t
;
STATIC
mp_obj_t
range_getiter
(
mp_obj_t
o_in
)
{
mp_obj_range_t
*
o
=
o_in
;
return
mp_obj_new_range_iterator
(
o
->
start
,
o
->
stop
,
o
->
step
);
}
STATIC
const
mp_obj_type_t
range_type
=
{
{
&
mp_type_type
}
,
.
name
=
MP_QSTR_range
,
.
getiter
=
range_getiter
,
};
// range is a class and instances are immutable sequence objects
mp_obj_t
mp_obj_new_range
(
int
start
,
int
stop
,
int
step
)
{
mp_obj_range_t
*
o
=
m_new_obj
(
mp_obj_range_t
);
o
->
base
.
type
=
&
range_type
;
o
->
start
=
start
;
o
->
stop
=
stop
;
o
->
step
=
step
;
return
o
;
}
#include
"runtime.h"
/******************************************************************************/
/* range iterator */
...
...
@@ -75,3 +44,47 @@ mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) {
o
->
step
=
step
;
return
o
;
}
/******************************************************************************/
/* range */
typedef
struct
_mp_obj_range_t
{
mp_obj_base_t
base
;
// TODO make these values generic objects or something
machine_int_t
start
;
machine_int_t
stop
;
machine_int_t
step
;
}
mp_obj_range_t
;
STATIC
mp_obj_t
range_make_new
(
mp_obj_t
type_in
,
uint
n_args
,
uint
n_kw
,
const
mp_obj_t
*
args
)
{
mp_check_nargs
(
n_args
,
1
,
3
,
n_kw
,
false
);
mp_obj_range_t
*
o
=
m_new_obj
(
mp_obj_range_t
);
o
->
base
.
type
=
&
mp_type_range
;
o
->
start
=
0
;
o
->
step
=
1
;
if
(
n_args
==
1
)
{
o
->
stop
=
mp_obj_get_int
(
args
[
0
]);
}
else
{
o
->
start
=
mp_obj_get_int
(
args
[
0
]);
o
->
stop
=
mp_obj_get_int
(
args
[
1
]);
if
(
n_args
==
3
)
{
o
->
step
=
mp_obj_get_int
(
args
[
2
]);
}
}
return
o
;
}
STATIC
mp_obj_t
range_getiter
(
mp_obj_t
o_in
)
{
mp_obj_range_t
*
o
=
o_in
;
return
mp_obj_new_range_iterator
(
o
->
start
,
o
->
stop
,
o
->
step
);
}
const
mp_obj_type_t
mp_type_range
=
{
{
&
mp_type_type
},
.
name
=
MP_QSTR_range
,
.
make_new
=
range_make_new
,
.
getiter
=
range_getiter
,
};
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment