diff options
| -rw-r--r-- | compiler/elymasAsm.ey | 13 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 11 | ||||
| -rw-r--r-- | compiler/elymasGlobal.ey | 522 | ||||
| -rw-r--r-- | compiler/standard.ey | 34 | ||||
| -rw-r--r-- | interpreter/ElymasGlobal.pm | 12 | ||||
| -rw-r--r-- | notes | 7 |
6 files changed, 402 insertions, 197 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index f6743b2..6b75cb8 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -354,6 +354,11 @@ /and %21 defAsmAddq /and /four defAsmAddImm + { ==off + %E8 + off imm32 + } /callqRel32 deff + { ==lbl %E8 lbl labelRel32 @@ -572,6 +577,14 @@ /js _ %78 defJmpRel8 %88 defJmpRel32 /jz _ %74 defJmpRel8 %84 defJmpRel32 + { ==reg + reg bit64assert + + reg regno %07 gt { 1 /none /none reg rex } rep + %FF + /four reg modrm11 + } /jmpqReg deff + { ==reg ==mem ==idx ==scale ==disp reg bit32assert mem bit64assert diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index b1783ff..a002430 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -758,9 +758,14 @@ # rdi -> address of scope on the heap # rsi -> address of element name on the heap # rax <- address of element on the heap (0 if nonexistant) - # rdx <- 0 if element is passive - # 1 if element is active - # 2 if element is quote-active + # rdx <- %xy + # y 0 eq if element is passive + # y 1 eq if element is active + # y 2 eq if element is quote-active + # x 1 band if element is static + # x 2 band if element is type constant + # x 4 band if element is constant + # x 8 band if element is deep constant # rcx <- address of entry (i.e. where rax was loaded from) [[ @retryWithParent diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index fb731a2..633d6ab 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -103,184 +103,187 @@ :retn ] /ey? defv - { ==activation - # create a new entry in the current scope for the given name - # mark that entry's default action according to activation - # 0 -> name, string - # 1 -> object - [[ - 8 /r15 :subqImm8Reg - /r15 :popqMem + # create a new entry in the current scope for the given name + # mark that entry's default action according to activation + # 0 -> activation + # 1 -> name, string + # 2 -> object + [[ + 8 /r15 :subqImm8Reg + /r15 :popqMem - /rdi :popqReg - - /rax :popqReg # CHECK this is just sanity checking - /rax :pushqReg - /rax /rax :testqRegReg - /realObject :jnzLbl8 - "trying to store zero object address" ::outputError - :ud2 - @realObject # CHECK end of checking + 8 /r15 :subqImm8Reg + /r15 :popqMem # /r15 now points to activation - # search for name in nametable - ::currentScope /rax :movqImmReg - /rax /rbx :movqMemReg # rbx == start of scope in heap - 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap - 8 /rbx /rsi :movqMemDisp8Reg # rsi == start of nametable in heap - 8 /rsi /rsi :addqMemDisp8Reg # rsi == end of nametable in heap (according to fill) + /rdi :popqReg + + /rax :popqReg # CHECK this is just sanity checking + /rax :pushqReg + /rax /rax :testqRegReg + /realObject :jnzLbl8 + "trying to store zero object address" ::outputError + :ud2 + @realObject # CHECK end of checking - @nameSearch - 16 /rdx :addqImm8Reg + # search for name in nametable + ::currentScope /rax :movqImmReg + /rax /rbx :movqMemReg # rbx == start of scope in heap + 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap + 8 /rbx /rsi :movqMemDisp8Reg # rsi == start of nametable in heap + 8 /rsi /rsi :addqMemDisp8Reg # rsi == end of nametable in heap (according to fill) - # rsi: end of nametable - # rdx: current element of nametable + @nameSearch + 16 /rdx :addqImm8Reg - /rdx /rsi :cmpqRegReg - /nameUndefined :jbeLbl8 + # rsi: end of nametable + # rdx: current element of nametable - /rdx :pushqReg - /rsi :pushqReg - /rdi :pushqReg - /rcx :pushqReg - /rdx /rsi :movqMemReg - ::internalStringEqualsCode _ len dearray - /rcx :popqReg - /rdi :popqReg - /rsi :popqReg - /rdx :popqReg - /rax /rax :testqRegReg - /nameOffsetKnown :jnzLbl8 - - # if not exists, insert - @nameUndefined - 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap - /rdx /eax :movlMemReg # add memory length to obtain memory end - /rax /rdx :addqRegReg - - /rsi /rdx :cmpqRegReg - /enlargeNameTable :jbeLbl8 - - # insert into name table - @insertIntoNameTable - /rdi /rsi :movqRegMem - activation 8 /rsi :movqImm32MemDisp8 # set default activation mode - 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap - 16 8 /rdx :addqImm8MemDisp8 # increment fill - /rsi /rdx :movqRegReg - /nameOffsetKnown :jmpLbl8 - - @enlargeNameTable - # if name table is already full, double size - 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap - /rdi :pushqReg - /rdx :pushqReg - /rdx /edi :movlMemReg # load current length - /rdi /rdi :addqRegReg + /rdx /rsi :cmpqRegReg + /nameUndefined :jbeLbl8 - ::internalAllocate /rax :movqImmReg - /rax :callqReg - %30 7 /rax :orbImmMemDisp8 # set type - /rdx :popqReg - 8 /rdx /rcx :movqMemDisp8Reg - /rcx 8 /rax :movqRegMemDisp8 # copy fill + /rdx :pushqReg + /rsi :pushqReg + /rdi :pushqReg + /rcx :pushqReg + /rdx /rsi :movqMemReg + ::internalStringEqualsCode _ len dearray + /rcx :popqReg + /rdi :popqReg + /rsi :popqReg + /rdx :popqReg + /rax /rax :testqRegReg + /nameOffsetKnown :jnzLbl8 - 16 /rdx /rsi :leaqMemDisp8Reg - 16 /rax /rdi :leaqMemDisp8Reg - 16 /rcx :subqImm8Reg - 3 /rcx :shrqImm8Reg - :reprcx :movsq # copy content + # if not exists, insert + @nameUndefined + 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap + /rdx /eax :movlMemReg # add memory length to obtain memory end + /rax /rdx :addqRegReg - # rax == enlarged name table on heap - - /rax 8 /rbx :movqRegMemDisp8 # switch scope to new name table + /rsi /rdx :cmpqRegReg + /enlargeNameTable :jbeLbl8 - # insert into name table - /rsi :popqReg - /rsi /rdi :xchgqRegReg - /insertIntoNameTable :jmpLbl8 - - @nameOffsetKnown - 8 /rbx /rdx :subqMemDisp8Reg # substract name table address - 16 /rdx :subqImm8Reg # substract name table header size - /rdx :shrq1Reg # divide by 2 to get offset within scope - - # rdx == offset in scope - # top of stack: the object to store - - # update - # if fits within main area, fine - 32 /rdx :addqImm8Reg # add scope header size - /edx /rbx :cmplRegMem - /inDataArea :jaLbl8 - - # update within extension area - /rbx /edx :sublMemReg # substract scope length - 24 /rbx /rdi :movqMemDisp8Reg # load extension area pointer - 8 /rdx :addqImm8Reg # add extension area header length - - # if extension area is non-existent, create - /rdi /rdi :testqRegReg - /extensionAreaExists :jnzLbl8 - - /rdx :pushqReg - INITIALEXTENSIONSIZE /rdi :movqImmReg - ::internalAllocate /rax :movqImmReg - /rax :callqReg - /rdx :popqReg + # insert into name table + @insertIntoNameTable + /rdi /rsi :movqRegMem + /r15 /rax :movqMemReg + 8 /rax /rax :movqMemDisp8Reg # load int value + /rax 8 /rsi :movqRegMemDisp8 # set default activation mode + 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap + 16 8 /rdx :addqImm8MemDisp8 # increment fill + /rsi /rdx :movqRegReg + /nameOffsetKnown :jmpLbl8 - %40 7 /rax :orbImmMemDisp8 # set type + @enlargeNameTable + # if name table is already full, double size + 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap + /rdi :pushqReg + /rdx :pushqReg + /rdx /edi :movlMemReg # load current length + /rdi /rdi :addqRegReg - /rax /rdi :movqRegReg - /rdi 24 /rbx :movqRegMemDisp8 # store new extension area - /inExtensionArea :jmpLbl8 + ::internalAllocate /rax :movqImmReg + /rax :callqReg + %30 7 /rax :orbImmMemDisp8 # set type + /rdx :popqReg + 8 /rdx /rcx :movqMemDisp8Reg + /rcx 8 /rax :movqRegMemDisp8 # copy fill - @extensionAreaExists + 16 /rdx /rsi :leaqMemDisp8Reg + 16 /rax /rdi :leaqMemDisp8Reg + 16 /rcx :subqImm8Reg + 3 /rcx :shrqImm8Reg + :reprcx :movsq # copy content - # if extension area is full, double size - /edx /rdi :cmplRegMem - /inExtensionArea :jaLbl8 + # rax == enlarged name table on heap + + /rax 8 /rbx :movqRegMemDisp8 # switch scope to new name table - # indeed full - /rdi :pushqReg - /rdx :pushqReg - /rdi /edi :movlMemReg - /rdi /rdi :addqRegReg - ::internalAllocate /rax :movqImmReg - /rax :callqReg - /rdx :popqReg - /rdi :popqReg + # insert into name table + /rsi :popqReg + /rsi /rdi :xchgqRegReg + /insertIntoNameTable :jmpLbl8 + + @nameOffsetKnown + 8 /rbx /rdx :subqMemDisp8Reg # substract name table address + 16 /rdx :subqImm8Reg # substract name table header size + /rdx :shrq1Reg # divide by 2 to get offset within scope - %40 7 /rax :orbImmMemDisp8 # set type + # rdx == offset in scope + # top of stack: the object to store - /rdi /rsi :movqRegReg - /rax /rdi :movqRegReg - /rdi 24 /rbx :movqRegMemDisp8 # store new extension area + # update + # if fits within main area, fine + 32 /rdx :addqImm8Reg # add scope header size + /edx /rbx :cmplRegMem + /inDataArea :jaLbl8 - /rdi :pushqReg - /rsi /ecx :movlMemReg # load length as copy count - 8 /rsi :addqImm8Reg - 8 /rdi :addqImm8Reg + # update within extension area + /rbx /edx :sublMemReg # substract scope length + 24 /rbx /rdi :movqMemDisp8Reg # load extension area pointer + 8 /rdx :addqImm8Reg # add extension area header length - 8 /rcx :subqImm8Reg # substract header length - 3 /rcx :shrqImm8Reg - :reprcx :movsq # copy content - /rdi :popqReg + # if extension area is non-existent, create + /rdi /rdi :testqRegReg + /extensionAreaExists :jnzLbl8 - @inExtensionArea - /rdi /rbx :movqRegReg + /rdx :pushqReg + INITIALEXTENSIONSIZE /rdi :movqImmReg + ::internalAllocate /rax :movqImmReg + /rax :callqReg + /rdx :popqReg - @inDataArea + %40 7 /rax :orbImmMemDisp8 # set type - /rax :popqReg - /rax /rbx /rdx :movqRegMemIndex # save entry pointer + /rax /rdi :movqRegReg + /rdi 24 /rbx :movqRegMemDisp8 # store new extension area + /inExtensionArea :jmpLbl8 - /r15 :pushqMem - 8 /r15 :addqImm8Reg - :retn - ]] - } 0 -101* /eydefv defv - 1 -101* /eydeff defv - 2 -01* /eydefq defv + @extensionAreaExists + + # if extension area is full, double size + /edx /rdi :cmplRegMem + /inExtensionArea :jaLbl8 + + # indeed full + /rdi :pushqReg + /rdx :pushqReg + /rdi /edi :movlMemReg + /rdi /rdi :addqRegReg + ::internalAllocate /rax :movqImmReg + /rax :callqReg + /rdx :popqReg + /rdi :popqReg + + %40 7 /rax :orbImmMemDisp8 # set type + + /rdi /rsi :movqRegReg + /rax /rdi :movqRegReg + /rdi 24 /rbx :movqRegMemDisp8 # store new extension area + + /rdi :pushqReg + /rsi /ecx :movlMemReg # load length as copy count + 8 /rsi :addqImm8Reg + 8 /rdi :addqImm8Reg + + 8 /rcx :subqImm8Reg # substract header length + 3 /rcx :shrqImm8Reg + :reprcx :movsq # copy content + /rdi :popqReg + + @inExtensionArea + /rdi /rbx :movqRegReg + + @inDataArea + + /rax :popqReg + /rax /rbx /rdx :movqRegMemIndex # save entry pointer + + 8 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ]] /eydef defv # assign to a scope variable # 0 -> name to assign to @@ -994,11 +997,14 @@ /unresolved :jzLbl8 /rax :pushqReg - 0 /rdx :cmpqImm8Reg + /rdx /rcx :movqRegReg + %0F /cl :andbImmReg + + 0 /cl :cmpbImmReg /inactive :jzLbl8 - 1 /rdx :cmpqImm8Reg + 1 /cl :cmpbImmReg /active :jzLbl8 - 2 /rdx :cmpqImm8Reg + 2 /cl :cmpbImmReg /active :jzLbl8 "invalid activation mode in internalExecuteIdentifierUnquoted" ::outputError @@ -1022,6 +1028,130 @@ 8 /r15 :addqImm8Reg :retn ]] /internalExecuteIdentifierUnquoted defv + + # resolve identifier without quoting considerations and act accordingly + # after resolving it, patch the given code block to more efficiently call the name next time + # 0 -> address of code block + # 1 -> identifier to resolve + [[ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + 8 /r15 :subqImm8Reg + /r15 :popqMem # store code block + + 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 + + %40 /dl :testbImmReg + /patchConstant :jnzLbl8 + + /rdx /rcx :movqRegReg + %0F /cl :andbImmReg + + 0 /cl :cmpbImmReg + /inactive :jzLbl8 + 1 /cl :cmpbImmReg + /active :jzLbl8 + 2 /cl :cmpbImmReg + /active :jzLbl8 + + "invalid activation mode in internalExecuteIdentifierUnquotedAndPatchLateResolve" ::outputError + :ud2 + + @unresolved + "unresolved name in internalExecuteIdentifierUnquotedAndPatchLateResolve: " ::outputError + /r15 /rdi :movqMemReg + ::internalDumpErrorString /rax :movqImmReg + /rax :callqReg + :ud2 + + @active + |ey* /rax :movqImmReg + /rax :callqReg + + @inactive + @done + + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + + @patchConstant + %0F /dl :testbImmReg + /patchConstantPassive :jzLbl32 + %01 /dl :testbImmReg + /patchConstantActive :jnzLbl32 + %02 /dl :testbImmReg + /patchConstantQuoted :jnzLbl8 + + "invalid activation mode in internalExecuteIdentifierUnquotedAndPatchLateResolve@patchConstant" ::outputError + :ud2 + + @patchConstantQuoted + "quote activation mode in internalExecuteIdentifierUnquotedAndPatchLateResolve@patchConstant" ::outputError + :ud2 + + @patchConstantActive + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + [ + /rbx :popqReg + /rax :movqImmOOBReg + ] ::loadToRdi + /rdi :popqMem + 8 /rdi :addqImm8Reg + [ + /rax :pushqReg + /rbx :pushqReg + |ey* /rax :movqImmReg + /rax :jmpqReg + ] ::loadToRdi + + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + /rdi :jmpqReg # continue with freshly patched code + + @patchConstantPassive + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + [ + /rax :movqImmOOBReg + ] ::loadToRdi + /rdi :popqMem + 8 /rdi :addqImm8Reg + [ + /rax :pushqReg + :retn + ] ::loadToRdi + + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + /rdi :jmpqReg # continue with freshly patched code + ]] /internalExecuteIdentifierUnquotedAndPatchLateResolve defv > { defv }' ::allocateOffsetStruct < @@ -1044,16 +1174,16 @@ /rax /rax :testqRegReg /unresolved :jzLbl8 - 0 /rdx :cmpqImm8Reg - /inactiveJump :jzLbl8 - 1 /rdx :cmpqImm8Reg + /rdx /rcx :movqRegReg + %0F /cl :andbImmReg + + 0 /cl :cmpbImmReg + /inactive :jzLbl32 + 1 /cl :cmpbImmReg /active :jzLbl8 - 2 /rdx :cmpqImm8Reg + 2 /cl :cmpbImmReg /quoteActive :jzLbl8 - @inactiveJump - /inactive :jmpLbl32 - "invalid activation mode in internalExecuteIdentifier" ::outputError :ud2 @@ -1114,7 +1244,12 @@ [ /rax :pushqReg - internalExecuteIdentifierUnquoted /rax :movqImmReg + 0 :callqRel32 + /rax :popqReg + # 16 bytes code here, header length, and code block header + 16 ::unscopingFunctionHeader len add 8 add /rax :subqImm8Reg + /rax :pushqReg + internalExecuteIdentifierUnquotedAndPatchLateResolve /rax :movqImmReg /rax :callqReg ] ::unscopingFunctionFooter cat ::loadToRdi @@ -1135,6 +1270,43 @@ > { defv }' ::allocateOffsetStruct < + # predefining defv, deff, defq # TODO think about moving this to standard(Client) one day + # 0 -> name, string + # 1 -> object + { ==activation + [[ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + 16 /rdi :movqImmReg + ::internalAllocate /rax :movqImmReg + /rax :callqReg + /rax :pushqReg + activation /rdx :movqImmReg + /rdx 8 /rax :movqRegMemDisp8 + + eydef /rax :movqImmReg + /rax :callqReg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ]] + } %00 -101* /eydefv defv + %01 -101* /eydeff defv + %02 -101* /eydefq defv + %10 -101* /eydefvs defv + %11 -101* /eydeffs defv + %20 -101* /eydefvt defv + %21 -101* /eydefft defv + %30 -101* /eydefvst defv + %31 -101* /eydeffst defv + %70 -101* /eydefvc defv + %71 -101* /eydeffc defv + %F0 -101* /eydefvd defv + %F1 -101* /eydeffd defv + -- + # concatenate two functions # 0 -> function g # 1 -> function f @@ -1421,10 +1593,10 @@ /unresolved :jzLbl8 /rax :pushqReg - 0 /rdx :cmpqImm8Reg + %0F /dl :testbImmReg /inactive :jzLbl8 - 1 /rdx :cmpqImm8Reg - /active :jzLbl8 + %01 /dl :testbImmReg + /active :jnzLbl8 "invalid activation mode in ." ::outputError :ud2 @@ -2086,13 +2258,13 @@ ::currentScope /rdi :movqImmReg /rax /rdi :movqRegMem - globalFunctions keys eydeff { | }' createScopeEntries - globalFunctions2 keys eydeff { | }' createScopeEntries - globalFunctions3 keys eydeff { | }' createScopeEntries + globalFunctions keys eydeffd { | }' createScopeEntries + globalFunctions2 keys eydeffd { | }' createScopeEntries + globalFunctions3 keys eydeffd { | }' createScopeEntries globalMacros keys eydefq { | }' createScopeEntries - globalT11t1Functions keys eydeff t11t1 { | }' createTypedScopeEntries - globalT1t1Functions keys eydeff t1t1 { | }' createTypedScopeEntries - globalTaat1Functions keys eydeff taat1 { | }' createTypedScopeEntries + globalT11t1Functions keys eydeffd t11t1 { | }' createTypedScopeEntries + globalT1t1Functions keys eydeffd t1t1 { | }' createTypedScopeEntries + globalTaat1Functions keys eydeffd taat1 { | }' createTypedScopeEntries ] :execute { ==name diff --git a/compiler/standard.ey b/compiler/standard.ey index 90b611d..dd2353f 100644 --- a/compiler/standard.ey +++ b/compiler/standard.ey @@ -1,5 +1,7 @@ -|defv "==" deff -|deff "=*" deff +|defvst "==" deffd +|deffst "=*" deffd +|defvc "==:" deffd +|deffc "=*:" deffd { "}" | * { /f deff /x defv @@ -7,10 +9,10 @@ } quoted { } { * } ? * } "}_" defq -{ deff }' " globalDeff" deff # this is not for public usage +{ deffst }' " globalDeff" deffd # this is not for public usage { - { -01 < /o defv { o -01 . } > -12 } quoted { } { * } ? * - quoted { |deff } " globalDeff" | ? * + { -01 < ==o { o -01 . } > -12 } quoted { } { * } ? * + quoted { |deffst } " globalDeff" | ? * } /via defq { -1110 ; ==f =*a len _ @@ -19,21 +21,21 @@ 1 -102 range f each }' { "fold on empty array" die }' ? * -} /fold deff +} /fold deffd { _ =*a len [ 1 -1202 1 add range { -110 sub a -01 }' each -- ] # TODO: rethink this one, seems overly complicated -} /reverse deff +} /reverse deffd -{ |or fold } /any deff -{ |and fold } /all deff +{ |or fold } /any deffd +{ |and fold } /all deffd { =*p { [ -01 { _ p { } { -- } ? * } each ] -} } /engrep deff +} } /engrep deffd -{ engrep * } /grep deff -{ -110 ; engrep |dom -20*1* } /indices deff +{ engrep * } /grep deffd +{ -110 ; engrep |dom -20*1* } /indices deffd { =*p _ =*a len ==l 1 neg ==r @@ -45,21 +47,21 @@ 1 add } loop -- r -} /index deff +} /index deffd { not { "Assertion failure" die } rep -} /assert deff +} /assert deffd { ==s [ s keys { s -01 . } each ] -} /values deff +} /values deffd { _ =*conds len ==max 0 ==i { i max lt } { i conds { i 1 add conds * max =i } { } ? * i 2 add =i } loop -} /conds deff +} /conds deffd # vim: syn=elymas diff --git a/interpreter/ElymasGlobal.pm b/interpreter/ElymasGlobal.pm index 1cf8227..321a10d 100644 --- a/interpreter/ElymasGlobal.pm +++ b/interpreter/ElymasGlobal.pm @@ -659,6 +659,18 @@ sub installGlobal1IntFunction { }, ['func', $name, ['int'], ['int']], 'active']; } +# TODO: maybe support optimization semantics in the interpreter as well one day +$globalScope->{'defvs'} = $globalScope->{'defv'}; +$globalScope->{'deffs'} = $globalScope->{'deff'}; +$globalScope->{'defvt'} = $globalScope->{'defv'}; +$globalScope->{'defft'} = $globalScope->{'deff'}; +$globalScope->{'defvst'} = $globalScope->{'defv'}; +$globalScope->{'deffst'} = $globalScope->{'deff'}; +$globalScope->{'defvc'} = $globalScope->{'defv'}; +$globalScope->{'deffc'} = $globalScope->{'deff'}; +$globalScope->{'defvd'} = $globalScope->{'defv'}; +$globalScope->{'deffd'} = $globalScope->{'deff'}; + sub installGlobal2IntFunction { my ($name, $code) = @_; @@ -75,7 +75,7 @@ A->int A->int add -> A->int = Characters = -!: <open> +!: co-routines and threads ": string quote #: line comment $: <open> @@ -238,9 +238,10 @@ Main problem: How do we find out if the names mean what we believe they do? === Name Properties === * [d] deeply constant: objects referenced (indirectly) from this name can be assumed constant (constant implied) * [c] constant: the object reference of this name can be assumed constant (code constant and static implied) -* [t] code / type constant: the final code block (not function) reference and function type can be assumed constant +* [t] code / type constant: the function type can be assumed constant (including whether this function has no captured scope) * [s] static: the path from local scope to where the name resolves can be assumed constant the name index within the scope can be assumed constant + the activation level can be assumed constant * [] dynamic: nothing can be assumed * [v] inactive: push value * [f] active: execute unless quoted @@ -252,7 +253,7 @@ Main problem: How do we find out if the names mean what we believe they do? | f | deff | deffs | defft | deffst | deffc | deffd | | q | defq | | | | | | +---+------+-------+-------+--------+-------+-------+ -* defaults: |defvst "==" deffd |deffst "=*" deffd +* defaults: |defvs "==" deffd |deffs "=*" deffd * it is possible to globally turn checking (after dynamic resolution) on == Sticky Resolution == |
