From 4beb22cef418690d10980c958a7e84692793b5fc Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Sat, 17 May 2025 19:26:49 -0500 Subject: [PATCH] Now you can break, continue and return in try statements --- docs/HANDBOOK.md | 2 -- include/CrossLang.hpp | 23 ++++++++++++-- src/compiler/codegen.cpp | 62 ++++++++++++++++++++++++++++++++++-- src/vm/vm.cpp | 69 ++++++++++++++++++++++++++++++++++++++++ src/vm/vm_opcode_table.h | 2 +- 5 files changed, 150 insertions(+), 8 deletions(-) diff --git a/docs/HANDBOOK.md b/docs/HANDBOOK.md index 8ddcaab..960c3d7 100644 --- a/docs/HANDBOOK.md +++ b/docs/HANDBOOK.md @@ -115,8 +115,6 @@ do(conditionLikeIf) #### Try statement -Note: you can't yield, return, break or continue from inside a try statement (also applys to catch and finally due to these being internally closures) - ```js try { Console.WriteLine("God is good."); diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index fa7961b..8fe2b32 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -659,7 +659,11 @@ typedef enum { YIELD, PUSHROOTPATH, PUSHRELATIVEPATH, - BREAKPOINT + BREAKPOINT, + PUSHBREAK, + PUSHCONTINUE, + JMPIFBREAK, + JMPIFCONTINUE } Instruction; /** * @brief Base type for bytecode instruction @@ -1344,6 +1348,9 @@ class Parser { } }; + + + //this is a dummy type with class MethodInvoker { @@ -1358,11 +1365,19 @@ class Parser { Tesses::Framework::Date::DateTime& GetDate(); ~TDateTime(); }; +class TBreak { + +}; +class TContinue { + +}; /** * @brief A script object * */ -using TObject = std::variant; + +using TObject = std::variant; + class TRootEnvironment; class GC; class GC { @@ -2072,6 +2087,10 @@ class GC { bool Dup(GC* gc); bool Nop(GC* gc); bool Breakpoint(GC* gc); + bool PushBreak(GC* gc); + bool PushContinue(GC* gc); + bool JumpIfBreak(GC* gc); + bool JumpIfContinue(GC* gc); public: static InterperterThread* Create(GCList* ls); static InterperterThread* Create(GCList& ls); diff --git a/src/compiler/codegen.cpp b/src/compiler/codegen.cpp index 677bea8..c4fcc65 100644 --- a/src/compiler/codegen.cpp +++ b/src/compiler/codegen.cpp @@ -991,6 +991,11 @@ namespace Tesses::CrossLang { std::cout << "WARN: continue does nothing here\n"; } + else if(contscope == -2) + { + instructions.push_back(new SimpleInstruction(PUSHCONTINUE)); + instructions.push_back(new SimpleInstruction(RET)); + } else { auto cont = scope-contscope; @@ -1009,6 +1014,11 @@ namespace Tesses::CrossLang { std::cout << "WARN: break does nothing here\n"; } + else if(brkscope == -2) + { + instructions.push_back(new SimpleInstruction(PUSHBREAK)); + instructions.push_back(new SimpleInstruction(RET)); + } else { auto _brk = scope-brkscope; @@ -1223,17 +1233,63 @@ namespace Tesses::CrossLang } if(std::holds_alternative(adv.nodes[0]) && std::holds_alternative(adv.nodes[1]) && std::holds_alternative(adv.nodes[2])) { - GenNode(instructions,AdvancedSyntaxNode::Create(ScopelessClosureExpression,true,{AdvancedSyntaxNode::Create(ParenthesesExpression,true,{}),adv.nodes[0]}),scope,contscope,brkscope,contI,brkI); + GenNode(instructions,AdvancedSyntaxNode::Create(ScopelessClosureExpression,true,{AdvancedSyntaxNode::Create(ParenthesesExpression,true,{}),adv.nodes[0]}),scope,contscope == -1 ? -1 : -2,brkscope == -1 ? -1 : -2,contI,brkI); GenNode(instructions,AdvancedSyntaxNode::Create(ScopelessClosureExpression,true,{ AdvancedSyntaxNode::Create(ParenthesesExpression,true,{adv.nodes[2]}), adv.nodes[1] - }),scope,contscope,brkscope,contI,brkI); + }),scope,contscope == -1 ? -1 : -2,brkscope == -1 ? -1 : -2,contI,brkI); instructions.push_back(new SimpleInstruction(TRYCATCH)); uint32_t compGenId = NewId(); std::string compGenIttr = "__compGenRetThing"; compGenIttr.append(std::to_string(compGenId)); + if(contscope != -1) + { + instructions.push_back(new JumpStyleInstruction(JMPIFCONTINUE,compGenIttr+"_cont")); + } + if(brkscope != -1) + { + instructions.push_back(new JumpStyleInstruction(JMPIFBREAK,compGenIttr+"_brk")); + } instructions.push_back(new JumpStyleInstruction(JMPUNDEFINED, compGenIttr)); instructions.push_back(new SimpleInstruction(RET)); + if(contscope == -2) + { + instructions.push_back(new LabelInstruction(compGenIttr+"_cont")); + instructions.push_back(new SimpleInstruction(PUSHCONTINUE)); + instructions.push_back(new SimpleInstruction(RET)); + } + else if(contscope != -1) + { + instructions.push_back(new LabelInstruction(compGenIttr+"_cont")); + auto cont = scope-contscope; + if(cont > 0) + instructions.push_back(new ScopeEndTimesInstruction((uint32_t)cont)); + + std::string myJmp = "__compGenCont"; + myJmp.append(std::to_string(contI)); + + instructions.push_back(new JumpStyleInstruction(JMP,myJmp)); + } + if(brkscope == -2) + { + instructions.push_back(new LabelInstruction(compGenIttr+"_brk")); + instructions.push_back(new SimpleInstruction(PUSHBREAK)); + instructions.push_back(new SimpleInstruction(RET)); + } + else if(brkscope != -1) + { + instructions.push_back(new LabelInstruction(compGenIttr+"_brk")); + auto _brk = scope-brkscope; + if(_brk > 0) + instructions.push_back(new ScopeEndTimesInstruction((uint32_t)_brk)); + + std::string myJmp = "__compGenBrk"; + myJmp.append(std::to_string(brkI)); + + instructions.push_back(new JumpStyleInstruction(JMP,myJmp)); + + } + instructions.push_back(new LabelInstruction(compGenIttr)); } @@ -1264,7 +1320,7 @@ namespace Tesses::CrossLang } - GenNode(fnInstructions,body,0,-1,-1,-1,-1); + GenNode(fnInstructions,body,0,contscope == -2 ? -2 : -1,brkscope == -2 ? -2 : -1,-1,-1); this->chunks[fnindex] = std::pair,std::vector>(args, fnInstructions); instructions.push_back(new ClosureInstruction((uint32_t)fnindex,false)); diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp index f3358d8..d52da6c 100644 --- a/src/vm/vm.cpp +++ b/src/vm/vm.cpp @@ -5153,6 +5153,57 @@ namespace Tesses::CrossLang { } return false; } + bool InterperterThread::JumpIfBreak(GC* gc) + { + + std::vector& cse=this->call_stack_entries; + auto stk = cse.back(); + + if(stk->ip + 4 <= stk->callable->closure->code.size()) + { + uint32_t n=BitConverter::ToUint32BE(stk->callable->closure->code[stk->ip]); + + GCList ls(gc); + auto _res2 = stk->Pop(ls); + + stk->ip = stk->ip + 4; + if(std::holds_alternative(_res2)) + stk->ip = n; + else + stk->Push(gc,_res2); + + + } + else + throw VMException("Can't read jmpifbreak pc."); + return false; + } + + bool InterperterThread::JumpIfContinue(GC* gc) + { + + std::vector& cse=this->call_stack_entries; + auto stk = cse.back(); + + if(stk->ip + 4 <= stk->callable->closure->code.size()) + { + uint32_t n=BitConverter::ToUint32BE(stk->callable->closure->code[stk->ip]); + + GCList ls(gc); + auto _res2 = stk->Pop(ls); + + stk->ip = stk->ip + 4; + if(std::holds_alternative(_res2)) + stk->ip = n; + else + stk->Push(gc,_res2); + + + } + else + throw VMException("Can't read jmpifcontinue pc."); + return false; + } bool InterperterThread::JumpUndefined(GC* gc) { @@ -5201,6 +5252,24 @@ namespace Tesses::CrossLang { stk->Push(gc,nullptr); return false; + } + bool InterperterThread::PushBreak(GC* gc) + { + + std::vector& cse=this->call_stack_entries; + auto stk = cse.back(); + + stk->Push(gc,TBreak()); + return false; + } + bool InterperterThread::PushContinue(GC* gc) + { + + std::vector& cse=this->call_stack_entries; + auto stk = cse.back(); + + stk->Push(gc,TContinue()); + return false; } bool InterperterThread::PushUndefined(GC* gc) { diff --git a/src/vm/vm_opcode_table.h b/src/vm/vm_opcode_table.h index 3c90211..f1ac19d 100644 --- a/src/vm/vm_opcode_table.h +++ b/src/vm/vm_opcode_table.h @@ -1,3 +1,3 @@ #if defined(VM_OPCODE_TABLE_INLINE) -static opcode opcodes[256]={&InterperterThread::Add, &InterperterThread::Sub, &InterperterThread::Times, &InterperterThread::Divide, &InterperterThread::Mod, &InterperterThread::LShift, &InterperterThread::RShift, &InterperterThread::BOr, &InterperterThread::BAnd, &InterperterThread::BNot, &InterperterThread::Lt, &InterperterThread::Gt, &InterperterThread::Lte, &InterperterThread::Gte, &InterperterThread::Eq, &InterperterThread::NEq, &InterperterThread::LNot, &InterperterThread::Neg, &InterperterThread::XOr, &InterperterThread::Pop, &InterperterThread::Dup,&InterperterThread::Nop, &InterperterThread::PushClosure, &InterperterThread::CreateDictionary, &InterperterThread::CreateArray, &InterperterThread::AppendList, &InterperterThread::AppendDictionary, &InterperterThread::PushResource, &InterperterThread::PushLong, &InterperterThread::PushChar, &InterperterThread::PushDouble, &InterperterThread::PushString, &InterperterThread::PushNull, &InterperterThread::PushUndefined, &InterperterThread::ScopeBegin, &InterperterThread::ScopeEnd, &InterperterThread::ScopeEndTimes, &InterperterThread::PushFalse, &InterperterThread::PushTrue, &InterperterThread::SetVariable, &InterperterThread::GetVariable, &InterperterThread::DeclareVariable, &InterperterThread::SetField, &InterperterThread::GetField, &InterperterThread::ExecuteFunction, &InterperterThread::ExecuteMethod, &InterperterThread::Return, &InterperterThread::JumpConditional, &InterperterThread::Jump, &InterperterThread::JumpUndefined, &InterperterThread::Defer, &InterperterThread::TryCatch, &InterperterThread::Throw, &InterperterThread::PushScopelessClosure, &InterperterThread::Yield, &InterperterThread::PushRootPath, &InterperterThread::PushRelativePath, &InterperterThread::Breakpoint, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal}; +static opcode opcodes[256]={&InterperterThread::Add, &InterperterThread::Sub, &InterperterThread::Times, &InterperterThread::Divide, &InterperterThread::Mod, &InterperterThread::LShift, &InterperterThread::RShift, &InterperterThread::BOr, &InterperterThread::BAnd, &InterperterThread::BNot, &InterperterThread::Lt, &InterperterThread::Gt, &InterperterThread::Lte, &InterperterThread::Gte, &InterperterThread::Eq, &InterperterThread::NEq, &InterperterThread::LNot, &InterperterThread::Neg, &InterperterThread::XOr, &InterperterThread::Pop, &InterperterThread::Dup,&InterperterThread::Nop, &InterperterThread::PushClosure, &InterperterThread::CreateDictionary, &InterperterThread::CreateArray, &InterperterThread::AppendList, &InterperterThread::AppendDictionary, &InterperterThread::PushResource, &InterperterThread::PushLong, &InterperterThread::PushChar, &InterperterThread::PushDouble, &InterperterThread::PushString, &InterperterThread::PushNull, &InterperterThread::PushUndefined, &InterperterThread::ScopeBegin, &InterperterThread::ScopeEnd, &InterperterThread::ScopeEndTimes, &InterperterThread::PushFalse, &InterperterThread::PushTrue, &InterperterThread::SetVariable, &InterperterThread::GetVariable, &InterperterThread::DeclareVariable, &InterperterThread::SetField, &InterperterThread::GetField, &InterperterThread::ExecuteFunction, &InterperterThread::ExecuteMethod, &InterperterThread::Return, &InterperterThread::JumpConditional, &InterperterThread::Jump, &InterperterThread::JumpUndefined, &InterperterThread::Defer, &InterperterThread::TryCatch, &InterperterThread::Throw, &InterperterThread::PushScopelessClosure, &InterperterThread::Yield, &InterperterThread::PushRootPath, &InterperterThread::PushRelativePath, &InterperterThread::Breakpoint, &InterperterThread::PushBreak, &InterperterThread::PushContinue, &InterperterThread::JumpIfBreak, &InterperterThread::JumpIfContinue, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal, &InterperterThread::Illegal}; #endif