298 /* end*/ 299 300 #define START_CLASS(name) \ 301 class name : AllStatic { \ 302 private: \ 303 friend class JVMCICompiler; \ 304 static void check(oop obj, const char* field_name, int offset) { \ 305 assert(obj != NULL, "NULL field access of %s.%s", #name, field_name); \ 306 assert(obj->is_a(SystemDictionary::name##_klass()), "wrong class, " #name " expected, found %s", obj->klass()->external_name()); \ 307 assert(offset != 0, "must be valid offset"); \ 308 } \ 309 static void compute_offsets(); \ 310 public: \ 311 static InstanceKlass* klass() { return SystemDictionary::name##_klass() == NULL ? NULL : InstanceKlass::cast(SystemDictionary::name##_klass()); } 312 313 #define END_CLASS }; 314 315 #define FIELD(name, type, accessor, cast) \ 316 static int _##name##_offset; \ 317 static type name(oop obj) { check(obj, #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \ 318 static type name(Handle& obj) { check(obj(), #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \ 319 static type name(jobject obj) { check(JNIHandles::resolve(obj), #name, _##name##_offset); return cast JNIHandles::resolve(obj)->accessor(_##name##_offset); } \ 320 static void set_##name(oop obj, type x) { check(obj, #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \ 321 static void set_##name(Handle& obj, type x) { check(obj(), #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \ 322 static void set_##name(jobject obj, type x) { check(JNIHandles::resolve(obj), #name, _##name##_offset); JNIHandles::resolve(obj)->accessor##_put(_##name##_offset, x); } 323 324 #define EMPTY_CAST 325 #define CHAR_FIELD(klass, name) FIELD(name, jchar, char_field, EMPTY_CAST) 326 #define INT_FIELD(klass, name) FIELD(name, jint, int_field, EMPTY_CAST) 327 #define BOOLEAN_FIELD(klass, name) FIELD(name, jboolean, bool_field, EMPTY_CAST) 328 #define LONG_FIELD(klass, name) FIELD(name, jlong, long_field, EMPTY_CAST) 329 #define FLOAT_FIELD(klass, name) FIELD(name, jfloat, float_field, EMPTY_CAST) 330 #define OOP_FIELD(klass, name, signature) FIELD(name, oop, obj_field, EMPTY_CAST) 331 #define OBJARRAYOOP_FIELD(klass, name, signature) FIELD(name, objArrayOop, obj_field, (objArrayOop)) 332 #define TYPEARRAYOOP_FIELD(klass, name, signature) FIELD(name, typeArrayOop, obj_field, (typeArrayOop)) 333 #define STATIC_OOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, oop, signature) 334 #define STATIC_OBJARRAYOOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, objArrayOop, signature) 335 #define STATIC_OOPISH_FIELD(klassName, name, type, signature) \ 336 static int _##name##_offset; \ 337 static type name() { \ 338 assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \ 339 InstanceKlass* ik = klassName::klass(); \ 340 address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields()); \ 341 if (UseCompressedOops) { \ | 298 /* end*/ 299 300 #define START_CLASS(name) \ 301 class name : AllStatic { \ 302 private: \ 303 friend class JVMCICompiler; \ 304 static void check(oop obj, const char* field_name, int offset) { \ 305 assert(obj != NULL, "NULL field access of %s.%s", #name, field_name); \ 306 assert(obj->is_a(SystemDictionary::name##_klass()), "wrong class, " #name " expected, found %s", obj->klass()->external_name()); \ 307 assert(offset != 0, "must be valid offset"); \ 308 } \ 309 static void compute_offsets(); \ 310 public: \ 311 static InstanceKlass* klass() { return SystemDictionary::name##_klass() == NULL ? NULL : InstanceKlass::cast(SystemDictionary::name##_klass()); } 312 313 #define END_CLASS }; 314 315 #define FIELD(name, type, accessor, cast) \ 316 static int _##name##_offset; \ 317 static type name(oop obj) { check(obj, #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \ 318 static type name(Handle obj) { check(obj(), #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \ 319 static type name(jobject obj) { check(JNIHandles::resolve(obj), #name, _##name##_offset); return cast JNIHandles::resolve(obj)->accessor(_##name##_offset); } \ 320 static void set_##name(oop obj, type x) { check(obj, #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \ 321 static void set_##name(Handle obj, type x) { check(obj(), #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \ 322 static void set_##name(jobject obj, type x) { check(JNIHandles::resolve(obj), #name, _##name##_offset); JNIHandles::resolve(obj)->accessor##_put(_##name##_offset, x); } 323 324 #define EMPTY_CAST 325 #define CHAR_FIELD(klass, name) FIELD(name, jchar, char_field, EMPTY_CAST) 326 #define INT_FIELD(klass, name) FIELD(name, jint, int_field, EMPTY_CAST) 327 #define BOOLEAN_FIELD(klass, name) FIELD(name, jboolean, bool_field, EMPTY_CAST) 328 #define LONG_FIELD(klass, name) FIELD(name, jlong, long_field, EMPTY_CAST) 329 #define FLOAT_FIELD(klass, name) FIELD(name, jfloat, float_field, EMPTY_CAST) 330 #define OOP_FIELD(klass, name, signature) FIELD(name, oop, obj_field, EMPTY_CAST) 331 #define OBJARRAYOOP_FIELD(klass, name, signature) FIELD(name, objArrayOop, obj_field, (objArrayOop)) 332 #define TYPEARRAYOOP_FIELD(klass, name, signature) FIELD(name, typeArrayOop, obj_field, (typeArrayOop)) 333 #define STATIC_OOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, oop, signature) 334 #define STATIC_OBJARRAYOOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, objArrayOop, signature) 335 #define STATIC_OOPISH_FIELD(klassName, name, type, signature) \ 336 static int _##name##_offset; \ 337 static type name() { \ 338 assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \ 339 InstanceKlass* ik = klassName::klass(); \ 340 address addr = ik->static_field_addr(_##name##_offset - InstanceMirrorKlass::offset_of_static_fields()); \ 341 if (UseCompressedOops) { \ |