[vmkit-commits] [vmkit] r198260 - some cleanup

Gael Thomas gael.thomas at lip6.fr
Tue Dec 31 00:16:09 PST 2013


Author: gthomas
Date: Tue Dec 31 02:16:09 2013
New Revision: 198260

URL: http://llvm.org/viewvc/llvm-project?rev=198260&view=rev
Log:
some cleanup

Added:
    vmkit/branches/mcjit/include/j3/j3attribute.h
    vmkit/branches/mcjit/include/j3/j3field.h
    vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc
    vmkit/branches/mcjit/lib/j3/vm/j3field.cc
Modified:
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3object.cc

Added: vmkit/branches/mcjit/include/j3/j3attribute.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3attribute.h?rev=198260&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3attribute.h (added)
+++ vmkit/branches/mcjit/include/j3/j3attribute.h Tue Dec 31 02:16:09 2013
@@ -0,0 +1,39 @@
+#ifndef _J3_ATTRIBUTE_H_
+#define _J3_ATTRIBUTE_H_
+
+#include "vmkit/allocator.h"
+
+namespace vmkit {
+	class Name;
+}
+
+namespace j3 {
+	class J3Attribute : public vmkit::PermanentObject {
+		friend class J3Class;
+
+		const vmkit::Name* _id;
+		uint32_t           _offset;
+	public:
+		
+		const vmkit::Name* id() { return _id; }
+		uint32_t           offset() { return _offset; }
+	};
+
+	class J3Attributes : public vmkit::PermanentObject {
+		size_t       _nbAttributes;
+		J3Attribute  _attributes[1];
+	public:
+		J3Attributes(size_t n) { _nbAttributes = n; }
+
+		void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) {
+			return vmkit::PermanentObject::operator new(sizeof(J3Attributes) + (n - 1) * sizeof(J3Attribute), allocator);
+		}
+
+		size_t       nbAttributes() { return _nbAttributes; }
+		J3Attribute* attribute(size_t n);
+		
+		J3Attribute* lookup(const vmkit::Name* attr);
+	};
+}
+
+#endif

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198260&r1=198259&r2=198260&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Dec 31 02:16:09 2013
@@ -29,6 +29,14 @@ namespace j3 {
 	class J3ObjectType;
 	class J3Method;
 	class J3Field;
+	class J3Attributes;
+
+	class J3InterfaceSlotDescriptor {
+	public:
+		uint32_t   nbMethods;
+		J3Method** methods;
+	};
+
 
 	class J3Type : public vmkit::Symbol {
 		pthread_mutex_t        _mutex;
@@ -94,71 +102,14 @@ namespace j3 {
 		virtual bool                isLayout() { return 0; }
 		virtual bool                isClass() { return 0; }
 		virtual bool                isPrimitive() { return 0; }
+
 		virtual llvm::Type*         llvmType() = 0;
 
 		void dump();
 	};
 
-	class J3Attribute : public vmkit::PermanentObject {
-		friend class J3Class;
-
-		const vmkit::Name* _id;
-		uint32_t           _offset;
-	public:
-		
-		const vmkit::Name* id() { return _id; }
-		uint32_t           offset() { return _offset; }
-	};
-
-	class J3Attributes : public vmkit::PermanentObject {
-		size_t       _nbAttributes;
-		J3Attribute  _attributes[1];
-	public:
-		J3Attributes(size_t n) { _nbAttributes = n; }
-
-		void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) {
-			return vmkit::PermanentObject::operator new(sizeof(J3Attributes) + (n - 1) * sizeof(J3Attribute), allocator);
-		}
-
-		size_t       nbAttributes() { return _nbAttributes; }
-		J3Attribute* attribute(size_t n);
-		
-		J3Attribute* lookup(const vmkit::Name* attr);
-	};
-
-	class J3Field : public vmkit::PermanentObject {
-		friend class J3Class;
-
-		J3Layout*          _layout;
-		uint16_t           _access;
-		const vmkit::Name* _name;
-		J3Type*            _type;
-		J3Attributes*      _attributes;
-		uintptr_t          _offset;
-
-	public:
-		J3Field() {}
-		J3Field(uint16_t access, const vmkit::Name* name, J3Type* type) { _access = access; _name = name; _type = type; }
-
-		J3Attributes*      attributes() const { return _attributes; }
-		uint16_t           access() { return _access; }
-		J3Layout*          layout()  { return _layout; }
-		const vmkit::Name* name() { return _name; }
-		J3Type*            type() { return _type; }
-
-		uintptr_t          offset() { return _offset; }
-
-		void               dump();
-	};
-
-	class J3InterfaceSlotDescriptor {
-	public:
-		uint32_t   nbMethods;
-		J3Method** methods;
-	};
-
 	class J3ObjectType : public J3Type {
-		J3ObjectHandle*           _javaClass;
+		J3ObjectHandle* volatile  _javaClass;
 		J3InterfaceSlotDescriptor _interfaceSlotDescriptors[J3VirtualTable::nbInterfaceMethodTable];
 
 	public:
@@ -185,10 +136,12 @@ namespace j3 {
 	class J3Layout : public J3ObjectType {
 		friend class J3Class;
 
-		size_t            nbFields;
-		J3Field*          fields;
+		size_t            _nbFields;
+		size_t            _nbPublicFields;
+		J3Field*          _fields;
 		
 		size_t            _nbMethods;
+		size_t            _nbPublicMethods;
 		J3Method**        _methods;
 
 		uintptr_t         _structSize;
@@ -199,7 +152,12 @@ namespace j3 {
 
 		uintptr_t         structSize();
 
+		size_t            nbFields() { return _nbFields; }
+		size_t            nbPublicFields() { return _nbPublicFields; }
+		J3Field*          fields() { return _fields; }
+
 		size_t            nbMethods() { return _nbMethods; }
+		size_t            nbPublicMethods() { return _nbPublicMethods; }
 		J3Method**        methods() { return _methods; }
 
 		J3Method*         findMethod(const vmkit::Name* name, const vmkit::Name* sign);
@@ -217,7 +175,7 @@ namespace j3 {
 	};
 
 	class J3Class : public J3Layout {
-		J3StaticLayout     staticLayout;
+		J3StaticLayout     _staticLayout;
 
 		uint16_t           _access;
 
@@ -252,6 +210,8 @@ namespace j3 {
 	public:
 		J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes);
 
+		J3StaticLayout*     staticLayout() { return &_staticLayout; }
+
 		size_t              nbInterfaces() { return _nbInterfaces; }
 		J3Class**           interfaces() { return _interfaces; }
 		J3Class*            super() { return _super; }

Added: vmkit/branches/mcjit/include/j3/j3field.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3field.h?rev=198260&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3field.h (added)
+++ vmkit/branches/mcjit/include/j3/j3field.h Tue Dec 31 02:16:09 2013
@@ -0,0 +1,44 @@
+#ifndef _J3_FIELD_H_
+#define _J3_FIELD_H_
+
+#include "vmkit/allocator.h"
+
+namespace vmkit {
+	class Name;
+}
+
+namespace j3 {
+	class J3Layout;
+	class J3Type;
+	class J3Attributes;
+	class J3ObjectHandle;
+
+	class J3Field : public vmkit::PermanentObject {
+		friend class J3Class;
+
+		J3Layout*                 _layout;
+		uint16_t                  _access;
+		const vmkit::Name*        _name;
+		J3Type*                   _type;
+		J3Attributes*             _attributes;
+		uintptr_t                 _offset;
+		J3ObjectHandle* volatile  _javaField;
+
+	public:
+		J3Field() {}
+		J3Field(uint16_t access, const vmkit::Name* name, J3Type* type) { _access = access; _name = name; _type = type; }
+
+		J3ObjectHandle*    javaField();
+		J3Attributes*      attributes() const { return _attributes; }
+		uint16_t           access() { return _access; }
+		J3Layout*          layout()  { return _layout; }
+		const vmkit::Name* name() { return _name; }
+		J3Type*            type() { return _type; }
+
+		uintptr_t          offset() { return _offset; }
+
+		void               dump();
+	};
+}
+
+#endif

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198260&r1=198259&r2=198260&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Tue Dec 31 02:16:09 2013
@@ -4,6 +4,8 @@
 #include "j3/j3classloader.h"
 #include "j3/j3class.h"
 #include "j3/j3method.h"
+#include "j3/j3constants.h"
+#include "j3/j3field.h"
 #include "jvm.h"
 
 using namespace j3;
@@ -385,11 +387,31 @@ jbyteArray JNICALL JVM_GetClassTypeAnnot
 
 jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); }
 jobjectArray JNICALL JVM_GetClassDeclaredFields(JNIEnv* env, jclass ofClass, jboolean publicOnly) { 
+	jobjectArray res;
+
 	enterJVM(); 
 	J3ObjectType* type = J3ObjectType::nativeClass(ofClass);
 
+	if(type->isClass()) {
+		J3Class* cl = type->asClass();
+		cl->resolve();
+		size_t total = publicOnly ? 
+			cl->nbPublicFields() + cl->staticLayout()->nbPublicFields() :
+			cl->nbFields() + cl->staticLayout()->nbFields();
+
+		res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), total);
+
+		size_t cur = 0;
+		for(uint32_t i=0; i<cl->nbFields(); i++)
+			if(!publicOnly || J3Cst::isPublic(cl->fields()[i].access()))
+				res->setObjectAt(i, cl->fields()[i].javaField());
+	} else
+		res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0);
+
 	NYI(); 
-	leaveJVM(); 
+	leaveJVM();
+ 
+	return res;
 }
 
 jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=198260&r1=198259&r2=198260&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Tue Dec 31 02:16:09 2013
@@ -10,6 +10,7 @@
 #include "j3/j3thread.h"
 #include "j3/j3trampoline.h"
 #include "j3/j3lib.h"
+#include "j3/j3field.h"
 
 #include "llvm/IR/Type.h"
 #include "llvm/IR/DerivedTypes.h"

Added: vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc?rev=198260&view=auto
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc (added)
+++ vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc Tue Dec 31 02:16:09 2013
@@ -0,0 +1,20 @@
+#include "j3/j3attribute.h"
+#include "j3/j3.h"
+
+using namespace j3;
+
+J3Attribute* J3Attributes::attribute(size_t n) { 
+	if(n >= _nbAttributes)
+		J3::internalError(L"should not happen");
+	return _attributes + n; 
+}
+
+J3Attribute* J3Attributes::lookup(const vmkit::Name* id) {
+	for(size_t i=0; i<_nbAttributes; i++) {
+		if(_attributes[i].id() == id)
+			return _attributes+i;
+	}
+
+	return 0;
+}
+

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198260&r1=198259&r2=198260&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Dec 31 02:16:09 2013
@@ -15,6 +15,8 @@
 #include "j3/j3mangler.h"
 #include "j3/j3object.h"
 #include "j3/j3thread.h"
+#include "j3/j3field.h"
+#include "j3/j3attribute.h"
 
 using namespace j3;
 
@@ -170,8 +172,8 @@ J3ObjectHandle* J3ObjectType::javaClass(
 			J3ObjectHandle* prev = J3Thread::get()->tell();
 			_javaClass = loader()->globalReferences()->add(J3ObjectHandle::doNewObject(loader()->vm()->classClass));
 			J3Thread::get()->restore(prev);
-			_javaClass->setLong(loader()->vm()->classVMData, (int64_t)(uintptr_t)this);
-			loader()->vm()->classInit->invokeSpecial(_javaClass);
+			javaClass()->setLong(loader()->vm()->classVMData, (int64_t)(uintptr_t)this);
+			loader()->vm()->classInit->invokeSpecial(javaClass());
 		}
 		unlock();
 	}
@@ -268,8 +270,8 @@ J3Method* J3Layout::findMethod(const vmk
 }
 
 J3Field* J3Layout::findField(const vmkit::Name* name, const J3Type* type) {
-	for(size_t i=0; i<nbFields; i++) {
-		J3Field* cur = fields + i;
+	for(size_t i=0; i<nbFields(); i++) {
+		J3Field* cur = fields() + i;
 
 		//printf("Compare %ls - %ls\n", cur->name()->cStr(), cur->type()->name()->cStr());
 		//printf("  with  %ls - %ls\n", name->cStr(), type->name()->cStr());
@@ -285,7 +287,7 @@ J3Field* J3Layout::findField(const vmkit
  */
 J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes) : 
 	J3Layout(loader, name), 
-	staticLayout(loader, this, name){
+	_staticLayout(loader, this, name){
 	_bytes = bytes;
 	status = LOADED;
 }
@@ -319,7 +321,7 @@ J3Method* J3Class::findStaticMethod(cons
 	J3Class* cur = this;
 	J3Method* res;
 	while(1) {
-		res = cur->staticLayout.findMethod(name, sign);
+		res = cur->staticLayout()->findMethod(name, sign);
 
 		if(res)
 			return res;
@@ -352,7 +354,7 @@ J3Field* J3Class::findStaticField(const
 	//fprintf(stderr, "Lookup static field %ls %ls::%ls\n", ftype->name()->cStr(), name()->cStr(), fname->cStr());
 	resolve();
 
-	J3Field* res = staticLayout.findField(fname, ftype);
+	J3Field* res = staticLayout()->findField(fname, ftype);
 
 	if(!res)
 		J3::internalError(L"implement me");
@@ -362,7 +364,7 @@ J3Field* J3Class::findStaticField(const
 
 void J3Class::registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr) {
 	resolve();
-	J3Method* res = staticLayout.findMethod(methName, methSign);
+	J3Method* res = staticLayout()->findMethod(methName, methSign);
 	if(!res)
 		res = findMethod(methName, methSign);
 	if(!res || !J3Cst::isNative(res->access()))
@@ -389,13 +391,13 @@ void J3Class::doInitialise() {
 			interfaces()[i]->initialise();
 
 		J3ObjectHandle* prev = J3Thread::get()->tell();
-		J3ObjectHandle* stacked = J3ObjectHandle::allocate(staticLayout.vt(), staticLayout.structSize());
+		J3ObjectHandle* stacked = J3ObjectHandle::allocate(staticLayout()->vt(), staticLayout()->structSize());
 
 		_staticInstance = loader()->globalReferences()->add(stacked);
 		J3Thread::get()->restore(prev);
 
-		for(size_t i=0; i<staticLayout.nbFields; i++) {
-			J3Field* cur = staticLayout.fields + i;
+		for(size_t i=0; i<staticLayout()->nbFields(); i++) {
+			J3Field* cur = staticLayout()->fields() + i;
 			J3Attribute* attr = cur->attributes()->lookup(loader()->vm()->constantValueAttr);
 
 			if(attr) {
@@ -420,7 +422,7 @@ void J3Class::doInitialise() {
 			}
 		}
 
-		J3Method* clinit = staticLayout.findMethod(loader()->vm()->clinitName, loader()->vm()->clinitSign);
+		J3Method* clinit = staticLayout()->findMethod(loader()->vm()->clinitName, loader()->vm()->clinitSign);
 			
 		if(clinit)
 			clinit->invokeStatic();
@@ -437,7 +439,7 @@ void J3Class::doResolve(J3Field* hiddenF
 		status = RESOLVED;
 		readClassBytes(hiddenFields, nbHiddenFields);
 		
-		staticLayout._vt = J3VirtualTable::create(&staticLayout);
+		staticLayout()->_vt = J3VirtualTable::create(staticLayout());
 
 		_vt = J3VirtualTable::create(this);
 
@@ -522,16 +524,16 @@ void J3Class::readClassBytes(J3Field* hi
 	}
 
 	size_t   n = nbHiddenFields + reader.readU2(), nbStaticFields = 0, nbVirtualFields = 0;
-	fields = (J3Field*)alloca(sizeof(J3Field)*n);
+	_fields = (J3Field*)alloca(sizeof(J3Field)*n);
 	J3Field* pFields0[n]; size_t i0 = 0; /* sort fields by reverse size */
 	J3Field* pFields1[n]; size_t i1 = 0;
 	J3Field* pFields2[n]; size_t i2 = 0;
 	J3Field* pFields3[n]; size_t i3 = 0;
 
-	memset(fields, 0, sizeof(J3Field)*n);
+	memset(fields(), 0, sizeof(J3Field)*n);
 	
 	for(size_t i=0; i<n; i++) {
-		J3Field* f = fields + i;
+		J3Field* f = fields() + i;
 
 		if(i < nbHiddenFields) {
 			f->_access     = hiddenFields[i].access();
@@ -546,7 +548,7 @@ void J3Class::readClassBytes(J3Field* hi
 		}
 
 		if(J3Cst::isStatic(f->access())) {
-			f->_layout = &staticLayout;
+			f->_layout = staticLayout();
 			nbStaticFields++;
 		} else {
 			f->_layout = this;
@@ -562,8 +564,8 @@ void J3Class::readClassBytes(J3Field* hi
 		}
 	}
 
-	staticLayout.fields = new(loader()->allocator()) J3Field[nbStaticFields];
-	fields = new(loader()->allocator()) J3Field[nbVirtualFields];
+	staticLayout()->_fields = new(loader()->allocator()) J3Field[nbStaticFields];
+	_fields = new(loader()->allocator()) J3Field[nbVirtualFields];
 
 	if(super() == this)
 		_structSize = sizeof(J3Object);
@@ -601,16 +603,18 @@ void J3Class::readClassBytes(J3Field* hi
 			nbVirtualMethods++;
 	}
 
-	staticLayout._methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbStaticMethods);
+	staticLayout()->_methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbStaticMethods);
 	_methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbVirtualMethods);
 
 	for(int i=0; i<n; i++) {
 		J3Layout* layout;
 		if(J3Cst::isStatic(methodsTmp[i]->access()))
-			layout = &staticLayout;
+			layout = staticLayout();
 		else
 			layout = this;
 		layout->_methods[layout->_nbMethods++] = methodsTmp[i];
+		if(J3Cst::isPublic(methodsTmp[i]->access()))
+			layout->_nbPublicMethods++;
 	}
 
 	_attributes = readAttributes(&reader);
@@ -623,13 +627,16 @@ void J3Class::fillFields(J3Field** field
 
 		if(J3Cst::isStatic(fields[i]->access())) {
 			//fprintf(stderr, "   adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr());
-			layout = &staticLayout;
+			layout = staticLayout();
 		} else {
 			layout = this;
 		}
 		cur->_offset = layout->structSize();
 		layout->_structSize += 1 << fields[i]->type()->logSize();
-		layout->fields[layout->nbFields++] = *fields[i];
+		layout->fields()[layout->_nbFields++] = *fields[i];
+
+		if(J3Cst::isPublic(fields[i]->access()))
+			layout->_nbPublicFields++;
 	}
 }
 
@@ -802,26 +809,6 @@ void J3Class::doNativeName() {
 	loader()->addSymbol(_nativeName, this);
 }
 
-void J3Field::dump() {
-	printf("Field: %ls %ls::%ls (%d)\n", type()->name()->cStr(), layout()->name()->cStr(), name()->cStr(), access());
-}
-
-
-J3Attribute* J3Attributes::attribute(size_t n) { 
-	if(n >= _nbAttributes)
-		J3::internalError(L"should not happen");
-	return _attributes + n; 
-}
-
-J3Attribute* J3Attributes::lookup(const vmkit::Name* id) {
-	for(size_t i=0; i<_nbAttributes; i++) {
-		if(_attributes[i].id() == id)
-			return _attributes+i;
-	}
-
-	return 0;
-}
-
 /*  
  *  ------------ J3ArrayClass ------------
  */

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=198260&r1=198259&r2=198260&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Dec 31 02:16:09 2013
@@ -11,6 +11,8 @@
 #include "j3/j3mangler.h"
 #include "j3/j3jni.h"
 #include "j3/j3object.h"
+#include "j3/j3field.h"
+#include "j3/j3attribute.h"
 
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
 

Added: vmkit/branches/mcjit/lib/j3/vm/j3field.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198260&view=auto
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (added)
+++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Tue Dec 31 02:16:09 2013
@@ -0,0 +1,21 @@
+#include "j3/j3field.h"
+#include "j3/j3class.h"
+#include "j3/j3classloader.h"
+#include "j3/j3.h"
+
+using namespace j3;
+
+J3ObjectHandle* J3Field::javaField() {
+	if(!_javaField) {
+		layout()->lock();
+		_javaField = J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass);
+		J3::internalError(L"implement me: javaField");
+		layout()->unlock();
+	}
+	return _javaField;
+}
+
+void J3Field::dump() {
+	printf("Field: %ls %ls::%ls (%d)\n", type()->name()->cStr(), layout()->name()->cStr(), name()->cStr(), access());
+}
+

Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=198260&r1=198259&r2=198260&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Tue Dec 31 02:16:09 2013
@@ -14,6 +14,7 @@
 #include "j3/j3constants.h"
 #include "j3/j3thread.h"
 #include "j3/j3monitor.h"
+#include "j3/j3field.h"
 
 using namespace j3;
 
@@ -455,11 +456,11 @@ void J3ObjectHandle::rawArrayCopyTo(uint
 }
 
 void J3ObjectHandle::rawSetObject(uint32_t offset, J3ObjectHandle* value) {
-	*((J3Object**)((uintptr_t)obj() + offset)) = value->obj();
+	*((J3Object**)((uintptr_t)obj() + offset)) = value ? value->obj() : 0;
 }
 
 J3ObjectHandle* J3ObjectHandle::rawGetObject(uint32_t offset) {
-	return J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset)));
+	return obj() ? J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset))) : 0;
 }
 
 void J3ObjectHandle::setObject(J3Field* field, J3ObjectHandle* value) {





More information about the vmkit-commits mailing list