@Override public IClass getNextDimType(){ if(dim > 1){ return new ArrayClass(elementType, dim - 1, classLoader); }else{ return elementType; } }
protected KernelArrayValue(KernelProgramBlock block, ArrayClass arrayCls, KernelParam... allocateDims) { super(block, Operator.COMMON); if(arrayCls.getDimension() < allocateDims.length){ throw new IllegalArgumentException("dimension not enough: array type is " + arrayCls + " and allocate dims is " + ArrayUtils.toString(allocateDims)); } this.arrayCls = arrayCls; this.allocateDims = allocateDims; }
private void init(KernelParam pardim, KernelParam... parDims){ this.parDims = new KernelParam[1 + parDims.length]; this.parDims[0] = pardim; System.arraycopy(parDims, 0, this.parDims, 1, parDims.length); valueClass = arrayRef.getResultType(); for(int i=0; i<this.parDims.length; i++){ valueClass = ((ArrayClass) valueClass).getNextDimType(); } }
IClass basicElementType = arrayType.getRootComponentClass(); IClass[] superTypes; if (basicElementType.isPrimitive()) { superTypes = new IClass[basicElementSuperTypes.length]; for (int i = 0; i < superTypes.length; i++) { superTypes[i] = subType.getClassHolder().getArrayType(basicElementSuperTypes[i], arrayType.getDimension());
instructions.push(arrayCls.getType()); instructions.checkCast(arrayCls.getType()); return; allocateDims[0].push(context); instructions.unbox(allocateDims[0].getResultType().getType()); instructions.newArray(arrayCls.getNextDimType().getType()); }else{ for(KernelParam allocate : allocateDims){ instructions.unbox(allocate.getResultType().getType()); instructions.multiANewArrayInsn(arrayCls.getType(), allocateDims.length);
@Override protected void verifyArgument() { //When call ArrayValue(ProgramBlock block, ArrayClass arrayCls, Parameterized... allocateDims) if(allocateDims != null){ for(KernelParam dim : allocateDims){ int order = IClassUtils.getPrimitiveAClass(dim.getResultType()).getCastOrder(); KernelProgramBlock block = getParent(); if(order > block.getType(int.class).getCastOrder() || order <= block.getType(boolean.class).getCastOrder()){ throw new RuntimeException("the allcate dim number must be byte, char, short or int type!"); } } } //When call other constructor final IClass rootComp = arrayCls.getRootComponentClass(); new EachValue(values){ @Override void process(KernelParam para) { if(!IClassUtils.checkAssignable(para.getResultType(), rootComp)) { throw new IllegalArgumentException("Type mismatch: cannot convert from " + para.getResultType() + " to " + rootComp + ""); } } }.process(); }
@Override public String toString() { return "new " + arrayCls.toString() + " " + super.toString(); }
/** * * @param block * @param arrayCls * @param values Parameterized array */ protected KernelArrayValue(KernelProgramBlock block, ArrayClass arrayCls, Object values) { super(block, Operator.COMMON); this.arrayCls = arrayCls; this.values = values; if(values != null && !values.getClass().isArray()){ throw new IllegalArgumentException("values must be an array"); }else{ //check verify int dim = new EachValue(values){ @Override void process(KernelParam para) { //Nothing TO DO } }.process(); if(arrayCls.getDimension() != dim){ throw new IllegalArgumentException("different dimension : value dimension is " + dim + ", class(" + arrayCls + ") dimension is " + arrayCls.getDimension()); } } }
@Override public ArrayClass getArrayType(IClass root, int dim) { String nameKey = getDescription(root, dim); Reference<IClass> ref = cache.get(nameKey); if (ref == null || ref.get() == null) { ArrayClass arrayClass = new ArrayClass(root, dim, this); ref = new WeakReference<IClass>(arrayClass); cache.put(nameKey, ref); } return (ArrayClass) ref.get(); }
@Override public void doExecute(MethodExecuteContext context) { if(!useByOther){ throw new RuntimeException(this.toString() + " not use by other operator"); } ArrayClass cls = (ArrayClass) arrayRef.getResultType(); if(parDims != null && parDims.length > cls.getDimension()){ throw new ArrayOperatorException(toString() + " dimension not enough!"); } if(LOG.isPrintEnabled()) { LOG.print("start load array value"); } getValue(context); }