Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
037e6912
Commit
037e6912
authored
Nov 22, 2016
by
Paul Sokolovsky
Browse files
py/objtype: Implement __call__ handling for an instance w/o heap alloc.
By refactoring and reusing code from objboundmeth.
parent
7e820792
Changes
3
Hide whitespace changes
Inline
Side-by-side
py/objboundmeth.c
View file @
037e6912
...
...
@@ -47,11 +47,8 @@ STATIC void bound_meth_print(const mp_print_t *print, mp_obj_t o_in, mp_print_ki
}
#endif
STATIC
mp_obj_t
bound_meth_call
(
mp_obj_t
self_in
,
size_t
n_args
,
size_t
n_kw
,
const
mp_obj_t
*
args
)
{
mp_obj_bound_meth_t
*
self
=
MP_OBJ_TO_PTR
(
self_in
);
// need to insert self->self before all other args and then call self->meth
mp_obj_t
mp_call_method_self_n_kw
(
mp_obj_t
meth
,
mp_obj_t
self
,
size_t
n_args
,
size_t
n_kw
,
const
mp_obj_t
*
args
)
{
// need to insert self before all other args and then call meth
size_t
n_total
=
n_args
+
2
*
n_kw
;
mp_obj_t
*
args2
=
NULL
;
mp_obj_t
*
free_args2
=
NULL
;
...
...
@@ -64,15 +61,20 @@ STATIC mp_obj_t bound_meth_call(mp_obj_t self_in, size_t n_args, size_t n_kw, co
// (fallback to) use stack to allocate temporary args array
args2
=
alloca
(
sizeof
(
mp_obj_t
)
*
(
1
+
n_total
));
}
args2
[
0
]
=
self
->
self
;
args2
[
0
]
=
self
;
memcpy
(
args2
+
1
,
args
,
n_total
*
sizeof
(
mp_obj_t
));
mp_obj_t
res
=
mp_call_function_n_kw
(
self
->
meth
,
n_args
+
1
,
n_kw
,
&
args2
[
0
]
);
mp_obj_t
res
=
mp_call_function_n_kw
(
meth
,
n_args
+
1
,
n_kw
,
args2
);
if
(
free_args2
!=
NULL
)
{
m_del
(
mp_obj_t
,
free_args2
,
1
+
n_total
);
}
return
res
;
}
STATIC
mp_obj_t
bound_meth_call
(
mp_obj_t
self_in
,
size_t
n_args
,
size_t
n_kw
,
const
mp_obj_t
*
args
)
{
mp_obj_bound_meth_t
*
self
=
MP_OBJ_TO_PTR
(
self_in
);
return
mp_call_method_self_n_kw
(
self
->
meth
,
self
->
self
,
n_args
,
n_kw
,
args
);
}
#if MICROPY_PY_FUNCTION_ATTRS
STATIC
void
bound_meth_attr
(
mp_obj_t
self_in
,
qstr
attr
,
mp_obj_t
*
dest
)
{
if
(
dest
[
0
]
!=
MP_OBJ_NULL
)
{
...
...
py/objtype.c
View file @
037e6912
...
...
@@ -4,7 +4,7 @@
* The MIT License (MIT)
*
* Copyright (c) 2013, 2014 Damien P. George
* Copyright (c) 2014 Paul Sokolovsky
* Copyright (c) 2014
-2016
Paul Sokolovsky
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
...
...
@@ -687,9 +687,8 @@ STATIC mp_obj_t instance_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value
}
}
STATIC
mp_obj_t
mp_obj_instance_get_call
(
mp_obj_t
self_in
)
{
STATIC
mp_obj_t
mp_obj_instance_get_call
(
mp_obj_t
self_in
,
mp_obj_t
*
member
)
{
mp_obj_instance_t
*
self
=
MP_OBJ_TO_PTR
(
self_in
);
mp_obj_t
member
[
2
]
=
{
MP_OBJ_NULL
,
MP_OBJ_NULL
};
struct
class_lookup_data
lookup
=
{
.
obj
=
self
,
.
attr
=
MP_QSTR___call__
,
...
...
@@ -702,11 +701,13 @@ STATIC mp_obj_t mp_obj_instance_get_call(mp_obj_t self_in) {
}
bool
mp_obj_instance_is_callable
(
mp_obj_t
self_in
)
{
return
mp_obj_instance_get_call
(
self_in
)
!=
MP_OBJ_NULL
;
mp_obj_t
member
[
2
]
=
{
MP_OBJ_NULL
,
MP_OBJ_NULL
};
return
mp_obj_instance_get_call
(
self_in
,
member
)
!=
MP_OBJ_NULL
;
}
mp_obj_t
mp_obj_instance_call
(
mp_obj_t
self_in
,
size_t
n_args
,
size_t
n_kw
,
const
mp_obj_t
*
args
)
{
mp_obj_t
call
=
mp_obj_instance_get_call
(
self_in
);
mp_obj_t
member
[
2
]
=
{
MP_OBJ_NULL
,
MP_OBJ_NULL
};
mp_obj_t
call
=
mp_obj_instance_get_call
(
self_in
,
member
);
if
(
call
==
MP_OBJ_NULL
)
{
if
(
MICROPY_ERROR_REPORTING
==
MICROPY_ERROR_REPORTING_TERSE
)
{
mp_raise_msg
(
&
mp_type_TypeError
,
"object not callable"
);
...
...
@@ -719,8 +720,8 @@ mp_obj_t mp_obj_instance_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons
if
(
call
==
MP_OBJ_SENTINEL
)
{
return
mp_call_function_n_kw
(
self
->
subobj
[
0
],
n_args
,
n_kw
,
args
);
}
mp_obj_t
meth
=
mp_obj_new_bound_meth
(
call
,
self_in
);
return
mp_call_
function_n_kw
(
meth
,
n_args
,
n_kw
,
args
);
return
mp_call_
method_self_n_kw
(
member
[
0
],
member
[
1
]
,
n_args
,
n_kw
,
args
);
}
STATIC
mp_obj_t
instance_getiter
(
mp_obj_t
self_in
)
{
...
...
py/runtime.h
View file @
037e6912
...
...
@@ -95,6 +95,7 @@ mp_obj_t mp_call_function_2(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2);
mp_obj_t
mp_call_function_n_kw
(
mp_obj_t
fun
,
mp_uint_t
n_args
,
mp_uint_t
n_kw
,
const
mp_obj_t
*
args
);
mp_obj_t
mp_call_method_n_kw
(
mp_uint_t
n_args
,
mp_uint_t
n_kw
,
const
mp_obj_t
*
args
);
mp_obj_t
mp_call_method_n_kw_var
(
bool
have_self
,
mp_uint_t
n_args_n_kw
,
const
mp_obj_t
*
args
);
mp_obj_t
mp_call_method_self_n_kw
(
mp_obj_t
meth
,
mp_obj_t
self
,
size_t
n_args
,
size_t
n_kw
,
const
mp_obj_t
*
args
);
// Call function and catch/dump exception - for Python callbacks from C code
void
mp_call_function_1_protected
(
mp_obj_t
fun
,
mp_obj_t
arg
);
void
mp_call_function_2_protected
(
mp_obj_t
fun
,
mp_obj_t
arg1
,
mp_obj_t
arg2
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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