1
0
Fork 0
forked from fun/fun

Some echo()/print() fixes. (0.37.12)

This commit is contained in:
Johannes Findeisen 2025-12-13 02:24:23 +01:00
commit b16a42a4a7
6 changed files with 36 additions and 6 deletions

View file

@ -269,6 +269,8 @@ void vm_clear_output(VM *vm) {
free_value(vm->output[i]);
}
vm->output_count = 0;
// reset partial flags
for (int i = 0; i < OUTPUT_SIZE; ++i) vm->output_is_partial[i] = 0;
}
void vm_free(VM *vm) {
@ -420,6 +422,7 @@ void vm_init(VM *vm) {
vm->sp = -1;
vm->fp = -1;
vm->output_count = 0;
for (int i = 0; i < OUTPUT_SIZE; ++i) vm->output_is_partial[i] = 0;
vm->instr_count = 0;
vm->exit_code = 0;
vm->trace_enabled = 0;
@ -475,6 +478,12 @@ static void vm_pop_frame(VM *vm) {
void vm_print_output(VM *vm) {
for (int i = 0; i < vm->output_count; ++i) {
print_value(&vm->output[i]);
if (!vm->output_is_partial[i]) {
printf("\n");
}
}
/* If the last item was partial (from echo), terminate the line for cleanliness */
if (vm->output_count > 0 && vm->output_is_partial[vm->output_count - 1]) {
printf("\n");
}
}

View file

@ -72,6 +72,7 @@ struct VM {
Value output[OUTPUT_SIZE]; // store printed values
int output_count;
int output_is_partial[OUTPUT_SIZE]; // 1 when the corresponding output entry should not end with newline (echo)
long long instr_count; // executed instructions in the last vm_run

View file

@ -1,12 +1,22 @@
/**
* Implements OP_ECHO: print top-of-stack value without trailing newline.
* Does not store into VM output buffer; writes directly to stdout and flushes.
* Now stores the value into the VM's output buffer and marks it as partial,
* so the CLI can render echo output together with following print output.
*/
case OP_ECHO: {
Value v = pop_value(vm);
print_value(&v);
fflush(stdout);
Value snap = deep_copy_value(&v);
free_value(v);
if (vm->output_count < OUTPUT_SIZE) {
int idx = vm->output_count;
vm->output[idx] = snap;
vm->output_is_partial[idx] = 1; // ECHO does not end the line
vm->output_count++;
} else {
free_value(snap);
fprintf(stderr, "Runtime error: output buffer overflow\n");
exit(1);
}
break;
}

View file

@ -32,7 +32,10 @@ case OP_PRINT: {
Value snap = deep_copy_value(&v);
free_value(v);
if (vm->output_count < OUTPUT_SIZE) {
vm->output[vm->output_count++] = snap;
int idx = vm->output_count;
vm->output[idx] = snap;
vm->output_is_partial[idx] = 0; // PRINT terminates the line
vm->output_count++;
} else {
free_value(snap);
fprintf(stderr, "Runtime error: output buffer overflow\n");