(fn, self, locals)
| 2867 | } |
| 2868 | |
| 2869 | function invoke(fn, self, locals){ |
| 2870 | var args = [], |
| 2871 | $inject = annotate(fn), |
| 2872 | length, i, |
| 2873 | key; |
| 2874 | |
| 2875 | for(i = 0, length = $inject.length; i < length; i++) { |
| 2876 | key = $inject[i]; |
| 2877 | args.push( |
| 2878 | locals && locals.hasOwnProperty(key) |
| 2879 | ? locals[key] |
| 2880 | : getService(key) |
| 2881 | ); |
| 2882 | } |
| 2883 | if (!fn.$inject) { |
| 2884 | // this means that we must be an array. |
| 2885 | fn = fn[length]; |
| 2886 | } |
| 2887 | |
| 2888 | |
| 2889 | // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke |
| 2890 | switch (self ? -1 : args.length) { |
| 2891 | case 0: return fn(); |
| 2892 | case 1: return fn(args[0]); |
| 2893 | case 2: return fn(args[0], args[1]); |
| 2894 | case 3: return fn(args[0], args[1], args[2]); |
| 2895 | case 4: return fn(args[0], args[1], args[2], args[3]); |
| 2896 | case 5: return fn(args[0], args[1], args[2], args[3], args[4]); |
| 2897 | case 6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]); |
| 2898 | case 7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); |
| 2899 | case 8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); |
| 2900 | case 9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]); |
| 2901 | case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); |
| 2902 | default: return fn.apply(self, args); |
| 2903 | } |
| 2904 | } |
| 2905 | |
| 2906 | function instantiate(Type, locals) { |
| 2907 | var Constructor = function() {}, |
no test coverage detected