Skip to content

Commit

Permalink
Initialize var bindings in runtime environments with undefined
Browse files Browse the repository at this point in the history
  • Loading branch information
raskad committed Apr 23, 2023
1 parent 3db79f6 commit d9fd074
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
19 changes: 19 additions & 0 deletions boa_engine/src/bytecompiler/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,18 @@ impl ByteCompiler<'_, '_> {
self.emit(Opcode::GetFunction, &[index]);
self.emit_u8(0);

let class_env = if let Some(class_name) = class.name() {
if class.has_binding_identifier() {
self.push_compile_environment(false);
self.create_immutable_binding(class_name, true);
Some(self.emit_opcode_with_two_operands(Opcode::PushDeclarativeEnvironment))
} else {
None
}
} else {
None
};

self.emit_opcode(Opcode::Dup);
if let Some(node) = class.super_ref() {
self.compile_expr(node, true);
Expand Down Expand Up @@ -544,6 +556,13 @@ impl ByteCompiler<'_, '_> {

self.emit_opcode(Opcode::Pop);

if let Some(class_env) = class_env {
let env_info = self.pop_compile_environment();
self.patch_jump_with_target(class_env.0, env_info.num_bindings as u32);
self.patch_jump_with_target(class_env.1, env_info.index as u32);
self.emit_opcode(Opcode::PopEnvironment);
}

if !expression {
self.emit_binding(
BindingOpcode::InitVar,
Expand Down
14 changes: 14 additions & 0 deletions boa_engine/src/environments/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,4 +217,18 @@ impl CompileTimeEnvironment {
pub(crate) const fn environment_index(&self) -> usize {
self.environment_index
}

/// Gets the indices of all `var` bindings in this environment.
pub(crate) fn var_binding_indices(&self) -> Vec<usize> {
self.bindings
.iter()
.filter_map(|(_, binding)| {
if binding.lex {
None
} else {
Some(binding.index)
}
})
.collect()
}
}
14 changes: 12 additions & 2 deletions boa_engine/src/environments/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -480,9 +480,14 @@ impl DeclarativeEnvironmentStack {

let this = this.unwrap_or(JsValue::Null);

let mut bindings = vec![None; num_bindings];
for index in compile_environment.borrow().var_binding_indices() {
bindings[index] = Some(JsValue::Undefined);
}

self.stack
.push(Environment::Declarative(Gc::new(DeclarativeEnvironment {
bindings: GcRefCell::new(vec![None; num_bindings]),
bindings: GcRefCell::new(bindings),
compile: compile_environment,
poisoned: Cell::new(poisoned),
with: Cell::new(with),
Expand Down Expand Up @@ -534,9 +539,14 @@ impl DeclarativeEnvironmentStack {
)
};

let mut bindings = vec![None; num_bindings];
for index in compile_environment.borrow().var_binding_indices() {
bindings[index] = Some(JsValue::Undefined);
}

self.stack
.push(Environment::Declarative(Gc::new(DeclarativeEnvironment {
bindings: GcRefCell::new(vec![None; num_bindings]),
bindings: GcRefCell::new(bindings),
compile: compile_environment,
poisoned: Cell::new(poisoned),
with: Cell::new(with),
Expand Down

0 comments on commit d9fd074

Please sign in to comment.