Class: PyCall::PyPtr

Inherits:
BasicObject
Includes:
PP::ObjectMixin
Defined in:
lib/pycall/pretty_print.rb,
ext/pycall/pycall.c

Direct Known Subclasses

PyTypePtr

Constant Summary collapse

NULL =
pycall_pyptr_new(NULL)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(val) ⇒ Object



256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'ext/pycall/pycall.c', line 256

static VALUE
pycall_pyptr_initialize(VALUE pyptr, VALUE val)
{
  VALUE addr;
  PyObject *pyobj;

  addr = rb_check_to_integer(val, "to_int");
  if (NIL_P(addr)) {
    rb_raise(rb_eTypeError, "Invalid PyObject address: %"PRIsVALUE, val);
  }

  pyobj = (PyObject *)NUM2PTR(addr);
  DATA_PTR(pyptr) = pyobj;
  return pyptr;
}

Class Method Details

.decref(pyptr) ⇒ Object



210
211
212
213
214
# File 'ext/pycall/pycall.c', line 210

static VALUE
pycall_pyptr_s_decref(VALUE klass, VALUE pyptr)
{
  return pycall_pyptr_decref(pyptr);
}

.incref(pyptr) ⇒ Object



179
180
181
182
183
# File 'ext/pycall/pycall.c', line 179

static VALUE
pycall_pyptr_s_incref(VALUE klass, VALUE pyptr)
{
  return pycall_pyptr_incref(pyptr);
}

.sizeof(pyptr) ⇒ Object



216
217
218
219
220
221
222
223
224
225
226
227
# File 'ext/pycall/pycall.c', line 216

static VALUE
pycall_pyptr_s_sizeof(VALUE klass, VALUE pyptr)
{
  size_t size;
  PyObject *pyobj;

  pyobj = try_get_pyobj_ptr(pyptr);
  if (pyobj == NULL) return Qnil;

  size = _PySys_GetSizeOf(pyobj);
  return SIZET2NUM(size);
}

Instance Method Details

#==(other) ⇒ Object



293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'ext/pycall/pycall.c', line 293

static VALUE
pycall_pyptr_eq(VALUE obj, VALUE other)
{
  PyObject* pyobj;
  PyObject* pyobj_other;

  if (!is_pycall_pyptr(other)) return Qfalse;

  pyobj = get_pyobj_ptr(obj);
  pyobj_other = get_pyobj_ptr(other);

  return pyobj == pyobj_other ? Qtrue : Qfalse;
}

#===(other) ⇒ Object



293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'ext/pycall/pycall.c', line 293

static VALUE
pycall_pyptr_eq(VALUE obj, VALUE other)
{
  PyObject* pyobj;
  PyObject* pyobj_other;

  if (!is_pycall_pyptr(other)) return Qfalse;

  pyobj = get_pyobj_ptr(obj);
  pyobj_other = get_pyobj_ptr(other);

  return pyobj == pyobj_other ? Qtrue : Qfalse;
}

#__address__Object



307
308
309
310
311
312
# File 'ext/pycall/pycall.c', line 307

static VALUE
pycall_pyptr_get_ptr_address(VALUE obj)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  return PTR2NUM(pyobj);
}

#__ob_refcnt__Object



314
315
316
317
318
319
320
321
# File 'ext/pycall/pycall.c', line 314

static VALUE
pycall_pyptr_get_ob_refcnt(VALUE obj)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  if (pyobj)
    return SSIZET2NUM(pyobj->ob_refcnt);
  return Qnil;
}

#__ob_type__Object



325
326
327
328
329
330
331
332
333
334
335
336
337
338
# File 'ext/pycall/pycall.c', line 325

static VALUE
pycall_pyptr_get_ob_type(VALUE obj)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  if (pyobj) {
    VALUE res;
    if (Py_TYPE(pyobj) == Py_API(PyInstance_Type))
      res = pycall_pytype_to_ruby((PyObject *)((PyInstanceObject *)pyobj)->in_class);
    else
      res = pycall_pytype_to_ruby((PyObject *)pyobj->ob_type);
    return res;
  }
  return Qnil;
}

#classObject



346
347
348
349
350
# File 'ext/pycall/pycall.c', line 346

static VALUE
pycall_pyptr_class(VALUE obj)
{
  return CLASS_OF(obj);
}

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'ext/pycall/pycall.c', line 293

static VALUE
pycall_pyptr_eq(VALUE obj, VALUE other)
{
  PyObject* pyobj;
  PyObject* pyobj_other;

  if (!is_pycall_pyptr(other)) return Qfalse;

  pyobj = get_pyobj_ptr(obj);
  pyobj_other = get_pyobj_ptr(other);

  return pyobj == pyobj_other ? Qtrue : Qfalse;
}

#hashObject



403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'ext/pycall/pycall.c', line 403

static VALUE
pycall_pyptr_hash(VALUE obj)
{
  PyObject *pyobj = get_pyobj_ptr(obj);
  Py_hash_t h;

  if (!pyobj)
    return PTR2NUM(pyobj);

  h = PyObject_Hash(pyobj);
  if (h == -1) {
    Py_API(PyErr_Clear)();
    return PTR2NUM(pyobj);
  }

  return SSIZET2NUM(h);
}

#inspectObject



352
353
354
355
356
357
358
359
360
361
362
363
# File 'ext/pycall/pycall.c', line 352

static VALUE
pycall_pyptr_inspect(VALUE obj)
{
  VALUE cname, str;
  PyObject* pyobj = get_pyobj_ptr(obj);

  cname = rb_class_name(CLASS_OF(obj));
  str = rb_sprintf("#<%"PRIsVALUE":%p type=%s addr=%p>", cname, (void*)obj, Py_TYPE(pyobj)->tp_name, pyobj);
  OBJ_INFECT(str, obj);

  return str;
}

#is_a?(klass) ⇒ Boolean

Returns:

  • (Boolean)


382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
# File 'ext/pycall/pycall.c', line 382

static VALUE
pycall_pyptr_is_kind_of(VALUE obj, VALUE klass)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  VALUE res;

  if (is_pycall_pyptr(klass)) {
    int res;
    PyObject* pyobj_klass = get_pyobj_ptr(klass);
    res = Py_API(PyObject_IsInstance)(pyobj, pyobj_klass);
    if (res >= 0) {
      return res ? Qtrue : Qfalse;
    }
    Py_API(PyErr_Clear)();
  }

  klass = class_or_module_required(klass);
  res = rb_class_inherited_p(CLASS_OF(obj), klass);
  return NIL_P(res) ? Qfalse : res;
}

#kind_of?(klass) ⇒ Boolean

Returns:

  • (Boolean)


382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
# File 'ext/pycall/pycall.c', line 382

static VALUE
pycall_pyptr_is_kind_of(VALUE obj, VALUE klass)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  VALUE res;

  if (is_pycall_pyptr(klass)) {
    int res;
    PyObject* pyobj_klass = get_pyobj_ptr(klass);
    res = Py_API(PyObject_IsInstance)(pyobj, pyobj_klass);
    if (res >= 0) {
      return res ? Qtrue : Qfalse;
    }
    Py_API(PyErr_Clear)();
  }

  klass = class_or_module_required(klass);
  res = rb_class_inherited_p(CLASS_OF(obj), klass);
  return NIL_P(res) ? Qfalse : res;
}

#nil?Boolean

Returns:

  • (Boolean)


286
287
288
289
290
291
# File 'ext/pycall/pycall.c', line 286

static VALUE
pycall_pyptr_is_nil(VALUE obj)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  return (pyobj == Py_API(_Py_NoneStruct)) || (pyobj == NULL) ? Qtrue : Qfalse;
}

#none?Boolean

Returns:

  • (Boolean)


279
280
281
282
283
284
# File 'ext/pycall/pycall.c', line 279

static VALUE
pycall_pyptr_is_none(VALUE obj)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  return pyobj == Py_API(_Py_NoneStruct) ? Qtrue : Qfalse;
}

#null?Boolean

Returns:

  • (Boolean)


272
273
274
275
276
277
# File 'ext/pycall/pycall.c', line 272

static VALUE
pycall_pyptr_is_null(VALUE obj)
{
  PyObject* pyobj = get_pyobj_ptr(obj);
  return pyobj ? Qfalse : Qtrue;
}

#object_idObject



340
341
342
343
344
# File 'ext/pycall/pycall.c', line 340

static VALUE
pycall_pyptr_object_id(VALUE obj)
{
  return rb_obj_id(obj);
}