added the go wrapper files. work in progress
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2023-10-27 18:20:02 +09:00
parent f19b971645
commit de94b4e66f
34 changed files with 11722 additions and 5465 deletions

41
go/Makefile.am Normal file
View File

@ -0,0 +1,41 @@
AUTOMAKE_OPTIONS = nostdinc
## the attempt to compose a proper procedure using a regular compiler failed.
## e.g ./configure GOC=opt/go/pkg/tool/linux_amd64/
## while go.m4 is included in autoconf 2.71, the support for the go language
## is very limited and the go language itself is pursuing the module based builder.
##
## the following is to trick autoconf/automake as if it's building go files with
## a real compiler whereas the actual building is done thru `go build`
bin_PROGRAMS = hclgo
hclgo_SOURCES = \
pkg/hcl.go \
pkg/cb.go \
pkg/inst.go \
main.go \
go.mod
hclgo_DEPENDENCIES = hclgo.bin
## let the linker to move hclgo.bin to the actual target
hclgo_LINK = mv -f hclgo.bin hclgo$(EXEEXT) || echo "FAILED TO LINK"
hclgo.bin:
cp -pf $(abs_srcdir)/go.mod $(abs_builddir)/go.mod >/dev/null 2>&1 || true
chmod u+w $(abs_builddir)/go.mod ## with `make distcheck`, the echo's redirection to the file fails without this permission change
sed -ri "/^[[:space:]]*replace[[:space:]]+cfg[[:space:]]*=>/d" $(abs_builddir)/go.mod
echo -e "\nreplace cfg => $(abs_builddir)/cfg" >> $(abs_builddir)/go.mod
[ -f $(abs_srcdir)/go.sum ] && cp -pf $(abs_srcdir)/go.sum $(abs_builddir)/go.sum >/dev/null 2>&1 || true
go build -x -o $(abs_builddir)/hclgo.bin -C $(srcdir) -modfile $(abs_builddir)/go.mod
go clean -x -C $(srcdir) -modfile $(abs_builddir)/go.mod
## the go to o recipe is fake to deceive make
.go.o:
echo $< > $@
.mod.o:
echo $< > $@
clean-local:
rm -rf $(abs_builddir)/go.mod $(abs_builddir)/go.sum

643
go/Makefile.in Normal file
View File

@ -0,0 +1,643 @@
# Makefile.in generated by automake 1.16.5 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
false; \
elif test -n '$(MAKE_HOST)'; then \
true; \
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
true; \
else \
false; \
fi; \
}
am__make_running_with_option = \
case $${target_option-} in \
?) ;; \
*) echo "am__make_running_with_option: internal error: invalid" \
"target option '$${target_option-}' specified" >&2; \
exit 1;; \
esac; \
has_opt=no; \
sane_makeflags=$$MAKEFLAGS; \
if $(am__is_gnu_make); then \
sane_makeflags=$$MFLAGS; \
else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
bs=\\; \
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
esac; \
fi; \
skip_next=no; \
strip_trailopt () \
{ \
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
}; \
for flg in $$sane_makeflags; do \
test $$skip_next = yes && { skip_next=no; continue; }; \
case $$flg in \
*=*|--*) continue;; \
-*I) strip_trailopt 'I'; skip_next=yes;; \
-*I?*) strip_trailopt 'I';; \
-*O) strip_trailopt 'O'; skip_next=yes;; \
-*O?*) strip_trailopt 'O';; \
-*l) strip_trailopt 'l'; skip_next=yes;; \
-*l?*) strip_trailopt 'l';; \
-[dEDm]) skip_next=yes;; \
-[JT]) skip_next=yes;; \
esac; \
case $$flg in \
*$$target_option*) has_opt=yes; break;; \
esac; \
done; \
test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
bin_PROGRAMS = hclgo$(EXEEXT)
subdir = go
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_sign.m4 \
$(top_srcdir)/m4/ax_numval.m4 $(top_srcdir)/m4/ax_pthread.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/lib/hcl-cfg.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(bindir)"
PROGRAMS = $(bin_PROGRAMS)
am__dirstamp = $(am__leading_dot)dirstamp
am_hclgo_OBJECTS = pkg/hcl.$(OBJEXT) pkg/cb.$(OBJEXT) \
pkg/inst.$(OBJEXT) main.$(OBJEXT) go.$(OBJEXT)
hclgo_OBJECTS = $(am_hclgo_OBJECTS)
hclgo_LDADD = $(LDADD)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 =
DEFAULT_INCLUDES =
SOURCES = $(hclgo_SOURCES)
DIST_SOURCES = $(hclgo_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
BEGIN { nonempty = 0; } \
{ items[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique. This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
list='$(am__tagged_files)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
am__DIST_COMMON = $(srcdir)/Makefile.in
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
BUILD_MODE = @BUILD_MODE@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSCOPE = @CSCOPE@
CTAGS = @CTAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
DL_LIBS = @DL_LIBS@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
FILECMD = @FILECMD@
GOC = @GOC@
GOFLAGS = @GOFLAGS@
GREP = @GREP@
HCL_PROJECT_AUTHOR = @HCL_PROJECT_AUTHOR@
HCL_PROJECT_URL = @HCL_PROJECT_URL@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LIPO = @LIPO@
LN_S = @LN_S@
LTDL_LIBS = @LTDL_LIBS@
LTLIBOBJS = @LTLIBOBJS@
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
PACKAGE_VERSION_PATCH = @PACKAGE_VERSION_PATCH@
PATH_SEPARATOR = @PATH_SEPARATOR@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_CXX = @PTHREAD_CXX@
PTHREAD_LIBS = @PTHREAD_LIBS@
QUADMATH_LIBS = @QUADMATH_LIBS@
RANLIB = @RANLIB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
UNICOWS_LIBS = @UNICOWS_LIBS@
UNWIND_LIBS = @UNWIND_LIBS@
VERSION = @VERSION@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = nostdinc
hclgo_SOURCES = \
pkg/hcl.go \
pkg/cb.go \
pkg/inst.go \
main.go \
go.mod
hclgo_DEPENDENCIES = hclgo.bin
hclgo_LINK = mv -f hclgo.bin hclgo$(EXEEXT) || echo "FAILED TO LINK"
all: all-am
.SUFFIXES:
.SUFFIXES: .go .mod .o
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign go/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --foreign go/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
$(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
fi; \
for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \
while read p p1; do if test -f $$p \
|| test -f $$p1 \
; then echo "$$p"; echo "$$p"; else :; fi; \
done | \
sed -e 'p;s,.*/,,;n;h' \
-e 's|.*|.|' \
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
sed 'N;N;N;s,\n, ,g' | \
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
if ($$2 == $$4) files[d] = files[d] " " $$1; \
else { print "f", $$3 "/" $$4, $$1; } } \
END { for (d in files) print "f", d, files[d] }' | \
while read type dir files; do \
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
test -z "$$files" || { \
echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
$(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
} \
; done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
files=`for p in $$list; do echo "$$p"; done | \
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-e 's/$$/$(EXEEXT)/' \
`; \
test -n "$$list" || exit 0; \
echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(bindir)" && rm -f $$files
clean-binPROGRAMS:
@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
echo " rm -f" $$list; \
rm -f $$list || exit $$?; \
test -n "$(EXEEXT)" || exit 0; \
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
pkg/$(am__dirstamp):
@$(MKDIR_P) pkg
@: > pkg/$(am__dirstamp)
pkg/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) pkg/$(DEPDIR)
@: > pkg/$(DEPDIR)/$(am__dirstamp)
pkg/hcl.$(OBJEXT): pkg/$(am__dirstamp) pkg/$(DEPDIR)/$(am__dirstamp)
pkg/cb.$(OBJEXT): pkg/$(am__dirstamp) pkg/$(DEPDIR)/$(am__dirstamp)
pkg/inst.$(OBJEXT): pkg/$(am__dirstamp) pkg/$(DEPDIR)/$(am__dirstamp)
hclgo$(EXEEXT): $(hclgo_OBJECTS) $(hclgo_DEPENDENCIES) $(EXTRA_hclgo_DEPENDENCIES)
@rm -f hclgo$(EXEEXT)
$(AM_V_GEN)$(hclgo_LINK) $(hclgo_OBJECTS) $(hclgo_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
-rm -f pkg/*.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
ID: $(am__tagged_files)
$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
$(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: ctags-am
CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
$(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: cscopelist-am
cscopelist-am: $(am__tagged_files)
list='$(am__tagged_files)'; \
case "$(srcdir)" in \
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
*) sdir=$(subdir)/$(srcdir) ;; \
esac; \
for i in $$list; do \
if test -f "$$i"; then \
echo "$(subdir)/$$i"; \
else \
echo "$$sdir/$$i"; \
fi; \
done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
distdir-am: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(PROGRAMS)
installdirs:
for dir in "$(DESTDIR)$(bindir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-rm -f pkg/$(DEPDIR)/$(am__dirstamp)
-rm -f pkg/$(am__dirstamp)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-binPROGRAMS clean-generic clean-libtool clean-local \
mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
html-am:
info: info-am
info-am:
install-data-am:
install-dvi: install-dvi-am
install-dvi-am:
install-exec-am: install-binPROGRAMS
install-html: install-html-am
install-html-am:
install-info: install-info-am
install-info-am:
install-man:
install-pdf: install-pdf-am
install-pdf-am:
install-ps: install-ps-am
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-binPROGRAMS
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
clean-binPROGRAMS clean-generic clean-libtool clean-local \
cscopelist-am ctags ctags-am distclean distclean-compile \
distclean-generic distclean-libtool distclean-tags distdir dvi \
dvi-am html html-am info info-am install install-am \
install-binPROGRAMS install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am install-man \
install-pdf install-pdf-am install-ps install-ps-am \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-generic mostlyclean \
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
uninstall-binPROGRAMS
.PRECIOUS: Makefile
hclgo.bin:
cp -pf $(abs_srcdir)/go.mod $(abs_builddir)/go.mod >/dev/null 2>&1 || true
chmod u+w $(abs_builddir)/go.mod ## with `make distcheck`, the echo's redirection to the file fails without this permission change
sed -ri "/^[[:space:]]*replace[[:space:]]+cfg[[:space:]]*=>/d" $(abs_builddir)/go.mod
echo -e "\nreplace cfg => $(abs_builddir)/cfg" >> $(abs_builddir)/go.mod
[ -f $(abs_srcdir)/go.sum ] && cp -pf $(abs_srcdir)/go.sum $(abs_builddir)/go.sum >/dev/null 2>&1 || true
go build -x -o $(abs_builddir)/hclgo.bin -C $(srcdir) -modfile $(abs_builddir)/go.mod
go clean -x -C $(srcdir) -modfile $(abs_builddir)/go.mod
.go.o:
echo $< > $@
.mod.o:
echo $< > $@
clean-local:
rm -rf $(abs_builddir)/go.mod $(abs_builddir)/go.sum
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

5
go/go.mod Normal file
View File

@ -0,0 +1,5 @@
module hcl
go 1.20
require cfg v0.0.0

134
go/main.go Normal file
View File

@ -0,0 +1,134 @@
package main
/*
#cgo CFLAGS: -I/home/hyung-hwan/xxx/include -g -Wall
#cgo LDFLAGS: -L/home/hyung-hwan/xxx/lib -lhcl -ldl -lquadmath
#include <hcl.h>
#include <stdlib.h>
extern int go_read_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg);
extern int go_scan_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg);
extern int go_print_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg);
int read_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg)
{
return go_read_handler(hcl, cmd, arg);
}
int scan_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg)
{
return go_scan_handler(hcl, cmd, arg);
}
int print_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg)
{
return go_print_handler(hcl, cmd, arg);
}
*/
//import "C"
import (
"fmt"
hcl "hcl/pkg"
"os"
"cfg"
)
/*
func run_hcl() {
var hcl *C.hcl_t = C.hcl_openstd(0, nil)
var src []uint16 = utf16.Encode(([]rune)(
`(printf ">>>>>>>>> [%d]\n" (+ 30 455))
(printf ">>>>>>>>> [%d]\n" (+ 11 455))
#include "a.hcl"
(printf ">>>>>>>>> [%d]\n" (+ 20 455))
`))
if hcl == nil {
log.Printf("Unable to open HCL\n")
} else {
var (
x C.int
logmask C.hcl_bitmask_t
tgt *C.char
empty *C.char
r C.hcl_oop_t
)
logmask = ^C.hcl_bitmask_t(0)
tgt = C.CString("/dev/stderr")
defer C.free(unsafe.Pointer(tgt))
empty = C.CString("")
defer C.free(unsafe.Pointer(empty))
C.hcl_setoption(hcl, C.HCL_LOG_MASK, unsafe.Pointer(&logmask))
C.hcl_setoption(hcl, C.HCL_LOG_TARGET_BCSTR, unsafe.Pointer(tgt))
_ = C.hcl_ignite(hcl, 1000000)
//fmt.Printf ("ignire %d\n", x)
_ = C.hcl_addbuiltinprims(hcl)
//fmt.Printf ("addbuiltinprims %d\n", x)
//_ = C.hcl_attachiostdwithbcstr(hcl, empty, empty, empty)
//x = C.hcl_attachio(hcl, (*[0]byte)(C.read_handler), (*[0]byte)(C.scan_handler), (*[0]byte)(C.print_handler))
x = C.hcl_attachio(hcl, C.hcl_ioimpl_t(C.read_handler), C.hcl_ioimpl_t(C.scan_handler), C.hcl_ioimpl_t(C.print_handler))
if x <= -1 {
log.Printf("unable to attach IO handlers - %d - %s\n", x, C.GoString(C.hcl_geterrbmsg(hcl)))
goto done
}
_ = C.hcl_beginfeed(hcl, nil)
//fmt.Printf ("beginfeed %d\n", x)
_ = C.hcl_feed(hcl, (*C.ushort)(&src[0]), (C.ulong)(len(src)))
//fmt.Printf ("feed %d\n", x)
_ = C.hcl_endfeed(hcl)
//fmt.Printf ("endfeed %d => bclen %d\n", x, C.hcl_getbclen(hcl))
_ = x
C.hcl_decode(hcl, 0, C.hcl_getbclen(hcl))
logmask = 0
C.hcl_setoption(hcl, C.HCL_LOG_MASK, unsafe.Pointer(&logmask))
r = C.hcl_execute(hcl)
if r == nil {
fmt.Printf("Error - %s\n", C.GoString(C.hcl_geterrbmsg(hcl)))
}
done:
C.hcl_close(hcl)
}
}
*/
func main() {
//run_hcl()
/*
var rfh hcl.ReadFileHandler
var sfh hcl.ScanFileHandler
var pfh hcl.PrintFileHandler
*/
fmt.Printf ("bindir = %s\n", cfg.BINDIR)
x, err := hcl.New()
if err != nil {
fmt.Printf("ERROR %s\n", err)
os.Exit(1)
}
x.Ignite(1000000)
x.AddBuiltinPrims()
/*
err = x.AttachIO(&rfh, &sfh, &pfh)
if err != nil {
fmt.Printf("Error - %s", err.Error())
}
x.FeedString(`(printf ">>>>>>>>> [%d]\n" (+ 30 455))
(printf ">>>>>>>>> [%d]\n" (+ 11 455))
#include "a.hcl"
(printf ">>>>>>>>> [%d]\n" (+ 20 455))`)
x.EndFeed()
x.Execute()
x.Close()
*/
}

460
go/pkg/cb.go Normal file
View File

@ -0,0 +1,460 @@
package hcl
/*
#cgo CFLAGS: -I/home/hyung-hwan/xxx/include -g -Wall
#cgo LDFLAGS: -L/home/hyung-hwan/xxx/lib -lhcl -ldl -lquadmath
#include <hcl.h>
#include <hcl-utl.h>
*/
import "C"
import (
// "bufio"
// "io"
"os"
// "sync"
// "unsafe"
)
type IOHandle struct {
file *os.File
ioif interface{}
}
/*
type IOHandleTable struct {
mtx sync.Mutex
handles []IOHandle
free_slots []int
}
func (io *IOHandleTable) add_io_handle(f *os.File, ioif interface{}) int {
io.mtx.Lock()
defer io.mtx.Unlock()
var n int = len(io.free_slots)
if n <= 0 { // no free slots
io.handles = append(io.handles, IOHandle{file: f, ioif: ioif})
return len(io.handles) - 1
} else {
var slot int
n--
slot = io.free_slots[n]
io.free_slots = io.free_slots[:n]
io.handles[slot].file = f
io.handles[slot].ioif = ioif
return slot
}
}
func (io *IOHandleTable) del_io_handle(slot int) IOHandle {
var (
h IOHandle
n int
)
io.mtx.Lock()
defer io.mtx.Unlock()
h = io.handles[slot]
io.handles[slot].file = nil
io.handles[slot].ioif = nil
n = len(io.handles)
if slot == n-1 {
io.handles = io.handles[:n-1]
} else {
io.free_slots = append(io.free_slots, slot)
}
return h
}
func (io *IOHandleTable) slot_to_io_handle(slot int) IOHandle {
io.mtx.Lock()
defer io.mtx.Unlock()
return io.handles[slot]
}
var io_tab IOHandleTable = IOHandleTable{}
//export go_read_handler
func go_read_handler(c *C.hcl_t, cmd C.hcl_iocmd_t, arg unsafe.Pointer) C.int {
var (
g *HCL
err error
)
g = c_to_go(c)
switch cmd {
case C.HCL_IO_OPEN:
var (
ioarg *C.hcl_iosrarg_t
name string
includer_name string
fd int
)
ioarg = (*C.hcl_iosrarg_t)(arg)
if ioarg.name == nil { // main stream when it's not feed based.
name = ""
} else {
var k []rune = ucstr_to_rune_slice(ioarg.name)
name = string(k)
}
if ioarg.includer == nil || ioarg.includer.name == nil {
includer_name = ""
} else {
var k []rune = ucstr_to_rune_slice(ioarg.includer.name)
includer_name = string(k)
}
fd, err = g.io.r.Open(g, name, includer_name)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
ioarg.handle = unsafe.Pointer(uintptr(fd))
return 0
case C.HCL_IO_CLOSE:
var ioarg *C.hcl_iosrarg_t = (*C.hcl_iosrarg_t)(arg)
g.io.r.Close(int(uintptr(ioarg.handle)))
return 0
case C.HCL_IO_READ:
var (
ioarg *C.hcl_iosrarg_t
n int
i int
buf []rune
)
ioarg = (*C.hcl_iosrarg_t)(arg)
buf = make([]rune, 1024) // TODO: different size...
n, err = g.io.r.Read(int(uintptr(ioarg.handle)), buf)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
for i = 0; i < n; i++ { // TODO: use a proper conversion when the rune size is different from hio_uch_t
ioarg.buf[i] = C.hcl_uch_t(buf[i])
}
ioarg.xlen = C.hcl_oow_t(n)
return 0
}
C.hcl_seterrnum(c, C.HCL_ENOIMPL)
return -1
}
//export go_scan_handler
func go_scan_handler(c *C.hcl_t, cmd C.hcl_iocmd_t, arg unsafe.Pointer) C.int {
var (
g *HCL
err error
)
g = c_to_go(c)
switch cmd {
case C.HCL_IO_OPEN:
err = g.io.s.Open(g)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
// we don't need to set ioarg.handle because the c object to go object
// mapping has been established and it doesn't handle multiple streams
return 0
case C.HCL_IO_CLOSE:
g.io.s.Close()
return 0
case C.HCL_IO_READ:
var (
ioarg *C.hcl_ioinarg_t
n int
err error
buf []rune
)
ioarg = (*C.hcl_ioinarg_t)(arg)
buf = make([]rune, 1024) // TODO: different size...
n, err = g.io.s.Read(buf)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
ioarg.xlen = C.ulong(n)
return 0
}
C.hcl_seterrnum(c, C.HCL_ENOIMPL)
return -1
}
//export go_print_handler
func go_print_handler(c *C.hcl_t, cmd C.hcl_iocmd_t, arg unsafe.Pointer) C.int {
var (
g *HCL
err error
)
g = c_to_go(c)
switch cmd {
case C.HCL_IO_OPEN:
err = g.io.p.Open(g)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
// we don't need to set ioarg.handle because the c object to go object
// mapping has been established and it doesn't handle multiple streams
return 0
case C.HCL_IO_CLOSE:
g.io.p.Close()
return 0
case C.HCL_IO_WRITE:
var (
ioarg *C.hcl_iooutarg_t
data []rune
err error
)
ioarg = (*C.hcl_iooutarg_t)(arg)
data = uchars_to_rune_slice((*C.hcl_uch_t)(ioarg.ptr), uintptr(ioarg.len))
err = g.io.p.Write(data)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
ioarg.xlen = C.hcl_oow_t(len(data))
return 0
case C.HCL_IO_WRITE_BYTES:
var (
ioarg *C.hcl_iooutarg_t
data []byte
err error
)
ioarg = (*C.hcl_iooutarg_t)(arg)
data = unsafe.Slice((*byte)(ioarg.ptr), ioarg.len)
err = g.io.p.WriteBytes(data)
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
ioarg.xlen = C.hcl_oow_t(len(data))
return 0
case C.HCL_IO_FLUSH:
var err error = g.io.p.Flush()
if err != nil {
C.hcl_seterrbmsg(c, C.HCL_ENOIMPL, C.CString(err.Error()))
return -1
}
return 0
}
C.hcl_seterrnum(c, C.HCL_ENOIMPL)
return -1
}
// ------------------------------------------------------
type ReadFileHandler struct {
g *HCL
}
func (p *ReadFileHandler) Open(g *HCL, name string, includer_name string) (int, error) {
var (
f *os.File
r *bufio.Reader
fd int
err error
)
if name == "" {
f = os.Stdin
} else {
f, err = os.Open(name)
if err != nil {
return -1, err
}
}
r = bufio.NewReader(f)
fd = io_tab.add_io_handle(f, r)
p.g = g
return fd, nil
}
func (p *ReadFileHandler) Close(fd int) {
var hnd IOHandle = io_tab.slot_to_io_handle(fd)
if hnd.file != nil {
if hnd.file != os.Stdout && hnd.file != os.Stderr {
hnd.file.Close()
}
hnd.file = nil
hnd.ioif = nil
}
}
func (p *ReadFileHandler) Read(fd int, buf []rune) (int, error) {
var (
hnd IOHandle
i int
c rune
r *bufio.Reader
err error
)
hnd = io_tab.slot_to_io_handle(fd)
r, _ = hnd.ioif.(*bufio.Reader)
for i = 0; i < len(buf); i++ {
c, _, err = r.ReadRune()
if err == io.EOF {
break
} else if err != nil {
return -1, err
}
buf[i] = c
}
return i, nil
}
// ------------------------------------------------------
type ScanFileHandler struct {
g *HCL
f *os.File
r *bufio.Reader
}
func (p *ScanFileHandler) Open(g *HCL) error {
var (
f *os.File
// err error
)
f = os.Stdin
//f, err = os.Open("/dev/stdin")
//if err != nil {
// return err
//}
p.r = bufio.NewReader(f)
p.f = f
p.g = g
return nil
}
func (p *ScanFileHandler) Close() {
if p.f != nil {
if p.f != os.Stdout && p.f != os.Stderr {
p.f.Close()
}
p.f = nil
p.r = nil
}
}
func (p *ScanFileHandler) Read(buf []rune) (int, error) {
var (
i int
c rune
err error
)
// flush all pending print out before reading
p.g.io.p.Flush()
for i = 0; i < len(buf); i++ {
c, _, err = p.r.ReadRune()
if err == io.EOF {
break
} else if err != nil {
return -1, err
}
buf[i] = c
}
return i, nil
}
// ------------------------------------------------------
type PrintFileHandler struct {
f *os.File
w *bufio.Writer
}
func (p *PrintFileHandler) Open(g *HCL) error {
var (
f *os.File
// err error
)
// f, err = os.OpenFile("/dev/stdout", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
// if err != nil {
// return err
// }
f = os.Stdout
p.w = bufio.NewWriter(f)
p.f = f
//fmt.Fprintf(os.Stderr, "XXXXXXXXXX open porint\n")
return nil
}
func (p *PrintFileHandler) Close() {
//fmt.Fprintf(os.Stderr, "XXXXXXXXXX close porint\n")
if p.f != nil {
if p.f != os.Stdout && p.f != os.Stderr {
p.f.Close()
}
p.f = nil
p.w = nil
}
}
func (p *PrintFileHandler) Write(data []rune) error {
var err error
//fmt.Fprintf(os.Stderr, "XXXXXXXXXX write porint\n")
_, err = p.w.WriteString(string(data))
p.w.Flush() // TODO: is this needed?
return err
}
func (p *PrintFileHandler) WriteBytes(data []byte) error {
var err error
//fmt.Fprintf(os.Stderr, "XXXXXXXXXX write porint\n")
_, err = p.w.Write(data)
p.w.Flush() // TODO: is this needed?
return err
}
func (p *PrintFileHandler) Flush() error {
//fmt.Fprintf(os.Stderr, "XXXXXXXXXX flush porint\n")
return p.w.Flush()
}
*/

105
go/pkg/hcl.go Normal file
View File

@ -0,0 +1,105 @@
package hcl
/*
#cgo CFLAGS: -I/home/hyung-hwan/xxx/include -g -Wall
#cgo LDFLAGS: -L/home/hyung-hwan/xxx/lib -lhcl -ldl -lquadmath
#include <hcl.h>
#include <hcl-utl.h>
*/
import "C"
import (
"fmt"
"runtime"
// "unsafe"
)
type HCL struct {
inst *C.hcl_t
no int
io struct {
r IOHandle
w IOHandle
}
}
var inst_table InstanceTable
func deregister_instance(hcl *HCL) {
if (hcl.no >= 0) {
inst_table.delete_instance(hcl.no)
hcl.no = -1
}
}
func New() (*HCL, error) {
var inst *C.hcl_t
var hcl* HCL
inst = C.hcl_open(nil, 0, nil, nil) // TODO: prim in, errnum out
hcl = &HCL{inst: inst, no : -1}
runtime.SetFinalizer(hcl, deregister_instance)
hcl.no = inst_table.add_instance(inst, hcl)
return hcl, nil
}
func (hcl *HCL) Close() {
C.hcl_close (hcl.inst)
deregister_instance (hcl)
}
func (hcl *HCL) Ignite(memsize uintptr) error {
if C.hcl_ignite(hcl.inst, C.hcl_oow_t(memsize)) <= -1 {
// TODO: need to convert string...
return fmt.Errorf ("unable to ignite: %s", ucstr_to_rune_slice(C.hcl_geterrstr(hcl.inst)))
}
return nil
}
func (hcl *HCL) AddBuiltinPrims() error {
if C.hcl_addbuiltinprims(hcl.inst) <= -1 {
}
return nil
}
func (hcl *HCL) AttachIO() error {
return nil
}
func (hcl *HCL) FeedString(str []rune) error {
return nil
}
func (hcl *HCL) BeginFeed() {
}
func (hcl *HCL) EndFeed() {
}
func (hcl *HCL) Execute() {
}
func ucstr_to_rune_slice(str *C.hcl_uch_t) []rune {
return uchars_to_rune_slice(str, uintptr(C.hcl_count_ucstr(str)))
}
func uchars_to_rune_slice(str *C.hcl_uch_t, len uintptr) []rune {
var res []rune
var i uintptr
// TODO: proper encoding...
res = make([]rune, len)
for i = 0; i < len; i++ {
//TODO res[i] := str[i]
}
return res
}
func c_to_go (inst *C.hcl_t) *HCL {
return nil
}

68
go/pkg/inst.go Normal file
View File

@ -0,0 +1,68 @@
package hcl
/*
#include <hcl.h>
*/
import "C"
import (
"sync"
)
type Instance struct {
c *C.hcl_t // c object
g *HCL // go object
}
type InstanceTable struct {
mtx sync.Mutex
insts []Instance
free_slots []int
}
func (itab *InstanceTable) add_instance(c *C.hcl_t, g *HCL) int {
itab.mtx.Lock()
defer itab.mtx.Unlock()
var n int = len(itab.free_slots)
if n <= 0 { // no free slots
itab.insts = append(itab.insts, Instance{c: c, g: g})
return len(itab.insts) - 1
} else {
var slot int
n--
slot = itab.free_slots[n]
itab.free_slots = itab.free_slots[:n]
itab.insts[slot].c = c
return slot
}
}
func (itab *InstanceTable) delete_instance(slot int) Instance {
var (
h Instance
n int
)
itab.mtx.Lock()
defer itab.mtx.Unlock()
h = itab.insts[slot]
itab.insts[slot].c = nil
itab.insts[slot].g = nil
n = len(itab.insts)
if slot == n-1 {
itab.insts = itab.insts[:n-1]
} else {
itab.free_slots = append(itab.free_slots, slot)
}
return h
}
func (itab *InstanceTable) slot_to_instance(slot int) Instance {
itab.mtx.Lock()
defer itab.mtx.Unlock()
return itab.insts[slot]
}