fix MT bugs

This commit is contained in:
Daniella / Tove 2022-04-16 22:13:08 +02:00
parent b535caf9c0
commit 2e597b0966
2 changed files with 10 additions and 9 deletions

View file

@ -23,7 +23,8 @@ public class ISBPL {
static boolean debug = false, printCalls = false; static boolean debug = false, printCalls = false;
public ISBPLDebugger.IPC debuggerIPC = new ISBPLDebugger.IPC(); public ISBPLDebugger.IPC debuggerIPC = new ISBPLDebugger.IPC();
ArrayList<ISBPLType> types = new ArrayList<>(); ArrayList<ISBPLType> types = new ArrayList<>();
final ISBPLThreadLocal<Stack<HashMap<String, ISBPLCallable>>> functionStack = ISBPLThreadLocal.withInitial(Stack::new); HashMap<String, ISBPLCallable> level0 = new HashMap<>();
final ISBPLThreadLocal<Stack<HashMap<String, ISBPLCallable>>> functionStack = ISBPLThreadLocal.withInitial(() -> { Stack<HashMap<String, ISBPLCallable>> stack = new Stack<>(); stack.push(level0); return stack; });
final ISBPLThreadLocal<Stack<File>> fileStack = ISBPLThreadLocal.withInitial(Stack::new); final ISBPLThreadLocal<Stack<File>> fileStack = ISBPLThreadLocal.withInitial(Stack::new);
HashMap<Object, ISBPLObject> vars = new HashMap<>(); HashMap<Object, ISBPLObject> vars = new HashMap<>();
final ISBPLThreadLocal<ArrayList<String>> lastWords = ISBPLThreadLocal.withInitial(() -> new ArrayList<>(16)); final ISBPLThreadLocal<ArrayList<String>> lastWords = ISBPLThreadLocal.withInitial(() -> new ArrayList<>(16));
@ -148,7 +149,7 @@ public class ISBPL {
long tid = Thread.currentThread().getId(); long tid = Thread.currentThread().getId();
Stack<HashMap<String, ISBPLCallable>> fs = (Stack<HashMap<String, ISBPLCallable>>) functionStack.get().clone(); Stack<HashMap<String, ISBPLCallable>> fs = (Stack<HashMap<String, ISBPLCallable>>) functionStack.get().clone();
new Thread(() -> { new Thread(() -> {
debuggerIPC.run.put(Thread.currentThread().getId(), debuggerIPC.run.get(tid) == -1 ? -1 : 0); debuggerIPC.run.put(Thread.currentThread().getId(), debuggerIPC.run.getOrDefault(tid, -1) == -1 ? -1 : 0);
debuggerIPC.stack.put(Thread.currentThread().getId(), s); debuggerIPC.stack.put(Thread.currentThread().getId(), s);
functionStack.set(fs); functionStack.set(fs);
try { try {
@ -1089,14 +1090,14 @@ public class ISBPL {
} }
public ISBPLType registerType(String name) { public ISBPLType registerType(String name) {
ISBPLType type = new ISBPLType(name); ISBPLType type = new ISBPLType(name, types.size());
types.add(type); types.add(type);
return type; return type;
} }
// These will die as soon as std creates the real types and any types created before these are replaced become invalid. // These will die as soon as std creates the real types and any types created before these are replaced become invalid.
static final ISBPLType defaultTypeInt = new ISBPLType("int"); static final ISBPLType defaultTypeInt = new ISBPLType("int", -2);
static final ISBPLType defaultTypeString = new ISBPLType("string"); static final ISBPLType defaultTypeString = new ISBPLType("string", -1);
public ISBPLType getType(String name) { public ISBPLType getType(String name) {
for (int i = 0 ; i < types.size() ; i++) { for (int i = 0 ; i < types.size() ; i++) {
@ -1329,14 +1330,14 @@ interface ISBPLCallable {
} }
class ISBPLType { class ISBPLType {
static int gid = -2; int id;
int id = gid++;
String name; String name;
HashMap<String, ISBPLCallable> methods = new HashMap<>(); HashMap<String, ISBPLCallable> methods = new HashMap<>();
HashMap<ISBPLObject, HashMap<Object, ISBPLObject>> vars = new HashMap<>(); HashMap<ISBPLObject, HashMap<Object, ISBPLObject>> vars = new HashMap<>();
public ISBPLType(String name) { public ISBPLType(String name, int id) {
this.name = name; this.name = name;
this.id = id;
} }
public HashMap<Object, ISBPLObject> varget(ISBPLObject o) { public HashMap<Object, ISBPLObject> varget(ISBPLObject o) {

View file

@ -85,6 +85,7 @@ def TYPE_LONG "long" mktype =TYPE_LONG
def TYPE_DOUBLE "double" mktype =TYPE_DOUBLE def TYPE_DOUBLE "double" mktype =TYPE_DOUBLE
def TYPE_FUNCTION "func" mktype =TYPE_FUNCTION def TYPE_FUNCTION "func" mktype =TYPE_FUNCTION
def TYPE_ARRAY "array" mktype =TYPE_ARRAY def TYPE_ARRAY "array" mktype =TYPE_ARRAY
def TYPE_STRING "string" mktype =TYPE_STRING
def TYPE_JIO "jio" mktype =TYPE_JIO def TYPE_JIO "jio" mktype =TYPE_JIO
"class" { "class" {
@ -99,7 +100,6 @@ def TYPE_JIO "jio" mktype =TYPE_JIO
} TYPE_JIO defmethod } TYPE_JIO defmethod
def JIO 0 TYPE_JIO settype =JIO def JIO 0 TYPE_JIO settype =JIO
def TYPE_STRING "string" mktype =TYPE_STRING
func _string { func _string {
def object =object def object =object