1 package org.simantics.scl.compiler.tests;
3 import org.junit.Assert;
4 import org.junit.Before;
6 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
7 import org.simantics.scl.compiler.errors.CompilationErrorFormatter;
8 import org.simantics.scl.compiler.module.repository.ImportFailure;
9 import org.simantics.scl.compiler.module.repository.ImportFailureException;
10 import org.simantics.scl.compiler.module.repository.ModuleRepository;
11 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
12 import org.simantics.scl.compiler.top.ExpressionEvaluator;
13 import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
14 import org.simantics.scl.compiler.types.Type;
15 import org.simantics.scl.compiler.types.Types;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
19 public class MemoryLeakExperiment {
20 private static final Logger LOGGER = LoggerFactory.getLogger(MemoryLeakExperiment.class);
21 ModuleRepository moduleRepository;
23 EnvironmentSpecification environmentSpecification;
26 public void initialize() throws Exception {
27 moduleRepository = InitialRepository.getInitialRepository();
29 // Environment for compiling expressions
30 environmentSpecification = new EnvironmentSpecification();
31 environmentSpecification.importModule("Builtin", "");
32 environmentSpecification.importModule("Prelude", "");
35 private void testExpression0(String expressionText,
37 Type expectedType) throws Exception {
39 RuntimeEnvironment runtimeEnvironment;
41 runtimeEnvironment = moduleRepository.createRuntimeEnvironment(environmentSpecification,
42 getClass().getClassLoader());
43 } catch(ImportFailureException e) {
44 for(ImportFailure failure : e.failures)
45 LOGGER.warn("Failed to import " + failure.moduleName);
49 // Compiling and running expression
51 Object result = new ExpressionEvaluator(runtimeEnvironment, expressionText)
52 .expectedType(expectedType)
53 .interpretIfPossible(false)
55 if(expectedValue != null)
56 Assert.assertEquals(expectedValue, result);
57 } catch(SCLExpressionCompilationException e) {
58 LOGGER.error(CompilationErrorFormatter.toString(expressionText, e.getErrors()));
64 public void testIt() throws Exception {
65 for(int i=0;i<1000000;++i) {
66 testExpression0("fst (\"a\", \"b\")", "a", Types.STRING);
67 if(i % 10000 == 0 && i > 0) {
69 System.runFinalization();
72 double used = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
73 LOGGER.info(i + " " + used*1e-6 + " Mb, " + (used / i) + " b / expression");