< prev index next >
src/share/vm/runtime/javaCalls.hpp
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -78,64 +78,46 @@
private:
enum Constants {
_default_size = 8 // Must be at least # of arguments in JavaCalls methods
};
- intptr_t _value_buffer [_default_size + 1];
- u_char _value_state_buffer[_default_size + 1];
+ intptr_t _value_buffer [_default_size + 1];
+ bool _is_oop_buffer[_default_size + 1];
intptr_t* _value;
- u_char* _value_state;
+ bool* _is_oop;
int _size;
int _max_size;
bool _start_at_zero; // Support late setting of receiver
JVMCI_ONLY(nmethod* _alternative_target;) // Nmethod that should be called instead of normal target
void initialize() {
// Starts at first element to support set_receiver.
- _value = &_value_buffer[1];
- _value_state = &_value_state_buffer[1];
+ _value = &_value_buffer[1];
+ _is_oop = &_is_oop_buffer[1];
_max_size = _default_size;
_size = 0;
_start_at_zero = false;
JVMCI_ONLY(_alternative_target = NULL;)
}
- // Helper for push_oop and the like. The value argument is a
- // "handle" that refers to an oop. We record the address of the
- // handle rather than the designated oop. The handle is later
- // resolved to the oop by parameters(). This delays the exposure of
- // naked oops until it is GC-safe.
- template<typename T>
- inline int push_oop_impl(T handle, int size) {
- // JNITypes::put_obj expects an oop value, so we play fast and
- // loose with the type system. The cast from handle type to oop
- // *must* use a C-style cast. In a product build it performs a
- // reinterpret_cast. In a debug build (more accurately, in a
- // CHECK_UNHANDLED_OOPS build) it performs a static_cast, invoking
- // the debug-only oop class's conversion from void* constructor.
- JNITypes::put_obj((oop)handle, _value, size); // Updates size.
- return size; // Return the updated size.
- }
-
public:
JavaCallArguments() { initialize(); }
JavaCallArguments(Handle receiver) {
initialize();
push_oop(receiver);
}
JavaCallArguments(int max_size) {
if (max_size > _default_size) {
- _value = NEW_RESOURCE_ARRAY(intptr_t, max_size + 1);
- _value_state = NEW_RESOURCE_ARRAY(u_char, max_size + 1);
+ _value = NEW_RESOURCE_ARRAY(intptr_t, max_size + 1);
+ _is_oop = NEW_RESOURCE_ARRAY(bool, max_size + 1);
- // Reserve room for potential receiver in value and state
- _value++;
- _value_state++;
+ // Reserve room for potential receiver in value and is_oop
+ _value++; _is_oop++;
_max_size = max_size;
_size = 0;
_start_at_zero = false;
JVMCI_ONLY(_alternative_target = NULL;)
@@ -152,76 +134,49 @@
nmethod* alternative_target() {
return _alternative_target;
}
#endif
- // The possible values for _value_state elements.
- enum {
- value_state_primitive,
- value_state_oop,
- value_state_handle,
- value_state_jobject,
- value_state_limit
- };
+ inline void push_oop(Handle h) { _is_oop[_size] = true;
+ JNITypes::put_obj((oop)h.raw_value(), _value, _size); }
- inline void push_oop(Handle h) {
- _value_state[_size] = value_state_handle;
- _size = push_oop_impl(h.raw_value(), _size);
- }
+ inline void push_int(int i) { _is_oop[_size] = false;
+ JNITypes::put_int(i, _value, _size); }
- inline void push_jobject(jobject h) {
- _value_state[_size] = value_state_jobject;
- _size = push_oop_impl(h, _size);
- }
+ inline void push_double(double d) { _is_oop[_size] = false; _is_oop[_size + 1] = false;
+ JNITypes::put_double(d, _value, _size); }
- inline void push_int(int i) {
- _value_state[_size] = value_state_primitive;
- JNITypes::put_int(i, _value, _size);
- }
+ inline void push_long(jlong l) { _is_oop[_size] = false; _is_oop[_size + 1] = false;
+ JNITypes::put_long(l, _value, _size); }
- inline void push_double(double d) {
- _value_state[_size] = value_state_primitive;
- _value_state[_size + 1] = value_state_primitive;
- JNITypes::put_double(d, _value, _size);
- }
-
- inline void push_long(jlong l) {
- _value_state[_size] = value_state_primitive;
- _value_state[_size + 1] = value_state_primitive;
- JNITypes::put_long(l, _value, _size);
- }
-
- inline void push_float(float f) {
- _value_state[_size] = value_state_primitive;
- JNITypes::put_float(f, _value, _size);
- }
+ inline void push_float(float f) { _is_oop[_size] = false;
+ JNITypes::put_float(f, _value, _size); }
// receiver
Handle receiver() {
assert(_size > 0, "must at least be one argument");
- assert(_value_state[0] == value_state_handle,
- "first argument must be an oop");
+ assert(_is_oop[0], "first argument must be an oop");
assert(_value[0] != 0, "receiver must be not-null");
return Handle((oop*)_value[0], false);
}
void set_receiver(Handle h) {
assert(_start_at_zero == false, "can only be called once");
_start_at_zero = true;
- _value_state--;
+ _is_oop--;
_value--;
_size++;
- _value_state[0] = value_state_handle;
- push_oop_impl(h.raw_value(), 0);
+ _is_oop[0] = true;
+ _value[0] = (intptr_t)h.raw_value();
}
// Converts all Handles to oops, and returns a reference to parameter vector
intptr_t* parameters() ;
int size_of_parameters() const { return _size; }
// Verify that pushed arguments fits a given method
- void verify(const methodHandle& method, BasicType return_type);
+ void verify(const methodHandle& method, BasicType return_type, Thread *thread);
};
// All calls to Java have to go via JavaCalls. Sets up the stack frame
// and makes sure that the last_Java_frame pointers are chained correctly.
//
< prev index next >