diff --git a/environment.go b/environment.go index 3d5c1e9..45a2b5f 100644 --- a/environment.go +++ b/environment.go @@ -112,14 +112,14 @@ func (self *_objectEnvironment) ImplicitThisValue() *_object { return nil } -func getIdentifierReference(environment _environment, name string, strict bool) _reference { +func getIdentifierReference(environment _environment, name string, strict bool, node _node) _reference { if environment == nil { - return newObjectReference(nil, name, strict, nil) + return newObjectReference(nil, name, strict, node) } if environment.HasBinding(name) { return environment.newReference(name, strict) } - return getIdentifierReference(environment.Outer(), name, strict) + return getIdentifierReference(environment.Outer(), name, strict, node) } // --- @@ -144,7 +144,7 @@ func (self *_objectEnvironment) newReference(name string, strict bool) _referenc } func (self *_objectEnvironment) GetReference(name string) _reference { - return getIdentifierReference(self, name, false) + return getIdentifierReference(self, name, false, nil) } func (self *_objectEnvironment) GetValue(name string, throw bool) Value { diff --git a/error.go b/error.go index c2f40a9..db1b22a 100644 --- a/error.go +++ b/error.go @@ -104,7 +104,8 @@ func catchPanic(function func()) (err error) { if caught.Line == -1 { err = errors.New(caught.String()) } else { - err = errors.New(fmt.Sprintf("%s (line %d)", caught.String(), caught.Line)) + // We're 0-based (for now), hence the + 1 + err = errors.New(fmt.Sprintf("%s (line %d)", caught.String(), caught.Line + 1)) } return case _result: diff --git a/evaluate_expression.go b/evaluate_expression.go index 36b15fc..25107e1 100644 --- a/evaluate_expression.go +++ b/evaluate_expression.go @@ -524,7 +524,7 @@ func (self *_runtime) evaluateIdentifier(node *_identifierNode) Value { // TODO Should be true or false (strictness) depending on context // TODO Associate the node with reference... how? // TODO Can/Will getIdentifierReference ever return nil? - reference := getIdentifierReference(self.LexicalEnvironment(), name, false) + reference := getIdentifierReference(self.LexicalEnvironment(), name, false, node) if reference == nil { panic("referenceError: " + name) } diff --git a/evaluate_statement.go b/evaluate_statement.go index be5fc6f..05256a9 100644 --- a/evaluate_statement.go +++ b/evaluate_statement.go @@ -34,7 +34,7 @@ func (self *_runtime) evaluateVariableDeclarationList(node *_variableDeclaration func (self *_runtime) evaluateVariableDeclaration(node *_variableDeclarationNode) Value { if node.Operator != "" { // FIXME If reference is nil - left := getIdentifierReference(self.LexicalEnvironment(), node.Identifier, false) + left := getIdentifierReference(self.LexicalEnvironment(), node.Identifier, false, node) right := self.evaluate(node.Initializer) rightValue := self.GetValue(right) @@ -192,7 +192,7 @@ func (self *_runtime) evaluateForIn(node *_forInNode) Value { if into.reference() == nil { identifier := toString(into) // TODO Should be true or false (strictness) depending on context - into = toValue(getIdentifierReference(self.LexicalEnvironment(), identifier, false)) + into = toValue(getIdentifierReference(self.LexicalEnvironment(), identifier, false, node)) } self.PutValue(into.reference(), toValue(name)) value, _ := self.continueEvaluate(body, _labelSet) diff --git a/otto_error_test.go b/otto_error_test.go index 1615c03..ea25514 100644 --- a/otto_error_test.go +++ b/otto_error_test.go @@ -27,7 +27,7 @@ func TestOttoError(t *testing.T) { return abcdef.length })() `) - Is(err, "ReferenceError: abcdef is not defined (line 2)") + Is(err, "ReferenceError: abcdef is not defined (line 3)") _, err = Otto.Run(` function start() { @@ -37,13 +37,13 @@ func TestOttoError(t *testing.T) { xyzzy() `) - Is(err, "ReferenceError: xyzzy is not defined (line 6)") + Is(err, "ReferenceError: xyzzy is not defined (line 7)") _, err = Otto.Run(` // Just a comment xyzzy `) - Is(err, "ReferenceError: xyzzy is not defined (line 3)") + Is(err, "ReferenceError: xyzzy is not defined (line 4)") }