diff options
| -rw-r--r-- | compiler/elymasGlobal.ey | 112 | ||||
| -rw-r--r-- | compiler/standardClient.ey | 6 | ||||
| -rw-r--r-- | examples/working-compiler/undefined-resolution.test | 9 |
3 files changed, 91 insertions, 36 deletions
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 360758d..4ff0b8f 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -1172,11 +1172,16 @@ :ud2 @unresolved - "unresolved name in internalExecuteIdentifierUnquoted: " ::outputError - /r15 /rdi :movqMemReg - ::internalDumpErrorString /rax :movqImmReg - /rax :callqReg - :ud2 + /r15 :pushqMem # push member + /r14 :pushqReg # push scope + /rax :movqImmOOBReg "#." ::string + /rax :pushqReg + /rax :movqImmOOBReg "internalExecuteIdentifierUnquoted" "ey." ::linkAbs64 + + 8 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + /rax :jmpqReg @active |ey* /rax :movqImmReg @@ -1234,11 +1239,16 @@ :ud2 @unresolved - "unresolved name in internalExecuteIdentifierUnquotedAndPatchLateResolve: " ::outputError - /r15 /rdi :movqMemReg - ::internalDumpErrorString /rax :movqImmReg - /rax :callqReg - :ud2 + /r15 :pushqMem # push member + /r14 :pushqReg # push scope + /rax :movqImmOOBReg "#." ::string + /rax :pushqReg + /rax :movqImmOOBReg "internalExecuteIdentifierUnquotedAndPatchLateResolve" "ey." ::linkAbs64 + + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + /rax :jmpqReg @active # TODO patch late resolve call away |ey* /rax :movqImmReg @@ -2179,11 +2189,13 @@ 8 /r15 :subqImm8Reg /r15 :popqMem - 8 /r15 :subqImm8Reg - /r15 :popqMem # store identifier + @restart + 16 /r15 :subqImm8Reg + 8 /r15 :popqMemDisp8 # store identifier + /r15 :popqMem # store scope - /rdi :popqReg # fetch scope - /r15 /rsi :movqMemReg + /r15 /rdi :movqMemReg + 8 /r15 /rsi :movqMemDisp8Reg ::internalResolve /rax :movqImmReg /rax :callqReg @@ -2199,23 +2211,25 @@ "invalid activation mode in ." ::outputError :ud2 - @unresolved - "unresolved name in .: " ::outputError - /r15 /rdi :movqMemReg - ::internalDumpErrorString /rax :movqImmReg - /rax :callqReg - :ud2 - @active |ey* /rax :movqImmReg /rax :callqReg @inactive @done - 8 /r15 :addqImm8Reg + 16 /r15 :addqImm8Reg /r15 :pushqMem 8 /r15 :addqImm8Reg :retn + + @unresolved + 8 /r15 :pushqMemDisp8 + /r15 :pushqMem + 16 /r15 :addqImm8Reg + + /rax :movqImmOOBReg "#." ::string + /rax :pushqReg + /restart :jmpLbl8 ]] /ey. defv # explicitely resolve a scope member, but never execute @@ -2225,11 +2239,12 @@ 8 /r15 :subqImm8Reg /r15 :popqMem - 8 /r15 :subqImm8Reg - /r15 :popqMem # store identifier + 16 /r15 :subqImm8Reg + 8 /r15 :popqMemDisp8 # store identifier + /r15 :popqMem # store scope - /rdi :popqReg # fetch scope - /r15 /rsi :movqMemReg + /r15 /rdi :movqMemReg + 8 /r15 /rsi :movqMemDisp8Reg ::internalResolve /rax :movqImmReg /rax :callqReg @@ -2237,17 +2252,24 @@ /unresolved :jzLbl8 /rax :pushqReg - 8 /r15 :addqImm8Reg + 16 /r15 :addqImm8Reg /r15 :pushqMem 8 /r15 :addqImm8Reg :retn @unresolved - "unresolved name in .|: " ::outputError - /r15 /rdi :movqMemReg - ::internalDumpErrorString /rax :movqImmReg - /rax :callqReg - :ud2 + 8 /r15 :pushqMemDisp8 + /r15 :pushqMem + 16 /r15 :addqImm8Reg + + /rax :movqImmOOBReg "#.|" ::string + /rax :pushqReg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + + /rax :movqImmOOBReg "ey.|" "ey." ::linkAbs64 + /rax :jmpqReg ]] /ey.| defv # test whether a scope member exists @@ -2258,24 +2280,42 @@ 8 /r15 :subqImm8Reg /r15 :popqMem - /rsi :popqReg # fetch identifier - /rdi :popqReg # fetch scope + 16 /r15 :subqImm8Reg + 8 /r15 :popqMemDisp8 # store identifier + /r15 :popqMem # store scope + + /r15 /rdi :movqMemReg + 8 /r15 /rsi :movqMemDisp8Reg ::internalResolve /rax :movqImmReg /rax :callqReg /rax /rax :testqRegReg /unresolved :jzLbl8 1 /rax :movqImmReg - @unresolved 63 /rax :btsqImm8Reg /rax :pushqReg + 16 /r15 :addqImm8Reg /r15 :pushqMem 8 /r15 :addqImm8Reg :retn + + @unresolved + 8 /r15 :pushqMemDisp8 + /r15 :pushqMem + 16 /r15 :addqImm8Reg + + /rax :movqImmOOBReg "#.?" ::string + /rax :pushqReg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + + /rax :movqImmOOBReg "ey.?" "ey." ::linkAbs64 + /rax :jmpqReg ]] /ey.? defv - # test whether a scope member exists without following parent pointers + # test whether a scope member exists without following parent pointers or dynamic lookup # 0 -> member name # 1 -> scope # 0 <- 1 if scope member exists directly in scope, 0 otherwise diff --git a/compiler/standardClient.ey b/compiler/standardClient.ey index 9854654..e21ffc0 100644 --- a/compiler/standardClient.ey +++ b/compiler/standardClient.ey @@ -1,3 +1,9 @@ +## dynamic member lookup fallback routines +{ -- 0 } "#.?" deffd +{ "undefined member in .: " -01 cat die } "#." deffd +{ "undefined member in .|: " -01 cat die } "#.|" deffd +{ "undefined member in =: " -01 cat die } "#.=" deffd + ## regex support # ideas taken from http://swtch.com/~rsc/regexp/regexp3.html # FIXME: correctly handly */+/? priority diff --git a/examples/working-compiler/undefined-resolution.test b/examples/working-compiler/undefined-resolution.test index 6465d47..aa0230e 100644 --- a/examples/working-compiler/undefined-resolution.test +++ b/examples/working-compiler/undefined-resolution.test @@ -11,3 +11,12 @@ s .|dotpipe s .?dotquestion s .dot < { bare } =*f s >' .f + +{ + < { |pipebare } =*f s >' .f + < { 42 =equalbare } =*f s >' .f + s .|dotpipe + s .?dotquestion + s .dot + < { bare } =*f s >' .f +} _ * * |
