diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-22 09:33:25 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-22 09:33:25 +0100 |
| commit | 7bc7f34f29a7b54c3d0f1ebffa885a860f36ac72 (patch) | |
| tree | 6c49e0120df820abc7a5e9879a94434d05fdaa87 | |
| parent | 16f98f47ba4f9f5012c9f6cf8e71cdf8035d0c3a (diff) | |
Scope capture now works
| -rw-r--r-- | compiler/elymasAsm.ey | 30 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 68 | ||||
| -rw-r--r-- | examples/working/scoping.ey | 1 |
3 files changed, 90 insertions, 9 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index 2dcc485..80e7066 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -176,6 +176,16 @@ reg mem modrm00 } /addlMemReg deff + { ==mem ==i + mem bit64assert + i 256 lt assert + + 1 /none /none mem rex + %83 + /zero mem modrm00 + i imm8 + } /addqImm8Mem deff + { ==mem ==disp ==i mem bit64assert i 256 lt assert @@ -339,6 +349,17 @@ reg mem modrm00 } /cmpqMemReg deff + { ==reg ==mem ==disp + reg bit64assert + mem bit64assert + disp 128 lt assert + + 1 reg /none mem rex + %3B + reg mem modrm01 + disp imm8 + } /cmpqMemDisp8Reg deff + { ==mem ==reg reg bit64assert mem bit64assert @@ -645,6 +666,15 @@ /zero mem modrm00 } /popqMem deff + { ==mem ==disp + mem regno %07 gt { 1 /none /none mem rex } rep + disp 128 lt assert + + %8F + /zero mem modrm01 + disp imm8 + } /popqMemDisp8 deff + { ==mem ==idx ==scale mem regno %07 gt idx regno %07 gt or { 1 /none idx mem rex } rep %8F diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index bcf874c..e2635b0 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -158,6 +158,8 @@ # 1 if element is active # 2 if element is quote-active [ + @retryWithParent + 8 /rdi /rcx :movqMemDisp8Reg # load name table /rcx /rdx :movqRegReg 16 /rdx :addqImm8Reg # rdx will iterate over entries @@ -186,7 +188,11 @@ @end # not found at all, retry with parent - # FIXME: Actually try with parent + 16 /rdi /rdi :movqMemDisp8Reg + /rdi /rdi :testqRegReg + /retryWithParent :jnzLbl8 + + @failed /rax /rax :xorqRegReg /rdx /rdx :xorqRegReg :retn @@ -228,6 +234,7 @@ # rsi -> parent scope # rax <- address of scope on the heap [ + /rsi :pushqReg /rdi :pushqReg # allocate name table @@ -252,12 +259,9 @@ # set type and existence of all pointers %26 7 /rax :orbImmMemDisp8 - # reference name table - /rcx :popqReg - /rcx 8 /rax :movqRegMemDisp8 - # zero parent and extension - /rdi /rdi :xorqRegReg - /rdi 16 /rax :movqRegMemDisp8 + 8 /rax :popqMemDisp8 # reference name table + 16 /rax :popqMemDisp8 # set parent + /rdi /rdi :xorqRegReg # zero extension /rdi 24 /rax :movqRegMemDisp8 :retn @@ -839,7 +843,6 @@ /rax /rax :testqRegReg /constructQuotedResolve :jnzLbl8 - # TODO: "unresolved name while unquoted" errUnresolvedName /rdi :movqImmReg internalDumpErrorString /rax :movqImmReg /rax :callqReg @@ -919,7 +922,7 @@ allocateCodeFromEncodingBuffer # rax == code block on heap - # create function object + # create non-capturing function object /rax /rdi :movqRegReg /rsi /rsi :xorqRegReg /rdx /rdx :xorqRegReg @@ -1095,6 +1098,52 @@ 8 /r15 :addqImm8Reg :retn ] :labelResolve /eyloop defv + + # a foreach loop + # 0 -> code to execute + # 1 -> array to loop over + # for each element in array, push it onto stack then execute the code + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + 8 /r15 :subqImm8Reg + /r15 :popqMem + + 16 /r15 :subqImm8Reg + + /rax :popqReg + 8 /rax /rcx :leaqMemDisp8Reg + /rcx /r15 :movqRegMem + + /rax /edx :movlMemReg + /rdx /rcx :addqRegReg + /rcx 8 /r15 :movqRegMemDisp8 + + # /r15 -> current array element + # 8 /r15 -> address after last array element + # 16 /r15 -> code to execute + + @loop + /r15 /rax :movqMemReg + 8 /r15 /rax :cmpqMemDisp8Reg + /end :jnbLbl8 + + /rax :pushqMem # push array element + 16 /r15 :pushqMemDisp8 # push code + |ey* /rax :movqImmReg + /rax :callqReg + + 8 /r15 :addqImm8Mem + /loop :jmpLbl8 + + @end + + 24 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] :labelResolve /eyeach defv > _ ==globalFunctions2 { defv }' allocateOffsetStruct < @@ -1291,6 +1340,7 @@ [ globalFunctions keys len globalFunctions2 keys len globalMacros keys len add add /rdi :movqImmReg + /rsi /rsi :xorqRegReg internalAllocateScope /rax :movqImmReg /rax :callqReg diff --git a/examples/working/scoping.ey b/examples/working/scoping.ey index 102f824..732dcb1 100644 --- a/examples/working/scoping.ey +++ b/examples/working/scoping.ey @@ -1 +1,2 @@ 42 { /i defv i } * dump +42 { /i defv { i } } * * dump |
