diff options
Diffstat (limited to 'src/pkg/exp/ogle/rvalue.go')
| -rw-r--r-- | src/pkg/exp/ogle/rvalue.go | 218 |
1 files changed, 109 insertions, 109 deletions
diff --git a/src/pkg/exp/ogle/rvalue.go b/src/pkg/exp/ogle/rvalue.go index ac5ec2be3..ba915ed5c 100644 --- a/src/pkg/exp/ogle/rvalue.go +++ b/src/pkg/exp/ogle/rvalue.go @@ -5,9 +5,9 @@ package ogle import ( - "debug/proc"; - "exp/eval"; - "fmt"; + "debug/proc" + "exp/eval" + "fmt" ) // A RemoteMismatchError occurs when an operation that requires two @@ -16,26 +16,26 @@ import ( // point to something in another process. type RemoteMismatchError string -func (e RemoteMismatchError) String() string { return string(e) } +func (e RemoteMismatchError) String() string { return string(e) } // A ReadOnlyError occurs when attempting to set or assign to a // read-only value. type ReadOnlyError string -func (e ReadOnlyError) String() string { return string(e) } +func (e ReadOnlyError) String() string { return string(e) } // A maker is a function that converts a remote address into an // interpreter Value. type maker func(remote) eval.Value type remoteValue interface { - addr() remote; + addr() remote } // remote represents an address in a remote process. type remote struct { - base proc.Word; - p *Process; + base proc.Word + p *Process } func (v remote) Get(a aborter, size int) uint64 { @@ -55,34 +55,34 @@ func (v remote) Get(a aborter, size int) uint64 { // // TODO(austin) We need to prevent the remote garbage // collector from collecting objects out from under us. - var arr [8]byte; - buf := arr[0:size]; - _, err := v.p.Peek(v.base, buf); + var arr [8]byte + buf := arr[0:size] + _, err := v.p.Peek(v.base, buf) if err != nil { a.Abort(err) } - return uint64(v.p.ToWord(buf)); + return uint64(v.p.ToWord(buf)) } func (v remote) Set(a aborter, size int, x uint64) { - var arr [8]byte; - buf := arr[0:size]; - v.p.FromWord(proc.Word(x), buf); - _, err := v.p.Poke(v.base, buf); + var arr [8]byte + buf := arr[0:size] + v.p.FromWord(proc.Word(x), buf) + _, err := v.p.Poke(v.base, buf) if err != nil { a.Abort(err) } } -func (v remote) plus(x proc.Word) remote { return remote{v.base + x, v.p} } +func (v remote) plus(x proc.Word) remote { return remote{v.base + x, v.p} } func tryRVString(f func(a aborter) string) string { - var s string; - err := try(func(a aborter) { s = f(a) }); + var s string + err := try(func(a aborter) { s = f(a) }) if err != nil { return fmt.Sprintf("<error: %v>", err) } - return s; + return s } /* @@ -90,7 +90,7 @@ func tryRVString(f func(a aborter) string) string { */ type remoteBool struct { - r remote; + r remote } func (v remoteBool) String() string { @@ -101,9 +101,9 @@ func (v remoteBool) Assign(t *eval.Thread, o eval.Value) { v.Set(t, o.(eval.BoolValue).Get(t)) } -func (v remoteBool) Get(t *eval.Thread) bool { return v.aGet(t) } +func (v remoteBool) Get(t *eval.Thread) bool { return v.aGet(t) } -func (v remoteBool) aGet(a aborter) bool { return v.r.Get(a, 1) != 0 } +func (v remoteBool) aGet(a aborter) bool { return v.r.Get(a, 1) != 0 } func (v remoteBool) Set(t *eval.Thread, x bool) { v.aSet(t, x) @@ -117,17 +117,17 @@ func (v remoteBool) aSet(a aborter, x bool) { } } -func (v remoteBool) addr() remote { return v.r } +func (v remoteBool) addr() remote { return v.r } -func mkBool(r remote) eval.Value { return remoteBool{r} } +func mkBool(r remote) eval.Value { return remoteBool{r} } /* * Uint */ type remoteUint struct { - r remote; - size int; + r remote + size int } func (v remoteUint) String() string { @@ -142,35 +142,35 @@ func (v remoteUint) Get(t *eval.Thread) uint64 { return v.aGet(t) } -func (v remoteUint) aGet(a aborter) uint64 { return v.r.Get(a, v.size) } +func (v remoteUint) aGet(a aborter) uint64 { return v.r.Get(a, v.size) } func (v remoteUint) Set(t *eval.Thread, x uint64) { v.aSet(t, x) } -func (v remoteUint) aSet(a aborter, x uint64) { v.r.Set(a, v.size, x) } +func (v remoteUint) aSet(a aborter, x uint64) { v.r.Set(a, v.size, x) } -func (v remoteUint) addr() remote { return v.r } +func (v remoteUint) addr() remote { return v.r } -func mkUint8(r remote) eval.Value { return remoteUint{r, 1} } +func mkUint8(r remote) eval.Value { return remoteUint{r, 1} } -func mkUint16(r remote) eval.Value { return remoteUint{r, 2} } +func mkUint16(r remote) eval.Value { return remoteUint{r, 2} } -func mkUint32(r remote) eval.Value { return remoteUint{r, 4} } +func mkUint32(r remote) eval.Value { return remoteUint{r, 4} } -func mkUint64(r remote) eval.Value { return remoteUint{r, 8} } +func mkUint64(r remote) eval.Value { return remoteUint{r, 8} } -func mkUint(r remote) eval.Value { return remoteUint{r, r.p.IntSize()} } +func mkUint(r remote) eval.Value { return remoteUint{r, r.p.IntSize()} } -func mkUintptr(r remote) eval.Value { return remoteUint{r, r.p.PtrSize()} } +func mkUintptr(r remote) eval.Value { return remoteUint{r, r.p.PtrSize()} } /* * Int */ type remoteInt struct { - r remote; - size int; + r remote + size int } func (v remoteInt) String() string { @@ -181,35 +181,35 @@ func (v remoteInt) Assign(t *eval.Thread, o eval.Value) { v.Set(t, o.(eval.IntValue).Get(t)) } -func (v remoteInt) Get(t *eval.Thread) int64 { return v.aGet(t) } +func (v remoteInt) Get(t *eval.Thread) int64 { return v.aGet(t) } -func (v remoteInt) aGet(a aborter) int64 { return int64(v.r.Get(a, v.size)) } +func (v remoteInt) aGet(a aborter) int64 { return int64(v.r.Get(a, v.size)) } func (v remoteInt) Set(t *eval.Thread, x int64) { v.aSet(t, x) } -func (v remoteInt) aSet(a aborter, x int64) { v.r.Set(a, v.size, uint64(x)) } +func (v remoteInt) aSet(a aborter, x int64) { v.r.Set(a, v.size, uint64(x)) } -func (v remoteInt) addr() remote { return v.r } +func (v remoteInt) addr() remote { return v.r } -func mkInt8(r remote) eval.Value { return remoteInt{r, 1} } +func mkInt8(r remote) eval.Value { return remoteInt{r, 1} } -func mkInt16(r remote) eval.Value { return remoteInt{r, 2} } +func mkInt16(r remote) eval.Value { return remoteInt{r, 2} } -func mkInt32(r remote) eval.Value { return remoteInt{r, 4} } +func mkInt32(r remote) eval.Value { return remoteInt{r, 4} } -func mkInt64(r remote) eval.Value { return remoteInt{r, 8} } +func mkInt64(r remote) eval.Value { return remoteInt{r, 8} } -func mkInt(r remote) eval.Value { return remoteInt{r, r.p.IntSize()} } +func mkInt(r remote) eval.Value { return remoteInt{r, r.p.IntSize()} } /* * Float */ type remoteFloat struct { - r remote; - size int; + r remote + size int } func (v remoteFloat) String() string { @@ -225,14 +225,14 @@ func (v remoteFloat) Get(t *eval.Thread) float64 { } func (v remoteFloat) aGet(a aborter) float64 { - bits := v.r.Get(a, v.size); + bits := v.r.Get(a, v.size) switch v.size { case 4: return float64(v.r.p.ToFloat32(uint32(bits))) case 8: return v.r.p.ToFloat64(bits) } - panic("Unexpected float size ", v.size); + panic("Unexpected float size ", v.size) } func (v remoteFloat) Set(t *eval.Thread, x float64) { @@ -240,7 +240,7 @@ func (v remoteFloat) Set(t *eval.Thread, x float64) { } func (v remoteFloat) aSet(a aborter, x float64) { - var bits uint64; + var bits uint64 switch v.size { case 4: bits = uint64(v.r.p.FromFloat32(float32(x))) @@ -249,23 +249,23 @@ func (v remoteFloat) aSet(a aborter, x float64) { default: panic("Unexpected float size ", v.size) } - v.r.Set(a, v.size, bits); + v.r.Set(a, v.size, bits) } -func (v remoteFloat) addr() remote { return v.r } +func (v remoteFloat) addr() remote { return v.r } -func mkFloat32(r remote) eval.Value { return remoteFloat{r, 4} } +func mkFloat32(r remote) eval.Value { return remoteFloat{r, 4} } -func mkFloat64(r remote) eval.Value { return remoteFloat{r, 8} } +func mkFloat64(r remote) eval.Value { return remoteFloat{r, 8} } -func mkFloat(r remote) eval.Value { return remoteFloat{r, r.p.FloatSize()} } +func mkFloat(r remote) eval.Value { return remoteFloat{r, r.p.FloatSize()} } /* * String */ type remoteString struct { - r remote; + r remote } func (v remoteString) String() string { @@ -281,16 +281,16 @@ func (v remoteString) Get(t *eval.Thread) string { } func (v remoteString) aGet(a aborter) string { - rs := v.r.p.runtime.String.mk(v.r).(remoteStruct); - str := proc.Word(rs.field(v.r.p.f.String.Str).(remoteUint).aGet(a)); - len := rs.field(v.r.p.f.String.Len).(remoteInt).aGet(a); + rs := v.r.p.runtime.String.mk(v.r).(remoteStruct) + str := proc.Word(rs.field(v.r.p.f.String.Str).(remoteUint).aGet(a)) + len := rs.field(v.r.p.f.String.Len).(remoteInt).aGet(a) - bytes := make([]uint8, len); - _, err := v.r.p.Peek(str, bytes); + bytes := make([]uint8, len) + _, err := v.r.p.Peek(str, bytes) if err != nil { a.Abort(err) } - return string(bytes); + return string(bytes) } func (v remoteString) Set(t *eval.Thread, x string) { @@ -303,33 +303,33 @@ func (v remoteString) aSet(a aborter, x string) { a.Abort(ReadOnlyError("remote strings cannot be assigned to")) } -func mkString(r remote) eval.Value { return remoteString{r} } +func mkString(r remote) eval.Value { return remoteString{r} } /* * Array */ type remoteArray struct { - r remote; - len int64; - elemType *remoteType; + r remote + len int64 + elemType *remoteType } func (v remoteArray) String() string { - res := "{"; + res := "{" for i := int64(0); i < v.len; i++ { if i > 0 { res += ", " } - res += v.elem(i).String(); + res += v.elem(i).String() } - return res + "}"; + return res + "}" } func (v remoteArray) Assign(t *eval.Thread, o eval.Value) { // TODO(austin) Could do a bigger memcpy if o is a // remoteArray in the same Process. - oa := o.(eval.ArrayValue); + oa := o.(eval.ArrayValue) for i := int64(0); i < v.len; i++ { v.Elem(t, i).Assign(t, oa.Elem(t, i)) } @@ -356,30 +356,30 @@ func (v remoteArray) Sub(i int64, len int64) eval.ArrayValue { */ type remoteStruct struct { - r remote; - layout []remoteStructField; + r remote + layout []remoteStructField } type remoteStructField struct { - offset int; - fieldType *remoteType; + offset int + fieldType *remoteType } func (v remoteStruct) String() string { - res := "{"; + res := "{" for i := range v.layout { if i > 0 { res += ", " } - res += v.field(i).String(); + res += v.field(i).String() } - return res + "}"; + return res + "}" } func (v remoteStruct) Assign(t *eval.Thread, o eval.Value) { // TODO(austin) Could do a bigger memcpy. - oa := o.(eval.StructValue); - l := len(v.layout); + oa := o.(eval.StructValue) + l := len(v.layout) for i := 0; i < l; i++ { v.Field(t, i).Assign(t, oa.Field(t, i)) } @@ -394,11 +394,11 @@ func (v remoteStruct) Field(t *eval.Thread, i int) eval.Value { } func (v remoteStruct) field(i int) eval.Value { - f := &v.layout[i]; - return f.fieldType.mk(v.r.plus(proc.Word(f.offset))); + f := &v.layout[i] + return f.fieldType.mk(v.r.plus(proc.Word(f.offset))) } -func (v remoteStruct) addr() remote { return v.r } +func (v remoteStruct) addr() remote { return v.r } /* * Pointer @@ -409,17 +409,17 @@ func (v remoteStruct) addr() remote { return v.r } // remotePtr.Get() will be structs. type remotePtr struct { - r remote; - elemType *remoteType; + r remote + elemType *remoteType } func (v remotePtr) String() string { return tryRVString(func(a aborter) string { - e := v.aGet(a); + e := v.aGet(a) if e == nil { return "<nil>" } - return "&" + e.String(); + return "&" + e.String() }) } @@ -432,11 +432,11 @@ func (v remotePtr) Get(t *eval.Thread) eval.Value { } func (v remotePtr) aGet(a aborter) eval.Value { - addr := proc.Word(v.r.Get(a, v.r.p.PtrSize())); + addr := proc.Word(v.r.Get(a, v.r.p.PtrSize())) if addr == 0 { return nil } - return v.elemType.mk(remote{addr, v.r.p}); + return v.elemType.mk(remote{addr, v.r.p}) } func (v remotePtr) Set(t *eval.Thread, x eval.Value) { @@ -445,34 +445,34 @@ func (v remotePtr) Set(t *eval.Thread, x eval.Value) { func (v remotePtr) aSet(a aborter, x eval.Value) { if x == nil { - v.r.Set(a, v.r.p.PtrSize(), 0); - return; + v.r.Set(a, v.r.p.PtrSize(), 0) + return } - xr, ok := x.(remoteValue); + xr, ok := x.(remoteValue) if !ok || v.r.p != xr.addr().p { a.Abort(RemoteMismatchError("remote pointer must point within the same process")) } - v.r.Set(a, v.r.p.PtrSize(), uint64(xr.addr().base)); + v.r.Set(a, v.r.p.PtrSize(), uint64(xr.addr().base)) } -func (v remotePtr) addr() remote { return v.r } +func (v remotePtr) addr() remote { return v.r } /* * Slice */ type remoteSlice struct { - r remote; - elemType *remoteType; + r remote + elemType *remoteType } func (v remoteSlice) String() string { return tryRVString(func(a aborter) string { - b := v.aGet(a).Base; + b := v.aGet(a).Base if b == nil { return "<nil>" } - return b.String(); + return b.String() }) } @@ -485,14 +485,14 @@ func (v remoteSlice) Get(t *eval.Thread) eval.Slice { } func (v remoteSlice) aGet(a aborter) eval.Slice { - rs := v.r.p.runtime.Slice.mk(v.r).(remoteStruct); - base := proc.Word(rs.field(v.r.p.f.Slice.Array).(remoteUint).aGet(a)); - nel := rs.field(v.r.p.f.Slice.Len).(remoteInt).aGet(a); - cap := rs.field(v.r.p.f.Slice.Cap).(remoteInt).aGet(a); + rs := v.r.p.runtime.Slice.mk(v.r).(remoteStruct) + base := proc.Word(rs.field(v.r.p.f.Slice.Array).(remoteUint).aGet(a)) + nel := rs.field(v.r.p.f.Slice.Len).(remoteInt).aGet(a) + cap := rs.field(v.r.p.f.Slice.Cap).(remoteInt).aGet(a) if base == 0 { return eval.Slice{nil, nel, cap} } - return eval.Slice{remoteArray{remote{base, v.r.p}, nel, v.elemType}, nel, cap}; + return eval.Slice{remoteArray{remote{base, v.r.p}, nel, v.elemType}, nel, cap} } func (v remoteSlice) Set(t *eval.Thread, x eval.Slice) { @@ -500,16 +500,16 @@ func (v remoteSlice) Set(t *eval.Thread, x eval.Slice) { } func (v remoteSlice) aSet(a aborter, x eval.Slice) { - rs := v.r.p.runtime.Slice.mk(v.r).(remoteStruct); + rs := v.r.p.runtime.Slice.mk(v.r).(remoteStruct) if x.Base == nil { rs.field(v.r.p.f.Slice.Array).(remoteUint).aSet(a, 0) } else { - ar, ok := x.Base.(remoteArray); + ar, ok := x.Base.(remoteArray) if !ok || v.r.p != ar.r.p { a.Abort(RemoteMismatchError("remote slice must point within the same process")) } - rs.field(v.r.p.f.Slice.Array).(remoteUint).aSet(a, uint64(ar.r.base)); + rs.field(v.r.p.f.Slice.Array).(remoteUint).aSet(a, uint64(ar.r.base)) } - rs.field(v.r.p.f.Slice.Len).(remoteInt).aSet(a, x.Len); - rs.field(v.r.p.f.Slice.Cap).(remoteInt).aSet(a, x.Cap); + rs.field(v.r.p.f.Slice.Len).(remoteInt).aSet(a, x.Len) + rs.field(v.r.p.f.Slice.Cap).(remoteInt).aSet(a, x.Cap) } |
