change to __set_attr__

This commit is contained in:
2025-09-19 00:31:04 +01:00
parent 50ff9fbefc
commit 70ba81bebc
6 changed files with 46 additions and 8 deletions

View File

@@ -36,7 +36,7 @@ typedef enum {
field_log, field_log,
field_length, field_length,
__getattribute__, __getattribute__,
__setattr__, __set_attr__,
__hash__, __hash__,
__repr__, __repr__,

View File

@@ -145,6 +145,28 @@ ArgonObject *create_ARGON_DICTIONARY_TYPE___get_attr__(size_t argc,
return result; return result;
} }
ArgonObject *create_ARGON_DICTIONARY_TYPE___set_attr__(size_t argc,
ArgonObject **argv,
ArErr *err,
RuntimeState *state) {
(void)state;
if (argc != 3) {
*err = create_err(0, 0, 0, "", "Runtime Error",
"__set_attr__ expects 2 argument, got %" PRIu64, argc);
return ARGON_NULL;
}
ArgonObject *object = argv[0];
ArgonObject *key = argv[1];
ArgonObject *value = argv[2];
int64_t hash = hash_object(key, err, state);
if (err->exists) {
return ARGON_NULL;
}
hashmap_insert_GC(object->value.as_hashmap, hash, key, value, 0);
return value;
}
void create_ARGON_DICTIONARY_TYPE() { void create_ARGON_DICTIONARY_TYPE() {
ARGON_DICTIONARY_TYPE = new_class(); ARGON_DICTIONARY_TYPE = new_class();
add_builtin_field(ARGON_DICTIONARY_TYPE, __name__, add_builtin_field(ARGON_DICTIONARY_TYPE, __name__,
@@ -156,6 +178,10 @@ void create_ARGON_DICTIONARY_TYPE() {
ARGON_DICTIONARY_TYPE, __get_attr__, ARGON_DICTIONARY_TYPE, __get_attr__,
create_argon_native_function("__get_attr__", create_argon_native_function("__get_attr__",
create_ARGON_DICTIONARY_TYPE___get_attr__)); create_ARGON_DICTIONARY_TYPE___get_attr__));
add_builtin_field(
ARGON_DICTIONARY_TYPE, __set_attr__,
create_argon_native_function("__set_attr__",
create_ARGON_DICTIONARY_TYPE___set_attr__));
add_builtin_field(ARGON_DICTIONARY_TYPE, __string__, add_builtin_field(ARGON_DICTIONARY_TYPE, __string__,
create_argon_native_function( create_argon_native_function(
"__string__", create_ARGON_DICTIONARY_TYPE___string__)); "__string__", create_ARGON_DICTIONARY_TYPE___string__));

View File

@@ -52,7 +52,7 @@ const char *built_in_field_names[BUILT_IN_FIELDS_COUNT] = {
"log", "log",
"length", "length",
"__getattribute__", "__getattribute__",
"__setattr__", "__set_attr__",
"__hash__", "__hash__",
"__repr__"}; "__repr__"};

View File

@@ -280,12 +280,12 @@ ArgonObject *BASE_CLASS___init__(size_t argc, ArgonObject **argv, ArErr *err,
return ARGON_NULL; return ARGON_NULL;
} }
ArgonObject *BASE_CLASS___setattr__(size_t argc, ArgonObject **argv, ArErr *err, ArgonObject *BASE_CLASS___set_attr__(size_t argc, ArgonObject **argv, ArErr *err,
RuntimeState *state) { RuntimeState *state) {
(void)state; (void)state;
if (argc != 3) { if (argc != 3) {
*err = create_err(0, 0, 0, "", "Runtime Error", *err = create_err(0, 0, 0, "", "Runtime Error",
"__setattr__ expects 3 argument, got %" PRIu64, argc); "__set_attr__ expects 3 argument, got %" PRIu64, argc);
} }
if (!argv[1]->value.as_str->hash) if (!argv[1]->value.as_str->hash)
argv[1]->value.as_str->hash = argv[1]->value.as_str->hash =
@@ -687,8 +687,8 @@ void bootstrap_types() {
create_argon_native_function("__getattribute__", create_argon_native_function("__getattribute__",
BASE_CLASS___getattribute__)); BASE_CLASS___getattribute__));
add_builtin_field( add_builtin_field(
BASE_CLASS, __setattr__, BASE_CLASS, __set_attr__,
create_argon_native_function("__setattr__", BASE_CLASS___setattr__)); create_argon_native_function("__set_attr__", BASE_CLASS___set_attr__));
create_ARGON_DICTIONARY_TYPE(); create_ARGON_DICTIONARY_TYPE();
} }
@@ -1200,13 +1200,13 @@ void runtime(Translated _translated, RuntimeState _state, Stack *stack,
} }
DO_LOAD_SETATTR_METHOD: { DO_LOAD_SETATTR_METHOD: {
state->registers[0] = get_builtin_field_for_class( state->registers[0] = get_builtin_field_for_class(
get_builtin_field(state->registers[0], __class__), __setattr__, get_builtin_field(state->registers[0], __class__), __set_attr__,
state->registers[0]); state->registers[0]);
if (!state->registers[0]) { if (!state->registers[0]) {
*err = create_err( *err = create_err(
state->source_location.line, state->source_location.column, state->source_location.line, state->source_location.column,
state->source_location.length, state->path, "Runtime Error", state->source_location.length, state->path, "Runtime Error",
"unable to get __setattr__ from objects class"); "unable to get __set_attr__ from objects class");
} }
continue; continue;
} }

View File

@@ -33,6 +33,8 @@ size_t translate_parsed_while(Translated *translated, ParsedWhile *parsedWhile,
push_instruction_code(translated, start_of_loop); push_instruction_code(translated, start_of_loop);
set_instruction_code(translated, jump_index, translated->bytecode.size); set_instruction_code(translated, jump_index, translated->bytecode.size);
push_instruction_byte(translated, OP_POP_SCOPE); push_instruction_byte(translated, OP_POP_SCOPE);
push_instruction_byte(translated, OP_LOAD_NULL);
push_instruction_byte(translated, 0);
if (translated->return_jumps) { if (translated->return_jumps) {
push_instruction_byte(translated, OP_JUMP); push_instruction_byte(translated, OP_JUMP);
size_t skip_return = push_instruction_code(translated, 0); size_t skip_return = push_instruction_code(translated, 0);

10
tests/intergral.ar Normal file
View File

@@ -0,0 +1,10 @@
let f(x) = sin(x)
let intergral_aprox(n, a, b) = do
let h = (b-a)/n
let output = 0
for (i from 1 to n+1) do
output += h*f(a+i*h)
return output
term.log(intergral_aprox(1000, 0,1))