mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-13 08:04:03 +09:00
basic: fixing an edge case with scalar arrays
This commit is contained in:
@@ -448,6 +448,13 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
|
|||||||
|
|
||||||
if (!isNaN(rh)) rh = rh*1 // if string we got can be cast to number, do it
|
if (!isNaN(rh)) rh = rh*1 // if string we got can be cast to number, do it
|
||||||
|
|
||||||
|
//println(lnum+" = lh: "+Object.entries(args[0]));
|
||||||
|
//println(lnum+" = rh raw: "+Object.entries(args[1]));
|
||||||
|
//println(lnum+" = rh resolved: "+rh);
|
||||||
|
//try { println(lnum+" = rh resolved entries: "+Object.entries(rh)); }
|
||||||
|
//catch (_) {}
|
||||||
|
|
||||||
|
|
||||||
if (troValue.arrFull !== undefined) { // assign to existing array
|
if (troValue.arrFull !== undefined) { // assign to existing array
|
||||||
if (isNaN(rh) && !Array.isArray(rh)) throw lang.illegalType(lnum, rh);
|
if (isNaN(rh) && !Array.isArray(rh)) throw lang.illegalType(lnum, rh);
|
||||||
let arr = eval("troValue.arrFull"+troValue.arrKey);
|
let arr = eval("troValue.arrFull"+troValue.arrKey);
|
||||||
@@ -459,8 +466,16 @@ if no arg text were given (e.g. "10 NEXT"), args will have zero length
|
|||||||
var varname = troValue.toUpperCase();
|
var varname = troValue.toUpperCase();
|
||||||
var type = JStoBASICtype(rh);
|
var type = JStoBASICtype(rh);
|
||||||
if (bStatus.consts[varname]) throw lang.asgnOnConst(lnum, varname);
|
if (bStatus.consts[varname]) throw lang.asgnOnConst(lnum, varname);
|
||||||
bStatus.vars[varname] = new BasicVar(rh, type);
|
// special case for scalar array
|
||||||
return {asgnVarName: varname, asgnValue: rh};
|
// it basically bypasses the regular resolve subroutine
|
||||||
|
if (args[1].troType !== undefined && args[1].troType == "array") {
|
||||||
|
bStatus.vars[varname] = new BasicVar(args[1].troValue, "array");
|
||||||
|
return {asgnVarName: varname, asgnValue: rh};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bStatus.vars[varname] = new BasicVar(rh, type);
|
||||||
|
return {asgnVarName: varname, asgnValue: rh};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"IN" : function(lnum, args) { // almost same as =, but don't actually make new variable. Used by FOR statement
|
"IN" : function(lnum, args) { // almost same as =, but don't actually make new variable. Used by FOR statement
|
||||||
@@ -1778,13 +1793,13 @@ bF._parseTokens = function(lnum, tokens, states, recDepth) {
|
|||||||
// @return is defined in BasicAST
|
// @return is defined in BasicAST
|
||||||
let JStoBASICtype = function(object) {
|
let JStoBASICtype = function(object) {
|
||||||
if (typeof object === "boolean") return "bool";
|
if (typeof object === "boolean") return "bool";
|
||||||
|
else if (object === undefined) return "null";
|
||||||
|
else if (object.arrName !== undefined) return "internal_arrindexing_lazy";
|
||||||
|
else if (object.asgnVarName !== undefined) return "internal_assignment_object";
|
||||||
else if (object instanceof ForGen) return "generator";
|
else if (object instanceof ForGen) return "generator";
|
||||||
else if (Array.isArray(object)) return "array";
|
else if (Array.isArray(object)) return "array";
|
||||||
else if (!isNaN(object)) return "num";
|
else if (!isNaN(object)) return "num";
|
||||||
else if (typeof object === "string" || object instanceof String) return "string";
|
else if (typeof object === "string" || object instanceof String) return "string";
|
||||||
else if (object === undefined) return "null";
|
|
||||||
else if (object.asgnVarName !== undefined) return "internal_assignment_object";
|
|
||||||
else if (object.arrName !== undefined) return "internal_arrindexing_lazy";
|
|
||||||
// buncha error msgs
|
// buncha error msgs
|
||||||
else throw "BasicIntpError: un-translatable object with typeof "+(typeof object)+",\ntoString = "+object+",\nentries = "+Object.entries(object);
|
else throw "BasicIntpError: un-translatable object with typeof "+(typeof object)+",\ntoString = "+object+",\nentries = "+Object.entries(object);
|
||||||
}
|
}
|
||||||
@@ -1855,6 +1870,9 @@ bF._executeSyntaxTree = function(lnum, syntaxTree, recDepth) {
|
|||||||
// func not in builtins (e.g. array access, user-defined function defuns)
|
// func not in builtins (e.g. array access, user-defined function defuns)
|
||||||
if (func === undefined) {
|
if (func === undefined) {
|
||||||
var someVar = bStatus.vars[funcName];
|
var someVar = bStatus.vars[funcName];
|
||||||
|
|
||||||
|
//println(lnum+" _executeSyntaxTree: "+Object.entries(someVar));
|
||||||
|
|
||||||
if (someVar === undefined) {
|
if (someVar === undefined) {
|
||||||
throw lang.syntaxfehler(lnum, funcName + " is undefined");
|
throw lang.syntaxfehler(lnum, funcName + " is undefined");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user