Oop* __fastcall Interpreter::primitiveMakePoint(CompiledMethod&, unsigned argCount) { Oop* sp = m_registers.m_stackPointer; Oop oopReceiver = *(sp-argCount); if (!ObjectMemory::isBehavior(oopReceiver)) return primitiveFailure(0); BehaviorOTE* oteClass = reinterpret_cast<BehaviorOTE*>(oopReceiver); Behavior* behavior = oteClass->m_location; if (behavior->isBytes()) return primitiveFailure(1); size_t minSize = behavior->fixedFields(); size_t i; if (behavior->isIndexable()) { i = max(minSize, argCount); } else { if (argCount > minSize) { // Not indexable, and too many fields return primitiveFailure(2); } i = minSize; } // Note that instantiateClassWithPointers counts up the class, PointersOTE* oteObj = ObjectMemory::newUninitializedPointerObject(oteClass, i); VariantObject* obj = oteObj->m_location; // nil out any extra fields const Oop nil = reinterpret_cast<Oop>(Pointers.Nil); while (i > argCount) { obj->m_fields[--i] = nil; } while (i != 0) { i--; Oop oopArg = *sp--; ObjectMemory::countUp(oopArg); obj->m_fields[i] = oopArg; } // Save down SP in case ZCT is reconciled on adding result, allowing unref'd args to be reclaimed m_registers.m_stackPointer = sp; *sp = reinterpret_cast<Oop>(oteObj); ObjectMemory::AddToZct((OTE*)oteObj); return sp; }
BOOL __fastcall Interpreter::primitiveMakePoint(CompiledMethod&, unsigned argCount) { Oop oopReceiver = stackValue(argCount); if (!ObjectMemory::isBehavior(oopReceiver)) return primitiveFailure(0); BehaviorOTE* oteClass = reinterpret_cast<BehaviorOTE*>(oopReceiver); Behavior* behavior = oteClass->m_location; if (behavior->isBytes()) return primitiveFailure(1); MWORD oops = argCount; if (behavior->isIndexable()) { oops += behavior->fixedFields(); } else { if (behavior->fixedFields() != oops) return primitiveFailure(2); } // Note that instantiateClassWithPointers counts up the class, PointersOTE* oteObj = ObjectMemory::newPointerObject(oteClass, oops); VariantObject* obj = oteObj->m_location; for (int i=oops-1;i>=0;i--) { Oop oopArg = popStack(); ObjectMemory::countUp(oopArg); obj->m_fields[i] = oopArg; } replaceStackTopWithNew(oteObj); return TRUE; }