diff --git a/rpc/args.go b/rpc/args.go
index c11ffa3cce1bfbe5a847f73a9a8348df8f980200..0169ece5834b15102768d06b348d8125a2ca78e9 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -617,14 +617,18 @@ type CompileArgs struct {
 
 func (args *CompileArgs) UnmarshalJSON(b []byte) (err error) {
 	var obj []interface{}
-	r := bytes.NewReader(b)
-	if err := json.NewDecoder(r).Decode(&obj); err != nil {
+	if err := json.Unmarshal(b, &obj); err != nil {
 		return NewDecodeParamError(err.Error())
 	}
 
-	if len(obj) > 0 {
-		args.Source = obj[0].(string)
+	if len(obj) < 1 {
+		return NewInsufficientParamsError(len(obj), 1)
+	}
+	argstr, ok := obj[0].(string)
+	if !ok {
+		return NewInvalidTypeError("arg0", "is not a string")
 	}
+	args.Source = argstr
 
 	return nil
 }
diff --git a/rpc/args_test.go b/rpc/args_test.go
index 0b243e76032c387c3be71815e9234924d15cc18d..7cb63b67e5eec0bddf9053d713d9e78c805858d7 100644
--- a/rpc/args_test.go
+++ b/rpc/args_test.go
@@ -1126,6 +1126,36 @@ func TestCompileArgs(t *testing.T) {
 	}
 }
 
+func TestCompileArgsInvalid(t *testing.T) {
+	input := `{}`
+
+	args := new(CompileArgs)
+	str := ExpectDecodeParamError(json.Unmarshal([]byte(input), args))
+	if len(str) > 0 {
+		t.Error(str)
+	}
+}
+
+func TestCompileArgsEmpty(t *testing.T) {
+	input := `[]`
+
+	args := new(CompileArgs)
+	str := ExpectInsufficientParamsError(json.Unmarshal([]byte(input), args))
+	if len(str) > 0 {
+		t.Error(str)
+	}
+}
+
+func TestCompileArgsBool(t *testing.T) {
+	input := `[false]`
+
+	args := new(CompileArgs)
+	str := ExpectInvalidTypeError(json.Unmarshal([]byte(input), args))
+	if len(str) > 0 {
+		t.Error(str)
+	}
+}
+
 func TestFilterStringArgs(t *testing.T) {
 	input := `["pending"]`
 	expected := new(FilterStringArgs)