diff options
| author | Drahflow <drahflow@gmx.de> | 2015-04-14 21:55:57 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2015-04-14 21:55:57 +0200 |
| commit | fca1dd8dbe0b547164f8218f14abf61bcf5efea2 (patch) | |
| tree | 8d079b6ef1ebdc0e253477a57c72a3f942b4b5b9 | |
| parent | 68f9af208c4dbda73b8dd388619cf6f83711b2c3 (diff) | |
Typed array application \o/
| -rw-r--r-- | compiler/elymasGlobal.ey | 24 | ||||
| -rw-r--r-- | compiler/standardClient.ey | 7 |
2 files changed, 27 insertions, 4 deletions
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 2363c6b..805a3db 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -442,8 +442,28 @@ %00 /cl :cmpbImmReg /arrayIntArgumentBoxed :jeLbl8 - "FIXME: typed array application" ::outputError - :ud2 + # escape this to compiled high-level code + /rbx :pushqReg + /rdx :pushqReg + + /rax :movqImmOOBReg "sys" ::string + /rax :pushqReg + /rax :movqImmOOBReg "ey*" "ey|" ::linkAbs64 + /rax :callqReg + + /rax :movqImmOOBReg "typed" ::string + /rax :pushqReg + /rax :movqImmOOBReg "ey*" "ey." ::linkAbs64 + /rax :callqReg + + /rax :movqImmOOBReg "execute" ::string + /rax :pushqReg + /rax :movqImmOOBReg "ey*" "ey." ::linkAbs64 + /rax :callqReg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn @arrayIntArgumentBoxed 8 /rbx /rax :movqMemDisp8Reg # rax == requested index diff --git a/compiler/standardClient.ey b/compiler/standardClient.ey index e26dd14..27d6455 100644 --- a/compiler/standardClient.ey +++ b/compiler/standardClient.ey @@ -651,8 +651,11 @@ # Run from right (stacktop) argument to left (stacklow) argument: # Take topmost type, check whether it can be found in other stacks (from top) # Eliminate all matching types via function or loop creation - { _ ==f _ sys .typed .inputs ==inputs - sys .typed .outputs ==outputs + { ==f + f sys .typed .type 7 eq { f { * }_ [ 0 ] [ 0 ] '' =f } rep + + f sys .typed .inputs ==inputs + f sys .typed .outputs ==outputs outputs len 1 gt { "multi-output function in auto-loop" die } rep |
