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