aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-10-04 13:19:23 +0200
committerDrahflow <drahflow@gmx.de>2013-10-04 13:19:23 +0200
commit00feca5e1e9bd4e1625a76fc548b06f05a0e88f8 (patch)
treed883026cc982758757236dd25ec449f378920e4f /elymas/lib
parentef3ff192922d1b3a51ee85de64c210f0e8101271 (diff)
Better argument type handling for SOs
Diffstat (limited to 'elymas/lib')
-rw-r--r--elymas/lib/sys/so.ey48
1 files changed, 38 insertions, 10 deletions
diff --git a/elymas/lib/sys/so.ey b/elymas/lib/sys/so.ey
index 15bd751..d40e5ef 100644
--- a/elymas/lib/sys/so.ey
+++ b/elymas/lib/sys/so.ey
@@ -332,22 +332,50 @@
# "--------------------------------" dump
} /loadFile deffd
- # resolves a C function taking only pointer and integer arguments
- # 0 -> number of arguments
+ # resolves a C function
+ # 0 -> argument specification string
+ # "iis" == foo(int, int, char *)
+ # i: integer argument (of any width), also used for general pointers
+ # s: string argument (pointer to string content passed)
# 1 -> name of symbol
# the resulting function will take as many arguments as specified and return a single integer
{ ==args ==name
- [ /rdi /rsi /rdx /rcx /r8 /r9 ] =*:availableRegisters
+ [ /rdi /rsi /rdx /rcx /r8 /r9 ] =*:availableIntegerRegisters
+ 0 ==nextIntegerRegister
[
+ args { ==t [
+ { t 0 "i" * eq }' {
+ nextIntegerRegister availableIntegerRegisters ==reg
+ nextIntegerRegister 1 add =nextIntegerRegister
+
+ [
+ reg :popqReg
+ 63 reg :btrqImm8Reg
+ [ 8 reg reg :movqMemDisp8Reg ] len :jcRel8
+ 8 reg reg :movqMemDisp8Reg
+ ]
+ }
+ { t 0 "s" * eq }' {
+ nextIntegerRegister availableIntegerRegisters ==reg
+ nextIntegerRegister 1 add =nextIntegerRegister
+
+ [
+ reg :popqReg
+ 24 reg :addqImm8Reg
+ ]
+ }
+ { 1 }' {
+ t dump
+ "unknown argument semantics argument" die
+ }
+ ] conds } each
+ ] ==argumentLoaders
+
+ [
/rbx :popqReg
- 0 args range reverse { availableRegisters ==reg
- reg :popqReg
- 63 reg :btrqImm8Reg
- [ 8 reg reg :movqMemDisp8Reg ] len :jcRel8
- 8 reg reg :movqMemDisp8Reg
- } each
+ argumentLoaders reverse { _ len dearray } each
symbols name . .value /rax :movqImmReg
/rax :callqReg
@@ -380,7 +408,7 @@
/rbx :pushqReg
:retn
] [ ] ::createFunction
- } /resolveIntegerFunction deffd
+ } /resolveFunction deffd
> /so sys .defv
# vim: syn=elymas