add number type and object
This commit is contained in:
43
src/runtime/objects/number/number.c
Normal file
43
src/runtime/objects/number/number.c
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025 William Bell
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#include "number.h"
|
||||
#include "../string/string.h"
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
#include "../functions/functions.h"
|
||||
|
||||
ArgonObject *ARGON_NUMBER_TYPE;
|
||||
|
||||
ArgonObject *ARGON_NUMBER_TYPE___string__(size_t argc, ArgonObject **argv,
|
||||
ArErr *err, RuntimeState *state) {
|
||||
(void)state;
|
||||
if (argc != 1) {
|
||||
*err = create_err(0, 0, 0, "", "Runtime Error",
|
||||
"__string__ expects 1 arguments, got %" PRIu64, argc);
|
||||
}
|
||||
double val = mpq_get_d(argv[0]->value.as_number);
|
||||
char buffer[64];
|
||||
snprintf(buffer, sizeof(buffer), "%.15g", val);
|
||||
return new_string_object_null_terminated(buffer);
|
||||
}
|
||||
|
||||
void create_ARGON_NUMBER_TYPE() {
|
||||
ARGON_NUMBER_TYPE = new_object();
|
||||
add_field(ARGON_NUMBER_TYPE, "__name__",
|
||||
new_string_object_null_terminated("number"));
|
||||
add_field(ARGON_NUMBER_TYPE, "__string__",
|
||||
create_argon_native_function("__string__", ARGON_NUMBER_TYPE___string__));
|
||||
}
|
||||
|
||||
ArgonObject *new_number_object(char *data) {
|
||||
ArgonObject *object = new_object();
|
||||
add_field(object, "__class__", ARGON_NUMBER_TYPE);
|
||||
object->type = TYPE_NUMBER;
|
||||
mpq_init(object->value.as_number);
|
||||
mpq_set_str(object->value.as_number, data, 62);
|
||||
return object;
|
||||
}
|
||||
17
src/runtime/objects/number/number.h
Normal file
17
src/runtime/objects/number/number.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025 William Bell
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef RUNTIME_NUMBER_H
|
||||
#define RUNTIME_NUMBER_H
|
||||
#include "../object.h"
|
||||
|
||||
extern ArgonObject *ARGON_NUMBER_TYPE;
|
||||
|
||||
void create_ARGON_NUMBER_TYPE();
|
||||
|
||||
ArgonObject *new_number_object(char *data);
|
||||
|
||||
#endif // RUNTIME_NUMBER_H
|
||||
@@ -20,6 +20,7 @@ ArgonObject *new_object() {
|
||||
object->type = TYPE_OBJECT;
|
||||
object->dict = createHashmap_GC();
|
||||
add_field(object, "__class__", ARGON_TYPE_TYPE);
|
||||
add_field(object, "__base__", BASE_CLASS);
|
||||
return object;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "objects/string/string.h"
|
||||
#include "objects/term/term.h"
|
||||
#include "objects/type/type.h"
|
||||
#include "objects/number/number.h"
|
||||
#include <fcntl.h>
|
||||
#include <gc/gc.h>
|
||||
#include <inttypes.h>
|
||||
@@ -122,10 +123,14 @@ ArgonObject *BASE_CLASS___string__(size_t argc, ArgonObject **argv, ArErr *err,
|
||||
get_field(argv[0], "__class__", false, false), "__name__", NULL);
|
||||
|
||||
char buffer[100];
|
||||
snprintf(buffer, sizeof(buffer), "<%.*s %.*s at %p>",
|
||||
(int)class_name->value.as_str.length, class_name->value.as_str.data,
|
||||
(int)object_name->value.as_str.length,
|
||||
object_name->value.as_str.data, argv[0]);
|
||||
if (class_name && object_name)
|
||||
snprintf(buffer, sizeof(buffer), "<%.*s %.*s at %p>",
|
||||
(int)class_name->value.as_str.length,
|
||||
class_name->value.as_str.data,
|
||||
(int)object_name->value.as_str.length,
|
||||
object_name->value.as_str.data, argv[0]);
|
||||
else
|
||||
snprintf(buffer, sizeof(buffer), "<object at %p>", argv[0]);
|
||||
return new_string_object_null_terminated(buffer);
|
||||
}
|
||||
|
||||
@@ -222,7 +227,8 @@ void bootstrap_types() {
|
||||
ARGON_NULL = new_object();
|
||||
add_field(ARGON_NULL, "__class__", ARGON_NULL_TYPE);
|
||||
|
||||
add_field(BASE_CLASS, "__base__", ARGON_NULL);
|
||||
add_field(BASE_CLASS, "__base__", NULL);
|
||||
add_field(BASE_CLASS, "__class__", ARGON_TYPE_TYPE);
|
||||
|
||||
ARGON_BOOL_TYPE = new_object();
|
||||
add_field(ARGON_BOOL_TYPE, "__base__", BASE_CLASS);
|
||||
@@ -254,6 +260,7 @@ void bootstrap_types() {
|
||||
add_field(ARGON_METHOD_TYPE, "__base__", BASE_CLASS);
|
||||
add_field(ARGON_METHOD_TYPE, "__name__",
|
||||
new_string_object_null_terminated("method"));
|
||||
create_ARGON_NUMBER_TYPE();
|
||||
|
||||
add_field(BASE_CLASS, "__new__",
|
||||
create_argon_native_function("__new__", BASE_CLASS___new__));
|
||||
@@ -331,6 +338,8 @@ void load_const(Translated *translated, RuntimeState *state) {
|
||||
case TYPE_OP_STRING:
|
||||
object = new_string_object(data, length);
|
||||
break;
|
||||
case TYPE_OP_NUMBER:
|
||||
object = new_number_object(data);
|
||||
}
|
||||
state->registers[to_register] = object;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user