Hi all.
I'm trying to understand how resolve_global instruction works for several days. Let's look at the code
// Fast case
void* globalObject = m_codeBlock->globalObject();
unsigned currentIndex = m_globalResolveInfoIndex++;
GlobalResolveInfo* resolveInfoAddress = &(m_codeBlock->globalResolveInfo(currentIndex));
// Check Structure of global object
move(TrustedImmPtr(globalObject), regT0); //loads address of globalObject to eax(regT0)
move(TrustedImmPtr(resolveInfoAddress), regT2);// loads address of resolveInfoAddress to ecx(regT2)
loadPtr(Address(regT2, OBJECT_OFFSETOF(GlobalResolveInfo, structure)), regT1);
addSlowCase(branchPtr(NotEqual, regT1, Address(regT0, JSCell::structureOffset()))); // Structures don't match // Do some checking
// Load cached property
// Assume that the global object always uses external storage.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSGlobalObject, m_propertyStorage)), regT0); // loads m_propertyStorage to eax
// Here is interesting thing happens
// offset member of GlobalResolveInfo class is always 0;
load32(Address(regT2, OBJECT_OFFSETOF(GlobalResolveInfo, offset)), regT1); //move value of GlobalResolveInfo offset member(it's always 0 ) to edx(regT1)
//So here we always mov same value to eax(regT0), regardless of whether our global Array , String or Object
loadPtr(BaseIndex(regT0, regT1, ScalePtr), regT0);
emitValueProfilingSite();
emitPutVirtualRegister(currentInstruction[1].u.operand);
1. What is mystery of this instruction, how it's really works let's say for this example???
2. What is in m_propertyStorage, and when it's sets?