On Oct 14, 2012, at 2:25 PM, Remi Forax wrote:

> A value object is a true immutable object so the 
> JIT can constant fold field access or merge redundant access even if 
> there is method call between them but for that the JIT has to insert a 
> check to know if the object is frozen (definitively better than 'locked' 
> IMO) or not. Things are less clear for me when you have operation like 
> ==, does it means that a frozen object has not the same semantics as a 
> not frozen one ?

The reference semantics of a frozen/locked/immutable object are (must be) a 
subset of the full reference semantics of a normal Java object.

The essential feature of a locked object, I think, is that the JVM is free to 
rebox it at any time.  (Maybe there is a restricted set of "times" that could 
make sense, but I'm thinking "between any two bytecodes".)

Once you grant the JVM the right to rebox at any time, you get indeterminate 
behavior on operations like this:
  Complex x = Complex.valueOf(0, 1);
  synchronized (x) { }  // cannot distinguish from synchronized (x.clone()) { }
  System.identityHashCode(x);  // cannot distinguish from 
System.identityHashCode(x.clone())
  assert(x == x);  // cannot distinguish (??) from (x == x.clone())
  Object y = x;
  assert(y == x);  // cf. (y == x.clone())
  Object y2 = y;
  assert(y2 == y); // probably true, but how do you tell the view type from the 
bytecodes?
  synchronized (y) { }
  System.identityHashCode(y);
  ArrayList<Complex> xs = ...;
  xs.set(0, x);
  Complex z = xs.get(0);
  assert(z == x);
  ...

This right-to-rebox also means that the JVM can throw away escape analysis for 
such types, since any escaping can be cloned first.  The end result is that 
nearly all immutable values (of fixed small size) can be allocated to 
registers.  This (crucially) includes values passed into and returned out of 
non-inlined methods.  This is the basis for a number of urgently useful things, 
beyond Complex.

My goal here is to find a set of design rules under which the indeterminacy (a) 
doesn't matter, (b) can be diagnosed with an exception, and/or (c) can be 
overwritten by an uplevel operation (like Object.equals).  That's what this is 
about:
  https://blogs.oracle.com/jrose/entry/value_types_in_the_vm

Mega-extra points for retrofitting to existing bytecodes and behaviors in 
rt.jar etc.

— John
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to