summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2018-05-07 11:49:36 -0400
committerAdrian Thurston <thurston@colm.net>2018-05-07 11:49:36 -0400
commitff797d903459b690c8c3035b601a3808afa4ccac (patch)
treed6c35e468985bd0c0dc12e0410d1d6a055461b60
parent335a1358877c7d01334d173731bc6b70a62ed3a7 (diff)
downloadcolm-ff797d903459b690c8c3035b601a3808afa4ccac.tar.gz
allow sending to streams via IN_PARSE_APPEND_WC
Moving to a single instrauction set for streams and parser, allowing us to interchange them at runtime. Can replace stdout with a stream that is in front of a parser.
-rw-r--r--src/bytecode.c56
-rw-r--r--src/synthesis.cc3
2 files changed, 46 insertions, 13 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 69b30eac..c8238955 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -2324,11 +2324,27 @@ again:
debug( prg, REALM_BYTECODE, "IN_PARSE_APPEND_WC\n" );
tree_t *input = vm_pop_tree();
- parser_t *parser = vm_pop_parser();
+ stream_t *stream = vm_pop_stream();
- stream_append_tree( prg, sp, parser->input, input );
+ if ( stream->id == prg->rtd->struct_stream_id ) {
+ struct stream_impl *si = stream_to_impl( stream );
+
+ if ( si->file != 0 )
+ colm_print_tree_file( prg, sp, si, input, false );
+ else if ( si->collect != 0 )
+ colm_print_tree_collect( prg, sp, si->collect, input, false );
+
+ vm_push_stream( stream );
+
+ instr += 6;
+ }
+ else {
+ parser_t *parser = (parser_t*)stream;
+
+ stream_append_tree( prg, sp, parser->input, input );
+ vm_push_parser( parser );
+ }
- vm_push_parser( parser );
colm_tree_downref( prg, sp, input );
break;
}
@@ -2337,18 +2353,34 @@ again:
debug( prg, REALM_BYTECODE, "IN_PARSE_APPEND_WV\n" );
tree_t *input = vm_pop_tree();
- parser_t *parser = vm_pop_parser();
+ stream_t *stream = vm_pop_stream();
- word_t len = stream_append_tree( prg, sp, parser->input, input );
+ if ( stream->id == prg->rtd->struct_stream_id ) {
+ struct stream_impl *si = stream_to_impl( stream );
- vm_push_parser( parser );
+ if ( si->file != 0 )
+ colm_print_tree_file( prg, sp, si, input, false );
+ else if ( si->collect != 0 )
+ colm_print_tree_collect( prg, sp, si->collect, input, false );
- rcode_unit_start( exec );
- rcode_code( exec, IN_PARSE_APPEND_BKT );
- rcode_word( exec, (word_t) parser );
- rcode_word( exec, (word_t) input );
- rcode_word( exec, (word_t) len );
- rcode_unit_term( exec );
+ vm_push_stream( stream );
+
+ instr += 6;
+ }
+ else {
+ parser_t *parser = (parser_t*)stream;
+
+ word_t len = stream_append_tree( prg, sp, parser->input, input );
+
+ vm_push_parser( parser );
+
+ rcode_unit_start( exec );
+ rcode_code( exec, IN_PARSE_APPEND_BKT );
+ rcode_word( exec, (word_t) parser );
+ rcode_word( exec, (word_t) input );
+ rcode_word( exec, (word_t) len );
+ rcode_unit_term( exec );
+ }
break;
}
diff --git a/src/synthesis.cc b/src/synthesis.cc
index d1b8fbbc..caf48027 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -1815,7 +1815,8 @@ UniqueType *LangTerm::evaluateSend( Compiler *pd, CodeVect &code ) const
UniqueType *varUt = varRef->lookup( pd );
if ( varUt == pd->uniqueTypeStream )
- evaluateSendStream( pd, code );
+ //evaluateSendStream( pd, code );
+ evaluateSendParser( pd, code, true );
else if ( varUt->parser() )
evaluateSendParser( pd, code, true );
else