about summary refs log tree commit diff
path: root/pkg/lang/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/compiler')
-rw-r--r--pkg/lang/compiler/compiler.go46
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 {