anchor.diff:        _uniforms[v] = b;
       }
       return b;
  +  }
  +
  +  delete() {
  +    if (_fragShader != null) {
  +      gl.detachShader(program, _fragShader);
  +      gl.deleteShader(_fragShader);
  +      _fragShader = null;
  +    }
  +    if (_vertShader != null) {
  +      gl.detachShader(program, _vertShader);
  +      gl.deleteShader(_vertShader);
  +      _vertShader = null;
  +    }
  +    if (program != null) {
  +     gl.deleteProgram(program);
  +     program = null;
  +    }
     }
   }
   
  
positive.code:   }
    return program;
  }
  
  void injectMatrix4(ProgramContext ctx, Matrix4 mat, String sname) {
    var u = ctx.getUniformLocation(sname);
  
negative.code: 
    final _attributes = new Map<String, int>();
    final _uniforms = new Map<String, UniformLocation>();
    Shader _vertShader;
    Shader _fragShader;
  
    // following field are stored in ProgramContext to avoid usage on an associative array ProgramContext -> RunOnProgramContext
    final _befores = new List<RunOnProgramContext>();
    final _ats = new List<RunOnProgramContext>();
  
    ProgramContext(this.gl, String vertSrc, String fragSrc) {
      _vertShader = _compileShader(gl, vertSrc, VERTEX_SHADER);
      _fragShader = _compileShader(gl, fragSrc, FRAGMENT_SHADER);
      program = _linkProgram(gl, _vertShader, _fragShader);
    }
  
    int getAttribLocation(String v) {
  