21 * questions. |
21 * questions. |
22 */ |
22 */ |
23 package org.graalvm.compiler.replacements; |
23 package org.graalvm.compiler.replacements; |
24 |
24 |
25 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; |
25 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; |
|
26 import org.graalvm.compiler.core.common.spi.ArrayOffsetProvider; |
26 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider; |
27 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider; |
27 import org.graalvm.compiler.core.common.type.Stamp; |
28 import org.graalvm.compiler.core.common.type.Stamp; |
28 import org.graalvm.compiler.core.common.type.StampFactory; |
29 import org.graalvm.compiler.core.common.type.StampFactory; |
29 import org.graalvm.compiler.core.common.type.TypeReference; |
30 import org.graalvm.compiler.core.common.type.TypeReference; |
30 import org.graalvm.compiler.debug.GraalError; |
31 import org.graalvm.compiler.debug.GraalError; |
38 public class NodeIntrinsificationProvider implements InjectionProvider { |
39 public class NodeIntrinsificationProvider implements InjectionProvider { |
39 |
40 |
40 private final MetaAccessProvider metaAccess; |
41 private final MetaAccessProvider metaAccess; |
41 private final SnippetReflectionProvider snippetReflection; |
42 private final SnippetReflectionProvider snippetReflection; |
42 private final ForeignCallsProvider foreignCalls; |
43 private final ForeignCallsProvider foreignCalls; |
|
44 private final ArrayOffsetProvider arrayOffsetProvider; |
43 private final WordTypes wordTypes; |
45 private final WordTypes wordTypes; |
44 |
46 |
45 public NodeIntrinsificationProvider(MetaAccessProvider metaAccess, SnippetReflectionProvider snippetReflection, ForeignCallsProvider foreignCalls, WordTypes wordTypes) { |
47 public NodeIntrinsificationProvider(MetaAccessProvider metaAccess, SnippetReflectionProvider snippetReflection, ForeignCallsProvider foreignCalls, ArrayOffsetProvider arrayOffsetProvider, |
|
48 WordTypes wordTypes) { |
46 this.metaAccess = metaAccess; |
49 this.metaAccess = metaAccess; |
47 this.snippetReflection = snippetReflection; |
50 this.snippetReflection = snippetReflection; |
48 this.foreignCalls = foreignCalls; |
51 this.foreignCalls = foreignCalls; |
|
52 this.arrayOffsetProvider = arrayOffsetProvider; |
49 this.wordTypes = wordTypes; |
53 this.wordTypes = wordTypes; |
50 } |
54 } |
51 |
55 |
52 @Override |
56 @Override |
53 public Stamp getInjectedStamp(Class<?> type, boolean nonNull) { |
57 public Stamp getInjectedStamp(Class<?> type, boolean nonNull) { |
71 return injected; |
75 return injected; |
72 } else if (type.equals(ForeignCallsProvider.class)) { |
76 } else if (type.equals(ForeignCallsProvider.class)) { |
73 return type.cast(foreignCalls); |
77 return type.cast(foreignCalls); |
74 } else if (type.equals(SnippetReflectionProvider.class)) { |
78 } else if (type.equals(SnippetReflectionProvider.class)) { |
75 return type.cast(snippetReflection); |
79 return type.cast(snippetReflection); |
|
80 } else if (type.equals(ArrayOffsetProvider.class)) { |
|
81 return type.cast(arrayOffsetProvider); |
76 } else { |
82 } else { |
77 throw new GraalError("Cannot handle injected argument of type %s.", type.getName()); |
83 throw new GraalError("Cannot handle injected argument of type %s.", type.getName()); |
78 } |
84 } |
79 } |
85 } |
80 } |
86 } |