loader_exports.mx raw
1 package main
2
3 import (
4 "runtime"
5 "unsafe"
6 )
7
8 var loaderHandles []*LoaderProgram
9
10 func allocLoaderHandle(p *LoaderProgram) int32 {
11 for i, h := range loaderHandles {
12 if h == nil {
13 loaderHandles[i] = p
14 return int32(i)
15 }
16 }
17 loaderHandles = append(loaderHandles, p)
18 return int32(len(loaderHandles) - 1)
19 }
20
21 func getLoader(h int32) *LoaderProgram {
22 if h < 0 || int(h) >= len(loaderHandles) {
23 return nil
24 }
25 return loaderHandles[h]
26 }
27
28 func loaderCopyOut(dst unsafe.Pointer, cap int32, src string) int32 {
29 n := int32(len(src))
30 if n > cap {
31 n = cap
32 }
33 if n > 0 {
34 buf := unsafe.Slice((*byte)(dst), n)
35 copy(buf, src[:n])
36 }
37 return n
38 }
39
40 //export moxie_loader_load
41 func moxie_loader_load(rootDirPtr unsafe.Pointer, rootDirLen int32, inputPkgPtr unsafe.Pointer, inputPkgLen int32, gorootPtr unsafe.Pointer, gorootLen int32) int32 {
42 runtime.InitCShared()
43 rootDir := string(unsafe.Slice((*byte)(rootDirPtr), rootDirLen))
44 inputPkg := string(unsafe.Slice((*byte)(inputPkgPtr), inputPkgLen))
45 goroot := string(unsafe.Slice((*byte)(gorootPtr), gorootLen))
46
47 prog, err := LoadPackages(rootDir, inputPkg, goroot)
48 if err != nil || prog == nil {
49 return -1
50 }
51 return allocLoaderHandle(prog)
52 }
53
54 //export moxie_loader_pkg_count
55 func moxie_loader_pkg_count(h int32) int32 {
56 runtime.InitCShared()
57 p := getLoader(h)
58 if p == nil {
59 return 0
60 }
61 return int32(len(p.Packages))
62 }
63
64 //export moxie_loader_mod_path
65 func moxie_loader_mod_path(h int32, out unsafe.Pointer, cap int32) int32 {
66 runtime.InitCShared()
67 p := getLoader(h)
68 if p == nil {
69 return 0
70 }
71 return loaderCopyOut(out, cap, p.ModPath)
72 }
73
74 //export moxie_loader_pkg_path
75 func moxie_loader_pkg_path(h int32, idx int32, out unsafe.Pointer, cap int32) int32 {
76 runtime.InitCShared()
77 p := getLoader(h)
78 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
79 return 0
80 }
81 return loaderCopyOut(out, cap, p.Packages[idx].ImportPath)
82 }
83
84 //export moxie_loader_pkg_dir
85 func moxie_loader_pkg_dir(h int32, idx int32, out unsafe.Pointer, cap int32) int32 {
86 runtime.InitCShared()
87 p := getLoader(h)
88 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
89 return 0
90 }
91 return loaderCopyOut(out, cap, p.Packages[idx].Dir)
92 }
93
94 //export moxie_loader_pkg_name
95 func moxie_loader_pkg_name(h int32, idx int32, out unsafe.Pointer, cap int32) int32 {
96 runtime.InitCShared()
97 p := getLoader(h)
98 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
99 return 0
100 }
101 return loaderCopyOut(out, cap, p.Packages[idx].PkgName)
102 }
103
104 //export moxie_loader_pkg_file_count
105 func moxie_loader_pkg_file_count(h int32, idx int32) int32 {
106 runtime.InitCShared()
107 p := getLoader(h)
108 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
109 return 0
110 }
111 return int32(len(p.Packages[idx].Files))
112 }
113
114 //export moxie_loader_pkg_import_count
115 func moxie_loader_pkg_import_count(h int32, idx int32) int32 {
116 runtime.InitCShared()
117 p := getLoader(h)
118 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
119 return 0
120 }
121 return int32(len(p.Packages[idx].Imports))
122 }
123
124 //export moxie_loader_pkg_import
125 func moxie_loader_pkg_import(h int32, idx int32, impIdx int32, out unsafe.Pointer, cap int32) int32 {
126 runtime.InitCShared()
127 p := getLoader(h)
128 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
129 return 0
130 }
131 pkg := p.Packages[idx]
132 if impIdx < 0 || int(impIdx) >= len(pkg.Imports) {
133 return 0
134 }
135 return loaderCopyOut(out, cap, pkg.Imports[impIdx])
136 }
137
138 //export moxie_loader_pkg_is_mxh
139 func moxie_loader_pkg_is_mxh(h int32, idx int32) int32 {
140 runtime.InitCShared()
141 p := getLoader(h)
142 if p == nil || idx < 0 || int(idx) >= len(p.Packages) {
143 return 0
144 }
145 if p.Packages[idx].IsMXH {
146 return 1
147 }
148 return 0
149 }
150
151 //export moxie_loader_free
152 func moxie_loader_free(h int32) {
153 runtime.InitCShared()
154 if h >= 0 && int(h) < len(loaderHandles) {
155 loaderHandles[h] = nil
156 }
157 }
158
159 func main() {}
160