aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-19 17:02:36 +0100
committerDrahflow <drahflow@gmx.de>2013-01-19 17:02:36 +0100
commitf7fd82182c1cd596278a4881970a7d4ef31dce65 (patch)
tree6bc33376fce21b863555e77451b342c6fbe77521
parentf630deeb77bbfab3d262a172696621ff840dc621 (diff)
User-defined functions now create scopes
-rw-r--r--compiler/elymasAsm.ey67
-rw-r--r--compiler/elymasAsmLib.ey488
-rw-r--r--compiler/elymasGlobal.ey56
l---------examples/working-compiler/bor.test1
l---------examples/working-compiler/elymas.ey1
l---------examples/working-compiler/elymasAsm.ey1
l---------examples/working-compiler/elymasAsmLib.ey1
l---------examples/working-compiler/elymasGlobal.ey1
l---------examples/working-compiler/exec.test1
l---------examples/working-compiler/int.test1
l---------examples/working-compiler/len.test1
l---------examples/working-compiler/loop.test1
l---------examples/working-compiler/scoping.test1
l---------examples/working-compiler/stackops.test1
l---------examples/working-compiler/standard.ey1
l---------examples/working-compiler/string.test1
-rw-r--r--examples/working/len.ey2
-rw-r--r--examples/working/scoping.ey1
18 files changed, 412 insertions, 215 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey
index f3a655e..e44eb85 100644
--- a/compiler/elymasAsm.ey
+++ b/compiler/elymasAsm.ey
@@ -96,8 +96,8 @@
} /sib deff
{ _ 0 ge assert 8 { _ 256 mod -01 256 div } rep -- } /imm64 deff
- { _ 0 ge assert 4 { _ 256 mod -01 256 div } rep -- } /imm32 deff
- { _ 0 ge assert 2 { _ 256 mod -01 256 div } rep -- } /imm16 deff
+ { _ 0 lt { 4294967296 add } rep 4294967295 band 4 { _ 256 mod -01 256 div } rep -- } /imm32 deff
+ { _ 0 lt { 65536 add } rep 65535 band 2 { _ 256 mod -01 256 div } rep -- } /imm16 deff
{ _ 0 lt { 256 add } rep 255 band } /imm8 deff
# label handling
@@ -118,6 +118,26 @@
[ -011 len dearray %00
} /labelRel8 deff
+ { ==l
+ ] _ len ==offset
+ labelHoles [ {
+ labels l . offset 2 add sub
+ _ 32768 lt assert
+ _ 32768 neg ge assert
+ imm16 offset [ 0 1 ] add 2 dearray -204314 =[] =[] } ] cat =labelHoles
+ [ -011 len dearray %00 %00
+ } /labelRel16 deff
+
+ { ==l
+ ] _ len ==offset
+ labelHoles [ {
+ labels l . offset 4 add sub
+ _ 2147483648 lt assert
+ _ 2147483648 neg ge assert
+ imm32 offset [ 0 1 2 3 ] add 4 dearray -408518628738 =[] =[] =[] =[] } ] cat =labelHoles
+ [ -011 len dearray %00 %00 %00 %00
+ } /labelRel32 deff
+
{ ==opcodes
labelHoles { opcodes -01 * } each
@@ -144,7 +164,7 @@
_ 128 lt assert
} name "Lbl8" cat
> -- 2 |deff rep
- }' /defJmp deff
+ }' /defJmpRel8 deff
# instructions
{ ==reg ==mem
@@ -216,6 +236,11 @@
src dst modrm11
} /andqRegReg deff
+ { ==lbl
+ %E8
+ lbl labelRel32
+ } /callLbl32 deff
+
{ ==reg
reg bit64assert
@@ -364,18 +389,22 @@
/zero reg modrm11
} /incqReg deff
- %E2 /loop defJmp
+ %E2 /loop defJmpRel8
- %EB /jmp defJmp
+ %EB /jmp defJmpRel8
+ { ==lbl
+ %E9
+ lbl labelRel32
+ } /jmpLbl32 deff
- %72 /jb defJmp
- %76 /jbe defJmp
- %74 /je defJmp
- %7E /jle defJmp
- %73 /jnb defJmp
- %75 /jne defJmp
- %75 /jnz defJmp
- %74 /jz defJmp
+ %72 /jb defJmpRel8
+ %76 /jbe defJmpRel8
+ %74 /je defJmpRel8
+ %7E /jle defJmpRel8
+ %73 /jnb defJmpRel8
+ %75 /jne defJmpRel8
+ %75 /jnz defJmpRel8
+ %74 /jz defJmpRel8
{ ==reg ==mem ==disp
reg bit64assert
@@ -442,6 +471,18 @@
i imm32
} /movlImmMem deff
+ { ==mem ==disp ==i
+ mem bit64assert
+ disp 128 lt assert
+ i 65536 65536 mul lt assert
+
+ mem regno %07 gt { 0 /none /none mem rex } rep
+ %C7
+ /zero mem modrm01
+ disp imm8
+ i imm32
+ } /movlImmMemDisp8 deff
+
{ ==reg ==mem
reg bit32assert
mem bit64assert
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index f823c45..ff0d34b 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -38,6 +38,21 @@
[ %00 %00 %00 %00 %00 %00 %00 %00 ] ==currentQuoted
> { defv }' allocateOffsetStruct
+ { _ =*array len _ 4 div ==largeMoves
+ 4 mod ==smallMoves
+ 0 ==i
+ largeMoves {
+ i _ 4 add =i
+ _ [ 3 2 1 0 ] add array { -01 256 mul add } fold -01 /rdi :movlImmMemDisp8
+ } rep
+ i /rdi :addqImm8Reg
+ smallMoves {
+ i _ 1 add =i
+ array /rdi :movbImmMem
+ /rdi :incqReg
+ } rep
+ } /loadToRdi deff
+
# internal functions, ABI follows SysV standards
# compare two strings
@@ -269,6 +284,31 @@
] /internalAllocateArray defv
> { defv }' allocateOffsetStruct
+ # FIXME: open a new function scope
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+ 8 /r15 :subqImm8Reg
+ currentScope /rbx :movqImmReg
+ /rbx /rsi :movqMemReg
+ /rsi /r15 :movqRegMem
+ ] _ /unscopingFunctionHeader defv [
+ 8 /rdi :movqImmReg
+ internalAllocateScope /rax :movqImmReg
+ /rax :callqReg
+ /rax /rbx :movqRegMem
+ ] cat /scopingFunctionHeader defv
+
+ [
+ /r15 /rcx :movqMemReg
+ currentScope /rax :movqImmReg
+ /rcx /rax :movqRegMem
+ 8 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ] /functionFooter defv
+
# elymas functions, stack based ABI
1 ==ARRAYMARKER
@@ -458,15 +498,18 @@
/rdx :popqReg
+ # save current scope
+ currentScope /rax :movqImmReg
+ /rax /rsi :movqMemReg
+ 8 /r15 :subqImm8Reg
+ /rsi /r15 :movqRegMem
+
# enter scope
8 /rdx /rcx :movqMemDisp8Reg
/rcx /rcx :testqRegReg
- /scoped :jnzLbl8
- currentScope /rax :movqImmReg
- /rax /rcx :movqMemReg
- @scoped
- 8 /r15 :subqImm8Reg
- /rcx /r15 :movqRegMem
+ /unscoped :jzLbl8
+ /rcx /rax :movqRegMem
+ @unscoped
# handle typed function
16 /rdx /rcx :movqMemDisp8Reg
@@ -545,9 +588,195 @@
8 /r15 :addqImm8Reg
:retn
] :labelResolve /ey] defv
+
+ # length of array or string
+ # 0 -> array / string
+ # 0 <- number of elements / characters
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ /rax :popqReg
+ 7 /rax /cl :movbMemDisp8Reg
+ %F0 /cl :andbImmReg
+ %10 /cl :cmpbImmReg
+ /stringLen :jeLbl8
+ %70 /cl :cmpbImmReg
+ /arrayLen :jeLbl8
+
+ # TODO "neither string nor array in len"
+ :ud2
+
+ @arrayLen
+ /rax /rcx :movqMemReg
+ 8 /rcx :shlqImm8Reg # clear type bits
+ 11 /rcx :shrqImm8Reg # divide by 8
+ /rcx :decqReg # substract header size
+ /done :jmpLbl8
+
+ @stringLen
+ 16 /rax /rcx :movqMemDisp8Reg
+
+ @done
+ /rcx :pushqReg
+
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ] :labelResolve /eylen defv
> _ ==globalFunctions { defv }' allocateOffsetStruct
<
+ <
+ # resolve identifier according to current scope and quote mode and 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
+
+ /rax /rax :testqRegReg
+ /unresolved :jzLbl8
+ /rax :pushqReg
+
+ 0 /rdx :cmpqImm8Reg
+ /inactive :jzLbl8
+ 1 /rdx :cmpqImm8Reg
+ /active :jzLbl8
+ 2 /rdx :cmpqImm8Reg
+ /quoteActive :jzLbl8
+
+ # TODO: "invalid activation mode"
+ :ud2
+
+ @unresolved
+ currentQuoted /rax :movqImmReg
+ /rax /rax :movqMemReg
+ /rax /rax :testqRegReg
+ /constructQuotedResolve :jnzLbl8
+
+ # TODO: "unresolved name while unquoted"
+ :ud2
+
+ @quoteActive
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ /done :jmpLbl8
+
+ @active
+ currentQuoted /rax :movqImmReg
+ /rax /rax :movqMemReg
+ /rax /rax :testqRegReg
+ /activeQuoted :jnzLbl8
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ /done :jmpLbl8
+
+ @activeQuoted
+ # FIXME: actually, this should re-resolve as if unresolved
+ /done :jmpLbl8
+
+ @inactive
+ currentQuoted /rax :movqImmReg
+ /rax /rax :movqMemReg
+ /rax /rax :testqRegReg
+ /constructQuotedResolve :jnzLbl8
+
+ @done
+ 16 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+
+ @constructQuotedResolve
+ # construct non-capturing function which
+ :quoteEncodingBuffer /rdi :movqImmReg
+ unscopingFunctionHeader loadToRdi
+
+ # 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
+
+ [
+ /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
+
+ :quoteEncodingBuffer /rax :movqImmReg
+ /rax /rdi :subqRegReg
+ /rdi :pushqReg # store opcode byte count
+
+ /rdi :decqReg
+ 3 /rdi :shrqImm8Reg
+ /rdi :incqReg
+ 3 /rdi :shlqImm8Reg
+ internalAllocateCode /rax :movqImmReg
+ /rax :callqReg
+
+ # rax == code block on heap
+
+ # copy opcodes
+ :quoteEncodingBuffer /rsi :movqImmReg
+ 8 /rax /rdi :leaqMemDisp8Reg
+ /rcx :popqReg
+ :reprcx :movsb
+
+ # create 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
+
+ <
# drop top stack element
[
/rax :popqReg
@@ -722,164 +951,128 @@
:retn
] /ey{ defv
- <
- # FIXME: open a new function scope
- [
- 8 /r15 :subqImm8Reg
- /r15 :popqMem
- 8 /r15 :subqImm8Reg
- currentScope /rax :movqImmReg
- /rax /rax :movqMemReg
- /rax /r15 :movqRegMem
- ] /functionHeader defv
-
- [
- /r15 /rcx :movqMemReg
- currentScope /rax :movqImmReg
- /rcx /rax :movqRegMem
- 8 /r15 :addqImm8Reg
- /r15 :pushqMem
- 8 /r15 :addqImm8Reg
- :retn
- ] /functionFooter defv
-
- { _ =*array len _ 4 div ==largeMoves
- 4 mod ==smallMoves
- 0 ==i
- largeMoves {
- i _ 4 add =i
- [ 3 2 1 0 ] add array { -01 256 mul add } fold /rdi :movlImmMem
- 4 /rdi :addqImm8Reg
- } rep
- smallMoves {
- i _ 1 add =i
- array /rdi :movbImmMem
- /rdi :incqReg
- } rep
- } /loadToRdi deff
-
- # quote construction, create function from begin marker onwards
- [
- 8 /r15 :subqImm8Reg
- /r15 :popqMem
-
- currentQuoted /rcx :movqImmReg
- /rcx :decqMem
-
- QUOTEMARKER /rcx :movqImmReg
- /rcx :pushqReg
- /rsp /rdx :movqRegReg
- @backwardsSearch
- 8 /rdx :addqImm8Reg
- /rdx /rcx :cmpqMemReg
- /backwardsSearch :jneLbl8
-
- /rdx :pushqReg # store address of begin marker
-
- :quoteEncodingBuffer /rdi :movqImmReg
+ # quote construction, create function from begin marker onwards
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
- functionHeader loadToRdi
+ currentQuoted /rcx :movqImmReg
+ /rcx :decqMem
- @search
- 8 /rdx :subqImm8Reg
- /rdx /rcx :cmpqMemReg
- /markerFound :jeLbl8
+ QUOTEMARKER /rcx :movqImmReg
+ /rcx :pushqReg
+ /rsp /rdx :movqRegReg
+ @backwardsSearch
+ 8 /rdx :addqImm8Reg
+ /rdx /rcx :cmpqMemReg
+ /backwardsSearch :jneLbl8
- /rdx /rsi :movqMemReg
- 7 /rsi /al :movbMemDisp8Reg
- %F0 /al :andbImmReg
- /immediateFound :jzLbl8
- %50 /al :cmpbImmReg
- /functionFound :jzLbl8
- %70 /al :cmpbImmReg
- /arrayFound :jzLbl8
-
- # TODO: "invalid object during quote construction"
- :ud2
+ /rdx :pushqReg # store address of begin marker
- @immediateFound
- [ /rax :movqImmOOBReg ] _ len 2 eq assert
- 2 dearray 256 mul add
- /rdi :movwImmMem
- /rsi 2 /rdi :movqRegMemDisp8
- [ /rax :pushqReg ] _ len 1 eq assert
- 1 dearray
- 10 /rdi :movbImmMemDisp8
- 11 /rdi :addqImm8Reg
- /search :jmpLbl8
+ :quoteEncodingBuffer /rdi :movqImmReg
+ scopingFunctionHeader loadToRdi
- @functionFound
- [ /rax :movqImmOOBReg ] _ len 2 eq assert
- 2 dearray 256 mul add
- /rdi :movwImmMem
- /rsi 2 /rdi :movqRegMemDisp8
- [ /rax :pushqReg ] _ len 1 eq assert
- 1 dearray
- 10 /rdi :movbImmMemDisp8
- 11 /rdi :addqImm8Reg
- [
- |ey* /rax :movqImmReg
- /rax :callqReg
- ] loadToRdi
- /search :jmpLbl8
+ @search
+ 8 /rdx :subqImm8Reg
+ /rdx /rcx :cmpqMemReg
+ /markerFound :jeLbl8
+
+ /rdx /rsi :movqMemReg
+ 7 /rsi /al :movbMemDisp8Reg
+ %F0 /al :andbImmReg
+ /immediateFound :jzLbl8
+ %10 /al :cmpbImmReg
+ /immediateFound :jzLbl8
+ %50 /al :cmpbImmReg
+ /functionFound :jzLbl8
+ %70 /al :cmpbImmReg
+ /arrayFound :jzLbl8
+
+ # TODO: "invalid object during quote construction"
+ :ud2
+
+ @immediateFound
+ [ /rax :movqImmOOBReg ] _ len 2 eq assert
+ 2 dearray 256 mul add
+ /rdi :movwImmMem
+ /rsi 2 /rdi :movqRegMemDisp8
+ [ /rax :pushqReg ] _ len 1 eq assert
+ 1 dearray
+ 10 /rdi :movbImmMemDisp8
+ 11 /rdi :addqImm8Reg
+ /search :jmpLbl8
+
+ @functionFound
+ [ /rax :movqImmOOBReg ] _ len 2 eq assert
+ 2 dearray 256 mul add
+ /rdi :movwImmMem
+ /rsi 2 /rdi :movqRegMemDisp8
+ [ /rax :pushqReg ] _ len 1 eq assert
+ 1 dearray
+ 10 /rdi :movbImmMemDisp8
+ 11 /rdi :addqImm8Reg
+ [
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ ] loadToRdi
+ /search :jmpLbl8
- @arrayFound
- # FIXME allow macros to put byte arrays into quoted contexts and thereby generate assembly
- :ud2
- /search :jmpLbl8
+ @arrayFound
+ # FIXME allow macros to put byte arrays into quoted contexts and thereby generate assembly
+ :ud2
+ /search :jmpLbl8
- @markerFound
+ @markerFound
- functionFooter loadToRdi
+ functionFooter loadToRdi
- :quoteEncodingBuffer /rax :movqImmReg
- /rax /rdi :subqRegReg
- /rdi :pushqReg # store opcode byte count
+ :quoteEncodingBuffer /rax :movqImmReg
+ /rax /rdi :subqRegReg
+ /rdi :pushqReg # store opcode byte count
- /rdi :decqReg
- 3 /rdi :shrqImm8Reg
- /rdi :incqReg
- 3 /rdi :shlqImm8Reg
- internalAllocateCode /rax :movqImmReg
- /rax :callqReg
+ /rdi :decqReg
+ 3 /rdi :shrqImm8Reg
+ /rdi :incqReg
+ 3 /rdi :shlqImm8Reg
+ internalAllocateCode /rax :movqImmReg
+ /rax :callqReg
- # rax == code block on heap
+ # rax == code block on heap
- # copy opcodes
- :quoteEncodingBuffer /rsi :movqImmReg
- 8 /rax /rdi :leaqMemDisp8Reg
- /rcx :popqReg
- :reprcx :movsb
+ # copy opcodes
+ :quoteEncodingBuffer /rsi :movqImmReg
+ 8 /rax /rdi :leaqMemDisp8Reg
+ /rcx :popqReg
+ :reprcx :movsb
- # create function object
- /rax /rdi :movqRegReg
- currentScope /rax :movqImmReg
- /rax /rsi :movqMemReg
- /rdx /rdx :xorqRegReg
- internalAllocateFunction /rax :movqImmReg
- /rax :callqReg
+ currentQuoted /rcx :movqImmReg
+ /rcx /rcx :movqMemReg
+ /rcx /rcx :testqRegReg
+ /quoted :jnzLbl8
- # rax == function object on heap
+ # create function object
+ /rax /rdi :movqRegReg
+ currentScope /rax :movqImmReg
+ /rax /rsi :movqMemReg
+ /rdx /rdx :xorqRegReg
+ internalAllocateFunction /rax :movqImmReg
+ /rax :callqReg
- # store function instead of begin marker
- /rdx :popqReg
- /rax /rdx :movqRegMem
- /rdx /rsp :movqRegReg # and drop quoted stuff from stack
+ # rax == function object on heap
- currentQuoted /rcx :movqImmReg
- /rcx /rcx :movqMemReg
- /rcx /rcx :testqRegReg
- /unquoted :jzLbl8
+ # store function instead of begin marker
+ /rdx :popqReg
+ /rax /rdx :movqRegMem
+ /rdx /rsp :movqRegReg # and drop quoted stuff from stack
- :ud2
- # FIXME: quote once more
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
- @unquoted
- /r15 :pushqMem
- 8 /r15 :addqImm8Reg
- :retn
- ] :labelResolve
- > -- /ey} defv
+ @quoted
+ # FIXME: quote once more
+ :ud2
+ ] :labelResolve /ey} defv
> _ ==globalMacros { defv }' allocateOffsetStruct
{ strToUTF8Bytes _ =*v len _ ==exactLength
@@ -931,8 +1124,7 @@
{ ==name
# create function
name | 8 sub /rdi :movqImmReg
- currentScope /rsi :movqImmReg
- /rsi /rsi :movqMemReg
+ /rsi /rsi :xorqRegReg # library functions don't have a captured scope
# TODO: put a type here where applicable
/rdx /rdx :xorqRegReg
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index 64f943a..3a42376 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -40,61 +40,9 @@
{ .value ::constStringCode
[
- # scope resolution
- ::currentScope /rdi :movqImmReg
- /rdi /rdi :movqMemReg
- /rsi :popqReg
- ::internalResolve /rax :movqImmReg
+ ::internalExecuteIdentifier /rax :movqImmReg
/rax :callqReg
-
- /rax /rax :testqRegReg
- /unresolved :jzLbl8
- /rax :pushqReg
-
- 0 /rdx :cmpqImm8Reg
- /inactive :jzLbl8
- 1 /rdx :cmpqImm8Reg
- /active :jzLbl8
- 2 /rdx :cmpqImm8Reg
- /quoteActive :jzLbl8
- :ud2
-
- @unresolved
- :ud2
-
- @quoteActive
- ::ey* /rax :movqImmReg
- /rax :callqReg
- /done :jmpLbl8
-
- @active
- ::currentQuoted /rax :movqImmReg
- /rax /rax :movqMemReg
- /rax /rax :testqRegReg
- /activeQuoted :jnzLbl8
- ::ey* /rax :movqImmReg
- /rax :callqReg
- /done :jmpLbl8
-
- @activeQuoted
- # FIXME: actually, this should re-resolve as if unresolved
- /done :jmpLbl8
-
- @inactive
- ::currentQuoted /rax :movqImmReg
- /rax /rax :movqMemReg
- /rax /rax :testqRegReg
- /inactiveQuoted :jnzLbl8
- /done :jmpLbl8
-
- @inactiveQuoted
- :ud2
-
-# ::ey* /rax :movqImmReg
-# /rax :callqReg
-
- @done
- ] :labelResolve cat :execute
+ ] cat :execute
} /TOKID
> -- 3 |defv rep
diff --git a/examples/working-compiler/bor.test b/examples/working-compiler/bor.test
new file mode 120000
index 0000000..cf9e7c1
--- /dev/null
+++ b/examples/working-compiler/bor.test
@@ -0,0 +1 @@
+../working/bor.ey \ No newline at end of file
diff --git a/examples/working-compiler/elymas.ey b/examples/working-compiler/elymas.ey
new file mode 120000
index 0000000..b512696
--- /dev/null
+++ b/examples/working-compiler/elymas.ey
@@ -0,0 +1 @@
+../../compiler/elymas.ey \ No newline at end of file
diff --git a/examples/working-compiler/elymasAsm.ey b/examples/working-compiler/elymasAsm.ey
new file mode 120000
index 0000000..7974413
--- /dev/null
+++ b/examples/working-compiler/elymasAsm.ey
@@ -0,0 +1 @@
+../../compiler/elymasAsm.ey \ No newline at end of file
diff --git a/examples/working-compiler/elymasAsmLib.ey b/examples/working-compiler/elymasAsmLib.ey
new file mode 120000
index 0000000..592d6e8
--- /dev/null
+++ b/examples/working-compiler/elymasAsmLib.ey
@@ -0,0 +1 @@
+../../compiler/elymasAsmLib.ey \ No newline at end of file
diff --git a/examples/working-compiler/elymasGlobal.ey b/examples/working-compiler/elymasGlobal.ey
new file mode 120000
index 0000000..5aa3f7b
--- /dev/null
+++ b/examples/working-compiler/elymasGlobal.ey
@@ -0,0 +1 @@
+../../compiler/elymasGlobal.ey \ No newline at end of file
diff --git a/examples/working-compiler/exec.test b/examples/working-compiler/exec.test
new file mode 120000
index 0000000..c4a9b19
--- /dev/null
+++ b/examples/working-compiler/exec.test
@@ -0,0 +1 @@
+../working/exec.ey \ No newline at end of file
diff --git a/examples/working-compiler/int.test b/examples/working-compiler/int.test
new file mode 120000
index 0000000..8df4a31
--- /dev/null
+++ b/examples/working-compiler/int.test
@@ -0,0 +1 @@
+../working/int.ey \ No newline at end of file
diff --git a/examples/working-compiler/len.test b/examples/working-compiler/len.test
new file mode 120000
index 0000000..8dde47d
--- /dev/null
+++ b/examples/working-compiler/len.test
@@ -0,0 +1 @@
+../working/len.ey \ No newline at end of file
diff --git a/examples/working-compiler/loop.test b/examples/working-compiler/loop.test
new file mode 120000
index 0000000..7839f4f
--- /dev/null
+++ b/examples/working-compiler/loop.test
@@ -0,0 +1 @@
+../working/loop.ey \ No newline at end of file
diff --git a/examples/working-compiler/scoping.test b/examples/working-compiler/scoping.test
new file mode 120000
index 0000000..7d79243
--- /dev/null
+++ b/examples/working-compiler/scoping.test
@@ -0,0 +1 @@
+../working/scoping.ey \ No newline at end of file
diff --git a/examples/working-compiler/stackops.test b/examples/working-compiler/stackops.test
new file mode 120000
index 0000000..1b1f227
--- /dev/null
+++ b/examples/working-compiler/stackops.test
@@ -0,0 +1 @@
+../working/stackops.ey \ No newline at end of file
diff --git a/examples/working-compiler/standard.ey b/examples/working-compiler/standard.ey
new file mode 120000
index 0000000..e7b7e7b
--- /dev/null
+++ b/examples/working-compiler/standard.ey
@@ -0,0 +1 @@
+../../compiler/standard.ey \ No newline at end of file
diff --git a/examples/working-compiler/string.test b/examples/working-compiler/string.test
new file mode 120000
index 0000000..bf7bb28
--- /dev/null
+++ b/examples/working-compiler/string.test
@@ -0,0 +1 @@
+../working/string.ey \ No newline at end of file
diff --git a/examples/working/len.ey b/examples/working/len.ey
new file mode 100644
index 0000000..616ab8f
--- /dev/null
+++ b/examples/working/len.ey
@@ -0,0 +1,2 @@
+"abcdef" len dump
+[ 1 2 3 4 ] len dump
diff --git a/examples/working/scoping.ey b/examples/working/scoping.ey
new file mode 100644
index 0000000..102f824
--- /dev/null
+++ b/examples/working/scoping.ey
@@ -0,0 +1 @@
+42 { /i defv i } * dump