@@ -534,20 +534,20 @@ STATIC inline mp_obj_t mp_load_attr_default(mp_obj_t base, qstr attr, mp_obj_t d
534534}
535535
536536STATIC mp_obj_t mp_builtin_getattr (mp_uint_t n_args , const mp_obj_t * args ) {
537- mp_obj_t attr = args [1 ];
538- if (MP_OBJ_IS_TYPE (attr , & mp_type_str )) {
539- attr = mp_obj_str_intern (attr );
540- } else if (!MP_OBJ_IS_QSTR (attr )) {
541- nlr_raise (mp_obj_new_exception_msg (& mp_type_TypeError , "string required" ));
542- }
543537 mp_obj_t defval = MP_OBJ_NULL ;
544538 if (n_args > 2 ) {
545539 defval = args [2 ];
546540 }
547- return mp_load_attr_default (args [0 ], MP_OBJ_QSTR_VALUE ( attr ), defval );
541+ return mp_load_attr_default (args [0 ], mp_obj_str_get_qstr ( args [ 1 ] ), defval );
548542}
549543MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_builtin_getattr_obj , 2 , 3 , mp_builtin_getattr );
550544
545+ STATIC mp_obj_t mp_builtin_setattr (mp_obj_t base , mp_obj_t attr , mp_obj_t value ) {
546+ mp_store_attr (base , mp_obj_str_get_qstr (attr ), value );
547+ return mp_const_none ;
548+ }
549+ MP_DEFINE_CONST_FUN_OBJ_3 (mp_builtin_setattr_obj , mp_builtin_setattr );
550+
551551STATIC mp_obj_t mp_builtin_hasattr (mp_obj_t object_in , mp_obj_t attr_in ) {
552552 assert (MP_OBJ_IS_QSTR (attr_in ));
553553
@@ -637,6 +637,7 @@ STATIC const mp_map_elem_t mp_module_builtins_globals_table[] = {
637637 { MP_OBJ_NEW_QSTR (MP_QSTR_execfile ), (mp_obj_t )& mp_builtin_execfile_obj },
638638#endif
639639 { MP_OBJ_NEW_QSTR (MP_QSTR_getattr ), (mp_obj_t )& mp_builtin_getattr_obj },
640+ { MP_OBJ_NEW_QSTR (MP_QSTR_setattr ), (mp_obj_t )& mp_builtin_setattr_obj },
640641 { MP_OBJ_NEW_QSTR (MP_QSTR_globals ), (mp_obj_t )& mp_builtin_globals_obj },
641642 { MP_OBJ_NEW_QSTR (MP_QSTR_hasattr ), (mp_obj_t )& mp_builtin_hasattr_obj },
642643 { MP_OBJ_NEW_QSTR (MP_QSTR_hash ), (mp_obj_t )& mp_builtin_hash_obj },
0 commit comments