STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) { if (n_args == 0) { // print a general help message printf("%s", help_text); } else { // try to print something sensible about the given object printf("object "); mp_obj_print(args[0], PRINT_STR); printf(" is of type %s\n", mp_obj_get_type_str(args[0])); mp_map_t *map = NULL; if (MP_OBJ_IS_TYPE(args[0], &mp_type_module)) { map = mp_obj_dict_get_map(mp_obj_module_get_globals(args[0])); } else { mp_obj_type_t *type; if (MP_OBJ_IS_TYPE(args[0], &mp_type_type)) { type = args[0]; } else { type = mp_obj_get_type(args[0]); } if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) { map = mp_obj_dict_get_map(type->locals_dict); } } if (map != NULL) { for (uint i = 0; i < map->alloc; i++) { if (map->table[i].key != MP_OBJ_NULL) { pyb_help_print_info_about_object(map->table[i].key, map->table[i].value); } } } } return mp_const_none; }
STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) { if (n_args == 0) { // print a general help message mp_printf(&mp_plat_print, "%s", help_text); } else { mp_obj_t args0 = args[0]; mp_obj_type_t *args0_type = mp_obj_get_type(args0); if (args0_type->name == MP_QSTR_bound_method) { args0 = ((mp_obj_t*)args0)[1]; // extract method args0_type = mp_obj_get_type(args0); } // see if we have specific help info for this instance for (size_t i = 0; i < MP_ARRAY_SIZE(help_table_instances); i++) { if (args0 == help_table_instances[i].obj) { mp_print_str(&mp_plat_print, help_table_instances[i].doc); //if (args0_type == &mp_type_module) { //TODO here we can list the things inside the module //} return mp_const_none; } } // see if we have specific help info for this type for (size_t i = 0; i < MP_ARRAY_SIZE(help_table_types); i++) { if (args0 == help_table_types[i].obj || args0_type == help_table_types[i].obj) { mp_print_str(&mp_plat_print, help_table_types[i].doc); return mp_const_none; } } // don't have specific help info, try instead to print something sensible mp_printf(&mp_plat_print, "object "); mp_obj_print(args0, PRINT_STR); mp_printf(&mp_plat_print, " is of type %q\n", args0_type->name); mp_map_t *map = NULL; if (args0_type == &mp_type_module) { map = mp_obj_dict_get_map(mp_obj_module_get_globals(args0)); } else { mp_obj_type_t *type; if (args0_type == &mp_type_type) { type = args0; } else { type = args0_type; } if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) { map = mp_obj_dict_get_map(type->locals_dict); } } if (map != NULL) { for (uint i = 0; i < map->alloc; i++) { if (map->table[i].key != MP_OBJ_NULL) { pyb_help_print_info_about_object(map->table[i].key, map->table[i].value); } } } } return mp_const_none; }