History

SBL file reader. Create and implement basic symbol interface used during debugging.

arr committed 9 years ago

Commit a3c184b1 parent 3b54d824 files · +852 −1Browse files

Showing the changes to src/include (1 of 4 files). Show all

Unified · Split

src/include/vm_asm.h+80−1
@@ -34,7 +34,7 @@ namespace disvm · 33 unmodified lines
3434 // If the supplied string cannot be resolved or if it is null, the 'invalid' opcode is returned.
3535 disvm::opcode_t token_to_opcode(const char *);
3636
37− // Namedspace named after enum type in Limbo compiler
37+ // Namespace named after enum type in Limbo compiler
3838 // Source: limbo/types.c
3939 namespace sigkind
4040 {
@@ -369,6 +369,85 @@ namespace disvm · 328 unmodified lines
369369 }
370370 }
371371
372+ namespace symbol
373+ {
374+ // Type class enum for symbols is unrelated to signature types enum.
375+ // The historical reason for this isn't recorded but is found in
376+ // the official Limbo compiler.
377+ enum class type_class_t : uint8_t
378+ {
379+ type_index = '@',
380+ adt = 'a',
381+ adt_pick = 'p',
382+ tuple = 't',
383+ module = 'm',
384+ function = 'F',
385+ array = 'A',
386+ channel = 'C',
387+ list = 'L',
388+ ref = 'R',
389+ none = 'n',
390+ nil = 'N',
391+ big = 'B',
392+ byte = 'b',
393+ integer = 'i',
394+ real = 'f',
395+ string = 's',
396+ poly = 'P',
397+ };
398+
399+ // Reference into source code
400+ struct source_ref_t
401+ {
402+ int32_t source_id;
403+ int32_t begin_line;
404+ int32_t begin_column;
405+ int32_t end_line;
406+ int32_t end_column;
407+ };
408+
409+ class symbol_debug_t
410+ {
411+ public:
412+ // Set the current pc
413+ virtual void set_current_pc(disvm::runtime::vm_pc_t) = 0;
414+
415+ // Enumeration for advancing the pc
416+ enum class advance_pc_t
417+ {
418+ current, // Return the current pc
419+ next_pc,
420+ next_debug_statement, // Advance to the next debug statement (i.e. source language statement)
421+ };
422+
423+ // Advance the current pc.
424+ // Returns 'true' if the function was successful, otherwise 'false'.
425+ virtual bool try_advance_pc(advance_pc_t, disvm::runtime::vm_pc_t *pc_after_advance = nullptr) = 0;
426+
427+ // Return the name of the function encompassing the current pc.
428+ // This function will throw a 'std::runtime_error' if a function doesn't exist at the current pc.
429+ virtual const std::string & current_function_name() const = 0;
430+
431+ // Return the source location for the current pc
432+ virtual source_ref_t current_source_location() const = 0;
433+
434+ // Get source file name based on ID
435+ virtual const std::string &get_source_by_id(int32_t source_id) const = 0;
436+ };
437+
438+ class symbol_data_t
439+ {
440+ public:
441+ // Get name of the module
442+ virtual const std::string& get_module_name() const = 0;
443+
444+ // Get interface over symbol data targeted for debugging
445+ virtual std::unique_ptr<symbol_debug_t> get_debug() = 0;
446+ };
447+
448+ std::unique_ptr<symbol_data_t> read(std::istream &);
449+ }
450+
372451 namespace runtime
373452 {
374453 // Operators for printing bytecode instructions