a bit of progress in writing the evaluator function
This commit is contained in:
parent
9481de61d5
commit
1ad6779aa4
@ -31,6 +31,7 @@ func (p *process_t) push_cnode_value(val *Cnode_t) error {
|
||||
p.vstack[p.vsp] = unsafe.Pointer(uintptr(unsafe.Pointer(val)) | 1)
|
||||
p.vsp++
|
||||
p.ctx.count++
|
||||
fmt.Printf("push_cnode_value = ctx.count => %d\n", p.ctx.count)
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -43,7 +44,7 @@ func (p *process_t) push_string_value(val string) error {
|
||||
p.vstack[p.vsp] = unsafe.Pointer(&val)
|
||||
p.vsp++
|
||||
p.ctx.count++
|
||||
|
||||
fmt.Printf("push_string_value = ctx.count => %d\n", p.ctx.count)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -58,6 +59,7 @@ func (p *process_t) merge_top_values() error {
|
||||
p.vstack[p.vsp] = nil
|
||||
p.vstack[p.vsp-1] = unsafe.Pointer(&new_val)
|
||||
p.ctx.count--
|
||||
fmt.Printf("merge_top_values = ctx.count => %d\n", p.ctx.count)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -124,7 +126,7 @@ func (p *process_t) pop_context(clear_vstack bool) (*Cnode_t, *Cnode_t) {
|
||||
node = p.ctx.parent_node
|
||||
container = p.ctx.container_node
|
||||
|
||||
if clear_vstack {
|
||||
if clear_vstack { // TODO: use the conttext type instead... may be able to use container_node.code???
|
||||
// clean up the unused part of the stack
|
||||
for i = 1; i < p.ctx.count; i++ {
|
||||
p.vstack[p.vsp-p.ctx.count+i] = nil
|
||||
@ -135,9 +137,9 @@ func (p *process_t) pop_context(clear_vstack bool) (*Cnode_t, *Cnode_t) {
|
||||
}
|
||||
p.ctx = p.ctx.parent_ctx
|
||||
|
||||
if p.ctx != nil {
|
||||
p.ctx.count++ // let the return value be the argument to the caller
|
||||
}
|
||||
// if p.ctx != nil {
|
||||
// p.ctx.count++ // let the return value be the argument to the caller
|
||||
// }
|
||||
|
||||
return node, container
|
||||
}
|
||||
@ -205,7 +207,7 @@ func (interp *Interp) eval_stmt_nodes(container_node *Cnode_t) (*string, error)
|
||||
panic("internal error - not statement node")
|
||||
}
|
||||
|
||||
//fmt.Printf("PUSHING CONTEXT.....\n")
|
||||
fmt.Printf("PUSHING CONTEXT.....\n")
|
||||
p.push_context(stmt_node, upper_node)
|
||||
p.push_string_value("") // placeholder for return value
|
||||
|
||||
@ -225,6 +227,7 @@ func (interp *Interp) eval_stmt_nodes(container_node *Cnode_t) (*string, error)
|
||||
fmt.Printf("\n--\n")
|
||||
}
|
||||
goto start_over_0
|
||||
|
||||
} else {
|
||||
// no statements inside []. treat it like an empty string
|
||||
p.push_string_value("")
|
||||
@ -232,7 +235,7 @@ func (interp *Interp) eval_stmt_nodes(container_node *Cnode_t) (*string, error)
|
||||
|
||||
case CNODE_DQUOTE:
|
||||
if inner_node.child != nil {
|
||||
//fmt.Printf("PUSHING CONTEXT.....\n")
|
||||
fmt.Printf("PUSHING CONTEXT.....\n")
|
||||
p.push_context(stmt_node, inner_node)
|
||||
//p.push_string_value("") // no placeholder for return value is needed
|
||||
inner_node = inner_node.child
|
||||
@ -284,22 +287,58 @@ func (interp *Interp) eval_stmt_nodes(container_node *Cnode_t) (*string, error)
|
||||
is_stmt = false
|
||||
}
|
||||
|
||||
//fmt.Printf("POPPING CONTEXT.....is_stmt[%v]\n", is_stmt)
|
||||
fmt.Printf("POPPING CONTEXT.....is_stmt[%v]\n", is_stmt)
|
||||
stmt_node, upper_node = p.pop_context(is_stmt)
|
||||
if upper_node != container_node {
|
||||
if debug {
|
||||
fmt.Printf("resuming... %d upper_node.next %p\n", p.vsp, upper_node.next)
|
||||
}
|
||||
inner_node = upper_node.next // as if it hit the bottom of the innner for loop
|
||||
goto resume
|
||||
|
||||
if upper_node.code != CNODE_BRACKET {
|
||||
inner_node = upper_node.next // as if it hit the bottom of the innner for loop
|
||||
p.ctx.count++; // use return value on the stack as an argument
|
||||
goto resume
|
||||
}
|
||||
}
|
||||
|
||||
//fmt.Printf("POPPING VALUE...\n")
|
||||
/*v = (*string)(p.pop_value()) // get the return value of the statement.
|
||||
if debug {
|
||||
interp.dump_vstack(&p)
|
||||
}*/
|
||||
stmt_node = stmt_node.next
|
||||
|
||||
if stmt_node == nil {
|
||||
// go doesn't allow jumping into a block.
|
||||
// let's the put the code here
|
||||
if upper_node != container_node {
|
||||
// the upper node is not the top containing node passed to this function.
|
||||
// the contenxt stack must not be empty in this case.
|
||||
if upper_node.code != CNODE_BRACKET {
|
||||
panic("internal error - invalid cnode type in the context statck")
|
||||
}
|
||||
fmt.Printf("POPPING CONTEXT.....false\n")
|
||||
//stmt_node, upper_node = p.pop_context(false)
|
||||
inner_node = upper_node.next
|
||||
fmt.Printf(">>>>>>>>>>>>>>>>>> vsp %d ctx.count %d\n", p.vsp, p.ctx.count)
|
||||
|
||||
p.ctx.count++; // use the result value as an argument
|
||||
goto resume
|
||||
}
|
||||
|
||||
fmt.Printf("POPVAL...\n")
|
||||
v = (*string)(p.pop_value()) // get the return value of the statement.
|
||||
if debug {
|
||||
interp.dump_vstack(&p)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
fmt.Printf("POPVAL...\n")
|
||||
v = (*string)(p.pop_value()) // get the return value of the statement.
|
||||
if debug {
|
||||
interp.dump_vstack(&p)
|
||||
}
|
||||
stmt_node = stmt_node.next
|
||||
}
|
||||
|
||||
if debug {
|
||||
|
Loading…
Reference in New Issue
Block a user