Browse Source

Fixed variable mapping in eval()

Dmitry Panov 8 years ago
parent
commit
b1c552c9bf
2 changed files with 16 additions and 2 deletions
  1. 4 2
      vm.go
  2. 12 0
      vm_test.go

+ 4 - 2
vm.go

@@ -250,8 +250,10 @@ func (s *stash) createBinding(name string) {
 	if s.names == nil {
 		s.names = make(map[string]uint32)
 	}
-	s.names[name] = uint32(len(s.names))
-	s.values = append(s.values, _undefined)
+	if _, exists := s.names[name]; !exists {
+		s.names[name] = uint32(len(s.names))
+		s.values = append(s.values, _undefined)
+	}
 }
 
 func (s *stash) deleteBinding(name string) bool {

+ 12 - 0
vm_test.go

@@ -42,6 +42,18 @@ func TestVM1(t *testing.T) {
 
 }
 
+func TestEvalVar(t *testing.T) {
+	const SCRIPT = `
+	function test() {
+		var a;
+		return eval("var a = 'yes'; var z = 'no'; a;") === "yes" && a === "yes";
+	}
+	test();
+	`
+
+	testScript1(SCRIPT, valueTrue, t)
+}
+
 var jumptable = []func(*vm, *instr){
 	f_jump,
 	f_halt,