2 let create_$classname_from_ptr raw_ptr =
5 let h = Hashtbl.create 20 in
6 List.iter (fun (nm,fn) -> Hashtbl.replace h nm fn)
7 [ "nop", (fun args -> C_void) ;
9 "&", (fun args -> raw_ptr) ;
14 Hashtbl.iter (fun x y -> out := (x,y) :: !out) h ;
17 C_string (String.sub x 2 ((String.length x) - 2)))
20 ((String.length x) > 2)
21 && x.[0] == ':' && x.[1] == ':') !out)))) ;
22 ":classof", (fun args -> C_string "$realname") ;
23 ":methods", (fun args ->
24 C_list (let out = ref [] in
25 Hashtbl.iter (fun x y -> out := (C_string x) :: !out) h ; !out))
27 let rec invoke_inner raw_ptr mth arg =
30 let application = Hashtbl.find h mth in
33 C_list l -> (C_list (raw_ptr :: l))
34 | C_void -> (C_list [ raw_ptr ])
35 | v -> (C_list [ raw_ptr ; v ]))
37 (* Try parent classes *)
39 let parent_classes = [
42 let rec try_parent plist raw_ptr =
47 (invoke (p raw_ptr)) mth arg
48 with (BadMethodName (p,m,s)) ->
52 raise (BadMethodName (raw_ptr,mth,"$realname"))
53 in try_parent parent_classes raw_ptr
56 (fun mth arg -> invoke_inner raw_ptr mth arg)
59 let _ = Callback.register
60 "create_$normalized_from_ptr"
61 create_$classname_from_ptr
65 val create_$classname_from_ptr : c_obj -> c_obj