mirror of
https://github.com/golang/go
synced 2024-11-24 07:40:17 -07:00
cmd/compile: simplify value coding for unified IR
In indexed export, values are always exported along with their type and are encoded in a type-sensitive manner, because this matches how cmd/compile handled constants internally. However, go/types intentionally differs from this, decoupling type from value representation. As unified IR strives to be more go/types-centric, it makes sense to embrace this and make values a more first-class encoding. Change-Id: If21d849c4f610358bd776d5665469d180bcd5f6e Reviewed-on: https://go-review.googlesource.com/c/go/+/348014 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
e30a09013b
commit
4c52eac49b
@ -255,7 +255,8 @@ func (r *decoder) strings() []string {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *decoder) rawValue() constant.Value {
|
func (r *decoder) value() constant.Value {
|
||||||
|
r.sync(syncValue)
|
||||||
isComplex := r.bool()
|
isComplex := r.bool()
|
||||||
val := r.scalar()
|
val := r.scalar()
|
||||||
if isComplex {
|
if isComplex {
|
||||||
|
@ -237,7 +237,8 @@ func (w *encoder) strings(ss []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *encoder) rawValue(val constant.Value) {
|
func (w *encoder) value(val constant.Value) {
|
||||||
|
w.sync(syncValue)
|
||||||
if w.bool(val.Kind() == constant.Complex) {
|
if w.bool(val.Kind() == constant.Complex) {
|
||||||
w.scalar(constant.Real(val))
|
w.scalar(constant.Real(val))
|
||||||
w.scalar(constant.Imag(val))
|
w.scalar(constant.Imag(val))
|
||||||
|
@ -626,7 +626,8 @@ func (pr *pkgReader) objIdx(idx int, implicits, explicits []*types.Type) ir.Node
|
|||||||
|
|
||||||
case objConst:
|
case objConst:
|
||||||
name := do(ir.OLITERAL, false)
|
name := do(ir.OLITERAL, false)
|
||||||
typ, val := r.value()
|
typ := r.typ()
|
||||||
|
val := FixValue(typ, r.value())
|
||||||
setType(name, typ)
|
setType(name, typ)
|
||||||
setValue(name, val)
|
setValue(name, val)
|
||||||
return name
|
return name
|
||||||
@ -755,12 +756,6 @@ func (r *reader) typeParamNames() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *reader) value() (*types.Type, constant.Value) {
|
|
||||||
r.sync(syncValue)
|
|
||||||
typ := r.typ()
|
|
||||||
return typ, FixValue(typ, r.rawValue())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *reader) method() *types.Field {
|
func (r *reader) method() *types.Field {
|
||||||
r.sync(syncMethod)
|
r.sync(syncMethod)
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
@ -1556,7 +1551,8 @@ func (r *reader) expr() (res ir.Node) {
|
|||||||
|
|
||||||
case exprConst:
|
case exprConst:
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
typ, val := r.value()
|
typ := r.typ()
|
||||||
|
val := FixValue(typ, r.value())
|
||||||
op := r.op()
|
op := r.op()
|
||||||
orig := r.string()
|
orig := r.string()
|
||||||
return typecheck.Expr(OrigConst(pos, typ, val, op, orig))
|
return typecheck.Expr(OrigConst(pos, typ, val, op, orig))
|
||||||
|
@ -7,8 +7,6 @@
|
|||||||
package noder
|
package noder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go/constant"
|
|
||||||
|
|
||||||
"cmd/compile/internal/base"
|
"cmd/compile/internal/base"
|
||||||
"cmd/compile/internal/syntax"
|
"cmd/compile/internal/syntax"
|
||||||
"cmd/compile/internal/types2"
|
"cmd/compile/internal/types2"
|
||||||
@ -388,7 +386,8 @@ func (pr *pkgReader2) objIdx(idx int) (*types2.Package, string) {
|
|||||||
|
|
||||||
case objConst:
|
case objConst:
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
typ, val := r.value()
|
typ := r.typ()
|
||||||
|
val := r.value()
|
||||||
return types2.NewConst(pos, objPkg, objName, typ, val)
|
return types2.NewConst(pos, objPkg, objName, typ, val)
|
||||||
|
|
||||||
case objFunc:
|
case objFunc:
|
||||||
@ -428,11 +427,6 @@ func (pr *pkgReader2) objIdx(idx int) (*types2.Package, string) {
|
|||||||
return objPkg, objName
|
return objPkg, objName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *reader2) value() (types2.Type, constant.Value) {
|
|
||||||
r.sync(syncValue)
|
|
||||||
return r.typ(), r.rawValue()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pr *pkgReader2) objDictIdx(idx int) *reader2Dict {
|
func (pr *pkgReader2) objDictIdx(idx int) *reader2Dict {
|
||||||
r := pr.newReader(relocObjDict, idx, syncObject1)
|
r := pr.newReader(relocObjDict, idx, syncObject1)
|
||||||
|
|
||||||
|
@ -542,7 +542,8 @@ func (w *writer) doObj(obj types2.Object) codeObj {
|
|||||||
|
|
||||||
case *types2.Const:
|
case *types2.Const:
|
||||||
w.pos(obj)
|
w.pos(obj)
|
||||||
w.value(obj.Type(), obj.Val())
|
w.typ(obj.Type())
|
||||||
|
w.value(obj.Val())
|
||||||
return objConst
|
return objConst
|
||||||
|
|
||||||
case *types2.Func:
|
case *types2.Func:
|
||||||
@ -598,12 +599,6 @@ func (w *writer) typExpr(expr syntax.Expr) {
|
|||||||
w.typ(tv.Type)
|
w.typ(tv.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *writer) value(typ types2.Type, val constant.Value) {
|
|
||||||
w.sync(syncValue)
|
|
||||||
w.typ(typ)
|
|
||||||
w.rawValue(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// objDict writes the dictionary needed for reading the given object.
|
// objDict writes the dictionary needed for reading the given object.
|
||||||
func (w *writer) objDict(obj types2.Object, dict *writerDict) {
|
func (w *writer) objDict(obj types2.Object, dict *writerDict) {
|
||||||
// TODO(mdempsky): Split objDict into multiple entries? reader.go
|
// TODO(mdempsky): Split objDict into multiple entries? reader.go
|
||||||
@ -1199,7 +1194,8 @@ func (w *writer) expr(expr syntax.Expr) {
|
|||||||
|
|
||||||
w.code(exprConst)
|
w.code(exprConst)
|
||||||
w.pos(pos)
|
w.pos(pos)
|
||||||
w.value(tv.Type, tv.Value)
|
w.typ(tv.Type)
|
||||||
|
w.value(tv.Value)
|
||||||
|
|
||||||
// TODO(mdempsky): These details are only important for backend
|
// TODO(mdempsky): These details are only important for backend
|
||||||
// diagnostics. Explore writing them out separately.
|
// diagnostics. Explore writing them out separately.
|
||||||
|
Loading…
Reference in New Issue
Block a user