mp_obj_t micropy_call_2(mp_obj_t module_obj, const char *func, uint64_t code, uint64_t type) { nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { mp_obj_t py_func = mp_load_attr(module_obj, qstr_from_str(func)); mp_obj_t arg0 = mp_obj_new_int_from_ll((long long)code); mp_obj_t arg1 = mp_obj_new_int_from_ll((long long)type); mp_obj_t ret = mp_call_function_2(py_func, arg0, arg1); nlr_pop(); return ret; } else { mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val)); // uncaught exception return 0; } }
STATIC mp_obj_t mod_eoslib_S(mp_obj_t obj1, mp_obj_t obj2) { uint64_t ret; uint8_t precision; const char* str; size_t len; precision = (uint8_t)mp_obj_get_uint(obj1); str = mp_obj_str_get_data(obj2, &len); ret = get_vm_api()->string_to_symbol(precision, str); return mp_obj_new_int_from_ll(ret); }
STATIC mp_obj_t mod_eoslib_hash64(mp_obj_t obj1) { uint64_t key = 0; if (MP_OBJ_IS_STR_OR_BYTES(obj1)) { size_t len; const char* str = mp_obj_str_get_data(obj1, &len); key = XXH64(str, len, 0); return mp_obj_new_int_from_ll(key); } else if (MP_OBJ_IS_INT(obj1)) { return obj1; } else { mp_raise_TypeError("can't hash unsupported type"); return mp_const_none;//mute return type check } }
mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) { byte *p = *ptr; mp_uint_t align; size_t size = mp_binary_get_size(struct_type, val_type, &align); if (struct_type == '@') { // Make pointer aligned p = (byte*)(((mp_uint_t)p + align - 1) & ~((mp_uint_t)align - 1)); #if MP_ENDIANNESS_LITTLE struct_type = '<'; #else struct_type = '>'; #endif } *ptr = p + size; long long val = mp_binary_get_int(size, is_signed(val_type), (struct_type == '>'), p); if (val_type == 'O') { return (mp_obj_t)(mp_uint_t)val; } else if (val_type == 'S') { const char *s_val = (const char*)(mp_uint_t)val; return mp_obj_new_str(s_val, strlen(s_val), false); #if MICROPY_PY_BUILTINS_FLOAT } else if (val_type == 'f') { union { uint32_t i; float f; } fpu = {val}; return mp_obj_new_float(fpu.f); } else if (val_type == 'd') { union { uint64_t i; double f; } fpu = {val}; return mp_obj_new_float(fpu.f); #endif } else if (is_signed(val_type)) { if ((long long)MP_SMALL_INT_MIN <= val && val <= (long long)MP_SMALL_INT_MAX) { return mp_obj_new_int((mp_int_t)val); } else { return mp_obj_new_int_from_ll(val); } } else { if ((unsigned long long)val <= (unsigned long long)MP_SMALL_INT_MAX) { return mp_obj_new_int_from_uint((mp_uint_t)val); } else { return mp_obj_new_int_from_ull(val); } } }
mp_obj_t mp_binary_get_val_array(char typecode, void *p, mp_uint_t index) { mp_int_t val = 0; switch (typecode) { case 'b': val = ((signed char*)p)[index]; break; case BYTEARRAY_TYPECODE: case 'B': val = ((unsigned char*)p)[index]; break; case 'h': val = ((short*)p)[index]; break; case 'H': val = ((unsigned short*)p)[index]; break; case 'i': return mp_obj_new_int(((int*)p)[index]); case 'I': return mp_obj_new_int_from_uint(((unsigned int*)p)[index]); case 'l': return mp_obj_new_int(((long*)p)[index]); case 'L': return mp_obj_new_int_from_uint(((unsigned long*)p)[index]); #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE case 'q': return mp_obj_new_int_from_ll(((long long*)p)[index]); case 'Q': return mp_obj_new_int_from_ull(((unsigned long long*)p)[index]); #endif #if MICROPY_PY_BUILTINS_FLOAT case 'f': return mp_obj_new_float(((float*)p)[index]); case 'd': return mp_obj_new_float(((double*)p)[index]); #endif // Extension to CPython: array of objects case 'O': return ((mp_obj_t*)p)[index]; // Extension to CPython: array of pointers case 'P': return mp_obj_new_int((mp_int_t)((void**)p)[index]); } return MP_OBJ_NEW_SMALL_INT(val); }
mp_obj_t mp_binary_get_val_array(char typecode, void *p, mp_uint_t index) { mp_int_t val = 0; switch (typecode) { case 'b': val = ((signed char*)p)[index]; break; case BYTEARRAY_TYPECODE: case 'B': val = ((unsigned char*)p)[index]; break; case 'h': val = ((short*)p)[index]; break; case 'H': val = ((unsigned short*)p)[index]; break; case 'i': return mp_obj_new_int(((int*)p)[index]); case 'I': return mp_obj_new_int_from_uint(((unsigned int*)p)[index]); case 'l': return mp_obj_new_int(((long*)p)[index]); case 'L': return mp_obj_new_int_from_uint(((unsigned long*)p)[index]); #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE case 'q': case 'Q': // TODO: Explode API more to cover signedness return mp_obj_new_int_from_ll(((long long*)p)[index]); #endif #if MICROPY_PY_BUILTINS_FLOAT case 'f': return mp_obj_new_float(((float*)p)[index]); case 'd': return mp_obj_new_float(((double*)p)[index]); #endif } return MP_OBJ_NEW_SMALL_INT(val); }
mp_obj_t mp_binary_get_val(char typecode, void *p, int index) { machine_int_t val = 0; switch (typecode) { case 'b': val = ((int8_t*)p)[index]; break; case BYTEARRAY_TYPECODE: case 'B': val = ((uint8_t*)p)[index]; break; case 'h': val = ((int16_t*)p)[index]; break; case 'H': val = ((uint16_t*)p)[index]; break; case 'i': case 'l': return mp_obj_new_int(((int32_t*)p)[index]); case 'I': case 'L': return mp_obj_new_int_from_uint(((uint32_t*)p)[index]); #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE case 'q': case 'Q': // TODO: Explode API more to cover signedness return mp_obj_new_int_from_ll(((long long*)p)[index]); #endif #if MICROPY_ENABLE_FLOAT case 'f': return mp_obj_new_float(((float*)p)[index]); case 'd': return mp_obj_new_float(((double*)p)[index]); #endif } return MP_OBJ_NEW_SMALL_INT(val); }
STATIC mp_obj_t mod_eoslib_s2n(mp_obj_t obj) { size_t len; const char *account = mp_obj_str_get_data(obj, &len); uint64_t n = get_vm_api()->string_to_uint64(account); return mp_obj_new_int_from_ll(n); }