提交 3f90f7c8 编写于 作者: O obscuren

Signextend

上级 c8438979
......@@ -34,6 +34,10 @@ func BigD(data []byte) *big.Int {
return n
}
func BitTest(num *big.Int, i int) bool {
return num.Bit(i) > 0
}
// To256
//
// "cast" the big int to a 256 big int (i.e., limit to)
......
......@@ -392,6 +392,20 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
self.Printf(" = %v", base)
stack.Push(base)
case SIGNEXTEND:
back := stack.Pop().Uint64()
if back.Cmp(big.NewInt(31)) < 0 {
bit := uint(back*8 + 7)
num := stack.Pop()
mask := new(big.Int).Lsh(ethutil.Big1, bit)
mask.Sub(mask, ethutil.Big1)
if ethutil.BitTest(num, int(bit)) {
num.Or(num, mask.Not(mask))
} else {
num.And(num, mask)
}
stack.Push(num)
}
case NOT:
base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册