Skip to content

Commit e828bbb

Browse files
committed
Refactor.
1 parent b7788c5 commit e828bbb

File tree

5 files changed

+66
-64
lines changed

5 files changed

+66
-64
lines changed

CHANGES.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
API changes:
44

5-
* `Property.value` is renamed to `Property.value_prop`,
6-
`Property._object_` to `Property.obj_prop`
5+
* Replaced `Property.value` and `Property._object_` with a single `Property.define`.
76

87
## Release 0.2.2
98

camlkit/camlkit.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ module CamlObjectProxy = struct
159159
sel
160160
in
161161
let methods =
162-
Property.obj_prop ivar_name @
162+
Property.define ivar_name Objc_t.id @
163163
[ Method.define
164164
~cmd: (selector "initWithTargetObject:")
165165
~args: Objc_t.[id]

runtime/define.ml

+2-17
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@ type 'a method_spec =
1010

1111
type method_spec' = MethodSpec : 'a method_spec -> method_spec'
1212

13-
let method_spec ~cmd ~typ ~imp ~enc =
14-
MethodSpec {cmd; typ; imp; enc}
15-
;;
16-
1713
type 'a ivar_spec =
1814
{ name : string
1915
; typ : 'a typ
@@ -22,17 +18,6 @@ type 'a ivar_spec =
2218

2319
type ivar_spec' = IvarSpec : 'a ivar_spec -> ivar_spec'
2420

25-
let ivar_spec ~name ~typ ~enc = IvarSpec {name; typ; enc}
26-
27-
let _method_ imp ~cmd ~args ~return =
28-
let typ = Objc_t.method_typ ~args return
29-
and enc = Objc_t.Encode._method_ ~args return
30-
in
31-
method_spec ~cmd ~typ ~imp ~enc
32-
;;
21+
let method_spec ~cmd ~typ ~imp ~enc = MethodSpec {cmd; typ; imp; enc}
3322

34-
let ivar name typ =
35-
let typ = Objc_t.(value_typ typ)
36-
and enc = Objc_t.(Encode.value typ)
37-
in ivar_spec ~name ~typ ~enc
38-
;;
23+
let ivar_spec ~name ~typ ~enc = IvarSpec {name; typ; enc}

runtime/runtime.ml

+58-40
Original file line numberDiff line numberDiff line change
@@ -347,13 +347,21 @@ module Method = struct
347347
let invoke ~typ ~self m =
348348
foreign "method_invoke" (id @-> _Method @-> typ) self m
349349

350-
let define = Define._method_
350+
let define imp ~cmd ~args ~return =
351+
let typ = Objc_t.method_typ ~args return
352+
and enc = Objc_t.Encode._method_ ~args return
353+
in
354+
Define.method_spec ~cmd ~typ ~imp ~enc
351355
end
352356

353357
module Ivar = struct
354358
include C.Functions.Ivar
355359

356-
let define = Define.ivar
360+
let define name typ =
361+
let typ = Objc_t.(value_typ typ)
362+
and enc = Objc_t.(Encode.value typ)
363+
in
364+
Define.ivar_spec ~name ~typ ~enc
357365
end
358366

359367
let get_property ~typ prop_name self =
@@ -411,52 +419,62 @@ module Property = struct
411419
let obj_setter
412420
?(assign = false)
413421
?(copy = false)
414-
~ivar_name
415422
~typ
416423
~enc
417-
()
424+
ivar_name
418425
=
419-
let cmd = selector (setter_name_of_ivar ivar_name)
420-
and imp self _cmd value =
421-
if not assign && not copy then
422-
value |> retain |> ignore;
423-
424-
(* release old object *)
425-
let ivar =
426-
Class.get_instance_variable
427-
~self: (Object.get_class self)
428-
~name: ivar_name
429-
in
430-
Object.get_ivar ~self ~ivar |> release;
431-
432-
assert (not (is_null ivar));
433-
Object.set_ivar ~self ~ivar (if copy then _copy_ value else value)
426+
let cmd = selector (setter_name_of_ivar ivar_name)
427+
and imp self _cmd value =
428+
if not assign && not copy then
429+
value |> retain |> ignore;
430+
431+
(* release old object *)
432+
let ivar =
433+
Class.get_instance_variable
434+
~self: (Object.get_class self)
435+
~name: ivar_name
434436
in
435-
method_spec ~cmd ~typ: (typ @-> returning void) ~imp ~enc
436-
;;
437+
Object.get_ivar ~self ~ivar |> release;
437438

438-
(** Getter and setter for a non-object property. *)
439-
let value_prop ivar_name typ =
440-
let typ = Objc_t.(value_typ typ)
441-
and enc = Objc_t.(Encode.value typ)
442-
in
443-
[ getter ~ivar_name ~typ ~enc
444-
; setter ~ivar_name ~typ ~enc
445-
]
446-
;;
447-
448-
(** Getter and setter for an object property. *)
449-
let obj_prop
439+
assert (not (is_null ivar));
440+
Object.set_ivar ~self ~ivar (if copy then _copy_ value else value)
441+
in
442+
method_spec ~cmd ~typ: (typ @-> returning void) ~imp ~enc
443+
444+
(** Definition of a property getter and (optionally) setter. *)
445+
let define :
446+
type a.
447+
?assign:bool ->
448+
?copy:bool ->
449+
?readonly:bool ->
450+
string ->
451+
a Objc_t.t ->
452+
Define.method_spec' list
453+
= fun
450454
?(assign = false)
451455
?(copy = false)
456+
?(readonly = false)
452457
ivar_name
453-
=
454-
let typ = Objc_t.(value_typ id)
455-
and enc = Objc_t.(Encode.value id)
456-
in
457-
[ obj_getter ~ivar_name ~typ ~enc
458-
; obj_setter ~assign ~copy ~ivar_name ~typ ~enc ()
459-
]
458+
t
459+
->
460+
let typ = Objc_t.value_typ t
461+
and enc = Objc_t.Encode.value t
462+
in
463+
match t with
464+
| Objc_t.Id ->
465+
if readonly then
466+
[ obj_getter ~ivar_name ~typ ~enc ]
467+
else
468+
[ obj_getter ~ivar_name ~typ ~enc
469+
; obj_setter ~assign ~copy ~typ ~enc ivar_name
470+
]
471+
| _ ->
472+
if readonly then
473+
[ getter ~ivar_name ~typ ~enc ]
474+
else
475+
[ getter ~ivar_name ~typ ~enc
476+
; setter ~ivar_name ~typ ~enc
477+
]
460478
end
461479

462480
(* Exception handling *)

test/test-camlkit-base/test_objc.ml

+4-4
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ let test_add_ivar ~name x () =
141141

142142
let test_value_accessors ~name x () =
143143
let ivars = [Ivar.define "myVar" Objc_t.int]
144-
and methods = Property.value_prop "myVar" Objc_t.int
144+
and methods = Property.define "myVar" Objc_t.int
145145
in
146146
let self = _new_ (Class.define name ~ivars ~methods) in
147147
Objc.msg_send
@@ -159,7 +159,7 @@ let test_value_accessors ~name x () =
159159

160160
let test_object_accessors ~name x () =
161161
let ivars = [Ivar.define "myVar" Objc_t.id]
162-
and methods = Property.obj_prop "myVar"
162+
and methods = Property.define "myVar" Objc_t.id
163163
in
164164
let self = _new_ (Class.define name ~ivars ~methods) in
165165
Objc.msg_send ~self
@@ -250,7 +250,7 @@ let test_msg_send_super () =
250250
let class_a =
251251
Class.define "ClassA"
252252
~methods:
253-
[ Define._method_
253+
[ Method.define
254254
~cmd: (selector "someMethod")
255255
~args: Objc_t.[]
256256
~return: Objc_t.void
@@ -261,7 +261,7 @@ let test_msg_send_super () =
261261
Class.define "ClassB"
262262
~superclass: class_a
263263
~methods:
264-
[ Define._method_
264+
[ Method.define
265265
~cmd: (selector "someMethod")
266266
~args: Objc_t.[]
267267
~return: Objc_t.void

0 commit comments

Comments
 (0)