1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "PointerToMemberValueNode.h" 8 9#include <new> 10 11#include "Architecture.h" 12#include "IntegerValue.h" 13#include "Tracing.h" 14#include "Type.h" 15#include "ValueLoader.h" 16#include "ValueLocation.h" 17 18 19PointerToMemberValueNode::PointerToMemberValueNode(ValueNodeChild* nodeChild, 20 PointerToMemberType* type) 21 : 22 ChildlessValueNode(nodeChild), 23 fType(type) 24{ 25 fType->AcquireReference(); 26} 27 28 29PointerToMemberValueNode::~PointerToMemberValueNode() 30{ 31 fType->ReleaseReference(); 32} 33 34 35Type* 36PointerToMemberValueNode::GetType() const 37{ 38 return fType; 39} 40 41 42status_t 43PointerToMemberValueNode::ResolvedLocationAndValue(ValueLoader* valueLoader, 44 ValueLocation*& _location, Value*& _value) 45{ 46 // get the location 47 ValueLocation* location = NodeChild()->Location(); 48 if (location == NULL) 49 return B_BAD_VALUE; 50 51 TRACE_LOCALS(" TYPE_POINTER_TO_MEMBER\n"); 52 53 // get the value type 54 type_code valueType; 55 if (valueLoader->GetArchitecture()->AddressSize() == 4) { 56 valueType = B_UINT32_TYPE; 57 TRACE_LOCALS(" -> 32 bit\n"); 58 } else { 59 valueType = B_UINT64_TYPE; 60 TRACE_LOCALS(" -> 64 bit\n"); 61 } 62 63 // load the value data 64 BVariant valueData; 65 status_t error = valueLoader->LoadValue(location, valueType, false, 66 valueData); 67 if (error != B_OK) 68 return error; 69 70 // create the type object 71 Value* value = new(std::nothrow) IntegerValue(valueData); 72 if (value == NULL) 73 return B_NO_MEMORY; 74 75 location->AcquireReference(); 76 _location = location; 77 _value = value; 78 return B_OK; 79} 80