use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeFuncObject in project jMiniLang by bajdcc.
the class RuntimeMachine method opCallExtern.
@Override
public void opCallExtern(boolean invoke) throws Exception {
int idx = loadInt();
String name = "";
if (invoke) {
RuntimeStack itStack = stack;
RuntimeObject obj = null;
while (obj == null && itStack != null) {
obj = itStack.findVariable(pageName, idx);
itStack = itStack.prev;
}
if (obj == null) {
err(RuntimeError.WRONG_LOAD_EXTERN, String.valueOf(idx));
}
if (obj.getType() == RuntimeObjectType.kFunc) {
RuntimeFuncObject func = (RuntimeFuncObject) obj.getObj();
Map<Integer, RuntimeObject> env = func.getEnv();
if (env != null) {
for (Entry<Integer, RuntimeObject> entry : env.entrySet()) {
int id = entry.getKey();
RuntimeObject o = entry.getValue();
if (o != null) {
if (o.getSymbol() == null)
o.setSymbol(currentPage.getData().get(id));
o.setReadonly(false);
}
stack.storeClosure(id, o);
}
stack.pushData(obj);
}
int address = func.getAddr();
stack.opCall(address, func.getPage(), stack.reg.execId, pageName, pageMap.get(func.getPage()).getInfo().getFuncNameByAddress(address));
stack.reg.execId = address;
stack.reg.pageId = func.getPage();
switchPage();
pop();
return;
} else if (obj.getType() == RuntimeObjectType.kString) {
name = obj.getObj().toString();
} else {
err(RuntimeError.WRONG_LOAD_EXTERN, obj.toString());
}
} else {
RuntimeObject obj = fetchFromGlobalData(idx);
name = obj.getObj().toString();
}
List<RuntimeCodePage> refers = pageRefer.get(pageName);
for (RuntimeCodePage page : refers) {
int address = page.getInfo().getAddressOfExportFunc(name);
if (address != -1) {
String jmpPage = page.getInfo().getDataMap().get("name").toString();
stack.opCall(address, jmpPage, stack.reg.execId, stack.reg.pageId, name);
stack.reg.execId = address;
stack.reg.pageId = jmpPage;
switchPage();
return;
}
}
for (RuntimeCodePage page : refers) {
IRuntimeDebugExec exec = page.getInfo().getExecCallByName(name);
if (exec != null) {
int argsCount = stack.getFuncArgsCount();
RuntimeObjectType[] types = exec.getArgsType();
if ((types == null && argsCount != 0) || (types != null && types.length != argsCount)) {
err(RuntimeError.WRONG_ARGCOUNT, name + " " + String.valueOf(argsCount));
}
List<RuntimeObject> args = new ArrayList<>();
for (int i = 0; i < argsCount; i++) {
RuntimeObjectType type = types[i];
RuntimeObject objParam = stack.loadFuncArgs(i);
if (type != RuntimeObjectType.kObject) {
RuntimeObjectType objType = objParam.getType();
if (objType != type) {
Token token = Token.createFromObject(objParam.getObj());
TokenType objTokenType = RuntimeObject.toTokenType(type);
if (objTokenType == TokenType.ERROR) {
err(RuntimeError.WRONG_ARGTYPE, name + " " + objTokenType.getName());
}
if (!TokenTools.promote(objTokenType, token)) {
err(RuntimeError.UNDEFINED_CONVERT, name + " " + token.toString() + " " + objTokenType.getName());
} else {
objParam.setObj(token.object);
}
}
}
args.add(objParam);
}
stack.opCall(stack.reg.execId, stack.reg.pageId, stack.reg.execId, stack.reg.pageId, name);
RuntimeObject retVal = exec.ExternalProcCall(args, this);
if (retVal == null) {
store(new RuntimeObject(null));
} else {
store(retVal);
}
opReturn();
return;
}
}
err(RuntimeError.WRONG_LOAD_EXTERN, name);
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeFuncObject in project jMiniLang by bajdcc.
the class ModuleProc method buildMethod.
private void buildMethod(IRuntimeDebugInfo info) {
info.addExternalFunc("g_create_process", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
return new RuntimeObject(BigInteger.valueOf(status.createProcess(func)));
}
});
info.addExternalFunc("g_create_process_args", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建进程带参数";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
RuntimeObject obj = args.get(1);
return new RuntimeObject(BigInteger.valueOf(status.createProcess(func, obj)));
}
});
info.addExternalFunc("g_create_user_process", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建用户态进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
return new RuntimeObject(BigInteger.valueOf(status.createUsrProcess(func)));
}
});
info.addExternalFunc("g_create_user_process_args", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建用户态进程带参数";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
RuntimeObject obj = args.get(1);
return new RuntimeObject(BigInteger.valueOf(status.createUsrProcess(func, obj)));
}
});
info.addExternalFunc("g_get_user_procs", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取用户态进程ID列表";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray arr = new RuntimeArray();
List<Integer> list = status.getUsrProcs();
for (Integer pid : list) {
arr.add(new RuntimeObject(pid));
}
return new RuntimeObject(arr);
}
});
info.addExternalFunc("g_get_pid", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取进程ID";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.getPid()));
}
});
info.addExternalFunc("g_get_parent_pid", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取父进程ID";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.getParentPid()));
}
});
info.addExternalFunc("g_get_process_priority", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取进程优先级";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.getPriority()));
}
});
info.addExternalFunc("g_set_process_priority", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "设置进程优先级";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger priority = (BigInteger) args.get(0).getObj();
return new RuntimeObject(status.setPriority(priority.intValue()));
}
});
info.addExternalFunc("g_join_process_once", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "进程等待";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger pid = (BigInteger) args.get(0).getObj();
return new RuntimeObject(status.getService().getProcessService().join(pid.intValue(), status.getPid()));
}
});
info.addExternalFunc("g_live_process", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "进程存活";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger pid = (BigInteger) args.get(0).getObj();
return new RuntimeObject(status.getService().getProcessService().live(pid.intValue()));
}
});
info.addExternalFunc("g_sleep", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "进程睡眠";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger turn = (BigInteger) args.get(0).getObj();
int time = turn.intValue();
return new RuntimeObject(BigInteger.valueOf(status.getService().getProcessService().sleep(status.getPid(), time > 0 ? time : 0)));
}
});
info.addExternalFunc("g_query_usr_proc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "枚举用户态进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(ProcInfoHelper.getProcInfo(status, status.getUsrProcs()));
}
});
info.addExternalFunc("g_query_sys_proc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "枚举内核态进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(ProcInfoHelper.getProcInfo(status, status.getSysProcs()));
}
});
info.addExternalFunc("g_query_all_proc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "枚举进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(ProcInfoHelper.getProcInfoAll(status));
}
});
info.addExternalFunc("g_set_process_desc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "设置进程说明";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
status.setProcDesc(String.valueOf(args.get(0).getObj()));
return null;
}
});
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeFuncObject in project jMiniLang by bajdcc.
the class RuntimeMachine method opLoadFunc.
@Override
public void opLoadFunc() throws RuntimeException {
int idx = loadInt();
RuntimeFuncObject func = new RuntimeFuncObject(pageName, idx);
RuntimeObject obj = new RuntimeObject(func);
int envSize = loadInt();
FOR_LOOP: for (int i = 0; i < envSize; i++) {
int id = loadInt();
if (id == -1) {
id = loadInt();
String name = fetchFromGlobalData(id).getObj().toString();
IRuntimeDebugValue value = currentPage.getInfo().getValueCallByName(name);
if (value != null) {
func.addEnv(id, value.getRuntimeObject());
continue;
}
int index = currentPage.getInfo().getAddressOfExportFunc(name);
if (index != -1) {
func.addEnv(id, new RuntimeObject(new RuntimeFuncObject(pageName, index)));
continue;
}
List<RuntimeCodePage> refers = pageRefer.get(currentPage.getInfo().getDataMap().get("name").toString());
for (RuntimeCodePage page : refers) {
value = page.getInfo().getValueCallByName(name);
if (value != null) {
func.addEnv(id, value.getRuntimeObject());
continue FOR_LOOP;
}
index = page.getInfo().getAddressOfExportFunc(name);
if (index != -1) {
func.addEnv(id, new RuntimeObject(new RuntimeFuncObject(page.getInfo().getDataMap().get("name").toString(), index)));
continue FOR_LOOP;
}
}
err(RuntimeError.WRONG_LOAD_EXTERN, name);
} else {
func.addEnv(id, stack.findVariable(func.getPage(), id));
}
}
stack.pushData(obj);
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeFuncObject in project jMiniLang by bajdcc.
the class RuntimeMachine method opReloadFunc.
@Override
public void opReloadFunc() throws RuntimeException {
int idx = loadInt();
RuntimeFuncObject func = new RuntimeFuncObject(stack.reg.pageId, stack.reg.execId);
RuntimeObject obj = new RuntimeObject(func);
obj.setSymbol(currentPage.getData().get(idx));
stack.storeVariableDirect(idx, obj);
}
Aggregations