public static Signature from(Arity arity) { switch(arity.required()) { case 0: return arity.isFixed() ? Signature.NO_ARGUMENTS : Signature.OPTIONAL; case 1: return arity.isFixed() ? Signature.ONE_ARGUMENT : Signature.ONE_REQUIRED; case 2: return arity.isFixed() ? Signature.TWO_ARGUMENTS : Signature.TWO_REQUIRED; case 3: return arity.isFixed() ? Signature.THREE_ARGUMENTS : Signature.THREE_REQUIRED; } throw new UnsupportedOperationException("We do not know enough about the arity to convert it to a signature"); }
public static Signature from(Arity arity) { switch(arity.required()) { case 0: return arity.isFixed() ? Signature.NO_ARGUMENTS : Signature.OPTIONAL; case 1: return arity.isFixed() ? Signature.ONE_ARGUMENT : Signature.ONE_REQUIRED; case 2: return arity.isFixed() ? Signature.TWO_ARGUMENTS : Signature.TWO_REQUIRED; case 3: return arity.isFixed() ? Signature.THREE_ARGUMENTS : Signature.THREE_REQUIRED; } throw new UnsupportedOperationException("We do not know enough about the arity to convert it to a signature"); }
@Override public String toString() { return isFixed() ? "Fixed" + required() : "Opt"; }
@Override public String toString() { return isFixed() ? "Fixed" + required() : "Opt"; }
@Override public String toString() { return isFixed() ? "Fixed" + required() : "Opt"; }
@Override public String toString() { return isFixed() ? "Fixed" + required() : "Opt"; }
public CompiledBlock19(Arity arity, StaticScope scope, CompiledBlockCallback19 callback, boolean hasMultipleArgsHead, int argumentType, String[] parameterList) { super(scope, arity, argumentType); this.callback = callback; this.hasMultipleArgsHead = hasMultipleArgsHead; this.parameterList = parameterList; this.needsSplat = Helpers.needsSplat19(arity().required(), !arity().isFixed()); }
public CompiledBlock19(Arity arity, StaticScope scope, CompiledBlockCallback19 callback, boolean hasMultipleArgsHead, int argumentType, String[] parameterList) { super(scope, arity, argumentType); this.callback = callback; this.hasMultipleArgsHead = hasMultipleArgsHead; this.parameterList = parameterList; this.needsSplat = Helpers.needsSplat19(arity().required(), !arity().isFixed()); }
public void checkArity(Ruby runtime, int length) { if (isFixed()) { if (length != required()) { throw runtime.newArgumentError(length, required()); } } else { if (length < required()) { throw runtime.newArgumentError(length, required()); } } }
public void checkArity(Ruby runtime, int length) { if (isFixed()) { if (length != required()) { throw runtime.newArgumentError("wrong number of arguments (" + length + " for " + required() + ")"); } } else { if (length < required()) { throw runtime.newArgumentError("wrong number of arguments (" + length + " for " + required() + ")"); } } }
public void checkArity(Ruby runtime, int length) { if (isFixed()) { if (length != required()) { throw runtime.newArgumentError(length, required()); } } else { if (length < required()) { throw runtime.newArgumentError(length, required()); } } }
public void checkArity(Ruby runtime, int length) { if (isFixed()) { if (length != required()) { throw runtime.newArgumentError("wrong number of arguments (" + length + " for " + required() + ")"); } } else { if (length < required()) { throw runtime.newArgumentError("wrong number of arguments (" + length + " for " + required() + ")"); } } }
private DynamicMethod createProcMethod(String name, Visibility visibility, RubyProc proc) { Block block = proc.getBlock(); block.getBinding().getFrame().setKlazz(this); block.getBinding().getFrame().setName(name); block.getBinding().setMethod(name); StaticScope scope = block.getBody().getStaticScope(); // for zsupers in define_method (blech!) we tell the proc scope to act as the "argument" scope scope.makeArgumentScope(); Arity arity = block.arity(); // just using required is broken...but no more broken than before zsuper refactoring scope.setRequiredArgs(arity.required()); if(!arity.isFixed()) { scope.setRestArg(arity.required()); } return new ProcMethod(this, proc, visibility); }
private DynamicMethod createProcMethod(String name, Visibility visibility, RubyProc proc) { Block block = proc.getBlock(); block.getBinding().getFrame().setKlazz(this); block.getBinding().getFrame().setName(name); block.getBinding().setMethod(name); StaticScope scope = block.getBody().getStaticScope(); // for zsupers in define_method (blech!) we tell the proc scope to act as the "argument" scope scope.makeArgumentScope(); Arity arity = block.arity(); // just using required is broken...but no more broken than before zsuper refactoring scope.setRequiredArgs(arity.required()); if(!arity.isFixed()) { scope.setRestArg(arity.required()); } return new ProcMethod(this, proc, visibility); }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg, IRubyObject releaser) { checkPointer(context.runtime, pointerArg); setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; Object ffiHandle = releaser.getMetaClass().getFFIHandleAccessorField().getVariableAccessorForRead().get(releaser); if (!(ffiHandle instanceof ReleaserData)) { getMetaClass().setFFIHandle(ffiHandle = new ReleaserData()); } ReleaserData releaserData = (ReleaserData) ffiHandle; DynamicMethod releaseMethod = releaserData.releaseCallSite.retrieveCache(releaser.getMetaClass(), releaserData.releaseCallSite.getMethodName()).method; // If no release method is defined, then memory leaks will result. if (releaseMethod.isUndefined()) { throw context.runtime.newRuntimeError("call method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw context.runtime.newRuntimeError("wrong number of arguments to call method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setReaper(new Reaper(pointer, releaser, releaserData.releaseCallSite)); return this; }
@Override @JRubyMethod(name = "initialize", visibility = PRIVATE) public final IRubyObject initialize(ThreadContext context, IRubyObject pointerArg) { Ruby runtime = context.runtime; checkPointer(runtime, pointerArg); Object ffiHandle = getMetaClass().getFFIHandle(); if (!(ffiHandle instanceof ClassData)) { getMetaClass().setFFIHandle(ffiHandle = new ClassData()); } ClassData classData = (ClassData) ffiHandle; // If no release method is defined, then memory leaks will result. DynamicMethod releaseMethod = classData.releaseCallSite.retrieveCache(getMetaClass().getMetaClass(), classData.releaseCallSite.getMethodName()).method; if (releaseMethod.isUndefined()) { throw runtime.newRuntimeError("release method undefined"); } else if ((releaseMethod.getArity().isFixed() && releaseMethod.getArity().required() != 1) || releaseMethod.getArity().required() > 1) { throw runtime.newRuntimeError("wrong number of arguments to release method (" + 1 + " for " + releaseMethod.getArity().required() + ")"); } setMemoryIO(((Pointer) pointerArg).getMemoryIO()); this.pointer = (Pointer) pointerArg; this.size = pointer.size; this.typeSize = pointer.typeSize; setReaper(new Reaper(pointer, getMetaClass(), classData.releaseCallSite)); return this; }