private void NewObj()
{
var inst = _instructions[_instructionPtr];
var memberRef = ((MethodReference)inst.Operand);
var type = _classLoader.LoadTypeFromTypeRef(memberRef.DeclaringType);
var resolvedCtor = memberRef.Resolve();
if (resolvedCtor.IsStatic || resolvedCtor.IsAbstract)
{
ThrowHelper.VerificationError("newobj on static or abstract method");
}
// There are four cases:
// 1) Value types (ordinary constructor, resulting VALUECLASS pushed)
// 2) String (var-args constructor, result automatically pushed)
// 3) MDArray (var-args constructor, resulting OBJECTREF pushed)
// 4) Reference types (ordinary constructor, resulting OBJECTREF pushed)
var classInfo = memberRef.DeclaringType;
if (classInfo.IsValueType)
{
// Value type
throw ThrowHelper.NotImplementedYet;
}
else if (classInfo.Namespace == "System" && classInfo.Name == "String") // TODO: move to method table
{
// For a VAROBJSIZE class (currently == String), pass NULL as this to "pseudo-constructor."
throw ThrowHelper.NotImplementedYet;
}
else
{
ObjectInstance thisArgObj = null;
if (classInfo.IsArray)
{
// Array
throw ThrowHelper.NotImplementedYet;
}
else
{
// Reference
thisArgObj = PetitClrRuntime.AllocateObject(type);
DoCallWork(false, thisArgObj, resolvedCtor);
}
_opStack.Push(thisArgObj);
}
}