diff options
author | Adrian Thurston <thurston@colm.net> | 2018-05-07 11:49:36 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2018-05-07 11:49:36 -0400 |
commit | ff797d903459b690c8c3035b601a3808afa4ccac (patch) | |
tree | d6c35e468985bd0c0dc12e0410d1d6a055461b60 | |
parent | 335a1358877c7d01334d173731bc6b70a62ed3a7 (diff) | |
download | colm-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.c | 56 | ||||
-rw-r--r-- | src/synthesis.cc | 3 |
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 |