Skip to content

Commit

Permalink
Equivalence classes should be shared per language.
Browse files Browse the repository at this point in the history
  • Loading branch information
woess committed Sep 12, 2023
1 parent bf840d4 commit 53d6c85
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 15 deletions.
2 changes: 1 addition & 1 deletion wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/Linker.java
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ private static void assignTypeEquivalenceClasses() {
final SymbolTable symtab = instance.symbolTable();
for (int index = 0; index < symtab.typeCount(); index++) {
FunctionType type = symtab.typeAt(index);
Integer equivalenceClass = context.equivalenceClassFor(type);
int equivalenceClass = context.language().equivalenceClassFor(type);
symtab.setEquivalenceClass(index, equivalenceClass);
}
for (int index = 0; index < symtab.numFunctions(); index++) {
Expand Down
14 changes: 0 additions & 14 deletions wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
*/
package org.graalvm.wasm;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

Expand All @@ -58,8 +57,6 @@
public final class WasmContext {
private final Env env;
private final WasmLanguage language;
private final Map<SymbolTable.FunctionType, Integer> equivalenceClasses;
private int nextEquivalenceClass;
private final MemoryRegistry memoryRegistry;
private final GlobalRegistry globals;
private final TableRegistry tableRegistry;
Expand All @@ -74,8 +71,6 @@ public WasmContext(Env env, WasmLanguage language) {
this.env = env;
this.language = language;
this.contextOptions = WasmContextOptions.fromOptionValues(env.getOptions());
this.equivalenceClasses = new HashMap<>();
this.nextEquivalenceClass = SymbolTable.FIRST_EQUIVALENCE_CLASS;
this.globals = new GlobalRegistry(contextOptions.supportBulkMemoryAndRefTypes());
this.tableRegistry = new TableRegistry();
this.memoryRegistry = new MemoryRegistry();
Expand Down Expand Up @@ -110,15 +105,6 @@ public Linker linker() {
return linker;
}

public Integer equivalenceClassFor(SymbolTable.FunctionType type) {
Integer equivalenceClass = equivalenceClasses.get(type);
if (equivalenceClass == null) {
equivalenceClass = nextEquivalenceClass++;
equivalenceClasses.put(type, equivalenceClass);
}
return equivalenceClass;
}

@SuppressWarnings("unused")
public Object getScope() {
return new WasmScope(this);
Expand Down
18 changes: 18 additions & 0 deletions wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmLanguage.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,24 @@ public final class WasmLanguage extends TruffleLanguage<WasmContext> {

private final Map<BuiltinModule, WasmModule> builtinModules = new ConcurrentHashMap<>();

private final Map<SymbolTable.FunctionType, Integer> equivalenceClasses = new ConcurrentHashMap<>();
private int nextEquivalenceClass = SymbolTable.FIRST_EQUIVALENCE_CLASS;

public int equivalenceClassFor(SymbolTable.FunctionType type) {
Integer equivalenceClass = equivalenceClasses.get(type);
if (equivalenceClass == null) {
synchronized (this) {
equivalenceClass = equivalenceClasses.get(type);
if (equivalenceClass == null) {
equivalenceClass = nextEquivalenceClass++;
Integer prev = equivalenceClasses.put(type, equivalenceClass);
assert prev == null;
}
}
}
return equivalenceClass;
}

@Override
protected WasmContext createContext(Env env) {
WasmContext context = new WasmContext(env, this);
Expand Down

0 comments on commit 53d6c85

Please sign in to comment.