Skip to content

Commit f87cea1

Browse files
committed
feat: Implement the core virtual machine with opcode dispatch for instruction execution and stack management.
1 parent cedbd76 commit f87cea1

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

src/runtime/vm.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,24 @@ static InterpretResult run(VM *vm) {
222222
double b = AS_NUMBER(pop(vm));
223223
double a = AS_NUMBER(pop(vm));
224224
push(vm, NUMBER_VAL(a + b));
225+
} else if (IS_NUMBER(peek(vm, 0)) && IS_STRING(peek(vm, 1))) {
226+
// String + Number
227+
Value numVal = pop(vm); // b
228+
Value strVal = pop(vm); // a
229+
char buffer[32];
230+
snprintf(buffer, sizeof(buffer), "%.14g", AS_NUMBER(numVal));
231+
push(vm, strVal);
232+
push(vm, OBJ_VAL(copyString(buffer, (int)strlen(buffer))));
233+
concatenate(vm);
234+
} else if (IS_STRING(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
235+
// Number + String
236+
Value strVal = pop(vm); // b
237+
Value numVal = pop(vm); // a
238+
char buffer[32];
239+
snprintf(buffer, sizeof(buffer), "%.14g", AS_NUMBER(numVal));
240+
push(vm, OBJ_VAL(copyString(buffer, (int)strlen(buffer))));
241+
push(vm, strVal);
242+
concatenate(vm);
225243
} else {
226244
runtimeError(vm, "Operands must be two numbers or two strings.");
227245
return INTERPRET_RUNTIME_ERROR;
@@ -410,6 +428,22 @@ static InterpretResult run(VM *vm) {
410428
double b = AS_NUMBER(pop(vm));
411429
double a = AS_NUMBER(pop(vm));
412430
push(vm, NUMBER_VAL(a + b));
431+
} else if (IS_NUMBER(peek(vm, 0)) && IS_STRING(peek(vm, 1))) {
432+
Value numVal = pop(vm);
433+
Value strVal = pop(vm);
434+
char buffer[32];
435+
snprintf(buffer, sizeof(buffer), "%.14g", AS_NUMBER(numVal));
436+
push(vm, strVal);
437+
push(vm, OBJ_VAL(copyString(buffer, (int)strlen(buffer))));
438+
concatenate(vm);
439+
} else if (IS_STRING(peek(vm, 0)) && IS_NUMBER(peek(vm, 1))) {
440+
Value strVal = pop(vm);
441+
Value numVal = pop(vm);
442+
char buffer[32];
443+
snprintf(buffer, sizeof(buffer), "%.14g", AS_NUMBER(numVal));
444+
push(vm, OBJ_VAL(copyString(buffer, (int)strlen(buffer))));
445+
push(vm, strVal);
446+
concatenate(vm);
413447
} else {
414448
runtimeError(vm, "Operands must be two numbers or two strings.");
415449
return INTERPRET_RUNTIME_ERROR;

0 commit comments

Comments
 (0)