diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-22 15:42:23 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-22 15:42:23 +0100 |
| commit | 7c0bcd61637a6101edf9a424ab4c369502378752 (patch) | |
| tree | 68c472dbd33d815830807826735f96b2f157473d /compiler | |
| parent | 35bc7a72f8c76669f2b49cc9cfd0a17e1d306073 (diff) | |
Some (harder) bugs removed.
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasAsmLib.ey | 271 |
1 files changed, 152 insertions, 119 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index 8c7bc7b..fb1a487 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -2,6 +2,7 @@ < 256 ==INITIALEXTENSIONSIZE + 256 ==INITIALSCOPESIZE { assembler -01 . } ":" deff assembler .|label "@" deff @@ -321,6 +322,7 @@ ] /internalAllocateArray defv > { defv }' allocateOffsetStruct + # TODO: don't touch scope at all, if unscoping function [ 8 /r15 :subqImm8Reg /r15 :popqMem @@ -822,6 +824,17 @@ 8 /r15 :addqImm8Reg :retn ] :labelResolve /eyrange defv + + # create a new scope capturing the current one + [ + INITIALSCOPESIZE /rdi :movqImmReg + currentScope /rsi :movqImmReg + /rsi /rsi :movqMemReg + internalAllocateScope /rax :movqImmReg + /rax :callqReg + + :retn + ] /ey< defv > _ ==globalFunctions { defv }' allocateOffsetStruct { @@ -846,142 +859,162 @@ } /allocateCodeFromEncodingBuffer deff < - < - # resolve identifier according to current scope and quote mode and act accordingly - # 0 -> identifier to resolve - [ - 8 /r15 :subqImm8Reg - /r15 :popqMem + # resolve identifier without quoting considerations act accordingly + # 0 -> identifier to resolve + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem - /selfBegin :callLbl32 - ] _ len ==internalExecuteHeaderLen [ -011 len dearray - @selfBegin - /rax :popqReg - internalExecuteHeaderLen /rax :subqImm8Reg - 8 /r15 :subqImm8Reg - /rax /r15 :movqRegMem # store entry into this function + 8 /r15 :subqImm8Reg + /r15 :popqMem # store identifier + + # scope resolution + currentScope /rdi :movqImmReg + /rdi /rdi :movqMemReg + /r15 /rsi :movqMemReg + internalResolve /rax :movqImmReg + /rax :callqReg - 8 /r15 :subqImm8Reg - /r15 :popqMem # store identifier - - # scope resolution - currentScope /rdi :movqImmReg - /rdi /rdi :movqMemReg - /r15 /rsi :movqMemReg - internalResolve /rax :movqImmReg - /rax :callqReg + /rax /rax :testqRegReg + /unresolved :jzLbl8 + /rax :pushqReg - /rax /rax :testqRegReg - /unresolved :jzLbl8 - /rax :pushqReg + 0 /rdx :cmpqImm8Reg + /inactive :jzLbl8 + 1 /rdx :cmpqImm8Reg + /active :jzLbl8 - 0 /rdx :cmpqImm8Reg - /inactive :jzLbl8 - 1 /rdx :cmpqImm8Reg - /active :jzLbl8 - 2 /rdx :cmpqImm8Reg - /quoteActive :jzLbl8 + # TODO: "invalid activation mode" + :ud2 - # TODO: "invalid activation mode" - :ud2 + @unresolved + errUnresolvedName /rdi :movqImmReg + internalDumpErrorString /rax :movqImmReg + /rax :callqReg + /r15 /rdi :movqMemReg + internalDumpErrorString /rax :movqImmReg + /rax :callqReg + :ud2 - @unresolved - currentQuoted /rax :movqImmReg - /rax /rax :movqMemReg - /rax /rax :testqRegReg - /constructQuotedResolve :jnzLbl8 + @active + |ey* /rax :movqImmReg + /rax :callqReg - errUnresolvedName /rdi :movqImmReg - internalDumpErrorString /rax :movqImmReg - /rax :callqReg - /r15 /rdi :movqMemReg - internalDumpErrorString /rax :movqImmReg - /rax :callqReg - :ud2 + @inactive + @done + 8 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] :labelResolve /internalExecuteIdentifierUnquoted defv + > { defv }' allocateOffsetStruct - @quoteActive - |ey* /rax :movqImmReg - /rax :callqReg - /done :jmpLbl8 + < + # resolve identifier according to current scope and quote mode and act accordingly + # 0 -> identifier to resolve + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem - @active - currentQuoted /rax :movqImmReg - /rax /rax :movqMemReg - /rax /rax :testqRegReg - /activeQuoted :jnzLbl8 - |ey* /rax :movqImmReg - /rax :callqReg - /done :jmpLbl8 + 8 /r15 :subqImm8Reg + /r15 :popqMem # store identifier + + # scope resolution + currentScope /rdi :movqImmReg + /rdi /rdi :movqMemReg + /r15 /rsi :movqMemReg + internalResolve /rax :movqImmReg + /rax :callqReg - @activeQuoted - # FIXME: actually, this should re-resolve as if unresolved - /done :jmpLbl8 + /rax /rax :testqRegReg + /unresolved :jzLbl8 - @inactive - currentQuoted /rax :movqImmReg - /rax /rax :movqMemReg - /rax /rax :testqRegReg - /constructQuotedResolve :jnzLbl8 + 0 /rdx :cmpqImm8Reg + /inactive :jzLbl8 + 1 /rdx :cmpqImm8Reg + /active :jzLbl8 + 2 /rdx :cmpqImm8Reg + /quoteActive :jzLbl8 - @done - 16 /r15 :addqImm8Reg - /r15 :pushqMem - 8 /r15 :addqImm8Reg - :retn + # TODO: "invalid activation mode" + :ud2 - @constructQuotedResolve - # construct non-capturing function which - :quoteEncodingBuffer /rdi :movqImmReg - unscopingFunctionHeader loadToRdi + @unresolved + currentQuoted /rax :movqImmReg + /rax /rax :movqMemReg + /rax /rax :testqRegReg + /constructQuotedResolve :jnzLbl8 - # 1. pushes identifier - [ /rax :movqImmOOBReg ] _ len 2 eq assert - 2 dearray 256 mul add - /rdi :movwImmMem - /r15 /rsi :movqMemReg - /rsi 2 /rdi :movqRegMemDisp8 - 10 /rdi :addqImm8Reg + errUnresolvedName /rdi :movqImmReg + internalDumpErrorString /rax :movqImmReg + /rax :callqReg + /r15 /rdi :movqMemReg + internalDumpErrorString /rax :movqImmReg + /rax :callqReg + :ud2 - [ - /rax :pushqReg - - # 2. resets to non-quoted mode - 8 /r15 :subqImm8Reg - currentQuoted /rax :movqImmReg - /rax /rcx :movqMemReg - /rcx /r15 :movqRegMem - /rcx /rcx :xorqRegReg - /rcx /rax :movqRegMem - # 3. resolves identifier action - /rax :movqImmOOBReg - ] loadToRdi - 8 /r15 /rax :movqMemDisp8Reg - /rax /rdi :movqRegMem - 8 /rdi :addqImm8Reg - [ - /rax :callqReg - # 4. restores quote mode - /r15 /rcx :movqMemReg - currentQuoted /rax :movqImmReg - /rcx /rax :movqRegMem - 8 /r15 :addqImm8Reg - ] functionFooter cat loadToRdi - - allocateCodeFromEncodingBuffer - # rax == code block on heap - - # create non-capturing function object - /rax /rdi :movqRegReg - /rsi /rsi :xorqRegReg - /rdx /rdx :xorqRegReg - internalAllocateFunction /rax :movqImmReg - /rax :callqReg + @quoteActive + /rax :pushqReg + |ey* /rax :movqImmReg + /rax :callqReg + /done :jmpLbl8 + + @active + currentQuoted /rbx :movqImmReg + /rbx /rbx :movqMemReg + /rbx /rbx :testqRegReg + /constructQuotedResolve :jnzLbl8 + + /rax :pushqReg + |ey* /rax :movqImmReg + /rax :callqReg + /done :jmpLbl8 + + @inactive + currentQuoted /rax :movqImmReg + /rax /rax :movqMemReg + /rax /rax :testqRegReg + /constructQuotedResolve :jnzLbl8 + + @done + 8 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + + @constructQuotedResolve + # construct non-capturing function + :quoteEncodingBuffer /rdi :movqImmReg + unscopingFunctionHeader loadToRdi - # rax == function object on heap + # push identifier + [ /rax :movqImmOOBReg ] _ len 2 eq assert + 2 dearray 256 mul add + /rdi :movwImmMem + /r15 /rsi :movqMemReg + /rsi 2 /rdi :movqRegMemDisp8 + 10 /rdi :addqImm8Reg + + [ /rax :pushqReg - /done :jmpLbl32 - ] :labelResolve - > -- /internalExecuteIdentifier defv + internalExecuteIdentifierUnquoted /rax :movqImmReg + /rax :callqReg + ] functionFooter cat loadToRdi + + allocateCodeFromEncodingBuffer + # rax == code block on heap + + # create non-capturing function object + /rax /rdi :movqRegReg + /rsi /rsi :xorqRegReg + /rdx /rdx :xorqRegReg + internalAllocateFunction /rax :movqImmReg + /rax :callqReg + + # rax == function object on heap + /rax :pushqReg + /done :jmpLbl32 + ] :labelResolve /internalExecuteIdentifier defv > { defv }' allocateOffsetStruct < |
