@@ -2,6 +2,7 @@ use super::argument::{Argument, ArgumentList};
2
2
use super :: intrinsic:: Intrinsic ;
3
3
use super :: types:: IntrinsicType ;
4
4
use serde:: Deserialize ;
5
+ use serde_json:: Value ;
5
6
use std:: collections:: HashMap ;
6
7
use std:: path:: Path ;
7
8
@@ -28,6 +29,14 @@ pub enum ArgPrep {
28
29
Nothing { } ,
29
30
}
30
31
32
+ impl TryFrom < Value > for ArgPrep {
33
+ type Error = serde_json:: Error ;
34
+
35
+ fn try_from ( value : Value ) -> Result < Self , Self :: Error > {
36
+ serde_json:: from_value ( value)
37
+ }
38
+ }
39
+
31
40
#[ derive( Deserialize , Debug ) ]
32
41
struct JsonIntrinsic {
33
42
#[ serde( rename = "SIMD_ISA" ) ]
@@ -36,7 +45,7 @@ struct JsonIntrinsic {
36
45
arguments : Vec < String > ,
37
46
return_type : ReturnType ,
38
47
#[ serde( rename = "Arguments_Preparation" ) ]
39
- args_prep : Option < HashMap < String , ArgPrep > > ,
48
+ args_prep : Option < HashMap < String , Value > > ,
40
49
#[ serde( rename = "Architectures" ) ]
41
50
architectures : Vec < String > ,
42
51
}
@@ -70,15 +79,13 @@ fn json_to_intrinsic(
70
79
71
80
let results = IntrinsicType :: from_c ( & intr. return_type . value , target) ?;
72
81
73
- let mut args_prep = intr. args_prep . as_mut ( ) ;
74
82
let args = intr
75
83
. arguments
76
84
. into_iter ( )
77
85
. enumerate ( )
78
86
. map ( |( i, arg) | {
79
- let arg_name = Argument :: type_and_name_from_c ( & arg) . 1 ;
80
- let arg_prep = args_prep. as_mut ( ) . and_then ( |a| a. remove ( arg_name) ) ;
81
- let mut arg = Argument :: from_c ( i, & arg, arg_prep, target) ;
87
+ // let arg_name = Argument::type_and_name_from_c(&arg).1;
88
+ let mut arg = Argument :: from_c ( i, & arg, target, intr. args_prep . as_mut ( ) ) ;
82
89
// The JSON doesn't list immediates as const
83
90
if let IntrinsicType :: Type {
84
91
ref mut constant, ..
0 commit comments