Implement lookup on strings (extract byte values)
TODO: bounds checking
Этот коммит содержится в:
родитель
4d33d9d38b
коммит
deadcb8dae
1 изменённых файлов: 23 добавлений и 0 удалений
23
tgo.go
23
tgo.go
|
@ -582,6 +582,29 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) {
|
|||
return c.builder.CreateGEP(val, indices, ""), nil
|
||||
case *ssa.Global:
|
||||
return c.mod.NamedGlobal(expr.Name()), nil
|
||||
case *ssa.Lookup:
|
||||
if expr.CommaOk {
|
||||
return llvm.Value{}, errors.New("todo: lookup with comma-ok")
|
||||
}
|
||||
if _, ok := expr.X.Type().(*types.Map); ok {
|
||||
return llvm.Value{}, errors.New("todo: lookup in map")
|
||||
}
|
||||
// Value type must be a string, which is a basic type.
|
||||
if expr.X.Type().(*types.Basic).Kind() != types.String {
|
||||
panic("lookup on non-string?")
|
||||
}
|
||||
value, err := c.parseExpr(frame, expr.X)
|
||||
if err != nil {
|
||||
return llvm.Value{}, nil
|
||||
}
|
||||
index, err := c.parseExpr(frame, expr.Index)
|
||||
if err != nil {
|
||||
return llvm.Value{}, nil
|
||||
}
|
||||
// TODO: out-of-bounds checking
|
||||
buf := c.builder.CreateExtractValue(value, 1, "")
|
||||
bufPtr := c.builder.CreateGEP(buf, []llvm.Value{index}, "")
|
||||
return c.builder.CreateLoad(bufPtr, ""), nil
|
||||
case *ssa.MakeInterface:
|
||||
val, err := c.parseExpr(frame, expr.X)
|
||||
if err != nil {
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче