Mercurial > repos > tabletprog
annotate modules/dl.tp @ 331:61f5b794d939
Breaking change: method call syntax now always uses the syntactic receiver as the actual receiver. This makes its behavior different from function call syntax, but solves some problems with methods being shadowed by local variables and the like.
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 28 Mar 2015 14:21:04 -0700 |
parents | cba0cb39517a |
children |
rev | line source |
---|---|
264
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #{ |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 includeSystemHeader: "dlfcn.h" |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 llMessage: sym:from withVars: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 handle <- obj_uint64 ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 name <- string ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 intret <- obj_uint64 ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 } andCode: :name :handle { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 intret <- make_object: (addr_of: obj_int64_meta) NULL 0 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 intret num!: (dlsym: (handle num) (name data)) |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 intret |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 llMessage: open:withFlags withVars: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 name <- string ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 intret <- obj_uint64 ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 flags <- obj_int32 ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 } andCode: :name :flags { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 intret <- make_object: (addr_of: obj_int64_meta) NULL 0 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 if: (name len) > 0 { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 intret num!: (dlopen: (name data) (flags num)) |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 } else: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 intret num!: (dlopen: NULL (flags num)) |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 intret |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 llMessage: LAZY withVars: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 flagret <- obj_int32 ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 } andCode: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 flagret <- make_object: (addr_of: obj_int64_meta) NULL 0 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 flagret num!: RTLD_LAZY |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 flagret |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 llMessage: NOW withVars: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 flagret <- obj_int32 ptr |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 } andCode: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 flagret <- make_object: (addr_of: obj_int64_meta) NULL 0 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 flagret num!: RTLD_NOW |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 flagret |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 main <- :args { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 library <- "" |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 func <- "main" |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 if: (args length) > 2 { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 library <- args get: 1 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 func <- args get: 2 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 } else: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 if: (args length) > 1 { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 func <- args get: 1 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 handle <- open: library withFlags: NOW |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 print: "handle: " . handle . "\n" |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 address <- sym: func from: handle |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 if: (library length) > 0 { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 print: library . " - " . func . ": " . address . "\n" |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 } else: { |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 print: func . ": " . address . "\n" |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 0 |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 } |
cba0cb39517a
Add module for interfacing with libdl
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 } |