diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index a524a88..32192b3 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -1427,7 +1427,7 @@ class GC { ~GC(); }; - + std::string GetObjectTypeString(TObject obj); std::string ToString(GC* gc, TObject obj); class GCList : public THeapObject diff --git a/src/assembler/asm.cpp b/src/assembler/asm.cpp index b1b5ddf..30bfe17 100644 --- a/src/assembler/asm.cpp +++ b/src/assembler/asm.cpp @@ -192,6 +192,7 @@ namespace Tesses::CrossLang { while(!IsSym("}",false)) { auto name = ReadIdent(); + if(name == "add") { instrs.push_back(std::make_shared(ADD)); @@ -541,6 +542,9 @@ namespace Tesses::CrossLang { auto lblName = lbl_prefix + "_" + ReadIdent(); instrs.push_back(std::make_shared(lblName)); } + else { + throw std::runtime_error("NOT IMPLEMENTED: " + name); + } } } void EnsureSymbol(std::string txt) @@ -1048,7 +1052,8 @@ namespace Tesses::CrossLang { } if(chk) { - chunks[chunkId].second.push_back(std::make_shared(PushChunk(chk->data),chk->scoped)); + auto item = std::make_shared(PushChunk(chk->data),chk->scoped); + chunks[chunkId].second.push_back(item); } if(reso) { diff --git a/src/assembler/disasm.cpp b/src/assembler/disasm.cpp index 14b72b4..1577369 100644 --- a/src/assembler/disasm.cpp +++ b/src/assembler/disasm.cpp @@ -622,6 +622,9 @@ namespace Tesses::CrossLang { } break; + default: + printf("ILL: %i\n", (int)code[i-1]); + break; } buffer.push_back('\n'); diff --git a/src/runtime_methods/std.cpp b/src/runtime_methods/std.cpp index 20aa028..06675d4 100644 --- a/src/runtime_methods/std.cpp +++ b/src/runtime_methods/std.cpp @@ -946,25 +946,23 @@ namespace Tesses::CrossLang } return nullptr; } - - static TObject TypeOf(GCList& ls, std::vector args) + std::string GetObjectTypeString(TObject _obj) { - if(args.size() < 1) return "Undefined"; - if(std::holds_alternative(args[0])) return "Regex"; - if(std::holds_alternative(args[0])) return "Undefined"; - if(std::holds_alternative(args[0])) return "Null"; - if(std::holds_alternative(args[0])) return "Boolean"; - if(std::holds_alternative(args[0])) return "Long"; - if(std::holds_alternative(args[0])) return "Double"; - if(std::holds_alternative(args[0])) return "Char"; - if(std::holds_alternative(args[0])) return "MethodInvoker"; - if(std::holds_alternative(args[0])) return "String"; + if(std::holds_alternative(_obj)) return "Regex"; + if(std::holds_alternative(_obj)) return "Undefined"; + if(std::holds_alternative(_obj)) return "Null"; + if(std::holds_alternative(_obj)) return "Boolean"; + if(std::holds_alternative(_obj)) return "Long"; + if(std::holds_alternative(_obj)) return "Double"; + if(std::holds_alternative(_obj)) return "Char"; + if(std::holds_alternative(_obj)) return "MethodInvoker"; + if(std::holds_alternative(_obj)) return "String"; - if(std::holds_alternative(args[0])) return "Path"; - if(std::holds_alternative(args[0])) return "DateTime"; - if(std::holds_alternative(args[0])) + if(std::holds_alternative(_obj)) return "Path"; + if(std::holds_alternative(_obj)) return "DateTime"; + if(std::holds_alternative(_obj)) { - auto obj = std::get(args[0]).obj; + auto obj = std::get(_obj).obj; auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); @@ -1051,6 +1049,12 @@ namespace Tesses::CrossLang return "Object"; } + + static TObject TypeOf(GCList& ls, std::vector args) + { + if(args.size() < 1) return "Undefined"; + return GetObjectTypeString(args[0]); + } TObject ByteArray(GCList& ls, std::vector args) { diff --git a/src/vm/vm.cpp b/src/vm/vm.cpp index d71dfac..60bd75b 100644 --- a/src/vm/vm.cpp +++ b/src/vm/vm.cpp @@ -6192,7 +6192,8 @@ namespace Tesses::CrossLang { } else { - throw VMException("[DECLAREVARIABLE] Can't pop string."); + + throw VMException("[DECLAREVARIABLE] Can't pop string, got type " + GetObjectTypeString(key) + " = " + ToString(gc,key) + "."); } } return false;