comparison src/share/vm/code/codeBlob.hpp @ 1299:9eba43136cb5

6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob Summary: Passing a null pointer to an InvokeDynamic function call should lead to a NullPointerException. Reviewed-by: kvn, never
author twisti
date Tue, 16 Mar 2010 11:52:17 +0100
parents 4e6abf09f540
children c18cbe5936b8 1a5913bf5e19
comparison
equal deleted inserted replaced
1298:da06d1795d84 1299:9eba43136cb5
1 /* 1 /*
2 * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved. 2 * Copyright 1998-2010 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
88 88
89 // Deletion 89 // Deletion
90 void flush(); 90 void flush();
91 91
92 // Typing 92 // Typing
93 virtual bool is_buffer_blob() const { return false; } 93 virtual bool is_buffer_blob() const { return false; }
94 virtual bool is_nmethod() const { return false; } 94 virtual bool is_nmethod() const { return false; }
95 virtual bool is_runtime_stub() const { return false; } 95 virtual bool is_runtime_stub() const { return false; }
96 virtual bool is_deoptimization_stub() const { return false; } 96 virtual bool is_deoptimization_stub() const { return false; }
97 virtual bool is_uncommon_trap_stub() const { return false; } 97 virtual bool is_uncommon_trap_stub() const { return false; }
98 virtual bool is_exception_stub() const { return false; } 98 virtual bool is_exception_stub() const { return false; }
99 virtual bool is_safepoint_stub() const { return false; } 99 virtual bool is_safepoint_stub() const { return false; }
100 virtual bool is_adapter_blob() const { return false; } 100 virtual bool is_adapter_blob() const { return false; }
101 virtual bool is_method_handles_adapter_blob() const { return false; }
101 102
102 virtual bool is_compiled_by_c2() const { return false; } 103 virtual bool is_compiled_by_c2() const { return false; }
103 virtual bool is_compiled_by_c1() const { return false; } 104 virtual bool is_compiled_by_c1() const { return false; }
104 105
105 // Casting 106 // Casting
219 //---------------------------------------------------------------------------------------------------- 220 //----------------------------------------------------------------------------------------------------
220 // BufferBlob: used to hold non-relocatable machine code such as the interpreter, stubroutines, etc. 221 // BufferBlob: used to hold non-relocatable machine code such as the interpreter, stubroutines, etc.
221 222
222 class BufferBlob: public CodeBlob { 223 class BufferBlob: public CodeBlob {
223 friend class VMStructs; 224 friend class VMStructs;
225 friend class AdapterBlob;
226 friend class MethodHandlesAdapterBlob;
227
224 private: 228 private:
225 // Creation support 229 // Creation support
226 BufferBlob(const char* name, int size); 230 BufferBlob(const char* name, int size);
227 BufferBlob(const char* name, int size, CodeBuffer* cb); 231 BufferBlob(const char* name, int size, CodeBuffer* cb);
228 232
234 static BufferBlob* create(const char* name, CodeBuffer* cb); 238 static BufferBlob* create(const char* name, CodeBuffer* cb);
235 239
236 static void free(BufferBlob* buf); 240 static void free(BufferBlob* buf);
237 241
238 // Typing 242 // Typing
239 bool is_buffer_blob() const { return true; } 243 virtual bool is_buffer_blob() const { return true; }
240 bool is_adapter_blob() const;
241 244
242 // GC/Verification support 245 // GC/Verification support
243 void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f) { /* nothing to do */ } 246 void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f) { /* nothing to do */ }
244 bool is_alive() const { return true; } 247 bool is_alive() const { return true; }
245 void do_unloading(BoolObjectClosure* is_alive, 248 void do_unloading(BoolObjectClosure* is_alive,
249 void oops_do(OopClosure* f) { /* do nothing*/ } 252 void oops_do(OopClosure* f) { /* do nothing*/ }
250 253
251 void verify(); 254 void verify();
252 void print() const PRODUCT_RETURN; 255 void print() const PRODUCT_RETURN;
253 void print_value_on(outputStream* st) const PRODUCT_RETURN; 256 void print_value_on(outputStream* st) const PRODUCT_RETURN;
257 };
258
259
260 //----------------------------------------------------------------------------------------------------
261 // AdapterBlob: used to hold C2I/I2C adapters
262
263 class AdapterBlob: public BufferBlob {
264 private:
265 AdapterBlob(int size) : BufferBlob("I2C/C2I adapters", size) {}
266 AdapterBlob(int size, CodeBuffer* cb) : BufferBlob("I2C/C2I adapters", size, cb) {}
267
268 public:
269 // Creation
270 static AdapterBlob* create(CodeBuffer* cb);
271
272 // Typing
273 virtual bool is_adapter_blob() const { return true; }
274 };
275
276
277 //----------------------------------------------------------------------------------------------------
278 // MethodHandlesAdapterBlob: used to hold MethodHandles adapters
279
280 class MethodHandlesAdapterBlob: public BufferBlob {
281 private:
282 MethodHandlesAdapterBlob(int size) : BufferBlob("MethodHandles adapters", size) {}
283 MethodHandlesAdapterBlob(int size, CodeBuffer* cb) : BufferBlob("MethodHandles adapters", size, cb) {}
284
285 public:
286 // Creation
287 static MethodHandlesAdapterBlob* create(int buffer_size);
288
289 // Typing
290 virtual bool is_method_handles_adapter_blob() const { return true; }
254 }; 291 };
255 292
256 293
257 //---------------------------------------------------------------------------------------------------- 294 //----------------------------------------------------------------------------------------------------
258 // RuntimeStub: describes stubs used by compiled code to call a (static) C++ runtime routine 295 // RuntimeStub: describes stubs used by compiled code to call a (static) C++ runtime routine