diff --git a/SLS_C/src/builtin.c b/SLS_C/src/builtin.c index e7f84c5..cd6f897 100644 --- a/SLS_C/src/builtin.c +++ b/SLS_C/src/builtin.c @@ -515,7 +515,7 @@ Boolean load_builtins(InterpreterState *interpreter_state) { break; \ case STACK_TOKEN_STRING: \ return FALSE; \ - } + } \ #define NUMERIC_TYPES \ double af = 0, bf = 0; \ @@ -1445,8 +1445,60 @@ Boolean builtin_drop(InterpreterState *interpreter_state) { } Boolean builtin_dup(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + if (interpreter_state->stack == NULL) return FALSE; + + StackItem *item = (StackItem *)malloc(sizeof(StackItem)); + if (item == NULL) return FALSE; + item->type = interpreter_state->stack->type; + item->next = interpreter_state->stack; + + switch (interpreter_state->stack->type) { + case STACK_IDENTIFIER: + item->identifier = interpreter_state->stack->identifier; + break; + case STACK_I64: + item->i64 = interpreter_state->stack->i64; + break; + case STACK_I32: + item->i32 = interpreter_state->stack->i32; + break; + case STACK_I16: + item->i16 = interpreter_state->stack->i16; + break; + case STACK_I8: + item->i8 = interpreter_state->stack->i8; + break; + case STACK_U64: + item->u64 = interpreter_state->stack->u64; + break; + case STACK_U32: + item->u32 = interpreter_state->stack->u32; + break; + case STACK_U16: + item->u16 = interpreter_state->stack->u16; + break; + case STACK_U8: + item->u8 = interpreter_state->stack->u8; + break; + case STACK_FLOAT: + item->f32 = interpreter_state->stack->f32; + break; + case STACK_DOUBLE: + item->f64 = interpreter_state->stack->f64; + break; + case STACK_CHARACTER: + item->character = interpreter_state->stack->character; + break; + case STACK_BOOLEAN: + item->boolean = interpreter_state->stack->boolean; + break; + case STACK_TOKEN_STRING: + item->token_string = copy_token_string(interpreter_state->stack->token_string); + break; + } + + interpreter_state->stack = item; + return TRUE; } Boolean builtin_eval(InterpreterState *interpreter_state) {