| 2845 | //////////////////////////////////// |
| 2846 | |
| 2847 | function createInternalInjector(cache, factory) { |
| 2848 | |
| 2849 | function getService(serviceName) { |
| 2850 | if (typeof serviceName !== 'string') { |
| 2851 | throw Error('Service name expected'); |
| 2852 | } |
| 2853 | if (cache.hasOwnProperty(serviceName)) { |
| 2854 | if (cache[serviceName] === INSTANTIATING) { |
| 2855 | throw Error('Circular dependency: ' + path.join(' <- ')); |
| 2856 | } |
| 2857 | return cache[serviceName]; |
| 2858 | } else { |
| 2859 | try { |
| 2860 | path.unshift(serviceName); |
| 2861 | cache[serviceName] = INSTANTIATING; |
| 2862 | return cache[serviceName] = factory(serviceName); |
| 2863 | } finally { |
| 2864 | path.shift(); |
| 2865 | } |
| 2866 | } |
| 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 | } |