소스 검색

accounts/abi: added unpacking "anything" in to interface{}

Jeffrey Wilcke 9 년 전
부모
커밋
c3d5250473
2개의 변경된 파일11개의 추가작업 그리고 0개의 파일을 삭제
  1. 2 0
      accounts/abi/abi.go
  2. 9 0
      accounts/abi/abi_test.go

+ 2 - 0
accounts/abi/abi.go

@@ -316,6 +316,8 @@ func set(dst, src reflect.Value, output Argument) error {
 			return fmt.Errorf("abi: cannot unmarshal src (len=%d) in to dst (len=%d)", output.Type.SliceSize, dst.Len())
 		}
 		reflect.Copy(dst, src)
+	case dstType.Kind() == reflect.Interface:
+		dst.Set(src)
 	default:
 		return fmt.Errorf("abi: cannot unmarshal %v in to %v", src.Type(), dst.Type())
 	}

+ 9 - 0
accounts/abi/abi_test.go

@@ -161,6 +161,13 @@ func TestSimpleMethodUnpack(t *testing.T) {
 			"hash",
 			nil,
 		},
+		{
+			`[ { "type": "bytes32" } ]`,
+			pad([]byte{1}, 32, false),
+			pad([]byte{1}, 32, false),
+			"interface",
+			nil,
+		},
 	} {
 		abiDefinition := fmt.Sprintf(`[{ "name" : "method", "outputs": %s}]`, test.def)
 		abi, err := JSON(strings.NewReader(abiDefinition))
@@ -203,6 +210,8 @@ func TestSimpleMethodUnpack(t *testing.T) {
 			var v common.Hash
 			err = abi.Unpack(&v, "method", test.marshalledOutput)
 			outvar = v
+		case "interface":
+			err = abi.Unpack(&outvar, "method", test.marshalledOutput)
 		default:
 			t.Errorf("unsupported type '%v' please add it to the switch statement in this test", test.outVar)
 			continue