Mercurial > hg > truffle
comparison src/share/vm/memory/allocation.hpp @ 1685:0e35fa8ebccd
6973963: SEGV in ciBlock::start_bci() with EA
Summary: Added more checks into ResourceObj and growableArray to verify correctness of allocation type.
Reviewed-by: never, coleenp, dholmes
author | kvn |
---|---|
date | Tue, 03 Aug 2010 15:55:03 -0700 |
parents | c18cbe5936b8 |
children | 2dfd013a7465 |
comparison
equal
deleted
inserted
replaced
1684:66c5dadb4d61 | 1685:0e35fa8ebccd |
---|---|
314 // ResourceObj's can be allocated within other objects, but don't use | 314 // ResourceObj's can be allocated within other objects, but don't use |
315 // new or delete (allocation_type is unknown). If new is used to allocate, | 315 // new or delete (allocation_type is unknown). If new is used to allocate, |
316 // use delete to deallocate. | 316 // use delete to deallocate. |
317 class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { | 317 class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { |
318 public: | 318 public: |
319 enum allocation_type { UNKNOWN = 0, C_HEAP, RESOURCE_AREA, ARENA }; | 319 enum allocation_type { STACK_OR_EMBEDDED = 0, RESOURCE_AREA, C_HEAP, ARENA, allocation_mask = 0x3 }; |
320 #ifdef ASSERT | 320 #ifdef ASSERT |
321 private: | 321 private: |
322 allocation_type _allocation; | 322 // When this object is allocated on stack the new() operator is not |
323 public: | 323 // called but garbage on stack may look like a valid allocation_type. |
324 bool allocated_on_C_heap() { return _allocation == C_HEAP; } | 324 // Store negated 'this' pointer when new() is called to distinguish cases. |
325 uintptr_t _allocation; | |
326 public: | |
327 static void set_allocation_type(address res, allocation_type type); | |
328 allocation_type get_allocation_type(); | |
329 bool allocated_on_stack() { return get_allocation_type() == STACK_OR_EMBEDDED; } | |
330 bool allocated_on_res_area() { return get_allocation_type() == RESOURCE_AREA; } | |
331 bool allocated_on_C_heap() { return get_allocation_type() == C_HEAP; } | |
332 bool allocated_on_arena() { return get_allocation_type() == ARENA; } | |
333 ResourceObj(); // default construtor | |
334 ResourceObj(const ResourceObj& r); // default copy construtor | |
335 ResourceObj& operator=(const ResourceObj& r); // default copy assignment | |
336 ~ResourceObj(); | |
325 #endif // ASSERT | 337 #endif // ASSERT |
326 | 338 |
327 public: | 339 public: |
328 void* operator new(size_t size, allocation_type type); | 340 void* operator new(size_t size, allocation_type type); |
329 void* operator new(size_t size, Arena *arena) { | 341 void* operator new(size_t size, Arena *arena) { |
330 address res = (address)arena->Amalloc(size); | 342 address res = (address)arena->Amalloc(size); |
331 // Set allocation type in the resource object | 343 DEBUG_ONLY(set_allocation_type(res, ARENA);) |
332 DEBUG_ONLY(((ResourceObj *)res)->_allocation = ARENA;) | |
333 return res; | 344 return res; |
334 } | 345 } |
335 void* operator new(size_t size) { | 346 void* operator new(size_t size) { |
336 address res = (address)resource_allocate_bytes(size); | 347 address res = (address)resource_allocate_bytes(size); |
337 // Set allocation type in the resource object | 348 DEBUG_ONLY(set_allocation_type(res, RESOURCE_AREA);) |
338 DEBUG_ONLY(((ResourceObj *)res)->_allocation = RESOURCE_AREA;) | |
339 return res; | 349 return res; |
340 } | 350 } |
341 void* operator new(size_t size, void* where, allocation_type type) { | 351 void* operator new(size_t size, void* where, allocation_type type) { |
342 void* res = where; | 352 address res = (address)where; |
343 // Set allocation type in the resource object | 353 DEBUG_ONLY(set_allocation_type(res, type);) |
344 DEBUG_ONLY(((ResourceObj *)res)->_allocation = type;) | |
345 return res; | 354 return res; |
346 } | 355 } |
347 void operator delete(void* p); | 356 void operator delete(void* p); |
348 }; | 357 }; |
349 | 358 |