1
1
Fork 0
mirror of https://github.com/boxgaming/qbjs.git synced 2024-09-19 20:14:58 +00:00

Export fix to prevent registering built-in functions. Changed Not operator to use javascript bitwise operator

This commit is contained in:
boxgaming 2024-08-13 09:14:05 -05:00
parent 185d53907b
commit b8836a2b3e
2 changed files with 179 additions and 80 deletions

194
qb2js.js
View file

@ -7,7 +7,7 @@ async function _QBCompiler() {
const FILE = 1; const TEXT = 2; const FILE = 1; const TEXT = 2;
const MWARNING = 0; const MERROR = 1; const MWARNING = 0; const MERROR = 1;
const False = 0; const False = 0;
const True = ! False; const True = ~ False;
const PrintDataTypes = True; const PrintDataTypes = True;
const PrintLineMapping = False; const PrintLineMapping = False;
const PrintTokenizedLine = False; const PrintTokenizedLine = False;
@ -20,7 +20,7 @@ async function _QBCompiler() {
var lines = QB.initArray([{l:0,u:0}], {line:0,text:'',mtype:0}); /* CODELINE */ var lines = QB.initArray([{l:0,u:0}], {line:0,text:'',mtype:0}); /* CODELINE */
var jsLines = QB.initArray([{l:0,u:0}], {line:0,text:'',mtype:0}); /* CODELINE */ var jsLines = QB.initArray([{l:0,u:0}], {line:0,text:'',mtype:0}); /* CODELINE */
var methods = QB.initArray([{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}); /* METHOD */ var methods = QB.initArray([{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}); /* METHOD */
var types = QB.initArray([{l:0,u:0}], {line:0,name:'',argc:0,args:''}); /* QBTYPE */ var types = QB.initArray([{l:0,u:0}], {line:0,name:'',argc:0,args:''}); /* QBTYPE */
var typeVars = QB.initArray([{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); /* VARIABLE */ var typeVars = QB.initArray([{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); /* VARIABLE */
var globalVars = QB.initArray([{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); /* VARIABLE */ var globalVars = QB.initArray([{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); /* VARIABLE */
@ -28,7 +28,7 @@ async function _QBCompiler() {
var warnings = QB.initArray([{l:0,u:0}], {line:0,text:'',mtype:0}); /* CODELINE */ var warnings = QB.initArray([{l:0,u:0}], {line:0,text:'',mtype:0}); /* CODELINE */
var exportLines = QB.initArray([{l:0,u:0}], ''); /* STRING */ var exportLines = QB.initArray([{l:0,u:0}], ''); /* STRING */
var exportConsts = QB.initArray([{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); /* VARIABLE */ var exportConsts = QB.initArray([{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}); /* VARIABLE */
var exportMethods = QB.initArray([{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}); /* METHOD */ var exportMethods = QB.initArray([{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}); /* METHOD */
var dataArray = QB.initArray([{l:0,u:0}], ''); /* STRING */ var dataArray = QB.initArray([{l:0,u:0}], ''); /* STRING */
var dataLabels = QB.initArray([{l:0,u:0}], {text:'',index:0}); /* LABEL */ var dataLabels = QB.initArray([{l:0,u:0}], {text:'',index:0}); /* LABEL */
var modLevel = 0; /* INTEGER */ var modLevel = 0; /* INTEGER */
@ -78,12 +78,12 @@ if (QB.halted()) { return; }; sourceType = Math.round(sourceType);
} }
await sub_AddJSLine( 0, "/* static method variables: */ "); await sub_AddJSLine( 0, "/* static method variables: */ ");
staticVarLine = (QB.func_UBound( jsLines)); staticVarLine = (QB.func_UBound( jsLines));
if (! selfConvert & moduleName == "" ) { if (~ selfConvert & moduleName == "" ) {
await sub_AddJSLine( 0, "QB.start();"); await sub_AddJSLine( 0, "QB.start();");
} }
if (! selfConvert & moduleName == "" ) { if (~ selfConvert & moduleName == "" ) {
var mtest = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var mtest = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
if ((await func_FindMethod( "GXOnGameEvent" , mtest, "SUB")) ) { if ((await func_FindMethod( "GXOnGameEvent" , mtest, "SUB" , True)) ) {
await sub_AddJSLine( 0, " await GX.registerGameEvents(sub_GXOnGameEvent);"); await sub_AddJSLine( 0, " await GX.registerGameEvents(sub_GXOnGameEvent);");
isGX = True; isGX = True;
} else { } else {
@ -94,11 +94,11 @@ if (QB.halted()) { return; }; sourceType = Math.round(sourceType);
await sub_AddJSLine( 0, ""); await sub_AddJSLine( 0, "");
await sub_InitData(); await sub_InitData();
await sub_ConvertLines( 1, await func_MainEnd(), ""); await sub_ConvertLines( 1, await func_MainEnd(), "");
if (! selfConvert & ! isGX & moduleName == "" ) { if (~ selfConvert & ~ isGX & moduleName == "" ) {
await sub_AddJSLine( 0, "QB.end();"); await sub_AddJSLine( 0, "QB.end();");
} }
await sub_ConvertMethods(); await sub_ConvertMethods();
if (! selfConvert & moduleName == "" ) { if (~ selfConvert & moduleName == "" ) {
await sub_InitTypes(); await sub_InitTypes();
} }
if ( selfConvert) { if ( selfConvert) {
@ -125,6 +125,35 @@ if (QB.halted()) { return; }; sourceType = Math.round(sourceType);
await sub_AddJSLine( 0, " }"); await sub_AddJSLine( 0, " }");
await sub_AddJSLine( 0, " return w;"); await sub_AddJSLine( 0, " return w;");
await sub_AddJSLine( 0, "};"); await sub_AddJSLine( 0, "};");
await sub_AddJSLine( 0, "function _getMethods(methods) {");
await sub_AddJSLine( 0, " var m = [];");
await sub_AddJSLine( 0, " for (var i=1; i <= QB.func_UBound(methods); i++) {");
await sub_AddJSLine( 0, " var lidx = QB.arrayValue(methods, [i]).value.line;");
await sub_AddJSLine( 0, " m.push({");
await sub_AddJSLine( 0, " line: QB.arrayValue(lines, [lidx]).value.line,");
await sub_AddJSLine( 0, " type: QB.arrayValue(methods, [i]).value.type,");
await sub_AddJSLine( 0, " returnType: QB.arrayValue(methods, [i]).value.returnType,");
await sub_AddJSLine( 0, " name: QB.arrayValue(methods, [i]).value.name,");
await sub_AddJSLine( 0, " uname: QB.arrayValue(methods, [i]).value.uname,");
await sub_AddJSLine( 0, " jsname: QB.arrayValue(methods, [i]).value.jsname,");
await sub_AddJSLine( 0, " argc: QB.arrayValue(methods, [i]).value.argc,");
await sub_AddJSLine( 0, " args: QB.arrayValue(methods, [i]).value.args");
await sub_AddJSLine( 0, " });");
await sub_AddJSLine( 0, " }");
await sub_AddJSLine( 0, " return m;");
await sub_AddJSLine( 0, "}");
await sub_AddJSLine( 0, "this.getMethods = function () { return _getMethods(methods); };");
await sub_AddJSLine( 0, "this.getExportMethods = function () { return _getMethods(exportMethods); };");
await sub_AddJSLine( 0, "this.getExportConsts = function() {");
await sub_AddJSLine( 0, " var c = [];");
await sub_AddJSLine( 0, " for (var i=1; i <= QB.func_UBound(exportConsts); i++) {");
await sub_AddJSLine( 0, " c.push({");
await sub_AddJSLine( 0, " name: QB.arrayValue(exportConsts, [i]).value.name,");
await sub_AddJSLine( 0, " jsname: QB.arrayValue(exportConsts, [i]).value.jsname");
await sub_AddJSLine( 0, " });");
await sub_AddJSLine( 0, " }");
await sub_AddJSLine( 0, " return c;");
await sub_AddJSLine( 0, "}");
await sub_AddJSLine( 0, "this.getSourceLine = function(jsLine) {"); await sub_AddJSLine( 0, "this.getSourceLine = function(jsLine) {");
await sub_AddJSLine( 0, " if (jsLine == 0) { return 0; }"); await sub_AddJSLine( 0, " if (jsLine == 0) { return 0; }");
await sub_AddJSLine( 0, " var line = QB.arrayValue(jsLines, [jsLine]).value.line;"); await sub_AddJSLine( 0, " var line = QB.arrayValue(jsLines, [jsLine]).value.line;");
@ -135,7 +164,6 @@ if (QB.halted()) { return; }; sourceType = Math.round(sourceType);
await sub_AddJSLine( 0, "return this;"); await sub_AddJSLine( 0, "return this;");
await sub_AddJSLine( 0, "}"); await sub_AddJSLine( 0, "}");
} else if ( moduleName != "" ) { } else if ( moduleName != "" ) {
await sub_AddJSLine( 0, "return this;");
await sub_AddJSLine( 0, "}"); await sub_AddJSLine( 0, "}");
await sub_AddJSLine( 0, "const " + moduleName + " = await _" + moduleName + "();"); await sub_AddJSLine( 0, "const " + moduleName + " = await _" + moduleName + "();");
} else if ( sourceType == FILE) { } else if ( sourceType == FILE) {
@ -177,7 +205,7 @@ if (QB.halted()) { return; };
async function sub_ResetDataStructures() { async function sub_ResetDataStructures() {
if (QB.halted()) { return; }; if (QB.halted()) { return; };
QB.resizeArray(lines, [{l:0,u:0}], {line:0,text:'',mtype:0}, false); /* CODELINE */ QB.resizeArray(lines, [{l:0,u:0}], {line:0,text:'',mtype:0}, false); /* CODELINE */
QB.resizeArray(methods, [{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, false); /* METHOD */ QB.resizeArray(methods, [{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, false); /* METHOD */
QB.resizeArray(types, [{l:0,u:0}], {line:0,name:'',argc:0,args:''}, false); /* QBTYPE */ QB.resizeArray(types, [{l:0,u:0}], {line:0,name:'',argc:0,args:''}, false); /* QBTYPE */
QB.resizeArray(typeVars, [{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); /* VARIABLE */ QB.resizeArray(typeVars, [{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); /* VARIABLE */
QB.resizeArray(globalVars, [{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); /* VARIABLE */ QB.resizeArray(globalVars, [{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); /* VARIABLE */
@ -186,7 +214,7 @@ if (QB.halted()) { return; };
QB.resizeArray(dataArray, [{l:0,u:0}], '', false); /* STRING */ QB.resizeArray(dataArray, [{l:0,u:0}], '', false); /* STRING */
QB.resizeArray(dataLabels, [{l:0,u:0}], {text:'',index:0}, false); /* LABEL */ QB.resizeArray(dataLabels, [{l:0,u:0}], {text:'',index:0}, false); /* LABEL */
if ( modLevel == 0) { if ( modLevel == 0) {
QB.resizeArray(exportMethods, [{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, false); /* METHOD */ QB.resizeArray(exportMethods, [{l:0,u:0}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, false); /* METHOD */
QB.resizeArray(exportConsts, [{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); /* VARIABLE */ QB.resizeArray(exportConsts, [{l:0,u:0}], {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}, false); /* VARIABLE */
} }
currentMethod = ""; currentMethod = "";
@ -224,7 +252,7 @@ if (QB.halted()) { return; }; firstLine = Math.round(firstLine); lastLine = Math
var i = 0; /* INTEGER */ var j = 0; /* INTEGER */ var i = 0; /* INTEGER */ var j = 0; /* INTEGER */
var indent = 0; /* INTEGER */ var indent = 0; /* INTEGER */
var tempIndent = 0; /* INTEGER */ var tempIndent = 0; /* INTEGER */
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
var totalIndent = 0; /* INTEGER */ var totalIndent = 0; /* INTEGER */
totalIndent = 1; totalIndent = 1;
var caseCount = 0; /* INTEGER */ var caseCount = 0; /* INTEGER */
@ -564,7 +592,7 @@ if (QB.halted()) { return; }; firstLine = Math.round(firstLine); lastLine = Math
} else { } else {
subname = (QB.func_Left( subline, subend - 1)); subname = (QB.func_Left( subline, subend - 1));
} }
if ((await func_FindMethod( subname, m, "SUB")) ) { if ((await func_FindMethod( subname, m, "SUB" , True)) ) {
var subargs = ''; /* STRING */ var subargs = ''; /* STRING */
if ( subname == subline) { if ( subname == subline) {
subargs = ""; subargs = "";
@ -600,7 +628,7 @@ if (QB.halted()) { return; }; firstLine = Math.round(firstLine); lastLine = Math
arg1 = (QB.func_Mid( QB.arrayValue(parts, [ 1]).value , parendx)); arg1 = (QB.func_Mid( QB.arrayValue(parts, [ 1]).value , parendx));
c = (await func_SLSplit( sname + " " + arg1 + (await func_Join( parts , 2, - 1, " ")) , parts , True)); c = (await func_SLSplit( sname + " " + arg1 + (await func_Join( parts , 2, - 1, " ")) , parts , True));
} }
if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , m, "SUB")) ) { if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , m, "SUB" , True)) ) {
js = (await func_ConvertSub( m, (await func_Join( parts , 2, - 1, " ")) , i)); js = (await func_ConvertSub( m, (await func_Join( parts , 2, - 1, " ")) , i));
} else { } else {
js = "// " + l; js = "// " + l;
@ -608,7 +636,7 @@ if (QB.halted()) { return; }; firstLine = Math.round(firstLine); lastLine = Math
} }
} }
} else { } else {
if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , m, "SUB")) ) { if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , m, "SUB" , True)) ) {
js = (await func_ConvertSub( m, (await func_Join( parts , 2, - 1, " ")) , i)); js = (await func_ConvertSub( m, (await func_Join( parts , 2, - 1, " ")) , i));
} else { } else {
js = "// " + l; js = "// " + l;
@ -706,8 +734,8 @@ return FixCondition;
async function sub_ParseExport(s/*STRING*/,lineIndex/*INTEGER*/) { async function sub_ParseExport(s/*STRING*/,lineIndex/*INTEGER*/) {
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var exportedItem = ''; /* STRING */ var exportedItem = ''; /* STRING */
var ef = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var ef = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
var es = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var es = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
var ev = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; /* VARIABLE */ var ev = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; /* VARIABLE */
var exportName = ''; /* STRING */ var exportName = ''; /* STRING */
var parts = QB.initArray([{l:0,u:0}], ''); /* STRING */ var parts = QB.initArray([{l:0,u:0}], ''); /* STRING */
@ -715,7 +743,7 @@ if (QB.halted()) { return; };
found = False; found = False;
var c = 0; /* INTEGER */ var c = 0; /* INTEGER */
c = (await func_SLSplit( s, parts , False)); c = (await func_SLSplit( s, parts , False));
if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , es, "SUB")) ) { if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , es, "SUB" , False)) ) {
if ( c > 2) { if ( c > 2) {
exportName = QB.arrayValue(parts, [ 3]).value; exportName = QB.arrayValue(parts, [ 3]).value;
} else { } else {
@ -728,7 +756,7 @@ if (QB.halted()) { return; };
await sub_RegisterExport( exportName, exportedItem); await sub_RegisterExport( exportName, exportedItem);
found = True; found = True;
} }
if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , ef, "FUNCTION")) ) { if ((await func_FindMethod( QB.arrayValue(parts, [ 1]).value , ef, "FUNCTION" , False)) ) {
if ( c > 2) { if ( c > 2) {
exportName = QB.arrayValue(parts, [ 3]).value; exportName = QB.arrayValue(parts, [ 3]).value;
} else { } else {
@ -760,7 +788,7 @@ if (QB.halted()) { return; };
found = True; found = True;
} }
} }
if (! found) { if (~ found) {
await sub_AddWarning( lineIndex, "Invalid export [" + QB.arrayValue(parts, [ 1]).value + "]. Exported items must be a Sub, Function or Const in the current module."); await sub_AddWarning( lineIndex, "Invalid export [" + QB.arrayValue(parts, [ 1]).value + "]. Exported items must be a Sub, Function or Const in the current module.");
} }
} }
@ -868,8 +896,8 @@ var ConvertPut = null;
position = "undefined"; position = "undefined";
} }
var v = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; /* VARIABLE */ var v = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; /* VARIABLE */
if (!(await func_FindVariable( vname, v, False)) ) { if (~(await func_FindVariable( vname, v, False)) ) {
if (!(await func_FindVariable( vname, v, True)) ) { if (~(await func_FindVariable( vname, v, True)) ) {
await sub_AddWarning( lineNumber, "Invalid variable '" + vname + "'"); await sub_AddWarning( lineNumber, "Invalid variable '" + vname + "'");
return ConvertPut; return ConvertPut;
} }
@ -1469,7 +1497,7 @@ var GetVarType = null;
vname = (QB.func_Left( vname, pidx - 1)); vname = (QB.func_Left( vname, pidx - 1));
} }
found = (await func_FindVariable( vname, v, False)); found = (await func_FindVariable( vname, v, False));
if (! found) { if (~ found) {
found = (await func_FindVariable( vname, v, True)); found = (await func_FindVariable( vname, v, True));
} }
if ( found) { if ( found) {
@ -1482,7 +1510,7 @@ var GetVarType = null;
vname = (QB.func_Left( vname, pidx - 1)); vname = (QB.func_Left( vname, pidx - 1));
} }
found = (await func_FindVariable( vname, v, False)); found = (await func_FindVariable( vname, v, False));
if (! found) { if (~ found) {
found = (await func_FindVariable( vname, v, True)); found = (await func_FindVariable( vname, v, True));
} }
if ( found) { if ( found) {
@ -1553,12 +1581,12 @@ var FindParamChar = null;
var ___v9485711 = 0; ___l3009705: for ( i= 1; i <= (QB.func_Len( s)); i= i + 1) { if (QB.halted()) { return; } ___v9485711++; if (___v9485711 % 100 == 0) { await QB.autoLimit(); } var ___v9485711 = 0; ___l3009705: for ( i= 1; i <= (QB.func_Len( s)); i= i + 1) { if (QB.halted()) { return; } ___v9485711++; if (___v9485711 % 100 == 0) { await QB.autoLimit(); }
c = (QB.func_Mid( s, i, 1)); c = (QB.func_Mid( s, i, 1));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
quote = ! quote; quote = ~ quote;
} else if (! quote & c == "(" ) { } else if (~ quote & c == "(" ) {
paren = paren + 1; paren = paren + 1;
} else if (! quote & c == ")" ) { } else if (~ quote & c == ")" ) {
paren = paren - 1; paren = paren - 1;
} else if (! quote & paren == 0 & c == char) { } else if (~ quote & paren == 0 & c == char) {
idx = i; idx = i;
break ___l3009705; break ___l3009705;
} }
@ -1758,7 +1786,7 @@ var RegisterVar = null;
bvar.jsname = "$" + currentMethod + "__" + bvar.jsname; bvar.jsname = "$" + currentMethod + "__" + bvar.jsname;
} }
bvar.type = (await func_NormalizeType( bvar.type)); bvar.type = (await func_NormalizeType( bvar.type));
if (! bvar.isArray) { if (~ bvar.isArray) {
js = js + "var " + bvar.jsname + " = " + (await func_InitTypeValue( bvar.type)) + "; "; js = js + "var " + bvar.jsname + " = " + (await func_InitTypeValue( bvar.type)) + "; ";
} else { } else {
if ((await func_FindVariable( bvar.name, findVar, True)) ) { if ((await func_FindVariable( bvar.name, findVar, True)) ) {
@ -1863,7 +1891,7 @@ var ConvertExpression = null;
var word = ''; /* STRING */ var word = ''; /* STRING */
word = ""; word = "";
var bvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; /* VARIABLE */ var bvar = {type:'',name:'',jsname:'',isConst:0,isArray:0,arraySize:0,typeId:0}; /* VARIABLE */
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
var stringLiteral = 0; /* INTEGER */ var stringLiteral = 0; /* INTEGER */
var i = 0; /* INTEGER */ var i = 0; /* INTEGER */
i = 1; i = 1;
@ -1871,7 +1899,7 @@ var ConvertExpression = null;
c = (QB.func_Mid( ex, i, 1)); c = (QB.func_Mid( ex, i, 1));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
js = js + c; js = js + c;
stringLiteral = ! stringLiteral; stringLiteral = ~ stringLiteral;
} else if ( stringLiteral) { } else if ( stringLiteral) {
js = js + c; js = js + c;
} else { } else {
@ -1882,7 +1910,7 @@ var ConvertExpression = null;
var uword = ''; /* STRING */ var uword = ''; /* STRING */
uword = (QB.func_UCase( (QB.func__Trim( word)))); uword = (QB.func_UCase( (QB.func__Trim( word))));
if ( uword == "NOT" ) { if ( uword == "NOT" ) {
js = js + "!"; js = js + "~";
} else if ( uword == "AND" ) { } else if ( uword == "AND" ) {
js = js + " & "; js = js + " & ";
} else if ( uword == "OR" ) { } else if ( uword == "OR" ) {
@ -1905,7 +1933,7 @@ var ConvertExpression = null;
if ((await func_FindVariable( word, bvar, False)) ) { if ((await func_FindVariable( word, bvar, False)) ) {
js = js + " " + bvar.jsname; js = js + " " + bvar.jsname;
} else { } else {
if ((await func_FindMethod( word, m, "FUNCTION")) ) { if ((await func_FindMethod( word, m, "FUNCTION" , True)) ) {
if ( m.name != currentMethod) { if ( m.name != currentMethod) {
js = js + (await func_CallMethod( m)) + "()"; js = js + (await func_CallMethod( m)) + "()";
} else { } else {
@ -1931,20 +1959,20 @@ var ConvertExpression = null;
var stringLiteral2 = 0; /* INTEGER */ var stringLiteral2 = 0; /* INTEGER */
stringLiteral2 = False; stringLiteral2 = False;
i = i + 1; i = i + 1;
var ___v6276420 = 0; ___l6317424: while (! done & i <= (QB.func_Len( ex))) { if (QB.halted()) { return; }___v6276420++; if (___v6276420 % 100 == 0) { await QB.autoLimit(); } var ___v6276420 = 0; ___l6317424: while (~ done & i <= (QB.func_Len( ex))) { if (QB.halted()) { return; }___v6276420++; if (___v6276420 % 100 == 0) { await QB.autoLimit(); }
c2 = (QB.func_Mid( ex, i, 1)); c2 = (QB.func_Mid( ex, i, 1));
if ( c2 == (QB.func_Chr( 34)) ) { if ( c2 == (QB.func_Chr( 34)) ) {
stringLiteral2 = ! stringLiteral2; stringLiteral2 = ~ stringLiteral2;
} else if (! stringLiteral2 & c2 == "(" ) { } else if (~ stringLiteral2 & c2 == "(" ) {
pcount = pcount + 1; pcount = pcount + 1;
} else if (! stringLiteral2 & c2 == ")" ) { } else if (~ stringLiteral2 & c2 == ")" ) {
if ( pcount == 0) { if ( pcount == 0) {
done = True; done = True;
} else { } else {
pcount = pcount - 1; pcount = pcount - 1;
} }
} }
if (! done) { if (~ done) {
ex2 = ex2 + c2; ex2 = ex2 + c2;
i = i + 1; i = i + 1;
} }
@ -1963,7 +1991,7 @@ var ConvertExpression = null;
} else { } else {
js = js + fneg + "QB.arrayValue(" + bvar.jsname + ", [" + (await func_ConvertExpression( ex2, lineNumber)) + "]).value"; js = js + fneg + "QB.arrayValue(" + bvar.jsname + ", [" + (await func_ConvertExpression( ex2, lineNumber)) + "]).value";
} }
} else if ((await func_FindMethod( word, m, "FUNCTION")) ) { } else if ((await func_FindMethod( word, m, "FUNCTION" , True)) ) {
js = js + fneg + "(" + (await func_CallMethod( m)) + "(" + (await func_ConvertMethodParams( ex2, lineNumber)) + "))"; js = js + fneg + "(" + (await func_CallMethod( m)) + "(" + (await func_ConvertMethodParams( ex2, lineNumber)) + "))";
} else { } else {
if ((QB.func__Trim( word)) != "" ) { if ((QB.func__Trim( word)) != "" ) {
@ -2034,7 +2062,7 @@ var FindVariable = null;
break ___l5610401; break ___l5610401;
} }
} }
if (! found) { if (~ found) {
var ___v8348172 = 0; ___l9137176: for ( i= 1; i <= (QB.func_UBound( globalVars)); i= i + 1) { if (QB.halted()) { return; } ___v8348172++; if (___v8348172 % 100 == 0) { await QB.autoLimit(); } var ___v8348172 = 0; ___l9137176: for ( i= 1; i <= (QB.func_UBound( globalVars)); i= i + 1) { if (QB.halted()) { return; } ___v8348172++; if (___v8348172 % 100 == 0) { await QB.autoLimit(); }
if (QB.arrayValue(globalVars, [ i]).value .isArray == isArray & (QB.func_UCase( QB.arrayValue(globalVars, [ i]).value .name)) == fvarname) { if (QB.arrayValue(globalVars, [ i]).value .isArray == isArray & (QB.func_UCase( QB.arrayValue(globalVars, [ i]).value .name)) == fvarname) {
found = True; found = True;
@ -2052,14 +2080,15 @@ var FindVariable = null;
FindVariable = found; FindVariable = found;
return FindVariable; return FindVariable;
} }
async function func_FindMethod(mname/*STRING*/,m/*METHOD*/,t/*STRING*/) { async function func_FindMethod(mname/*STRING*/,m/*METHOD*/,t/*STRING*/,includeBuiltIn/*INTEGER*/) {
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var FindMethod = null; var FindMethod = null;
var found = 0; /* INTEGER */ var found = 0; /* INTEGER */
found = False; found = False;
var i = 0; /* INTEGER */ var i = 0; /* INTEGER */
var ___v5433606 = 0; ___l226292: for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; } ___v5433606++; if (___v5433606 % 100 == 0) { await QB.autoLimit(); } var ___v5433606 = 0; ___l226292: for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; } ___v5433606++; if (___v5433606 % 100 == 0) { await QB.autoLimit(); }
if (QB.arrayValue(methods, [ i]).value .uname == (QB.func__Trim( (QB.func_UCase( (await func_RemoveSuffix( mname)))))) & QB.arrayValue(methods, [ i]).value .type == t) { if ((~ includeBuiltIn) & QB.arrayValue(methods, [ i]).value .builtin) {
} else if (QB.arrayValue(methods, [ i]).value .uname == (QB.func__Trim( (QB.func_UCase( (await func_RemoveSuffix( mname)))))) & QB.arrayValue(methods, [ i]).value .type == t) {
found = True; found = True;
m.line = QB.arrayValue(methods, [ i]).value .line; m.line = QB.arrayValue(methods, [ i]).value .line;
m.type = QB.arrayValue(methods, [ i]).value .type; m.type = QB.arrayValue(methods, [ i]).value .type;
@ -2073,7 +2102,7 @@ var FindMethod = null;
break ___l226292; break ___l226292;
} }
} }
if (! found) { if (~ found) {
var ___v4302612 = 0; ___l9161640: for ( i= 1; i <= (QB.func_UBound( exportMethods)); i= i + 1) { if (QB.halted()) { return; } ___v4302612++; if (___v4302612 % 100 == 0) { await QB.autoLimit(); } var ___v4302612 = 0; ___l9161640: for ( i= 1; i <= (QB.func_UBound( exportMethods)); i= i + 1) { if (QB.halted()) { return; } ___v4302612++; if (___v4302612 % 100 == 0) { await QB.autoLimit(); }
if (QB.arrayValue(exportMethods, [ i]).value .uname == (QB.func__Trim( (QB.func_UCase( (await func_RemoveSuffix( mname)))))) & QB.arrayValue(exportMethods, [ i]).value .type == t) { if (QB.arrayValue(exportMethods, [ i]).value .uname == (QB.func__Trim( (QB.func_UCase( (await func_RemoveSuffix( mname)))))) & QB.arrayValue(exportMethods, [ i]).value .type == t) {
found = True; found = True;
@ -2131,7 +2160,7 @@ if (QB.halted()) { return; };
} }
bvar.jsname = ""; bvar.jsname = "";
await sub_AddVariable( bvar, localVars); await sub_AddVariable( bvar, localVars);
if (! bvar.isArray) { if (~ bvar.isArray) {
var typeName = ''; /* STRING */ var typeName = ''; /* STRING */
typeName = (QB.func_UCase( bvar.type)); typeName = (QB.func_UCase( bvar.type));
if ( typeName == "_BIT" | typeName == "_UNSIGNED _BIT" | typeName == "_BYTE" | typeName == "_UNSIGNED _BYTE" | typeName == "INTEGER" | typeName == "_UNSIGNED INTEGER" | typeName == "LONG" | typeName == "_UNSIGNED LONG" | typeName == "_INTEGER64" | typeName == "_UNSIGNED _INTEGER64" ) { if ( typeName == "_BIT" | typeName == "_UNSIGNED _BIT" | typeName == "_BYTE" | typeName == "_UNSIGNED _BYTE" | typeName == "INTEGER" | typeName == "_UNSIGNED INTEGER" | typeName == "LONG" | typeName == "_UNSIGNED LONG" | typeName == "_INTEGER64" | typeName == "_UNSIGNED _INTEGER64" ) {
@ -2271,7 +2300,7 @@ var ReadLine = null;
} }
if ((QB.func_UCase( QB.arrayValue(words, [ 1]).value)) == "$END" ) { if ((QB.func_UCase( QB.arrayValue(words, [ 1]).value)) == "$END" ) {
if ( rawJS) { if ( rawJS) {
rawJS = ! rawJS; rawJS = ~ rawJS;
} }
await sub_AddLine( lineIndex, fline); await sub_AddLine( lineIndex, fline);
ReadLine = rawJS; ReadLine = rawJS;
@ -2393,7 +2422,7 @@ if (QB.halted()) { return; };
argstr = (QB.func_Left( mstr, pend - 1)); argstr = (QB.func_Left( mstr, pend - 1));
} }
var arga = QB.initArray([{l:0,u:0}], ''); /* STRING */ var arga = QB.initArray([{l:0,u:0}], ''); /* STRING */
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
m.line = i; m.line = i;
m.type = word; m.type = word;
m.name = mname; m.name = mname;
@ -2480,9 +2509,9 @@ var SLSplit = null;
var oplen = 0; /* INTEGER */ var oplen = 0; /* INTEGER */
oplen = (await func_FindOperator( c, c2)); oplen = (await func_FindOperator( c, c2));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode; quoteMode = ~ quoteMode;
result = result + c; result = result + c;
if (! quoteMode & escapeStrings) { if (~ quoteMode & escapeStrings) {
result = (await func_Replace( result, "\\" , "\\\\")); result = (await func_Replace( result, "\\" , "\\\\"));
} }
} else if ( c == " " ) { } else if ( c == " " ) {
@ -2571,7 +2600,7 @@ if (QB.halted()) { return; };
var c = ''; /* STRING */ var c = ''; /* STRING */
c = (QB.func_Mid( sourceString, i, 1)); c = (QB.func_Mid( sourceString, i, 1));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode; quoteMode = ~ quoteMode;
} else if ( quoteMode) { } else if ( quoteMode) {
} else if ( c == "(" ) { } else if ( c == "(" ) {
paren = paren + 1; paren = paren + 1;
@ -2602,7 +2631,7 @@ var SLSplit2 = null;
var c = ''; /* STRING */ var c = ''; /* STRING */
c = (QB.func_Mid( cstr, i, 1)); c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode; quoteMode = ~ quoteMode;
result = result + c; result = result + c;
} else if ( quoteMode) { } else if ( quoteMode) {
result = result + c; result = result + c;
@ -2651,7 +2680,7 @@ var ListSplit = null;
var c = ''; /* STRING */ var c = ''; /* STRING */
c = (QB.func_Mid( cstr, i, 1)); c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode; quoteMode = ~ quoteMode;
result = result + c; result = result + c;
} else if ( quoteMode) { } else if ( quoteMode) {
result = result + c; result = result + c;
@ -2696,7 +2725,7 @@ var PrintSplit = null;
var c = ''; /* STRING */ var c = ''; /* STRING */
c = (QB.func_Mid( cstr, i, 1)); c = (QB.func_Mid( cstr, i, 1));
if ( c == (QB.func_Chr( 34)) ) { if ( c == (QB.func_Chr( 34)) ) {
quoteMode = ! quoteMode; quoteMode = ~ quoteMode;
result = result + c; result = result + c;
} else if ( quoteMode) { } else if ( quoteMode) {
result = result + c; result = result + c;
@ -2737,7 +2766,7 @@ if (QB.halted()) { return; };
await QB.sub_Print(["------------------------------------------------------------"]); await QB.sub_Print(["------------------------------------------------------------"]);
var i = 0; /* INTEGER */ var i = 0; /* INTEGER */
var ___v6789134 = 0; ___l1919225: for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; } ___v6789134++; if (___v6789134 % 100 == 0) { await QB.autoLimit(); } var ___v6789134 = 0; ___l1919225: for ( i= 1; i <= (QB.func_UBound( methods)); i= i + 1) { if (QB.halted()) { return; } ___v6789134++; if (___v6789134 % 100 == 0) { await QB.autoLimit(); }
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
m = QB.arrayValue(methods, [ i]).value; m = QB.arrayValue(methods, [ i]).value;
await QB.sub_Print([(QB.func_Str( m.line)) + ": " + m.type + " - " + m.name + " [" + m.jsname + "] - " + m.returnType + " - " + m.args]); await QB.sub_Print([(QB.func_Str( m.line)) + ": " + m.type + " - " + m.name + " [" + m.jsname + "] - " + m.returnType + " - " + m.args]);
} }
@ -2776,7 +2805,7 @@ async function sub_AddMethod(m/*METHOD*/,prefix/*STRING*/,sync/*INTEGER*/) {
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var mcount = 0; /* SINGLE */ var mcount = 0; /* SINGLE */
mcount = (QB.func_UBound( methods)) + 1; mcount = (QB.func_UBound( methods)) + 1;
QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); /* METHOD */ QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, true); /* METHOD */
if ( m.type == "FUNCTION" ) { if ( m.type == "FUNCTION" ) {
m.returnType = (await func_DataTypeFromName( m.name)); m.returnType = (await func_DataTypeFromName( m.name));
} }
@ -2789,7 +2818,7 @@ async function sub_AddExportMethod(m/*METHOD*/,prefix/*STRING*/,sync/*INTEGER*/)
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var mcount = 0; /* SINGLE */ var mcount = 0; /* SINGLE */
mcount = (QB.func_UBound( exportMethods)) + 1; mcount = (QB.func_UBound( exportMethods)) + 1;
QB.resizeArray(exportMethods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); /* METHOD */ QB.resizeArray(exportMethods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, true); /* METHOD */
if ( m.type == "FUNCTION" ) { if ( m.type == "FUNCTION" ) {
m.returnType = (await func_DataTypeFromName( m.name)); m.returnType = (await func_DataTypeFromName( m.name));
} }
@ -2812,12 +2841,13 @@ async function sub_AddGXMethod(mtype/*STRING*/,mname/*STRING*/,sync/*INTEGER*/)
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var mcount = 0; /* SINGLE */ var mcount = 0; /* SINGLE */
mcount = (QB.func_UBound( methods)) + 1; mcount = (QB.func_UBound( methods)) + 1;
QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); /* METHOD */ QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, true); /* METHOD */
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
m.type = mtype; m.type = mtype;
m.name = mname; m.name = mname;
m.uname = (QB.func_UCase( m.name)); m.uname = (QB.func_UCase( m.name));
m.sync = sync; m.sync = sync;
m.builtin = True;
m.jsname = (await func_GXMethodJS( (await func_RemoveSuffix( mname)))); m.jsname = (await func_GXMethodJS( (await func_RemoveSuffix( mname))));
if ( mtype == "FUNCTION" ) { if ( mtype == "FUNCTION" ) {
m.returnType = (await func_DataTypeFromName( mname)); m.returnType = (await func_DataTypeFromName( mname));
@ -2826,32 +2856,35 @@ if (QB.halted()) { return; };
} }
async function sub_AddQBMethod(mtype/*STRING*/,mname/*STRING*/,sync/*INTEGER*/) { async function sub_AddQBMethod(mtype/*STRING*/,mname/*STRING*/,sync/*INTEGER*/) {
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
m.type = mtype; m.type = mtype;
m.name = mname; m.name = mname;
m.builtin = True;
await sub_AddMethod( m, "QB." , sync); await sub_AddMethod( m, "QB." , sync);
if ((QB.func_InStr( mname, "_")) == 1) { if ((QB.func_InStr( mname, "_")) == 1) {
var m2 = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m2 = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
await sub_CopyMethod( QB.arrayValue(methods, [(QB.func_UBound( methods))]).value , m2); await sub_CopyMethod( QB.arrayValue(methods, [(QB.func_UBound( methods))]).value , m2);
m2.name = (QB.func_Mid( mname, 2)); m2.name = (QB.func_Mid( mname, 2));
m2.uname = (QB.func_UCase( (await func_RemoveSuffix( m2.name)))); m2.uname = (QB.func_UCase( (await func_RemoveSuffix( m2.name))));
m2.builtin = True;
var mcount = 0; /* SINGLE */ var mcount = 0; /* SINGLE */
mcount = (QB.func_UBound( methods)) + 1; mcount = (QB.func_UBound( methods)) + 1;
QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); /* METHOD */ QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, true); /* METHOD */
QB.arrayValue(methods, [ mcount]).value = m2; QB.arrayValue(methods, [ mcount]).value = m2;
} }
} }
async function sub_AddNativeMethod(mtype/*STRING*/,mname/*STRING*/,jsname/*STRING*/,sync/*INTEGER*/) { async function sub_AddNativeMethod(mtype/*STRING*/,mname/*STRING*/,jsname/*STRING*/,sync/*INTEGER*/) {
if (QB.halted()) { return; }; if (QB.halted()) { return; };
var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}; /* METHOD */ var m = {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}; /* METHOD */
m.type = mtype; m.type = mtype;
m.name = mname; m.name = mname;
m.uname = (QB.func_UCase( m.name)); m.uname = (QB.func_UCase( m.name));
m.jsname = jsname; m.jsname = jsname;
m.sync = sync; m.sync = sync;
m.builtin = True;
var mcount = 0; /* SINGLE */ var mcount = 0; /* SINGLE */
mcount = (QB.func_UBound( methods)) + 1; mcount = (QB.func_UBound( methods)) + 1;
QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0}, true); /* METHOD */ QB.resizeArray(methods, [{l:0,u:mcount}], {line:0,type:'',returnType:'',name:'',uname:'',argc:0,args:'',jsname:'',sync:0,builtin:0}, true); /* METHOD */
QB.arrayValue(methods, [ mcount]).value = m; QB.arrayValue(methods, [ mcount]).value = m;
} }
async function sub_AddLine(lineIndex/*INTEGER*/,fline/*STRING*/) { async function sub_AddLine(lineIndex/*INTEGER*/,fline/*STRING*/) {
@ -2905,9 +2938,9 @@ if (QB.halted()) { return; };
v.type = "CONST"; v.type = "CONST";
v.name = vname; v.name = vname;
if ( vname == "GX_TRUE" ) { if ( vname == "GX_TRUE" ) {
v.jsname = "true"; v.jsname = "GX.TRUE";
} else if ( vname == "GX_FALSE" ) { } else if ( vname == "GX_FALSE" ) {
v.jsname = "false"; v.jsname = "GX.FALSE";
} else { } else {
var jsname = ''; /* STRING */ var jsname = ''; /* STRING */
jsname = (QB.func_Mid( vname, 3, (QB.func_Len( vname)) - 2)); jsname = (QB.func_Mid( vname, 3, (QB.func_Len( vname)) - 2));
@ -3046,7 +3079,7 @@ var RemoveSuffix = null;
var c = ''; /* STRING */ var c = ''; /* STRING */
vname = (QB.func__Trim( vname)); vname = (QB.func__Trim( vname));
i = (QB.func_Len( vname)); i = (QB.func_Len( vname));
var ___v7577293 = 0; ___l896414: while (! done) { if (QB.halted()) { return; }___v7577293++; if (___v7577293 % 100 == 0) { await QB.autoLimit(); } var ___v7577293 = 0; ___l896414: while (~ done) { if (QB.halted()) { return; }___v7577293++; if (___v7577293 % 100 == 0) { await QB.autoLimit(); }
c = (QB.func_Mid( vname, i, 1)); c = (QB.func_Mid( vname, i, 1));
if ( c == "`" | c == "%" | c == "&" | c == "$" | c == "~" | c == "!" | c == "#" ) { if ( c == "`" | c == "%" | c == "&" | c == "$" | c == "~" | c == "!" | c == "#" ) {
i = i - 1; i = i - 1;
@ -3786,6 +3819,35 @@ this.getWarnings = function() {
} }
return w; return w;
}; };
function _getMethods(methods) {
var m = [];
for (var i=1; i <= QB.func_UBound(methods); i++) {
var lidx = QB.arrayValue(methods, [i]).value.line;
m.push({
line: QB.arrayValue(lines, [lidx]).value.line,
type: QB.arrayValue(methods, [i]).value.type,
returnType: QB.arrayValue(methods, [i]).value.returnType,
name: QB.arrayValue(methods, [i]).value.name,
uname: QB.arrayValue(methods, [i]).value.uname,
jsname: QB.arrayValue(methods, [i]).value.jsname,
argc: QB.arrayValue(methods, [i]).value.argc,
args: QB.arrayValue(methods, [i]).value.args
});
}
return m;
}
this.getMethods = function () { return _getMethods(methods); };
this.getExportMethods = function () { return _getMethods(exportMethods); };
this.getExportConsts = function() {
var c = [];
for (var i=1; i <= QB.func_UBound(exportConsts); i++) {
c.push({
name: QB.arrayValue(exportConsts, [i]).value.name,
jsname: QB.arrayValue(exportConsts, [i]).value.jsname
});
}
return c;
}
this.getSourceLine = function(jsLine) { this.getSourceLine = function(jsLine) {
if (jsLine == 0) { return 0; } if (jsLine == 0) { return 0; }
var line = QB.arrayValue(jsLines, [jsLine]).value.line; var line = QB.arrayValue(jsLines, [jsLine]).value.line;

View file

@ -31,6 +31,7 @@ Type Method
args As String args As String
jsname As String jsname As String
sync As Integer sync As Integer
builtin As Integer
End Type End Type
Type Argument Type Argument
@ -147,7 +148,7 @@ Sub QBToJS (source As String, sourceType As Integer, moduleName As String)
If Not selfConvert And moduleName = "" Then If Not selfConvert And moduleName = "" Then
Dim mtest As Method Dim mtest As Method
If FindMethod("GXOnGameEvent", mtest, "SUB") Then If FindMethod("GXOnGameEvent", mtest, "SUB", True) Then
AddJSLine 0, " await GX.registerGameEvents(sub_GXOnGameEvent);" AddJSLine 0, " await GX.registerGameEvents(sub_GXOnGameEvent);"
isGX = True isGX = True
Else Else
@ -189,6 +190,35 @@ Sub QBToJS (source As String, sourceType As Integer, moduleName As String)
AddJSLine 0, " }" AddJSLine 0, " }"
AddJSLine 0, " return w;" AddJSLine 0, " return w;"
AddJSLine 0, "};" AddJSLine 0, "};"
AddJSLine 0, "function _getMethods(methods) {"
AddJSLine 0, " var m = [];"
AddJSLine 0, " for (var i=1; i <= QB.func_UBound(methods); i++) {"
AddJSLine 0, " var lidx = QB.arrayValue(methods, [i]).value.line;"
AddJSLine 0, " m.push({"
AddJSLine 0, " line: QB.arrayValue(lines, [lidx]).value.line,"
AddJSLine 0, " type: QB.arrayValue(methods, [i]).value.type,"
AddJSLine 0, " returnType: QB.arrayValue(methods, [i]).value.returnType,"
AddJSLine 0, " name: QB.arrayValue(methods, [i]).value.name,"
AddJSLine 0, " uname: QB.arrayValue(methods, [i]).value.uname,"
AddJSLine 0, " jsname: QB.arrayValue(methods, [i]).value.jsname,"
AddJSLine 0, " argc: QB.arrayValue(methods, [i]).value.argc,"
AddJSLine 0, " args: QB.arrayValue(methods, [i]).value.args"
AddJSLine 0, " });"
AddJSLine 0, " }"
AddJSLine 0, " return m;"
AddJSLine 0, "}"
AddJSLine 0, "this.getMethods = function () { return _getMethods(methods); };"
AddJSLine 0, "this.getExportMethods = function () { return _getMethods(exportMethods); };"
AddJSLine 0, "this.getExportConsts = function() {"
AddJSLine 0, " var c = [];"
AddJSLine 0, " for (var i=1; i <= QB.func_UBound(exportConsts); i++) {"
AddJSLine 0, " c.push({"
AddJSLine 0, " name: QB.arrayValue(exportConsts, [i]).value.name,"
AddJSLine 0, " jsname: QB.arrayValue(exportConsts, [i]).value.jsname"
AddJSLine 0, " });"
AddJSLine 0, " }"
AddJSLine 0, " return c;"
AddJSLine 0, "}"
AddJSLine 0, "this.getSourceLine = function(jsLine) {" AddJSLine 0, "this.getSourceLine = function(jsLine) {"
AddJSLine 0, " if (jsLine == 0) { return 0; }" AddJSLine 0, " if (jsLine == 0) { return 0; }"
AddJSLine 0, " var line = QB.arrayValue(jsLines, [jsLine]).value.line;" AddJSLine 0, " var line = QB.arrayValue(jsLines, [jsLine]).value.line;"
@ -200,7 +230,7 @@ Sub QBToJS (source As String, sourceType As Integer, moduleName As String)
AddJSLine 0, "}" AddJSLine 0, "}"
ElseIf moduleName <> "" Then ElseIf moduleName <> "" Then
AddJSLine 0, "return this;" 'AddJSLine 0, "return this;"
AddJSLine 0, "}" AddJSLine 0, "}"
AddJSLine 0, "const " + moduleName + " = await _" + moduleName + "();" AddJSLine 0, "const " + moduleName + " = await _" + moduleName + "();"
@ -670,7 +700,7 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
subname = Left$(subline, subend - 1) subname = Left$(subline, subend - 1)
End If End If
If FindMethod(subname, m, "SUB") Then If FindMethod(subname, m, "SUB", True) Then
Dim subargs As String Dim subargs As String
If subname = subline Then If subname = subline Then
subargs = "" subargs = ""
@ -714,7 +744,7 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
c = SLSplit(sname + " " + arg1 + Join(parts(), 2, -1, " "), parts(), True) c = SLSplit(sname + " " + arg1 + Join(parts(), 2, -1, " "), parts(), True)
End If End If
If FindMethod(parts(1), m, "SUB") Then If FindMethod(parts(1), m, "SUB", True) Then
js = ConvertSub(m, Join(parts(), 2, -1, " "), i) js = ConvertSub(m, Join(parts(), 2, -1, " "), i)
Else Else
js = "// " + l js = "// " + l
@ -724,7 +754,7 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
Else Else
If FindMethod(parts(1), m, "SUB") Then If FindMethod(parts(1), m, "SUB", True) Then
js = ConvertSub(m, Join(parts(), 2, -1, " "), i) js = ConvertSub(m, Join(parts(), 2, -1, " "), i)
Else Else
js = "// " + l js = "// " + l
@ -819,7 +849,7 @@ Sub ParseExport (s As String, lineIndex As Integer)
'AddWarning lineIndex, "ParseExport: [" + s + "]" 'AddWarning lineIndex, "ParseExport: [" + s + "]"
If FindMethod(parts(1), es, "SUB") Then If FindMethod(parts(1), es, "SUB", False) Then
If c > 2 Then If c > 2 Then
exportName = parts(3) exportName = parts(3)
Else Else
@ -833,7 +863,7 @@ Sub ParseExport (s As String, lineIndex As Integer)
found = True found = True
End If End If
If FindMethod(parts(1), ef, "FUNCTION") Then If FindMethod(parts(1), ef, "FUNCTION", False) Then
If c > 2 Then If c > 2 Then
exportName = parts(3) exportName = parts(3)
Else Else
@ -2011,7 +2041,7 @@ Function ConvertExpression$ (ex As String, lineNumber As Integer)
If i = Len(ex) Then word = word + c If i = Len(ex) Then word = word + c
Dim uword As String: uword = UCase$(_Trim$(word)) Dim uword As String: uword = UCase$(_Trim$(word))
If uword = "NOT" Then If uword = "NOT" Then
js = js + "!" js = js + "~"
ElseIf uword = "AND" Then ElseIf uword = "AND" Then
js = js + " & " js = js + " & "
ElseIf uword = "OR" Then ElseIf uword = "OR" Then
@ -2040,7 +2070,7 @@ Function ConvertExpression$ (ex As String, lineNumber As Integer)
' the return value is being assigned in the method. ' the return value is being assigned in the method.
' Currently, this does not support recursive calls. ' Currently, this does not support recursive calls.
' (is this comment still true?) ' (is this comment still true?)
If FindMethod(word, m, "FUNCTION") Then If FindMethod(word, m, "FUNCTION", True) Then
If m.name <> currentMethod Then If m.name <> currentMethod Then
js = js + CallMethod$(m) + "()" js = js + CallMethod$(m) + "()"
Else Else
@ -2103,7 +2133,7 @@ Function ConvertExpression$ (ex As String, lineNumber As Integer)
' This is the case where a dimension is specified in order to retrieve or set a value in the array ' This is the case where a dimension is specified in order to retrieve or set a value in the array
js = js + fneg + "QB.arrayValue(" + bvar.jsname + ", [" + ConvertExpression(ex2, lineNumber) + "]).value" js = js + fneg + "QB.arrayValue(" + bvar.jsname + ", [" + ConvertExpression(ex2, lineNumber) + "]).value"
End If End If
ElseIf FindMethod(word, m, "FUNCTION") Then ElseIf FindMethod(word, m, "FUNCTION", True) Then
js = js + fneg + "(" + CallMethod(m) + "(" + ConvertMethodParams(ex2, lineNumber) + "))" js = js + fneg + "(" + CallMethod(m) + "(" + ConvertMethodParams(ex2, lineNumber) + "))"
Else Else
If _Trim$(word) <> "" Then AddWarning lineNumber, "Missing function or array [" + word + "]" If _Trim$(word) <> "" Then AddWarning lineNumber, "Missing function or array [" + word + "]"
@ -2183,11 +2213,14 @@ Function FindVariable (varname As String, bvar As Variable, isArray As Integer)
FindVariable = found FindVariable = found
End Function End Function
Function FindMethod (mname As String, m As Method, t As String) Function FindMethod (mname As String, m As Method, t As String, includeBuiltIn As Integer)
Dim found As Integer: found = False Dim found As Integer: found = False
Dim i As Integer Dim i As Integer
For i = 1 To UBound(methods) For i = 1 To UBound(methods)
If methods(i).uname = _Trim$(UCase$(RemoveSuffix(mname))) And methods(i).type = t Then If (Not includeBuiltIn) And methods(i).builtin Then
' Skip it
'_Continue
ElseIf methods(i).uname = _Trim$(UCase$(RemoveSuffix(mname))) And methods(i).type = t Then
found = True found = True
m.line = methods(i).line m.line = methods(i).line
m.type = methods(i).type m.type = methods(i).type
@ -3055,6 +3088,7 @@ Sub AddGXMethod (mtype As String, mname As String, sync As Integer)
m.name = mname m.name = mname
m.uname = UCase$(m.name) m.uname = UCase$(m.name)
m.sync = sync m.sync = sync
m.builtin = True
m.jsname = GXMethodJS(RemoveSuffix(mname)) m.jsname = GXMethodJS(RemoveSuffix(mname))
If mtype = "FUNCTION" Then If mtype = "FUNCTION" Then
m.returnType = DataTypeFromName(mname) m.returnType = DataTypeFromName(mname)
@ -3066,6 +3100,7 @@ Sub AddQBMethod (mtype As String, mname As String, sync As Integer)
Dim m As Method Dim m As Method
m.type = mtype m.type = mtype
m.name = mname m.name = mname
m.builtin = True
AddMethod m, "QB.", sync AddMethod m, "QB.", sync
If InStr(mname, "_") = 1 Then If InStr(mname, "_") = 1 Then
' Register the method again without the "_" prefix ' Register the method again without the "_" prefix
@ -3073,6 +3108,7 @@ Sub AddQBMethod (mtype As String, mname As String, sync As Integer)
CopyMethod methods(UBound(methods)), m2 CopyMethod methods(UBound(methods)), m2
m2.name = Mid$(mname, 2) m2.name = Mid$(mname, 2)
m2.uname = UCase$(RemoveSuffix(m2.name)) m2.uname = UCase$(RemoveSuffix(m2.name))
m2.builtin = True
Dim mcount: mcount = UBound(methods) + 1 Dim mcount: mcount = UBound(methods) + 1
ReDim _Preserve As Method methods(mcount) ReDim _Preserve As Method methods(mcount)
methods(mcount) = m2 methods(mcount) = m2
@ -3086,6 +3122,7 @@ Sub AddNativeMethod (mtype As String, mname As String, jsname As String, sync As
m.uname = UCase$(m.name) m.uname = UCase$(m.name)
m.jsname = jsname m.jsname = jsname
m.sync = sync m.sync = sync
m.builtin = True
Dim mcount: mcount = UBound(methods) + 1 Dim mcount: mcount = UBound(methods) + 1
ReDim _Preserve As Method methods(mcount) ReDim _Preserve As Method methods(mcount)
@ -3140,9 +3177,9 @@ Sub AddGXConst (vname As String)
v.type = "CONST" v.type = "CONST"
v.name = vname v.name = vname
If vname = "GX_TRUE" Then If vname = "GX_TRUE" Then
v.jsname = "true" v.jsname = "GX.TRUE"
ElseIf vname = "GX_FALSE" Then ElseIf vname = "GX_FALSE" Then
v.jsname = "false" v.jsname = "GX.FALSE"
Else Else
Dim jsname As String Dim jsname As String
jsname = Mid$(vname, 3, Len(vname) - 2) jsname = Mid$(vname, 3, Len(vname) - 2)