Blame view

node_modules/bluebird/js/release/call_get.js 4.25 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  "use strict";
  var cr = Object.create;
  if (cr) {
      var callerCache = cr(null);
      var getterCache = cr(null);
      callerCache[" size"] = getterCache[" size"] = 0;
  }
  
  module.exports = function(Promise) {
  var util = require("./util");
  var canEvaluate = util.canEvaluate;
  var isIdentifier = util.isIdentifier;
  
  var getMethodCaller;
  var getGetter;
  if (!false) {
  var makeMethodCaller = function (methodName) {
      return new Function("ensureMethod", "                                    \n\
          return function(obj) {                                               \n\
              'use strict'                                                     \n\
              var len = this.length;                                           \n\
              ensureMethod(obj, 'methodName');                                 \n\
              switch(len) {                                                    \n\
                  case 1: return obj.methodName(this[0]);                      \n\
                  case 2: return obj.methodName(this[0], this[1]);             \n\
                  case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                  case 0: return obj.methodName();                             \n\
                  default:                                                     \n\
                      return obj.methodName.apply(obj, this);                  \n\
              }                                                                \n\
          };                                                                   \n\
          ".replace(/methodName/g, methodName))(ensureMethod);
  };
  
  var makeGetter = function (propertyName) {
      return new Function("obj", "                                             \n\
          'use strict';                                                        \n\
          return obj.propertyName;                                             \n\
          ".replace("propertyName", propertyName));
  };
  
  var getCompiled = function(name, compiler, cache) {
      var ret = cache[name];
      if (typeof ret !== "function") {
          if (!isIdentifier(name)) {
              return null;
          }
          ret = compiler(name);
          cache[name] = ret;
          cache[" size"]++;
          if (cache[" size"] > 512) {
              var keys = Object.keys(cache);
              for (var i = 0; i < 256; ++i) delete cache[keys[i]];
              cache[" size"] = keys.length - 256;
          }
      }
      return ret;
  };
  
  getMethodCaller = function(name) {
      return getCompiled(name, makeMethodCaller, callerCache);
  };
  
  getGetter = function(name) {
      return getCompiled(name, makeGetter, getterCache);
  };
  }
  
  function ensureMethod(obj, methodName) {
      var fn;
      if (obj != null) fn = obj[methodName];
      if (typeof fn !== "function") {
          var message = "Object " + util.classString(obj) + " has no method '" +
              util.toString(methodName) + "'";
          throw new Promise.TypeError(message);
      }
      return fn;
  }
  
  function caller(obj) {
      var methodName = this.pop();
      var fn = ensureMethod(obj, methodName);
      return fn.apply(obj, this);
  }
  Promise.prototype.call = function (methodName) {
      var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
      if (!false) {
          if (canEvaluate) {
              var maybeCaller = getMethodCaller(methodName);
              if (maybeCaller !== null) {
                  return this._then(
                      maybeCaller, undefined, undefined, args, undefined);
              }
          }
      }
      args.push(methodName);
      return this._then(caller, undefined, undefined, args, undefined);
  };
  
  function namedGetter(obj) {
      return obj[this];
  }
  function indexedGetter(obj) {
      var index = +this;
      if (index < 0) index = Math.max(0, index + obj.length);
      return obj[index];
  }
  Promise.prototype.get = function (propertyName) {
      var isIndex = (typeof propertyName === "number");
      var getter;
      if (!isIndex) {
          if (canEvaluate) {
              var maybeGetter = getGetter(propertyName);
              getter = maybeGetter !== null ? maybeGetter : namedGetter;
          } else {
              getter = namedGetter;
          }
      } else {
          getter = indexedGetter;
      }
      return this._then(getter, undefined, undefined, propertyName, undefined);
  };
  };