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.vstack[p.vsp] = unsafe.Pointer(uintptr(unsafe.Pointer(val)) | 1)
|
||||||
p.vsp++
|
p.vsp++
|
||||||
p.ctx.count++
|
p.ctx.count++
|
||||||
|
fmt.Printf("push_cnode_value = ctx.count => %d\n", p.ctx.count)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -43,7 +44,7 @@ func (p *process_t) push_string_value(val string) error {
|
|||||||
p.vstack[p.vsp] = unsafe.Pointer(&val)
|
p.vstack[p.vsp] = unsafe.Pointer(&val)
|
||||||
p.vsp++
|
p.vsp++
|
||||||
p.ctx.count++
|
p.ctx.count++
|
||||||
|
fmt.Printf("push_string_value = ctx.count => %d\n", p.ctx.count)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,6 +59,7 @@ func (p *process_t) merge_top_values() error {
|
|||||||
p.vstack[p.vsp] = nil
|
p.vstack[p.vsp] = nil
|
||||||
p.vstack[p.vsp-1] = unsafe.Pointer(&new_val)
|
p.vstack[p.vsp-1] = unsafe.Pointer(&new_val)
|
||||||
p.ctx.count--
|
p.ctx.count--
|
||||||
|
fmt.Printf("merge_top_values = ctx.count => %d\n", p.ctx.count)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +126,7 @@ func (p *process_t) pop_context(clear_vstack bool) (*Cnode_t, *Cnode_t) {
|
|||||||
node = p.ctx.parent_node
|
node = p.ctx.parent_node
|
||||||
container = p.ctx.container_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
|
// clean up the unused part of the stack
|
||||||
for i = 1; i < p.ctx.count; i++ {
|
for i = 1; i < p.ctx.count; i++ {
|
||||||
p.vstack[p.vsp-p.ctx.count+i] = nil
|
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
|
p.ctx = p.ctx.parent_ctx
|
||||||
|
|
||||||
if p.ctx != nil {
|
// if p.ctx != nil {
|
||||||
p.ctx.count++ // let the return value be the argument to the caller
|
// p.ctx.count++ // let the return value be the argument to the caller
|
||||||
}
|
// }
|
||||||
|
|
||||||
return node, container
|
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")
|
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_context(stmt_node, upper_node)
|
||||||
p.push_string_value("") // placeholder for return value
|
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")
|
fmt.Printf("\n--\n")
|
||||||
}
|
}
|
||||||
goto start_over_0
|
goto start_over_0
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// no statements inside []. treat it like an empty string
|
// no statements inside []. treat it like an empty string
|
||||||
p.push_string_value("")
|
p.push_string_value("")
|
||||||
@ -232,7 +235,7 @@ func (interp *Interp) eval_stmt_nodes(container_node *Cnode_t) (*string, error)
|
|||||||
|
|
||||||
case CNODE_DQUOTE:
|
case CNODE_DQUOTE:
|
||||||
if inner_node.child != nil {
|
if inner_node.child != nil {
|
||||||
//fmt.Printf("PUSHING CONTEXT.....\n")
|
fmt.Printf("PUSHING CONTEXT.....\n")
|
||||||
p.push_context(stmt_node, inner_node)
|
p.push_context(stmt_node, inner_node)
|
||||||
//p.push_string_value("") // no placeholder for return value is needed
|
//p.push_string_value("") // no placeholder for return value is needed
|
||||||
inner_node = inner_node.child
|
inner_node = inner_node.child
|
||||||
@ -284,22 +287,58 @@ func (interp *Interp) eval_stmt_nodes(container_node *Cnode_t) (*string, error)
|
|||||||
is_stmt = false
|
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)
|
stmt_node, upper_node = p.pop_context(is_stmt)
|
||||||
if upper_node != container_node {
|
if upper_node != container_node {
|
||||||
if debug {
|
if debug {
|
||||||
fmt.Printf("resuming... %d upper_node.next %p\n", p.vsp, upper_node.next)
|
fmt.Printf("resuming... %d upper_node.next %p\n", p.vsp, upper_node.next)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if upper_node.code != CNODE_BRACKET {
|
||||||
inner_node = upper_node.next // as if it hit the bottom of the innner for loop
|
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
|
goto resume
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//fmt.Printf("POPPING VALUE...\n")
|
//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.
|
v = (*string)(p.pop_value()) // get the return value of the statement.
|
||||||
if debug {
|
if debug {
|
||||||
interp.dump_vstack(&p)
|
interp.dump_vstack(&p)
|
||||||
}
|
}
|
||||||
stmt_node = stmt_node.next
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if debug {
|
if debug {
|
||||||
|
Loading…
Reference in New Issue
Block a user