Skip to content

Commit 56ee795

Browse files
committed
Revise Run/Import code
1 parent 60fccfa commit 56ee795

File tree

7 files changed

+98
-88
lines changed

7 files changed

+98
-88
lines changed

easycoder/easycoder-min.js

Lines changed: 52 additions & 52 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

easycoder/easycoder.js

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -738,10 +738,10 @@ const EasyCoder_Core = {
738738
break;
739739
case `symbol`:
740740
const record = program.getSymbolRecord(command.name);
741-
const exporter = record.exporter;
741+
const exporter = record.exporter.script;
742742
delete record.exporter;
743743
console.log(`Symbol: ${JSON.stringify(record, null, 2)}`);
744-
record.exporter = exporter;
744+
record.exporter.script = exporter;
745745
break;
746746
case `step`:
747747
program.debugStep = true;
@@ -1160,16 +1160,18 @@ const EasyCoder_Core = {
11601160

11611161
compile: compiler => {
11621162
const imports = compiler.imports;
1163+
let caller = EasyCoder.scripts[imports.caller];
11631164
const program = compiler.getProgram();
11641165
if (imports.length) {
1165-
for (const symbolRecord of imports) {
1166+
for (const name of imports) {
1167+
let symbolRecord = caller.getSymbolRecord(name);
11661168
const thisType = compiler.nextToken();
11671169
const exportedType = symbolRecord.keyword;
11681170
if (thisType === exportedType) {
11691171
const command = compiler.compileVariable(symbolRecord.domain, exportedType, true);
11701172
const newRecord = program[compiler.getSymbols()[command.name].pc];
11711173
newRecord.element = symbolRecord.element;
1172-
newRecord.exporter = symbolRecord.exporter;
1174+
newRecord.exporter = symbolRecord.exporter ? symbolRecord.exporter : caller.script;
11731175
newRecord.exportedName = symbolRecord.name;
11741176
newRecord.extra = symbolRecord.extra;
11751177
newRecord.isValueHolder = symbolRecord.isValueHolder;
@@ -1232,7 +1234,7 @@ const EasyCoder_Core = {
12321234
}
12331235
symbol.index = index;
12341236
if (symbol.imported) {
1235-
const exporterRecord = symbol.exporter.getSymbolRecord(symbol.exportedName);
1237+
const exporterRecord = EasyCoder.symbols[symbol.exporter].getSymbolRecord(symbol.exportedName);
12361238
exporterRecord.index = index;
12371239
}
12381240
return command.pc + 1;
@@ -1537,7 +1539,7 @@ const EasyCoder_Core = {
15371539
content: value.content
15381540
};
15391541
if (target.imported) {
1540-
const exporterRecord = target.exporter.getSymbolRecord(target.exportedName);
1542+
const exporterRecord = EasyCoder.scripts[target.exporter].getSymbolRecord(target.exportedName);
15411543
exporterRecord.value[exporterRecord.index] = value;
15421544
}
15431545
return command.pc + 1;
@@ -1648,13 +1650,14 @@ const EasyCoder_Core = {
16481650
compile: compiler => {
16491651
const lino = compiler.getLino();
16501652
const script = compiler.getNextValue();
1653+
let program = compiler.getProgram();
16511654
const imports = [];
16521655
if (compiler.tokenIs(`with`)) {
16531656
while (true) {
16541657
if (compiler.nextIsSymbol(true)) {
16551658
const symbolRecord = compiler.getSymbolRecord();
1656-
symbolRecord.exporter = compiler.getProgram();
1657-
imports.push(symbolRecord);
1659+
// symbolRecord.exporter = program.script;
1660+
imports.push(symbolRecord.name);
16581661
compiler.next();
16591662
if (!compiler.tokenIs(`and`)) {
16601663
break;
@@ -1666,7 +1669,7 @@ const EasyCoder_Core = {
16661669
if (compiler.tokenIs(`as`)) {
16671670
if (compiler.nextIsSymbol(true)) {
16681671
const moduleRecord = compiler.getSymbolRecord();
1669-
moduleRecord.program = compiler.getProgram();
1672+
moduleRecord.program = program;
16701673
compiler.next();
16711674
if (moduleRecord.keyword !== `module`) {
16721675
throw new Error(`'${moduleRecord.name}' is not a module`);
@@ -1755,14 +1758,16 @@ const EasyCoder_Core = {
17551758
compile: compiler => {
17561759
const program = compiler.getProgram();
17571760
program.script = compiler.nextToken();
1761+
if (EasyCoder.scripts[program.script]) {
1762+
throw new Error(`Script '${program.script}' is already running.`);
1763+
}
17581764
EasyCoder.scripts[program.script] = program;
17591765
compiler.next();
17601766
return true;
17611767
},
17621768

17631769
run: program => {
1764-
const command = program[program.pc];
1765-
return command.pc + 1;
1770+
return program[program.pc].pc + 1;
17661771
}
17671772
},
17681773

@@ -3480,9 +3485,9 @@ const EasyCoder = {
34803485
return this.getSymbolRecord(target.alias);
34813486
}
34823487
if (target.exporter) {
3483-
if (target.exporter != this) {
3484-
return target.exporter.getSymbolRecord(target.exportedName);
3485-
}
3488+
// if (target.exporter != this.script) {
3489+
return EasyCoder.scripts[target.exporter].getSymbolRecord(target.exportedName);
3490+
// }
34863491
}
34873492
return target;
34883493
},
@@ -3587,6 +3592,7 @@ const EasyCoder = {
35873592
const command = program[program.pc];
35883593
const script = program.getValue(command.script);
35893594
const imports = command.imports;
3595+
imports.caller = program.script;
35903596
const moduleRecord = command.module ? program.getSymbolRecord(command.module) : null;
35913597
try {
35923598
EasyCoder.tokeniseAndCompile(script.split(`\n`), imports, moduleRecord, this, command.then);
@@ -3730,7 +3736,6 @@ const EasyCoder = {
37303736
if (!program.script) {
37313737
program.script = this.scriptIndex;
37323738
}
3733-
EasyCoder.scripts[program.script] = [...program];
37343739
const finishCompile = Date.now();
37353740
console.log(`${finishCompile - this.timestamp} ms: ` +
37363741
`Compiled ${program.script}: ${source.scriptLines.length} lines (${source.tokens.length} tokens) in ` +
@@ -4023,6 +4028,7 @@ const EasyCoder_Run = {
40234028

40244029
exit: (program) => {
40254030
if (program.onExit) {
4031+
delete EasyCoder.scripts[program.script];
40264032
program.parent.run(program.onExit);
40274033
program.module.program = null;
40284034
program.running = false;

easycoder/plugins/browser.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,14 +357,13 @@ const EasyCoder_Browser = {
357357
} else {
358358
const imports = compiler.imports;
359359
if (imports && imports.length > 0) {
360-
// This section is used by Codex to force run in Run panel
361-
const parent = imports[0].name;
360+
// This section is used by Codex to force run in Run panel, which must be the first import
362361
compiler.addCommand({
363362
domain: `browser`,
364363
keyword: `create`,
365364
lino,
366365
name: symbolRecord.name,
367-
parent,
366+
parent: imports[0],
368367
imported: true
369368
});
370369
return true;

js/easycoder/Core.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,10 @@ const EasyCoder_Core = {
354354
break;
355355
case `symbol`:
356356
const record = program.getSymbolRecord(command.name);
357-
const exporter = record.exporter;
357+
const exporter = record.exporter.script;
358358
delete record.exporter;
359359
console.log(`Symbol: ${JSON.stringify(record, null, 2)}`);
360-
record.exporter = exporter;
360+
record.exporter.script = exporter;
361361
break;
362362
case `step`:
363363
program.debugStep = true;
@@ -776,16 +776,18 @@ const EasyCoder_Core = {
776776

777777
compile: compiler => {
778778
const imports = compiler.imports;
779+
let caller = EasyCoder.scripts[imports.caller];
779780
const program = compiler.getProgram();
780781
if (imports.length) {
781-
for (const symbolRecord of imports) {
782+
for (const name of imports) {
783+
let symbolRecord = caller.getSymbolRecord(name);
782784
const thisType = compiler.nextToken();
783785
const exportedType = symbolRecord.keyword;
784786
if (thisType === exportedType) {
785787
const command = compiler.compileVariable(symbolRecord.domain, exportedType, true);
786788
const newRecord = program[compiler.getSymbols()[command.name].pc];
787789
newRecord.element = symbolRecord.element;
788-
newRecord.exporter = symbolRecord.exporter;
790+
newRecord.exporter = symbolRecord.exporter ? symbolRecord.exporter : caller.script;
789791
newRecord.exportedName = symbolRecord.name;
790792
newRecord.extra = symbolRecord.extra;
791793
newRecord.isValueHolder = symbolRecord.isValueHolder;
@@ -848,7 +850,7 @@ const EasyCoder_Core = {
848850
}
849851
symbol.index = index;
850852
if (symbol.imported) {
851-
const exporterRecord = symbol.exporter.getSymbolRecord(symbol.exportedName);
853+
const exporterRecord = EasyCoder.symbols[symbol.exporter].getSymbolRecord(symbol.exportedName);
852854
exporterRecord.index = index;
853855
}
854856
return command.pc + 1;
@@ -1153,7 +1155,7 @@ const EasyCoder_Core = {
11531155
content: value.content
11541156
};
11551157
if (target.imported) {
1156-
const exporterRecord = target.exporter.getSymbolRecord(target.exportedName);
1158+
const exporterRecord = EasyCoder.scripts[target.exporter].getSymbolRecord(target.exportedName);
11571159
exporterRecord.value[exporterRecord.index] = value;
11581160
}
11591161
return command.pc + 1;
@@ -1264,13 +1266,14 @@ const EasyCoder_Core = {
12641266
compile: compiler => {
12651267
const lino = compiler.getLino();
12661268
const script = compiler.getNextValue();
1269+
let program = compiler.getProgram();
12671270
const imports = [];
12681271
if (compiler.tokenIs(`with`)) {
12691272
while (true) {
12701273
if (compiler.nextIsSymbol(true)) {
12711274
const symbolRecord = compiler.getSymbolRecord();
1272-
symbolRecord.exporter = compiler.getProgram();
1273-
imports.push(symbolRecord);
1275+
// symbolRecord.exporter = program.script;
1276+
imports.push(symbolRecord.name);
12741277
compiler.next();
12751278
if (!compiler.tokenIs(`and`)) {
12761279
break;
@@ -1282,7 +1285,7 @@ const EasyCoder_Core = {
12821285
if (compiler.tokenIs(`as`)) {
12831286
if (compiler.nextIsSymbol(true)) {
12841287
const moduleRecord = compiler.getSymbolRecord();
1285-
moduleRecord.program = compiler.getProgram();
1288+
moduleRecord.program = program;
12861289
compiler.next();
12871290
if (moduleRecord.keyword !== `module`) {
12881291
throw new Error(`'${moduleRecord.name}' is not a module`);
@@ -1371,14 +1374,16 @@ const EasyCoder_Core = {
13711374
compile: compiler => {
13721375
const program = compiler.getProgram();
13731376
program.script = compiler.nextToken();
1377+
if (EasyCoder.scripts[program.script]) {
1378+
throw new Error(`Script '${program.script}' is already running.`);
1379+
}
13741380
EasyCoder.scripts[program.script] = program;
13751381
compiler.next();
13761382
return true;
13771383
},
13781384

13791385
run: program => {
1380-
const command = program[program.pc];
1381-
return command.pc + 1;
1386+
return program[program.pc].pc + 1;
13821387
}
13831388
},
13841389

js/easycoder/Main.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ const EasyCoder = {
6363
return this.getSymbolRecord(target.alias);
6464
}
6565
if (target.exporter) {
66-
if (target.exporter != this) {
67-
return target.exporter.getSymbolRecord(target.exportedName);
68-
}
66+
// if (target.exporter != this.script) {
67+
return EasyCoder.scripts[target.exporter].getSymbolRecord(target.exportedName);
68+
// }
6969
}
7070
return target;
7171
},
@@ -170,6 +170,7 @@ const EasyCoder = {
170170
const command = program[program.pc];
171171
const script = program.getValue(command.script);
172172
const imports = command.imports;
173+
imports.caller = program.script;
173174
const moduleRecord = command.module ? program.getSymbolRecord(command.module) : null;
174175
try {
175176
EasyCoder.tokeniseAndCompile(script.split(`\n`), imports, moduleRecord, this, command.then);
@@ -313,7 +314,6 @@ const EasyCoder = {
313314
if (!program.script) {
314315
program.script = this.scriptIndex;
315316
}
316-
EasyCoder.scripts[program.script] = [...program];
317317
const finishCompile = Date.now();
318318
console.log(`${finishCompile - this.timestamp} ms: ` +
319319
`Compiled ${program.script}: ${source.scriptLines.length} lines (${source.tokens.length} tokens) in ` +

js/easycoder/Run.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ const EasyCoder_Run = {
162162

163163
exit: (program) => {
164164
if (program.onExit) {
165+
delete EasyCoder.scripts[program.script];
165166
program.parent.run(program.onExit);
166167
program.module.program = null;
167168
program.running = false;

js/plugins/browser.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,14 +357,13 @@ const EasyCoder_Browser = {
357357
} else {
358358
const imports = compiler.imports;
359359
if (imports && imports.length > 0) {
360-
// This section is used by Codex to force run in Run panel
361-
const parent = imports[0].name;
360+
// This section is used by Codex to force run in Run panel, which must be the first import
362361
compiler.addCommand({
363362
domain: `browser`,
364363
keyword: `create`,
365364
lino,
366365
name: symbolRecord.name,
367-
parent,
366+
parent: imports[0],
368367
imported: true
369368
});
370369
return true;

0 commit comments

Comments
 (0)