From 4abf50f217b2d9d62d4d6a9687ccacacac7ba370 Mon Sep 17 00:00:00 2001 From: Haled Odat Date: Sun, 9 Apr 2023 03:33:52 +0200 Subject: [PATCH] Get property while writing inline cache --- boa_engine/src/vm/opcode/get/property.rs | 30 +++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/boa_engine/src/vm/opcode/get/property.rs b/boa_engine/src/vm/opcode/get/property.rs index fe7bcde58db..6e7c12835ab 100644 --- a/boa_engine/src/vm/opcode/get/property.rs +++ b/boa_engine/src/vm/opcode/get/property.rs @@ -69,17 +69,25 @@ impl Operation for GetPropertyByName { // Check if it can be cached. let shape = object_borrowed.properties().shape.clone(); - drop(object_borrowed); - let slot = if let Some(mut slot) = shape.lookup(&key) { + let (slot, mut result) = if let Some(mut slot) = shape.lookup(&key) { slot.attributes |= SlotAttributes::DIRECT; - slot - } else if let Some(mut slot) = shape - .prototype() - .and_then(|prototype| prototype.borrow().properties().shape.lookup(&key)) - { + let result = object_borrowed.properties().storage[slot.index as usize].clone(); + + (slot, result) + } else if let Some(prototype) = shape.prototype() { + let prototype_borrowed = prototype.borrow(); + let Some(mut slot) = prototype_borrowed.properties().shape.lookup(&key) else { + drop(object_borrowed); + drop(prototype_borrowed); + let result = object.__get__(&key, value, context)?; + context.vm.push(result); + return Ok(CompletionType::Normal); + }; + let result = prototype_borrowed.properties().storage[slot.index as usize].clone(); slot.attributes.set(SlotAttributes::DIRECT, false); - slot + (slot, result) } else { + drop(object_borrowed); let result = object.__get__(&key, value, context)?; context.vm.push(result); return Ok(CompletionType::Normal); @@ -93,7 +101,11 @@ impl Operation for GetPropertyByName { *ic.shape.borrow_mut() = Some(shape); - let result = object.__get__(&key, value, context)?; + drop(object_borrowed); + if slot.attributes.has_get() { + result = result.call(&value, &[], context)?; + } + context.vm.push(result); Ok(CompletionType::Normal) }