• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wurstscript / WurstScript / 215

08 Nov 2023 06:49PM CUT coverage: 62.561% (-0.04%) from 62.602%
215

Pull #1081

circleci

Frotty
fixes and master merge
Pull Request #1081: More performance improvements

17307 of 27664 relevant lines covered (62.56%)

0.63 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.06
de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/jassinterpreter/ReflectionNativeProvider.java
1
package de.peeeq.wurstio.jassinterpreter;
2

3
import de.peeeq.wurstio.jassinterpreter.providers.*;
4
import de.peeeq.wurstscript.WLogger;
5
import de.peeeq.wurstscript.intermediatelang.ILconst;
6
import de.peeeq.wurstscript.intermediatelang.ILconstNull;
7
import de.peeeq.wurstscript.intermediatelang.interpreter.AbstractInterpreter;
8
import de.peeeq.wurstscript.intermediatelang.interpreter.NativesProvider;
9
import de.peeeq.wurstscript.intermediatelang.interpreter.NoSuchNativeException;
10
import de.peeeq.wurstscript.utils.Utils;
11

12
import java.io.PrintStream;
13
import java.lang.reflect.InvocationTargetException;
14
import java.lang.reflect.Method;
15
import java.util.HashMap;
16

17
public class ReflectionNativeProvider implements NativesProvider {
18
    private final HashMap<String, NativeJassFunction> methodMap = new HashMap<>();
1✔
19

20
    public ReflectionNativeProvider(AbstractInterpreter interpreter) {
1✔
21
        addProvider(new GamecacheProvider(interpreter));
1✔
22
        addProvider(new ForceProvider(interpreter));
1✔
23
        addProvider(new HandleProvider(interpreter));
1✔
24
        addProvider(new GroupProvider(interpreter));
1✔
25
        addProvider(new HashtableProvider(interpreter));
1✔
26
        addProvider(new MathProvider(interpreter));
1✔
27
        addProvider(new OutputProvider(interpreter));
1✔
28
        addProvider(new WurstflectionProvider(interpreter));
1✔
29
        addProvider(new StringProvider(interpreter));
1✔
30
        addProvider(new UnitProvider(interpreter));
1✔
31
        addProvider(new PlayerProvider(interpreter));
1✔
32
        addProvider(new TriggerProvider(interpreter));
1✔
33
        addProvider(new TimerProvider(interpreter));
1✔
34
        addProvider(new LocationProvider(interpreter));
1✔
35
        addProvider(new RectProvider(interpreter));
1✔
36
        addProvider(new ItemProvider(interpreter));
1✔
37
        addProvider(new ConversionProvider(interpreter));
1✔
38
        addProvider(new DestructableProvider(interpreter));
1✔
39
        addProvider(new DialogProvider(interpreter));
1✔
40
        addProvider(new EffectProvider(interpreter));
1✔
41
        addProvider(new RegionProvider(interpreter));
1✔
42
        addProvider(new ImageProvider(interpreter));
1✔
43
        addProvider(new IntegerProvider(interpreter));
1✔
44
        addProvider(new FrameProvider(interpreter));
1✔
45
        addProvider(new LuaEnsureTypeProvider(interpreter));
1✔
46
        addProvider(new QuestProvider(interpreter));
1✔
47
        addProvider(new QuestItemProvider(interpreter));
1✔
48
    }
1✔
49

50
    public NativeJassFunction getFunctionPair(String funcName) {
51
        return methodMap.get(funcName);
1✔
52
    }
53

54
    private void addProvider(Provider provider) {
55
        for (Method method : provider.getClass().getMethods()) {
1✔
56
            Implements annotation = method.getAnnotation(Implements.class);
1✔
57
            if (annotation != null) {
1✔
58
                String[] funcNames = annotation.funcNames();
1✔
59
                for (String funcName : funcNames) {
1✔
60
                    if (methodMap.containsKey(funcName)) {
1✔
61
                        throw new Error("Trying to add multiple implementations of <" + funcName + ">");
×
62
                    }
63
                    methodMap.put(funcName, new NativeJassFunction(provider, method));
1✔
64
                }
65
            } else {
1✔
66
                methodMap.put(method.getName(), new NativeJassFunction(provider, method));
1✔
67
            }
68
        }
69
    }
1✔
70

71
    @Override
72
    public ILconst invoke(String funcname, ILconst[] args) throws NoSuchNativeException {
73
        NativeJassFunction candidate = methodMap.get(funcname);
1✔
74
        if (candidate == null) {
1✔
75
            throw new NoSuchNativeException("");
×
76
        }
77

78
        if (candidate.getMethod().getParameterCount() == args.length) {
1✔
79
            String[] parameterTypes = new String[args.length];
1✔
80
            for (int i = 0; i < args.length; i++) {
1✔
81
                parameterTypes[i] = "" + args[i];
1✔
82
                if (!candidate.getMethod().getParameterTypes()[i].isAssignableFrom(args[i].getClass())) {
1✔
83
                    if (args[i] instanceof ILconstNull) {
1✔
84
                        // handle null as a special case and pass it to the native as a Java null
85
                        args[i] = null;
1✔
86
                        continue;
1✔
87
                    }
88
                    throw new Error("The native <" + funcname + "> expects different parameter " + i + "!" +
×
89
                            "\n\tExpected: " + candidate.getMethod().getParameterTypes()[i].getSimpleName() + " Actual: " + parameterTypes[i]);
×
90
                }
91
            }
92
        }
93
        try {
94
            return (ILconst) candidate.getMethod().invoke(candidate.getProvider(), (Object[]) args);
1✔
95
        } catch (IllegalAccessException | InvocationTargetException e) {
1✔
96
            if (e.getCause() instanceof Error) {
1✔
97
                throw (Error) e.getCause();
1✔
98
            } else if (e.getCause() instanceof InterpreterException) {
1✔
99
                throw (InterpreterException) e.getCause();
1✔
100
            }
101
            throw new Error(e.getCause());
×
102
        }
103
    }
104

105
    @Override
106
    public void setOutStream(PrintStream outStream) {
107

108
    }
1✔
109
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc