diff options
author | Adrian Thurston <thurston@colm.net> | 2018-05-13 00:41:54 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2018-05-13 00:41:54 -0400 |
commit | 47d60422cc5744cd3b75a6926ec4f1e7b2ae0ae3 (patch) | |
tree | 75cbe82b54ed9a9798f5595fecfa4c2269c678ed /src/bytecode.c | |
parent | b421b74dc376d1b10ba4dbb25ed721248ab3f8e4 (diff) | |
download | colm-47d60422cc5744cd3b75a6926ec4f1e7b2ae0ae3.tar.gz |
added stds, a list of streams, used for bare sends
Diffstat (limited to 'src/bytecode.c')
-rw-r--r-- | src/bytecode.c | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 185bb728..41160f6b 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -114,12 +114,24 @@ static void rcode_downref( program_t *prg, tree_t **sp, code_t *instr ); -static void open_stdout( program_t *prg ) +static void make_stdin( program_t *prg ) +{ + if ( prg->stdin_val == 0 ) + prg->stdin_val = colm_stream_open_fd( prg, "<stdin>", 0 ); +} + +static void make_stdout( program_t *prg ) { if ( prg->stdout_val == 0 ) prg->stdout_val = colm_stream_open_fd( prg, "<stdout>", 1 ); } +static void make_stderr( program_t *prg ) +{ + if ( prg->stderr_val == 0 ) + prg->stderr_val = colm_stream_open_fd( prg, "<stderr>", 2 ); +} + static void flush_streams( program_t *prg ) { if ( prg->stdout_val != 0 ) @@ -414,6 +426,22 @@ static list_t *construct_argv( program_t *prg, int argc, const char **argv, cons return list; } + +static list_t *construct_stds( program_t *prg ) +{ + make_stdout( prg ); + + list_t *list = (list_t*)colm_construct_generic( prg, prg->rtd->stds_generic_id ); + + struct_t *strct = colm_struct_new_size( prg, 16 ); + strct->id = prg->rtd->stds_el_id; + colm_struct_set_field( strct, stream_t*, 0, prg->stdout_val ); + list_el_t *list_el = colm_struct_get_addr( strct, list_el_t*, 1 ); + colm_list_append( list, list_el ); + + return list; +} + /* * Execution environment */ @@ -537,7 +565,6 @@ tree_t *colm_run_func( struct colm_program *prg, int frame_id, return prg->return_val; }; - int colm_make_reverse_code( struct pda_run *pda_run ) { struct rt_code_vect *reverse_code = &pda_run->reverse_code; @@ -3683,8 +3710,8 @@ again: /* Pop the root object. */ vm_pop_tree(); - if ( prg->stdin_val == 0 ) - prg->stdin_val = colm_stream_open_fd( prg, "<stdin>", 0 ); + + make_stdin( prg ); vm_push_stream( prg->stdin_val ); break; @@ -3694,7 +3721,7 @@ again: /* Pop the root object. */ vm_pop_tree(); - open_stdout( prg ); + make_stdout( prg ); vm_push_stream( prg->stdout_val ); break; @@ -3704,8 +3731,8 @@ again: /* Pop the root object. */ vm_pop_tree(); - if ( prg->stderr_val == 0 ) - prg->stderr_val = colm_stream_open_fd( prg, "<stderr>", 2 ); + + make_stderr( prg ); vm_push_stream( prg->stderr_val ); break; @@ -3872,6 +3899,15 @@ again: colm_struct_set_field( prg->global, list_t*, field, list ); break; } + case IN_INIT_STDS: { + half_t field; + read_half( field ); + debug( prg, REALM_BYTECODE, "IN_INIT_STDS %lu\n", field ); + + list_t *list = construct_stds( prg ); + colm_struct_set_field( prg->global, list_t*, field, list ); + break; + } case IN_STOP: { debug( prg, REALM_BYTECODE, "IN_STOP\n" ); |