diff options
| author | Mel <einebeere@gmail.com> | 2022-08-22 23:41:49 +0000 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-08-22 23:41:49 +0000 |
| commit | e22df631c4428f8dea4d5784a8a7840d2f84c6be (patch) | |
| tree | 084c233741374cdabde8d70b49988b3dca686719 /pkg/lang/compiler | |
| parent | 24183cd5363b96d83292df17d44fa79d8b47a89f (diff) | |
| download | jinx-e22df631c4428f8dea4d5784a8a7840d2f84c6be.tar.zst jinx-e22df631c4428f8dea4d5784a8a7840d2f84c6be.zip | |
Generate runtime debug info with source locations
Diffstat (limited to 'pkg/lang/compiler')
| -rw-r--r-- | pkg/lang/compiler/compiler.go | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go index b08a215..b1d4dfb 100644 --- a/pkg/lang/compiler/compiler.go +++ b/pkg/lang/compiler/compiler.go @@ -70,6 +70,8 @@ func (comp *Compiler) Compile() (modules.Module, error) { } func (comp *Compiler) compileStmt(t *code.Builder, stmt ast.Stmt) error { + startPc := t.Len() + var err error switch stmt.Kind { case ast.StmtKindEmpty: @@ -119,15 +121,24 @@ func (comp *Compiler) compileStmt(t *code.Builder, stmt ast.Stmt) error { } // Wrap errors in a compiler error, if it's not already one. - if err != nil && !isCompilerError(err) { - err = Error{ - Module: comp.name, - Loc: stmt.At, - Err: err, + if err != nil { + if !isCompilerError(err) { + err = Error{ + Module: comp.name, + Loc: stmt.At, + Err: err, + } } + return err } - return err + // Add debug info if needed. + endPc := t.Len() + if startPc != endPc { + t.AddDebugInfo(startPc, endPc-1, stmt.At) + } + + return nil } func (comp *Compiler) compileUseStmt(t *code.Builder, stmt ast.StmtUse) error { @@ -645,6 +656,8 @@ func (comp *Compiler) compileExprStmt(t *code.Builder, exprStmt ast.StmtExpr) er } func (comp *Compiler) compileExpr(t *code.Builder, expr ast.Expr) error { + startPc := t.Len() + var err error switch expr.Kind { case ast.ExprKindBinary: @@ -683,15 +696,24 @@ func (comp *Compiler) compileExpr(t *code.Builder, expr ast.Expr) error { } // If the error was not a compiler error, we need to wrap it in one. - if err != nil && !isCompilerError(err) { - err = Error{ - Module: comp.name, - Loc: expr.At, - Err: err, + if err != nil { + if !isCompilerError(err) { + err = Error{ + Module: comp.name, + Loc: expr.At, + Err: err, + } } + + return err } - return err + endPc := t.Len() + if startPc != endPc { + t.AddDebugInfo(startPc, endPc-1, expr.At) + } + + return nil } func (comp *Compiler) compileBinaryExpr(t *code.Builder, expr ast.ExprBinary) error { |
