add multiplication and division

This commit is contained in:
William Bell
2025-08-19 02:36:09 +01:00
parent a96023ced1
commit c856e7d654
8 changed files with 178 additions and 48 deletions

View File

@@ -7,6 +7,7 @@
#include "number.h"
#include "../functions/functions.h"
#include "../string/string.h"
#include <gmp-x86_64.h>
#include <gmp.h>
#include <inttypes.h>
#include <stdio.h>
@@ -126,6 +127,56 @@ ArgonObject *ARGON_NUMBER_TYPE___subtract__(size_t argc, ArgonObject **argv,
return result;
}
ArgonObject *ARGON_NUMBER_TYPE___multiply__(size_t argc, ArgonObject **argv,
ArErr *err, RuntimeState *state) {
(void)state;
if (argc != 2) {
*err = create_err(0, 0, 0, "", "Runtime Error",
"__multiply__ expects 2 arguments, got %" PRIu64, argc);
return ARGON_NULL;
}
mpq_t r;
mpq_init(r);
if (argv[1]->type != TYPE_NUMBER) {
ArgonObject *type_name = get_field_for_class(
get_field(argv[1], "__class__", false, false), "__name__", argv[1]);
*err = create_err(0, 0, 0, "", "Runtime Error",
"__multiply__ cannot perform multiplication between number and %.*s",
type_name->value.as_str.length,
type_name->value.as_str.data);
return ARGON_NULL;
}
mpq_mul(r, *argv[0]->value.as_number, *argv[1]->value.as_number);
ArgonObject *result = new_number_object(r);
mpq_clear(r);
return result;
}
ArgonObject *ARGON_NUMBER_TYPE___division__(size_t argc, ArgonObject **argv,
ArErr *err, RuntimeState *state) {
(void)state;
if (argc != 2) {
*err = create_err(0, 0, 0, "", "Runtime Error",
"__division__ expects 2 arguments, got %" PRIu64, argc);
return ARGON_NULL;
}
mpq_t r;
mpq_init(r);
if (argv[1]->type != TYPE_NUMBER) {
ArgonObject *type_name = get_field_for_class(
get_field(argv[1], "__class__", false, false), "__name__", argv[1]);
*err = create_err(0, 0, 0, "", "Runtime Error",
"__division__ cannot perform division between number and %.*s",
type_name->value.as_str.length,
type_name->value.as_str.data);
return ARGON_NULL;
}
mpq_div(r, *argv[0]->value.as_number, *argv[1]->value.as_number);
ArgonObject *result = new_number_object(r);
mpq_clear(r);
return result;
}
ArgonObject *ARGON_NUMBER_TYPE___string__(size_t argc, ArgonObject **argv,
ArErr *err, RuntimeState *state) {
(void)state;
@@ -298,6 +349,12 @@ void create_ARGON_NUMBER_TYPE() {
add_field(ARGON_NUMBER_TYPE, "__subtract__",
create_argon_native_function("__subtract__",
ARGON_NUMBER_TYPE___subtract__));
add_field(ARGON_NUMBER_TYPE, "__multiply__",
create_argon_native_function("__multiply__",
ARGON_NUMBER_TYPE___multiply__));
add_field(ARGON_NUMBER_TYPE, "__division__",
create_argon_native_function("__division__",
ARGON_NUMBER_TYPE___division__));
}
void mpz_init_gc_managed(mpz_t z, size_t limbs_count) {