Explorar o código

LibJS: Do not assume that a call frame exists in {get,set}_variable

AnotherTest %!s(int64=5) %!d(string=hai) anos
pai
achega
992467cca3
Modificáronse 1 ficheiros con 16 adicións e 12 borrados
  1. 16 12
      Libraries/LibJS/Interpreter.cpp

+ 16 - 12
Libraries/LibJS/Interpreter.cpp

@@ -133,16 +133,18 @@ void Interpreter::exit_scope(const ScopeNode& scope_node)
 
 
 void Interpreter::set_variable(const FlyString& name, Value value, bool first_assignment)
 void Interpreter::set_variable(const FlyString& name, Value value, bool first_assignment)
 {
 {
-    for (auto* environment = current_environment(); environment; environment = environment->parent()) {
-        auto possible_match = environment->get(name);
-        if (possible_match.has_value()) {
-            if (!first_assignment && possible_match.value().declaration_kind == DeclarationKind::Const) {
-                throw_exception<TypeError>("Assignment to constant variable");
+    if (m_call_stack.size()) {
+        for (auto* environment = current_environment(); environment; environment = environment->parent()) {
+            auto possible_match = environment->get(name);
+            if (possible_match.has_value()) {
+                if (!first_assignment && possible_match.value().declaration_kind == DeclarationKind::Const) {
+                    throw_exception<TypeError>("Assignment to constant variable");
+                    return;
+                }
+
+                environment->set(name, { value, possible_match.value().declaration_kind });
                 return;
                 return;
             }
             }
-
-            environment->set(name, { value, possible_match.value().declaration_kind });
-            return;
         }
         }
     }
     }
 
 
@@ -151,10 +153,12 @@ void Interpreter::set_variable(const FlyString& name, Value value, bool first_as
 
 
 Optional<Value> Interpreter::get_variable(const FlyString& name)
 Optional<Value> Interpreter::get_variable(const FlyString& name)
 {
 {
-    for (auto* environment = current_environment(); environment; environment = environment->parent()) {
-        auto possible_match = environment->get(name);
-        if (possible_match.has_value())
-            return possible_match.value().value;
+    if (m_call_stack.size()) {
+        for (auto* environment = current_environment(); environment; environment = environment->parent()) {
+            auto possible_match = environment->get(name);
+            if (possible_match.has_value())
+                return possible_match.value().value;
+        }
     }
     }
     return global_object().get(name);
     return global_object().get(name);
 }
 }