summaryrefslogtreecommitdiff
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2018-05-13 00:41:54 -0400
committerAdrian Thurston <thurston@colm.net>2018-05-13 00:41:54 -0400
commit47d60422cc5744cd3b75a6926ec4f1e7b2ae0ae3 (patch)
tree75cbe82b54ed9a9798f5595fecfa4c2269c678ed /src/bytecode.c
parentb421b74dc376d1b10ba4dbb25ed721248ab3f8e4 (diff)
downloadcolm-47d60422cc5744cd3b75a6926ec4f1e7b2ae0ae3.tar.gz
added stds, a list of streams, used for bare sends
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c50
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" );