aboutsummaryrefslogtreecommitdiffstats
path: root/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-08-30 20:55:08 +0200
committerSverker Eriksson <[email protected]>2017-08-30 20:55:08 +0200
commit7c67bbddb53c364086f66260701bc54a61c9659c (patch)
tree92ab0d4b91d5e2f6e7a3f9d61ea25089e8a71fe0 /lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
parent97dc5e7f396129222419811c173edc7fa767b0f8 (diff)
parent3b7a6ffddc819bf305353a593904cea9e932e7dc (diff)
downloadotp-7c67bbddb53c364086f66260701bc54a61c9659c.tar.gz
otp-7c67bbddb53c364086f66260701bc54a61c9659c.tar.bz2
otp-7c67bbddb53c364086f66260701bc54a61c9659c.zip
Merge tag 'OTP-19.0' into sverker/19/binary_to_atom-utf8-crash/ERL-474/OTP-14590
Diffstat (limited to 'lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java')
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java266
1 files changed, 150 insertions, 116 deletions
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
index 8056439962..2165397013 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
@@ -1,241 +1,275 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2000-2009. All Rights Reserved.
- *
- * The contents of this file are subject to the Erlang Public License,
- * Version 1.1, (the "License"); you may not use this file except in
- * compliance with the License. You should have received a copy of the
- * Erlang Public License along with this software. If not, it can be
- * retrieved online at http://www.erlang.org/.
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and limitations
- * under the License.
- *
+ *
+ * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
* %CopyrightEnd%
*/
package com.ericsson.otp.erlang;
-import java.io.Serializable;
-
/**
* Provides a Java representation of Erlang refs. There are two styles of Erlang
* refs, old style (one id value) and new style (array of id values). This class
* manages both types.
*/
-public class OtpErlangRef extends OtpErlangObject implements Serializable,
- Cloneable {
+public class OtpErlangRef extends OtpErlangObject {
// don't change this!
- static final long serialVersionUID = -7022666480768586521L;
+ private static final long serialVersionUID = -7022666480768586521L;
+ private final int tag;
private final String node;
private final int creation;
// old style refs have one 18-bit id
// r6 "new" refs have array of ids, first one is only 18 bits however
+ // 19 "newer" refs have full 32-bits for creation and for ids[0]
private int ids[] = null;
/**
* Create a unique Erlang ref belonging to the local node.
- *
+ *
* @param self
- * the local node.
- *
+ * the local node.
+ *
* @deprecated use OtpLocalNode:createRef() instead
*/
@Deprecated
public OtpErlangRef(final OtpLocalNode self) {
- final OtpErlangRef r = self.createRef();
+ final OtpErlangRef r = self.createRef();
- ids = r.ids;
- creation = r.creation;
- node = r.node;
+ tag = r.tag;
+ ids = r.ids;
+ creation = r.creation;
+ node = r.node;
}
/**
* Create an Erlang ref from a stream containing a ref encoded in Erlang
* external format.
- *
+ *
* @param buf
- * the stream containing the encoded ref.
- *
+ * the stream containing the encoded ref.
+ *
* @exception OtpErlangDecodeException
- * if the buffer does not contain a valid external
- * representation of an Erlang ref.
+ * if the buffer does not contain a valid external
+ * representation of an Erlang ref.
*/
public OtpErlangRef(final OtpInputStream buf)
- throws OtpErlangDecodeException {
- final OtpErlangRef r = buf.read_ref();
+ throws OtpErlangDecodeException {
+ final OtpErlangRef r = buf.read_ref();
- node = r.node();
- creation = r.creation();
+ tag = r.tag;
+ node = r.node();
+ creation = r.creation();
- ids = r.ids();
+ ids = r.ids();
}
/**
* Create an old style Erlang ref from its components.
- *
+ *
* @param node
- * the nodename.
- *
+ * the nodename.
+ *
* @param id
- * an arbitrary number. Only the low order 18 bits will be
- * used.
- *
+ * an arbitrary number. Only the low order 18 bits will be used.
+ *
* @param creation
- * another arbitrary number. Only the low order 2 bits will
- * be used.
+ * another arbitrary number.
*/
public OtpErlangRef(final String node, final int id, final int creation) {
- this.node = node;
- ids = new int[1];
- ids[0] = id & 0x3ffff; // 18 bits
- this.creation = creation & 0x03; // 2 bits
+ this.tag = OtpExternal.newRefTag;
+ this.node = node;
+ ids = new int[1];
+ ids[0] = id & 0x3ffff; // 18 bits
+ this.creation = creation & 0x03; // 2 bits
}
/**
* Create a new style Erlang ref from its components.
- *
+ *
* @param node
- * the nodename.
- *
+ * the nodename.
+ *
* @param ids
- * an array of arbitrary numbers. Only the low order 18 bits
- * of the first number will be used. If the array contains
- * only one number, an old style ref will be written instead.
- * At most three numbers will be read from the array.
- *
+ * an array of arbitrary numbers. Only the low order 18 bits of
+ * the first number will be used. If the array contains only one
+ * number, an old style ref will be written instead. At most
+ * three numbers will be read from the array.
+ *
* @param creation
- * another arbitrary number. Only the low order 2 bits will
- * be used.
+ * another arbitrary number. Only the low order 2 bits will be
+ * used.
*/
public OtpErlangRef(final String node, final int[] ids, final int creation) {
- this.node = node;
- this.creation = creation & 0x03; // 2 bits
+ this(OtpExternal.newRefTag, node, ids, creation);
+ }
+
+ /**
+ * Create a new(er) style Erlang ref from its components.
+ *
+ * @param tag
+ * the external format to be compliant with.
+ * OtpExternal.newRefTag where only a subset of the bits are used (see other constructor)
+ * OtpExternal.newerRefTag where all bits of ids and creation are used.
+ * newerPortTag can only be decoded by OTP-19 and newer.
+ *
+ * @param node
+ * the nodename.
+ *
+ * @param ids
+ * an array of arbitrary numbers. At most three numbers
+ * will be read from the array.
+ *
+ * @param creation
+ * another arbitrary number.
+ */
+ public OtpErlangRef(final int tag, final String node, final int[] ids,
+ final int creation) {
+ this.tag = tag;
+ this.node = node;
- // use at most 82 bits (18 + 32 + 32)
- int len = ids.length;
- this.ids = new int[3];
- this.ids[0] = 0;
- this.ids[1] = 0;
- this.ids[2] = 0;
+ // use at most 3 words
+ int len = ids.length;
+ this.ids = new int[3];
+ this.ids[0] = 0;
+ this.ids[1] = 0;
+ this.ids[2] = 0;
- if (len > 3) {
- len = 3;
+ if (len > 3) {
+ len = 3;
+ }
+ System.arraycopy(ids, 0, this.ids, 0, len);
+ if (tag == OtpExternal.newRefTag) {
+ this.creation = creation & 0x3;
+ this.ids[0] &= 0x3ffff; // only 18 significant bits in first number
+ }
+ else {
+ this.creation = creation;
}
- System.arraycopy(ids, 0, this.ids, 0, len);
- this.ids[0] &= 0x3ffff; // only 18 significant bits in first number
+ }
+
+ protected int tag() {
+ return tag;
}
/**
* Get the id number from the ref. Old style refs have only one id number.
* If this is a new style ref, the first id number is returned.
- *
+ *
* @return the id number from the ref.
*/
public int id() {
- return ids[0];
+ return ids[0];
}
/**
* Get the array of id numbers from the ref. If this is an old style ref,
* the array is of length 1. If this is a new style ref, the array has
* length 3.
- *
+ *
* @return the array of id numbers from the ref.
*/
public int[] ids() {
- return ids;
+ return ids;
}
/**
* Determine whether this is a new style ref.
- *
+ *
* @return true if this ref is a new style ref, false otherwise.
*/
public boolean isNewRef() {
- return ids.length > 1;
+ return ids.length > 1;
}
/**
* Get the creation number from the ref.
- *
+ *
* @return the creation number from the ref.
*/
public int creation() {
- return creation;
+ return creation;
}
/**
* Get the node name from the ref.
- *
+ *
* @return the node name from the ref.
*/
public String node() {
- return node;
+ return node;
}
/**
* Get the string representation of the ref. Erlang refs are printed as
* #Ref&lt;node.id&gt;
- *
+ *
* @return the string representation of the ref.
*/
@Override
public String toString() {
- String s = "#Ref<" + node;
+ String s = "#Ref<" + node;
- for (int i = 0; i < ids.length; i++) {
- s += "." + ids[i];
- }
+ for (int i = 0; i < ids.length; i++) {
+ s += "." + ids[i];
+ }
- s += ">";
+ s += ">";
- return s;
+ return s;
}
/**
* Convert this ref to the equivalent Erlang external representation.
- *
+ *
* @param buf
- * an output stream to which the encoded ref should be
- * written.
+ * an output stream to which the encoded ref should be written.
*/
@Override
public void encode(final OtpOutputStream buf) {
- buf.write_ref(node, ids, creation);
+ buf.write_ref(this);
}
/**
* Determine if two refs are equal. Refs are equal if their components are
* equal. New refs and old refs are considered equal if the node, creation
* and first id numnber are equal.
- *
+ *
* @param o
- * the other ref to compare to.
- *
+ * the other ref to compare to.
+ *
* @return true if the refs are equal, false otherwise.
*/
@Override
public boolean equals(final Object o) {
- if (!(o instanceof OtpErlangRef)) {
- return false;
- }
+ if (!(o instanceof OtpErlangRef)) {
+ return false;
+ }
- final OtpErlangRef ref = (OtpErlangRef) o;
+ final OtpErlangRef ref = (OtpErlangRef) o;
- if (!(node.equals(ref.node()) && creation == ref.creation())) {
- return false;
- }
+ if (!(node.equals(ref.node()) && creation == ref.creation())) {
+ return false;
+ }
- if (isNewRef() && ref.isNewRef()) {
- return ids[0] == ref.ids[0] && ids[1] == ref.ids[1]
- && ids[2] == ref.ids[2];
- }
- return ids[0] == ref.ids[0];
+ if (isNewRef() && ref.isNewRef()) {
+ return ids[0] == ref.ids[0] && ids[1] == ref.ids[1]
+ && ids[2] == ref.ids[2];
+ }
+ return ids[0] == ref.ids[0];
}
/**
@@ -247,18 +281,18 @@ public class OtpErlangRef extends OtpErlangObject implements Serializable,
@Override
protected int doHashCode() {
- OtpErlangObject.Hash hash = new OtpErlangObject.Hash(7);
- hash.combine(creation, ids[0]);
- if (isNewRef()) {
- hash.combine(ids[1], ids[2]);
- }
- return hash.valueOf();
+ final OtpErlangObject.Hash hash = new OtpErlangObject.Hash(7);
+ hash.combine(creation, ids[0]);
+ if (isNewRef()) {
+ hash.combine(ids[1], ids[2]);
+ }
+ return hash.valueOf();
}
-
+
@Override
public Object clone() {
- final OtpErlangRef newRef = (OtpErlangRef) super.clone();
- newRef.ids = ids.clone();
- return newRef;
+ final OtpErlangRef newRef = (OtpErlangRef) super.clone();
+ newRef.ids = ids.clone();
+ return newRef;
}
}