@@ -70,7 +70,13 @@ public class VariableTableManager {
7070 private volatile String [] variableNames = EMPTY_STRING_ARRAY ;
7171
7272 /** whether a slot has been allocated to object_id */
73- private volatile boolean hasObjectID = false ;
73+ private volatile int hasObjectID = 0 ;
74+
75+ /** whether a slot has been allocated to ffi */
76+ private volatile int hasFFI = 0 ;
77+
78+ /** whether a slot has been allocated to objectspace_group */
79+ private volatile int hasObjectspaceGroup = 0 ;
7480
7581 /** whether objects associated with this table use fields */
7682 private volatile int fieldVariables = 0 ;
@@ -106,7 +112,7 @@ public Map<String, VariableAccessor> getVariableAccessorsForRead() {
106112 * @return true if object_id has been allocated; false otherwise
107113 */
108114 public boolean hasObjectID () {
109- return hasObjectID ;
115+ return hasObjectID == 1 ;
110116 }
111117
112118 /**
@@ -117,16 +123,17 @@ public boolean hasObjectID() {
117123 * @return the object's object_id (possibly new)
118124 */
119125 public long getObjectId (RubyBasicObject self ) {
120- VariableAccessor objectIdAccessor = getObjectIdAccessorField (). getVariableAccessorForRead ();
126+ VariableAccessor objectIdAccessor = getObjectIdAccessorForRead ();
121127 Long id = (Long )objectIdAccessor .get (self );
122128 if (id != null ) return id ;
123129
124130 synchronized (self ) {
125- objectIdAccessor = getObjectIdAccessorField (). getVariableAccessorForRead ();
131+ objectIdAccessor = getObjectIdAccessorForRead ();
126132 id = (Long )objectIdAccessor .get (self );
127133 if (id != null ) return id ;
128134
129- return initObjectId (self , getObjectIdAccessorField ().getVariableAccessorForWrite (this ));
135+ objectIdAccessor = getObjectIdAccessorForWrite ();
136+ return initObjectId (self , objectIdAccessor );
130137 }
131138 }
132139
@@ -228,25 +235,28 @@ public VariableAccessor getVariableAccessorForRead(String name) {
228235 }
229236
230237 /**
231- * Retrieve the lazy accessor (VariableAccessorField) for object_id.
238+ * Retrieve the read accessor for object_id for reads. If no object_id has been prepared, this will return a dummy
239+ * accessor that just returns null.
232240 *
233- * @return the lazy accessor for object_id
241+ * @return the read accessor for object_id
234242 */
235- public VariableAccessorField getObjectIdAccessorField () {
236- return objectIdVariableAccessorField ;
243+ public VariableAccessor getObjectIdAccessorForRead () {
244+ return objectIdVariableAccessorField . getVariableAccessorForRead () ;
237245 }
238246
239247 /**
240- * Retrieve the lazy accessor (VariableAccessorField) for FFI handle .
248+ * Retrieve the write accessor for object_id .
241249 *
242- * @return the lazy accessor for FFI handle
250+ * @return the write accessor for object_id
243251 */
244- public VariableAccessorField getFFIHandleAccessorField () {
245- return ffiHandleVariableAccessorField ;
252+ public VariableAccessor getObjectIdAccessorForWrite () {
253+ if (hasObjectID == 0 ) hasObjectID = 1 ;
254+ return objectIdVariableAccessorField .getVariableAccessorForWrite (this );
246255 }
247256
248257 /**
249- * Retrieve the read accessor for FFI handle.
258+ * Retrieve the read accessor for FFI handle. If no object_id has been prepared, this will return a dummy
259+ * accessor that just returns null.
250260 *
251261 * @return the read accessor for FFI handle
252262 */
@@ -260,20 +270,13 @@ public VariableAccessor getFFIHandleAccessorForRead() {
260270 * @return the write accessor for FFI handle
261271 */
262272 public VariableAccessor getFFIHandleAccessorForWrite () {
273+ if (hasFFI == 0 ) hasFFI = 1 ;
263274 return ffiHandleVariableAccessorField .getVariableAccessorForWrite (this );
264275 }
265276
266277 /**
267- * Retrieve the lazy accessor (VariableAccessorField) for object group.
268- *
269- * @return the lazy accessor for object group
270- */
271- public VariableAccessorField getObjectGroupAccessorField () {
272- return objectGroupVariableAccessorField ;
273- }
274-
275- /**
276- * Retrieve the read accessor for object group.
278+ * Retrieve the read accessor for object group. If no object_id has been prepared, this will return a dummy
279+ * accessor that just returns null.
277280 *
278281 * @return the read accessor for object group
279282 */
@@ -287,6 +290,7 @@ public VariableAccessor getObjectGroupAccessorForRead() {
287290 * @return the write accessor for object group
288291 */
289292 public VariableAccessor getObjectGroupAccessorForWrite () {
293+ if (hasObjectspaceGroup == 0 ) hasObjectspaceGroup = 1 ;
290294 return objectGroupVariableAccessorField .getVariableAccessorForWrite (this );
291295 }
292296
@@ -424,7 +428,8 @@ public void syncVariables(RubyBasicObject self, IRubyObject other) {
424428 public boolean hasVariables (RubyBasicObject object ) {
425429 // we check both to exclude object_id
426430 Object [] myVarTable ;
427- return fieldVariables > 0 || getVariableTableSize () > 0 && (myVarTable = object .varTable ) != null && myVarTable .length > 0 ;
431+ return fieldVariables > 0 ||
432+ (myVarTable = object .varTable ) != null && myVarTable .length > hasObjectID + hasFFI + hasObjectspaceGroup ;
428433 }
429434
430435 public void serializeVariables (RubyBasicObject object , ObjectOutputStream oos ) throws IOException {
@@ -586,4 +591,34 @@ synchronized final VariableAccessor allocateVariableAccessorForVar(String name,
586591
587592 return newVariableAccessor ;
588593 }
594+
595+ /**
596+ * Retrieve the lazy accessor (VariableAccessorField) for object_id.
597+ *
598+ * @return the lazy accessor for object_id
599+ * @deprecated Use {@link #getObjectIdAccessorForRead()} or {@link #getObjectIdAccessorForWrite()}
600+ */
601+ public VariableAccessorField getObjectIdAccessorField () {
602+ return objectIdVariableAccessorField ;
603+ }
604+
605+ /**
606+ * Retrieve the lazy accessor (VariableAccessorField) for FFI handle.
607+ *
608+ * @return the lazy accessor for FFI handle
609+ * @deprecated Use {@link #getFFIHandleAccessorForRead()} or {@link #getFFIHandleAccessorForWrite()}
610+ */
611+ public VariableAccessorField getFFIHandleAccessorField () {
612+ return ffiHandleVariableAccessorField ;
613+ }
614+
615+ /**
616+ * Retrieve the lazy accessor (VariableAccessorField) for object group.
617+ *
618+ * @return the lazy accessor for object group
619+ * @deprecated Use {@link #getObjectGroupAccessorForRead()} or {@link #getObjectGroupAccessorForWrite()}
620+ */
621+ public VariableAccessorField getObjectGroupAccessorField () {
622+ return objectGroupVariableAccessorField ;
623+ }
589624}
0 commit comments