/
var.go
49 lines (42 loc) · 1.09 KB
/
var.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package cgen
import (
"fmt"
"strconv"
"github.com/Nv7-Github/bsharp/ir"
)
func (c *CGen) addDefine(n *ir.DefineNode) (*Code, error) {
v := c.ir.Variables[n.Var]
name := Namespace + v.Name + strconv.Itoa(v.ID)
val, err := c.AddNode(n.Value)
if err != nil {
return nil, err
}
pre := val.Pre
free := ""
if isDynamic(v.Type) { // Free old val, grab new one
pre = JoinCode(pre, c.GrabCode(val.Value, n.Value.Type()))
if c.declaredVars[v.ID] {
oldName := c.GetTmp("old")
pre = JoinCode(fmt.Sprintf("%s %s = %s;", c.CType(v.Type), oldName, name), pre)
free = c.FreeCode(oldName, v.Type)
}
}
code := fmt.Sprintf("%s = %s;", name, val.Value)
// If not declared, then declare
if !c.declaredVars[v.ID] {
// Check if it is global
if v.NeedsGlobal {
fmt.Fprintf(c.globals, "%s %s;\n", c.CType(v.Type), name)
c.declaredVars[v.ID] = true
} else {
code = fmt.Sprintf("%s %s = %s;", c.CType(v.Type), name, val.Value)
c.declaredVars[v.ID] = true
}
if isDynamic(v.Type) {
c.stack.Add(c.FreeCode(name, v.Type))
}
}
return &Code{
Pre: JoinCode(pre, code, free),
}, nil
}