gobstones-code-runner 0.4.2 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/htmls/gobstones-code-runner.html +493 -190
- data/lib/gobstones/code-runner/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a46689b03d4e539d3febe946a4caeefa933767b087f7307a2e4add9dc79bc8fb
|
4
|
+
data.tar.gz: 6578e5d6bc23fd76cf07e0e29e23a5920fce6bad0519e188187bf22a184db848
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f35a4ee2c461c7608b2bc16ec63037667ae8a54b1669c011aa6153941d23ba31a2939867b4f277f79c21e6f1231942c10cdd1440d0acffe4cf233c83d690f750
|
7
|
+
data.tar.gz: cd2ea0b40c3c573fd570629c041ef254020adbc74c6bbb4bba25aaa77d8901866139fb72b6014aee17ba77fbd269d9bff30b9103abd0f3f4bb5858a108257f6a
|
@@ -4479,9 +4479,9 @@ exports.ASTConstructorDeclaration = exports.ASTFieldBinding = exports.ASTExprFun
|
|
4479
4479
|
|
4480
4480
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
4481
4481
|
|
4482
|
-
var _reader = __webpack_require__(
|
4482
|
+
var _reader = __webpack_require__(6);
|
4483
4483
|
|
4484
|
-
var _token = __webpack_require__(
|
4484
|
+
var _token = __webpack_require__(3);
|
4485
4485
|
|
4486
4486
|
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
4487
4487
|
|
@@ -5593,6 +5593,141 @@ var ASTConstructorDeclaration = exports.ASTConstructorDeclaration = function (_A
|
|
5593
5593
|
"use strict";
|
5594
5594
|
|
5595
5595
|
|
5596
|
+
Object.defineProperty(exports, "__esModule", {
|
5597
|
+
value: true
|
5598
|
+
});
|
5599
|
+
|
5600
|
+
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
5601
|
+
|
5602
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
5603
|
+
|
5604
|
+
/* Token tags are constant symbols */
|
5605
|
+
var T_EOF = exports.T_EOF = Symbol.for('T_EOF'); // End of file
|
5606
|
+
var T_NUM = exports.T_NUM = Symbol.for('T_NUM'); // Number
|
5607
|
+
var T_STRING = exports.T_STRING = Symbol.for('T_STRING'); // String constant
|
5608
|
+
var T_UPPERID = exports.T_UPPERID = Symbol.for('T_UPPERID'); // Uppercase identifier
|
5609
|
+
var T_LOWERID = exports.T_LOWERID = Symbol.for('T_LOWERID'); // Lowercase identifier
|
5610
|
+
|
5611
|
+
/* Keywords */
|
5612
|
+
var T_PROGRAM = exports.T_PROGRAM = Symbol.for('T_PROGRAM');
|
5613
|
+
var T_INTERACTIVE = exports.T_INTERACTIVE = Symbol.for('T_INTERACTIVE');
|
5614
|
+
var T_PROCEDURE = exports.T_PROCEDURE = Symbol.for('T_PROCEDURE');
|
5615
|
+
var T_FUNCTION = exports.T_FUNCTION = Symbol.for('T_FUNCTION');
|
5616
|
+
var T_RETURN = exports.T_RETURN = Symbol.for('T_RETURN');
|
5617
|
+
var T_IF = exports.T_IF = Symbol.for('T_IF');
|
5618
|
+
var T_THEN = exports.T_THEN = Symbol.for('T_THEN');
|
5619
|
+
var T_ELSEIF = exports.T_ELSEIF = Symbol.for('T_ELSEIF');
|
5620
|
+
var T_ELSE = exports.T_ELSE = Symbol.for('T_ELSE');
|
5621
|
+
var T_CHOOSE = exports.T_CHOOSE = Symbol.for('T_CHOOSE');
|
5622
|
+
var T_WHEN = exports.T_WHEN = Symbol.for('T_WHEN');
|
5623
|
+
var T_OTHERWISE = exports.T_OTHERWISE = Symbol.for('T_OTHERWISE');
|
5624
|
+
var T_REPEAT = exports.T_REPEAT = Symbol.for('T_REPEAT');
|
5625
|
+
var T_FOREACH = exports.T_FOREACH = Symbol.for('T_FOREACH');
|
5626
|
+
var T_IN = exports.T_IN = Symbol.for('T_IN');
|
5627
|
+
var T_WHILE = exports.T_WHILE = Symbol.for('T_WHILE');
|
5628
|
+
var T_SWITCH = exports.T_SWITCH = Symbol.for('T_SWITCH');
|
5629
|
+
var T_TO = exports.T_TO = Symbol.for('T_TO');
|
5630
|
+
var T_LET = exports.T_LET = Symbol.for('T_LET');
|
5631
|
+
var T_NOT = exports.T_NOT = Symbol.for('T_NOT');
|
5632
|
+
var T_DIV = exports.T_DIV = Symbol.for('T_DIV');
|
5633
|
+
var T_MOD = exports.T_MOD = Symbol.for('T_MOD');
|
5634
|
+
var T_TYPE = exports.T_TYPE = Symbol.for('T_TYPE');
|
5635
|
+
var T_IS = exports.T_IS = Symbol.for('T_IS');
|
5636
|
+
var T_RECORD = exports.T_RECORD = Symbol.for('T_RECORD');
|
5637
|
+
var T_VARIANT = exports.T_VARIANT = Symbol.for('T_VARIANT');
|
5638
|
+
var T_CASE = exports.T_CASE = Symbol.for('T_CASE');
|
5639
|
+
var T_FIELD = exports.T_FIELD = Symbol.for('T_FIELD');
|
5640
|
+
var T_UNDERSCORE = exports.T_UNDERSCORE = Symbol.for('T_UNDERSCORE');
|
5641
|
+
var T_TIMEOUT = exports.T_TIMEOUT = Symbol.for('T_TIMEOUT');
|
5642
|
+
|
5643
|
+
/* Symbols */
|
5644
|
+
var T_LPAREN = exports.T_LPAREN = Symbol.for('T_LPAREN');
|
5645
|
+
var T_RPAREN = exports.T_RPAREN = Symbol.for('T_RPAREN');
|
5646
|
+
var T_LBRACE = exports.T_LBRACE = Symbol.for('T_LBRACE');
|
5647
|
+
var T_RBRACE = exports.T_RBRACE = Symbol.for('T_RBRACE');
|
5648
|
+
var T_LBRACK = exports.T_LBRACK = Symbol.for('T_LBRACK');
|
5649
|
+
var T_RBRACK = exports.T_RBRACK = Symbol.for('T_RBRACK');
|
5650
|
+
var T_COMMA = exports.T_COMMA = Symbol.for('T_COMMA');
|
5651
|
+
var T_SEMICOLON = exports.T_SEMICOLON = Symbol.for('T_SEMICOLON');
|
5652
|
+
var T_ELLIPSIS = exports.T_ELLIPSIS = Symbol.for('T_ELLIPSIS');
|
5653
|
+
var T_RANGE = exports.T_RANGE = Symbol.for('T_RANGE');
|
5654
|
+
var T_GETS = exports.T_GETS = Symbol.for('T_GETS');
|
5655
|
+
var T_PIPE = exports.T_PIPE = Symbol.for('T_PIPE');
|
5656
|
+
var T_ARROW = exports.T_ARROW = Symbol.for('T_ARROW');
|
5657
|
+
var T_ASSIGN = exports.T_ASSIGN = Symbol.for('T_ASSIGN');
|
5658
|
+
var T_EQ = exports.T_EQ = Symbol.for('T_EQ');
|
5659
|
+
var T_NE = exports.T_NE = Symbol.for('T_NE');
|
5660
|
+
var T_LE = exports.T_LE = Symbol.for('T_LE');
|
5661
|
+
var T_GE = exports.T_GE = Symbol.for('T_GE');
|
5662
|
+
var T_LT = exports.T_LT = Symbol.for('T_LT');
|
5663
|
+
var T_GT = exports.T_GT = Symbol.for('T_GT');
|
5664
|
+
var T_AND = exports.T_AND = Symbol.for('T_AND');
|
5665
|
+
var T_OR = exports.T_OR = Symbol.for('T_OR');
|
5666
|
+
var T_CONCAT = exports.T_CONCAT = Symbol.for('T_CONCAT');
|
5667
|
+
var T_PLUS = exports.T_PLUS = Symbol.for('T_PLUS');
|
5668
|
+
var T_MINUS = exports.T_MINUS = Symbol.for('T_MINUS');
|
5669
|
+
var T_TIMES = exports.T_TIMES = Symbol.for('T_TIMES');
|
5670
|
+
var T_POW = exports.T_POW = Symbol.for('T_POW');
|
5671
|
+
|
5672
|
+
/* A token is given by:
|
5673
|
+
* - A token tag (e.g. T_LOWERID, T_NUM).
|
5674
|
+
* - Possibly, a value (e.g. 'nroBolitas', 8).
|
5675
|
+
* When the value is irrelevant, we provide null by convention.
|
5676
|
+
* - Two positions, representing its location in the source. */
|
5677
|
+
|
5678
|
+
var Token = exports.Token = function () {
|
5679
|
+
function Token(tag, value, startPos, endPos) {
|
5680
|
+
_classCallCheck(this, Token);
|
5681
|
+
|
5682
|
+
this._tag = tag;
|
5683
|
+
this._value = value;
|
5684
|
+
this._startPos = startPos;
|
5685
|
+
this._endPos = endPos;
|
5686
|
+
}
|
5687
|
+
|
5688
|
+
_createClass(Token, [{
|
5689
|
+
key: 'toString',
|
5690
|
+
value: function toString() {
|
5691
|
+
var tag = Symbol.keyFor(this._tag).substring(2);
|
5692
|
+
switch (tag) {
|
5693
|
+
case 'NUM':case 'STRING':case 'UPPERID':case 'LOWERID':
|
5694
|
+
return tag + '("' + this._value + '")';
|
5695
|
+
default:
|
5696
|
+
return tag;
|
5697
|
+
}
|
5698
|
+
}
|
5699
|
+
}, {
|
5700
|
+
key: 'tag',
|
5701
|
+
get: function get() {
|
5702
|
+
return this._tag;
|
5703
|
+
}
|
5704
|
+
}, {
|
5705
|
+
key: 'value',
|
5706
|
+
get: function get() {
|
5707
|
+
return this._value;
|
5708
|
+
}
|
5709
|
+
}, {
|
5710
|
+
key: 'startPos',
|
5711
|
+
get: function get() {
|
5712
|
+
return this._startPos;
|
5713
|
+
}
|
5714
|
+
}, {
|
5715
|
+
key: 'endPos',
|
5716
|
+
get: function get() {
|
5717
|
+
return this._endPos;
|
5718
|
+
}
|
5719
|
+
}]);
|
5720
|
+
|
5721
|
+
return Token;
|
5722
|
+
}();
|
5723
|
+
|
5724
|
+
/***/ }),
|
5725
|
+
/* 4 */
|
5726
|
+
/***/ (function(module, exports, __webpack_require__) {
|
5727
|
+
|
5728
|
+
"use strict";
|
5729
|
+
|
5730
|
+
|
5596
5731
|
Object.defineProperty(exports, "__esModule", {
|
5597
5732
|
value: true
|
5598
5733
|
});
|
@@ -5606,7 +5741,7 @@ exports.typesWithOrder = typesWithOrder;
|
|
5606
5741
|
|
5607
5742
|
var _i18n = __webpack_require__(0);
|
5608
5743
|
|
5609
|
-
var _value = __webpack_require__(
|
5744
|
+
var _value = __webpack_require__(5);
|
5610
5745
|
|
5611
5746
|
var _exceptions = __webpack_require__(1);
|
5612
5747
|
|
@@ -5651,10 +5786,10 @@ function dirEnum() {
|
|
5651
5786
|
* INIT and TIMEOUT. */
|
5652
5787
|
function keyEventEnum() {
|
5653
5788
|
var modifiers = ['', 'CTRL_', 'ALT_', 'SHIFT_', 'CTRL_ALT_', 'CTRL_SHIFT_', 'ALT_SHIFT_', 'CTRL_ALT_SHIFT_'];
|
5654
|
-
var charKeys = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
|
5655
|
-
var specialKeys = ['SPACE', '
|
5656
|
-
var symbolKeys = ['
|
5657
|
-
var arrowKeys = ['
|
5789
|
+
var charKeys = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
5790
|
+
var specialKeys = ['SPACE', 'RETURN', 'TAB', 'BACKSPACE', 'ESCAPE', 'INSERT', 'DELETE', 'HOME', 'END', 'PAGEUP', 'PAGEDOWN', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12'];
|
5791
|
+
var symbolKeys = ['AMPERSAND', 'ASTERISK', 'AT', 'BACKSLASH', 'CARET', 'COLON', 'DOLLAR', 'EQUALS', 'EXCLAIM', 'GREATER', 'HASH', 'LESS', 'PERCENT', 'PLUS', 'SEMICOLON', 'SLASH', 'QUESTION', 'QUOTE', 'QUOTEDBL', 'UNDERSCORE', 'LEFTPAREN', 'RIGHTPAREN', 'LEFTBRACKET', 'RIGHTBRACKET', 'LEFTBRACE', 'RIGHTBRACE'];
|
5792
|
+
var arrowKeys = ['LEFT', 'RIGHT', 'UP', 'DOWN'];
|
5658
5793
|
var keys = charKeys.concat(specialKeys).concat(symbolKeys).concat(arrowKeys);
|
5659
5794
|
|
5660
5795
|
var eventNames = [];
|
@@ -6702,7 +6837,7 @@ var RuntimePrimitives = exports.RuntimePrimitives = function () {
|
|
6702
6837
|
|
6703
6838
|
this._primitiveFunctions[(0, _i18n.i18n)('PRIM:boom')] = this._primitiveProcedures[(0, _i18n.i18n)('PRIM:BOOM')];
|
6704
6839
|
|
6705
|
-
/* List
|
6840
|
+
/* List operators */
|
6706
6841
|
this._primitiveFunctions['++'] = new PrimitiveOperation([typeListAny, typeListAny], function (startPos, endPos, globalState, args) {
|
6707
6842
|
var a = args[0];
|
6708
6843
|
var b = args[1];
|
@@ -6711,6 +6846,10 @@ var RuntimePrimitives = exports.RuntimePrimitives = function () {
|
|
6711
6846
|
return a.append(b);
|
6712
6847
|
});
|
6713
6848
|
|
6849
|
+
this._primitiveFunctions[(0, _i18n.i18n)('PRIM:isEmpty')] = new PrimitiveOperation([typeListAny], noValidation, function (globalState, a) {
|
6850
|
+
return valueFromBool(a.length() === 0);
|
6851
|
+
});
|
6852
|
+
|
6714
6853
|
this._primitiveFunctions[(0, _i18n.i18n)('PRIM:head')] = new PrimitiveOperation([typeListAny], function (startPos, endPos, globalState, args) {
|
6715
6854
|
var a = args[0];
|
6716
6855
|
if (a.length() === 0) {
|
@@ -6841,7 +6980,7 @@ var RuntimePrimitives = exports.RuntimePrimitives = function () {
|
|
6841
6980
|
}();
|
6842
6981
|
|
6843
6982
|
/***/ }),
|
6844
|
-
/*
|
6983
|
+
/* 5 */
|
6845
6984
|
/***/ (function(module, exports, __webpack_require__) {
|
6846
6985
|
|
6847
6986
|
"use strict";
|
@@ -7136,7 +7275,11 @@ var TypeList = exports.TypeList = function (_Type5) {
|
|
7136
7275
|
_createClass(TypeList, [{
|
7137
7276
|
key: 'toString',
|
7138
7277
|
value: function toString() {
|
7139
|
-
|
7278
|
+
var suffix = '';
|
7279
|
+
if (!this._contentType.isAny()) {
|
7280
|
+
suffix = '(' + this._contentType.toString() + ')';
|
7281
|
+
}
|
7282
|
+
return (0, _i18n.i18n)('TYPE:List') + suffix;
|
7140
7283
|
}
|
7141
7284
|
}, {
|
7142
7285
|
key: 'isList',
|
@@ -7205,11 +7348,8 @@ var TypeStructure = exports.TypeStructure = function (_Type6) {
|
|
7205
7348
|
}
|
7206
7349
|
}
|
7207
7350
|
|
7208
|
-
|
7209
|
-
|
7210
|
-
caseStrings.push(qualifiedConstructor);
|
7211
|
-
} else {
|
7212
|
-
caseStrings.push(qualifiedConstructor + '(' + fieldStrings.join(', ') + ')');
|
7351
|
+
if (fieldStrings.length !== 0) {
|
7352
|
+
caseStrings.push(constructorName + '(' + fieldStrings.join(', ') + ')');
|
7213
7353
|
}
|
7214
7354
|
}
|
7215
7355
|
} catch (err) {
|
@@ -7230,7 +7370,7 @@ var TypeStructure = exports.TypeStructure = function (_Type6) {
|
|
7230
7370
|
if (caseStrings.length === 0) {
|
7231
7371
|
return this._typeName;
|
7232
7372
|
} else {
|
7233
|
-
return caseStrings.join(' + '
|
7373
|
+
return this._typeName + ' { ' + caseStrings.join(' | ') + ' }';
|
7234
7374
|
}
|
7235
7375
|
}
|
7236
7376
|
}, {
|
@@ -8198,7 +8338,7 @@ var ValueStructure = exports.ValueStructure = function (_Value5) {
|
|
8198
8338
|
}(Value);
|
8199
8339
|
|
8200
8340
|
/***/ }),
|
8201
|
-
/*
|
8341
|
+
/* 6 */
|
8202
8342
|
/***/ (function(module, exports, __webpack_require__) {
|
8203
8343
|
|
8204
8344
|
"use strict";
|
@@ -8491,141 +8631,6 @@ var MultifileReader = exports.MultifileReader = function () {
|
|
8491
8631
|
return MultifileReader;
|
8492
8632
|
}();
|
8493
8633
|
|
8494
|
-
/***/ }),
|
8495
|
-
/* 6 */
|
8496
|
-
/***/ (function(module, exports, __webpack_require__) {
|
8497
|
-
|
8498
|
-
"use strict";
|
8499
|
-
|
8500
|
-
|
8501
|
-
Object.defineProperty(exports, "__esModule", {
|
8502
|
-
value: true
|
8503
|
-
});
|
8504
|
-
|
8505
|
-
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
8506
|
-
|
8507
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8508
|
-
|
8509
|
-
/* Token tags are constant symbols */
|
8510
|
-
var T_EOF = exports.T_EOF = Symbol.for('T_EOF'); // End of file
|
8511
|
-
var T_NUM = exports.T_NUM = Symbol.for('T_NUM'); // Number
|
8512
|
-
var T_STRING = exports.T_STRING = Symbol.for('T_STRING'); // String constant
|
8513
|
-
var T_UPPERID = exports.T_UPPERID = Symbol.for('T_UPPERID'); // Uppercase identifier
|
8514
|
-
var T_LOWERID = exports.T_LOWERID = Symbol.for('T_LOWERID'); // Lowercase identifier
|
8515
|
-
|
8516
|
-
/* Keywords */
|
8517
|
-
var T_PROGRAM = exports.T_PROGRAM = Symbol.for('T_PROGRAM');
|
8518
|
-
var T_INTERACTIVE = exports.T_INTERACTIVE = Symbol.for('T_INTERACTIVE');
|
8519
|
-
var T_PROCEDURE = exports.T_PROCEDURE = Symbol.for('T_PROCEDURE');
|
8520
|
-
var T_FUNCTION = exports.T_FUNCTION = Symbol.for('T_FUNCTION');
|
8521
|
-
var T_RETURN = exports.T_RETURN = Symbol.for('T_RETURN');
|
8522
|
-
var T_IF = exports.T_IF = Symbol.for('T_IF');
|
8523
|
-
var T_THEN = exports.T_THEN = Symbol.for('T_THEN');
|
8524
|
-
var T_ELSEIF = exports.T_ELSEIF = Symbol.for('T_ELSEIF');
|
8525
|
-
var T_ELSE = exports.T_ELSE = Symbol.for('T_ELSE');
|
8526
|
-
var T_CHOOSE = exports.T_CHOOSE = Symbol.for('T_CHOOSE');
|
8527
|
-
var T_WHEN = exports.T_WHEN = Symbol.for('T_WHEN');
|
8528
|
-
var T_OTHERWISE = exports.T_OTHERWISE = Symbol.for('T_OTHERWISE');
|
8529
|
-
var T_REPEAT = exports.T_REPEAT = Symbol.for('T_REPEAT');
|
8530
|
-
var T_FOREACH = exports.T_FOREACH = Symbol.for('T_FOREACH');
|
8531
|
-
var T_IN = exports.T_IN = Symbol.for('T_IN');
|
8532
|
-
var T_WHILE = exports.T_WHILE = Symbol.for('T_WHILE');
|
8533
|
-
var T_SWITCH = exports.T_SWITCH = Symbol.for('T_SWITCH');
|
8534
|
-
var T_TO = exports.T_TO = Symbol.for('T_TO');
|
8535
|
-
var T_LET = exports.T_LET = Symbol.for('T_LET');
|
8536
|
-
var T_NOT = exports.T_NOT = Symbol.for('T_NOT');
|
8537
|
-
var T_DIV = exports.T_DIV = Symbol.for('T_DIV');
|
8538
|
-
var T_MOD = exports.T_MOD = Symbol.for('T_MOD');
|
8539
|
-
var T_TYPE = exports.T_TYPE = Symbol.for('T_TYPE');
|
8540
|
-
var T_IS = exports.T_IS = Symbol.for('T_IS');
|
8541
|
-
var T_RECORD = exports.T_RECORD = Symbol.for('T_RECORD');
|
8542
|
-
var T_VARIANT = exports.T_VARIANT = Symbol.for('T_VARIANT');
|
8543
|
-
var T_CASE = exports.T_CASE = Symbol.for('T_CASE');
|
8544
|
-
var T_FIELD = exports.T_FIELD = Symbol.for('T_FIELD');
|
8545
|
-
var T_UNDERSCORE = exports.T_UNDERSCORE = Symbol.for('T_UNDERSCORE');
|
8546
|
-
var T_TIMEOUT = exports.T_TIMEOUT = Symbol.for('T_TIMEOUT');
|
8547
|
-
|
8548
|
-
/* Symbols */
|
8549
|
-
var T_LPAREN = exports.T_LPAREN = Symbol.for('T_LPAREN');
|
8550
|
-
var T_RPAREN = exports.T_RPAREN = Symbol.for('T_RPAREN');
|
8551
|
-
var T_LBRACE = exports.T_LBRACE = Symbol.for('T_LBRACE');
|
8552
|
-
var T_RBRACE = exports.T_RBRACE = Symbol.for('T_RBRACE');
|
8553
|
-
var T_LBRACK = exports.T_LBRACK = Symbol.for('T_LBRACK');
|
8554
|
-
var T_RBRACK = exports.T_RBRACK = Symbol.for('T_RBRACK');
|
8555
|
-
var T_COMMA = exports.T_COMMA = Symbol.for('T_COMMA');
|
8556
|
-
var T_SEMICOLON = exports.T_SEMICOLON = Symbol.for('T_SEMICOLON');
|
8557
|
-
var T_ELLIPSIS = exports.T_ELLIPSIS = Symbol.for('T_ELLIPSIS');
|
8558
|
-
var T_RANGE = exports.T_RANGE = Symbol.for('T_RANGE');
|
8559
|
-
var T_GETS = exports.T_GETS = Symbol.for('T_GETS');
|
8560
|
-
var T_PIPE = exports.T_PIPE = Symbol.for('T_PIPE');
|
8561
|
-
var T_ARROW = exports.T_ARROW = Symbol.for('T_ARROW');
|
8562
|
-
var T_ASSIGN = exports.T_ASSIGN = Symbol.for('T_ASSIGN');
|
8563
|
-
var T_EQ = exports.T_EQ = Symbol.for('T_EQ');
|
8564
|
-
var T_NE = exports.T_NE = Symbol.for('T_NE');
|
8565
|
-
var T_LE = exports.T_LE = Symbol.for('T_LE');
|
8566
|
-
var T_GE = exports.T_GE = Symbol.for('T_GE');
|
8567
|
-
var T_LT = exports.T_LT = Symbol.for('T_LT');
|
8568
|
-
var T_GT = exports.T_GT = Symbol.for('T_GT');
|
8569
|
-
var T_AND = exports.T_AND = Symbol.for('T_AND');
|
8570
|
-
var T_OR = exports.T_OR = Symbol.for('T_OR');
|
8571
|
-
var T_CONCAT = exports.T_CONCAT = Symbol.for('T_CONCAT');
|
8572
|
-
var T_PLUS = exports.T_PLUS = Symbol.for('T_PLUS');
|
8573
|
-
var T_MINUS = exports.T_MINUS = Symbol.for('T_MINUS');
|
8574
|
-
var T_TIMES = exports.T_TIMES = Symbol.for('T_TIMES');
|
8575
|
-
var T_POW = exports.T_POW = Symbol.for('T_POW');
|
8576
|
-
|
8577
|
-
/* A token is given by:
|
8578
|
-
* - A token tag (e.g. T_LOWERID, T_NUM).
|
8579
|
-
* - Possibly, a value (e.g. 'nroBolitas', 8).
|
8580
|
-
* When the value is irrelevant, we provide null by convention.
|
8581
|
-
* - Two positions, representing its location in the source. */
|
8582
|
-
|
8583
|
-
var Token = exports.Token = function () {
|
8584
|
-
function Token(tag, value, startPos, endPos) {
|
8585
|
-
_classCallCheck(this, Token);
|
8586
|
-
|
8587
|
-
this._tag = tag;
|
8588
|
-
this._value = value;
|
8589
|
-
this._startPos = startPos;
|
8590
|
-
this._endPos = endPos;
|
8591
|
-
}
|
8592
|
-
|
8593
|
-
_createClass(Token, [{
|
8594
|
-
key: 'toString',
|
8595
|
-
value: function toString() {
|
8596
|
-
var tag = Symbol.keyFor(this._tag).substring(2);
|
8597
|
-
switch (tag) {
|
8598
|
-
case 'NUM':case 'STRING':case 'UPPERID':case 'LOWERID':
|
8599
|
-
return tag + '("' + this._value + '")';
|
8600
|
-
default:
|
8601
|
-
return tag;
|
8602
|
-
}
|
8603
|
-
}
|
8604
|
-
}, {
|
8605
|
-
key: 'tag',
|
8606
|
-
get: function get() {
|
8607
|
-
return this._tag;
|
8608
|
-
}
|
8609
|
-
}, {
|
8610
|
-
key: 'value',
|
8611
|
-
get: function get() {
|
8612
|
-
return this._value;
|
8613
|
-
}
|
8614
|
-
}, {
|
8615
|
-
key: 'startPos',
|
8616
|
-
get: function get() {
|
8617
|
-
return this._startPos;
|
8618
|
-
}
|
8619
|
-
}, {
|
8620
|
-
key: 'endPos',
|
8621
|
-
get: function get() {
|
8622
|
-
return this._endPos;
|
8623
|
-
}
|
8624
|
-
}]);
|
8625
|
-
|
8626
|
-
return Token;
|
8627
|
-
}();
|
8628
|
-
|
8629
8634
|
/***/ }),
|
8630
8635
|
/* 7 */
|
8631
8636
|
/***/ (function(module, exports, __webpack_require__) {
|
@@ -8922,6 +8927,8 @@ var LOCALE_ES = exports.LOCALE_ES = {
|
|
8922
8927
|
|
8923
8928
|
'errmsg:pattern-number-cannot-be-negative-zero': 'El patrón numérico no puede ser "-0".',
|
8924
8929
|
|
8930
|
+
'errmsg:return-tuple-cannot-be-empty': 'El return tiene que devolver algo.',
|
8931
|
+
|
8925
8932
|
'errmsg:pattern-tuple-cannot-be-singleton': 'El patrón para una tupla no puede tener una sola componente. ' + 'Las tuplas tienen 0, 2, 3, o más componentes, pero no 1.',
|
8926
8933
|
|
8927
8934
|
'errmsg:assignment-tuple-cannot-be-singleton': 'La asignación a una tupla no puede constar de una sola componente. ' + 'Las tuplas tienen 0, 2, 3, o más componentes, pero no 1.',
|
@@ -9075,6 +9082,36 @@ var LOCALE_ES = exports.LOCALE_ES = {
|
|
9075
9082
|
|
9076
9083
|
'errmsg:forbidden-extension-destructuring-foreach': 'El índice de la repetición indexada debe ser un identificador.',
|
9077
9084
|
|
9085
|
+
'errmsg:forbidden-extension-allow-recursion': function errmsgForbiddenExtensionAllowRecursion(cycle) {
|
9086
|
+
var msg = [];
|
9087
|
+
var _iteratorNormalCompletion2 = true;
|
9088
|
+
var _didIteratorError2 = false;
|
9089
|
+
var _iteratorError2 = undefined;
|
9090
|
+
|
9091
|
+
try {
|
9092
|
+
for (var _iterator2 = cycle[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
9093
|
+
var call = _step2.value;
|
9094
|
+
|
9095
|
+
msg.push(' ' + call.caller + ' llama a ' + call.callee + ' (' + call.location.startPos.filename.toString() + ':' + call.location.startPos.line.toString() + ':' + call.location.startPos.column.toString() + ')');
|
9096
|
+
}
|
9097
|
+
} catch (err) {
|
9098
|
+
_didIteratorError2 = true;
|
9099
|
+
_iteratorError2 = err;
|
9100
|
+
} finally {
|
9101
|
+
try {
|
9102
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
9103
|
+
_iterator2.return();
|
9104
|
+
}
|
9105
|
+
} finally {
|
9106
|
+
if (_didIteratorError2) {
|
9107
|
+
throw _iteratorError2;
|
9108
|
+
}
|
9109
|
+
}
|
9110
|
+
}
|
9111
|
+
|
9112
|
+
return 'La recursión está deshabilitada. ' + 'Hay un ciclo en las invocaciones:\n' + msg.join('\n');
|
9113
|
+
},
|
9114
|
+
|
9078
9115
|
'errmsg:patterns-in-foreach-must-not-be-events': 'El patrón de un foreach no puede ser un evento.',
|
9079
9116
|
|
9080
9117
|
/* Runtime errors (virtual machine) */
|
@@ -9188,7 +9225,7 @@ var LOCALE_ES = exports.LOCALE_ES = {
|
|
9188
9225
|
|
9189
9226
|
'TYPE:Integer': 'Number',
|
9190
9227
|
'TYPE:String': 'String',
|
9191
|
-
'TYPE:Tuple': '
|
9228
|
+
'TYPE:Tuple': '',
|
9192
9229
|
'TYPE:List': 'List',
|
9193
9230
|
|
9194
9231
|
'TYPE:Event': 'Event',
|
@@ -9233,10 +9270,11 @@ var LOCALE_ES = exports.LOCALE_ES = {
|
|
9233
9270
|
'PRIM:minDir': 'minDir',
|
9234
9271
|
'PRIM:maxDir': 'maxDir',
|
9235
9272
|
|
9273
|
+
'PRIM:isEmpty': 'vacía',
|
9236
9274
|
'PRIM:head': 'primero',
|
9237
9275
|
'PRIM:tail': 'resto',
|
9238
9276
|
'PRIM:init': 'comienzo',
|
9239
|
-
'PRIM:last': '
|
9277
|
+
'PRIM:last': 'último',
|
9240
9278
|
|
9241
9279
|
/* Helpers */
|
9242
9280
|
'<alternative>': function alternative(strings) {
|
@@ -9833,7 +9871,7 @@ exports.ITypeCheck = exports.IRestoreState = exports.ISaveState = exports.IPrimi
|
|
9833
9871
|
|
9834
9872
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
9835
9873
|
|
9836
|
-
var _reader = __webpack_require__(
|
9874
|
+
var _reader = __webpack_require__(6);
|
9837
9875
|
|
9838
9876
|
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
9839
9877
|
|
@@ -10687,15 +10725,15 @@ exports.GobstonesInterpreterAPI = undefined;
|
|
10687
10725
|
|
10688
10726
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
10689
10727
|
|
10690
|
-
var _runtime = __webpack_require__(
|
10728
|
+
var _runtime = __webpack_require__(4);
|
10691
10729
|
|
10692
10730
|
var _runner = __webpack_require__(14);
|
10693
10731
|
|
10694
10732
|
var _i18n = __webpack_require__(0);
|
10695
10733
|
|
10696
|
-
var _board_formats = __webpack_require__(
|
10734
|
+
var _board_formats = __webpack_require__(21);
|
10697
10735
|
|
10698
|
-
var _value = __webpack_require__(
|
10736
|
+
var _value = __webpack_require__(5);
|
10699
10737
|
|
10700
10738
|
var _ast = __webpack_require__(2);
|
10701
10739
|
|
@@ -11450,8 +11488,8 @@ LOCALE_EN['CONS:Dir1'] = 'East';
|
|
11450
11488
|
LOCALE_EN['CONS:Dir2'] = 'South';
|
11451
11489
|
LOCALE_EN['CONS:Dir3'] = 'West';
|
11452
11490
|
|
11453
|
-
LOCALE_EN['PRIM:PutStone'] = '
|
11454
|
-
LOCALE_EN['PRIM:RemoveStone'] = '
|
11491
|
+
LOCALE_EN['PRIM:PutStone'] = 'Drop';
|
11492
|
+
LOCALE_EN['PRIM:RemoveStone'] = 'Grab';
|
11455
11493
|
LOCALE_EN['PRIM:Move'] = 'Move';
|
11456
11494
|
LOCALE_EN['PRIM:GoToEdge'] = 'GoToEdge';
|
11457
11495
|
LOCALE_EN['PRIM:EmptyBoardContents'] = 'EmptyBoardContents';
|
@@ -13260,15 +13298,15 @@ var _linter = __webpack_require__(17);
|
|
13260
13298
|
|
13261
13299
|
var _symtable = __webpack_require__(8);
|
13262
13300
|
|
13263
|
-
var _compiler = __webpack_require__(
|
13301
|
+
var _compiler = __webpack_require__(19);
|
13264
13302
|
|
13265
|
-
var _runtime = __webpack_require__(
|
13303
|
+
var _runtime = __webpack_require__(4);
|
13266
13304
|
|
13267
|
-
var _vm = __webpack_require__(
|
13305
|
+
var _vm = __webpack_require__(20);
|
13268
13306
|
|
13269
|
-
var _reader = __webpack_require__(
|
13307
|
+
var _reader = __webpack_require__(6);
|
13270
13308
|
|
13271
|
-
var _token = __webpack_require__(
|
13309
|
+
var _token = __webpack_require__(3);
|
13272
13310
|
|
13273
13311
|
var _ast = __webpack_require__(2);
|
13274
13312
|
|
@@ -13409,6 +13447,8 @@ var Runner = exports.Runner = function () {
|
|
13409
13447
|
value: function _setLanguageOption(option) {
|
13410
13448
|
if (option === 'DestructuringForeach') {
|
13411
13449
|
this.enableLintCheck('forbidden-extension-destructuring-foreach', false);
|
13450
|
+
} else if (option === 'AllowRecursion') {
|
13451
|
+
this.enableLintCheck('forbidden-extension-allow-recursion', false);
|
13412
13452
|
} else {
|
13413
13453
|
throw Error('Unknown language option: ' + option);
|
13414
13454
|
}
|
@@ -13649,7 +13689,7 @@ var _lexer = __webpack_require__(16);
|
|
13649
13689
|
|
13650
13690
|
var _i18n = __webpack_require__(0);
|
13651
13691
|
|
13652
|
-
var _token = __webpack_require__(
|
13692
|
+
var _token = __webpack_require__(3);
|
13653
13693
|
|
13654
13694
|
var _ast = __webpack_require__(2);
|
13655
13695
|
|
@@ -14037,7 +14077,7 @@ var Parser = exports.Parser = function () {
|
|
14037
14077
|
value: function _parseStmtReturn() {
|
14038
14078
|
var startPos = this._currentToken.startPos;
|
14039
14079
|
this._match(_token.T_RETURN);
|
14040
|
-
var tuple = this._parseExprTuple();
|
14080
|
+
var tuple = this._parseExprTuple(false /* possiblyEmpty */);
|
14041
14081
|
var result = new _ast.ASTStmtReturn(tuple);
|
14042
14082
|
result.startPos = startPos;
|
14043
14083
|
result.endPos = tuple.endPos;
|
@@ -14446,7 +14486,7 @@ var Parser = exports.Parser = function () {
|
|
14446
14486
|
case _token.T_UPPERID:
|
14447
14487
|
return this._parseExprStructureOrStructureUpdate();
|
14448
14488
|
case _token.T_LPAREN:
|
14449
|
-
return this._parseExprTuple();
|
14489
|
+
return this._parseExprTuple(true /* possiblyEmpty */);
|
14450
14490
|
case _token.T_LBRACK:
|
14451
14491
|
return this._parseExprListOrRange();
|
14452
14492
|
default:
|
@@ -14744,13 +14784,17 @@ var Parser = exports.Parser = function () {
|
|
14744
14784
|
|
14745
14785
|
}, {
|
14746
14786
|
key: '_parseExprTuple',
|
14747
|
-
value: function _parseExprTuple() {
|
14787
|
+
value: function _parseExprTuple(possiblyEmpty) {
|
14748
14788
|
var startPos = this._currentToken.startPos;
|
14749
14789
|
this._match(_token.T_LPAREN);
|
14750
14790
|
var expressionList = this._parseExpressionSeq(_token.T_RPAREN);
|
14751
14791
|
var endPos = this._currentToken.startPos;
|
14752
14792
|
this._match(_token.T_RPAREN);
|
14753
14793
|
|
14794
|
+
if (!possiblyEmpty && expressionList === 0) {
|
14795
|
+
fail(startPos, endPos, 'return-tuple-cannot-be-empty', []);
|
14796
|
+
}
|
14797
|
+
|
14754
14798
|
var result = void 0;
|
14755
14799
|
if (expressionList.length === 1) {
|
14756
14800
|
result = expressionList[0];
|
@@ -14933,9 +14977,9 @@ var _i18n = __webpack_require__(0);
|
|
14933
14977
|
|
14934
14978
|
var _exceptions = __webpack_require__(1);
|
14935
14979
|
|
14936
|
-
var _reader = __webpack_require__(
|
14980
|
+
var _reader = __webpack_require__(6);
|
14937
14981
|
|
14938
|
-
var _token = __webpack_require__(
|
14982
|
+
var _token = __webpack_require__(3);
|
14939
14983
|
|
14940
14984
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
14941
14985
|
|
@@ -15034,7 +15078,7 @@ var SYMBOLS = [
|
|
15034
15078
|
['++', _token.T_CONCAT], ['+', _token.T_PLUS], ['-', _token.T_MINUS], ['*', _token.T_TIMES], ['^', _token.T_POW]];
|
15035
15079
|
|
15036
15080
|
/* Valid language options accepted by the LANGUAGE pragma */
|
15037
|
-
var LANGUAGE_OPTIONS = ['DestructuringForeach'];
|
15081
|
+
var LANGUAGE_OPTIONS = ['DestructuringForeach', 'AllowRecursion'];
|
15038
15082
|
|
15039
15083
|
function leadingZeroes(string) {
|
15040
15084
|
return string.length >= 0 && string[0] === '0';
|
@@ -15525,6 +15569,8 @@ var _exceptions = __webpack_require__(1);
|
|
15525
15569
|
|
15526
15570
|
var _i18n = __webpack_require__(0);
|
15527
15571
|
|
15572
|
+
var _recursion_checker = __webpack_require__(18);
|
15573
|
+
|
15528
15574
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
15529
15575
|
|
15530
15576
|
function isBlockWithReturn(stmt) {
|
@@ -15596,7 +15642,8 @@ var Linter = exports.Linter = function () {
|
|
15596
15642
|
'procedure-used-as-constructor': true,
|
15597
15643
|
'undeclared-constructor': true,
|
15598
15644
|
// Extensions
|
15599
|
-
'forbidden-extension-destructuring-foreach': true
|
15645
|
+
'forbidden-extension-destructuring-foreach': true,
|
15646
|
+
'forbidden-extension-allow-recursion': true
|
15600
15647
|
};
|
15601
15648
|
}
|
15602
15649
|
|
@@ -15676,6 +15723,8 @@ var Linter = exports.Linter = function () {
|
|
15676
15723
|
|
15677
15724
|
this._lintDefinition(_definition);
|
15678
15725
|
}
|
15726
|
+
|
15727
|
+
/* Disable recursion */
|
15679
15728
|
} catch (err) {
|
15680
15729
|
_didIteratorError2 = true;
|
15681
15730
|
_iteratorError2 = err;
|
@@ -15690,6 +15739,8 @@ var Linter = exports.Linter = function () {
|
|
15690
15739
|
}
|
15691
15740
|
}
|
15692
15741
|
}
|
15742
|
+
|
15743
|
+
this._disableRecursion(ast);
|
15693
15744
|
}
|
15694
15745
|
}, {
|
15695
15746
|
key: '_addDefinitionToSymbolTable',
|
@@ -16878,6 +16929,16 @@ var Linter = exports.Linter = function () {
|
|
16878
16929
|
}
|
16879
16930
|
}
|
16880
16931
|
}
|
16932
|
+
}, {
|
16933
|
+
key: '_disableRecursion',
|
16934
|
+
value: function _disableRecursion(ast) {
|
16935
|
+
if (this._enabledLinterChecks['forbidden-extension-allow-recursion']) {
|
16936
|
+
var cycle = new _recursion_checker.RecursionChecker().callCycle(ast);
|
16937
|
+
if (cycle !== null) {
|
16938
|
+
this._lintCheck(cycle[0].location.startPos, cycle[0].location.endPos, 'forbidden-extension-allow-recursion', [cycle]);
|
16939
|
+
}
|
16940
|
+
}
|
16941
|
+
}
|
16881
16942
|
|
16882
16943
|
/* Throw a syntax error indicating that we expected the name of a
|
16883
16944
|
* constructor, but we got a name which is not a constructor.
|
@@ -16909,6 +16970,224 @@ var Linter = exports.Linter = function () {
|
|
16909
16970
|
"use strict";
|
16910
16971
|
|
16911
16972
|
|
16973
|
+
Object.defineProperty(exports, "__esModule", {
|
16974
|
+
value: true
|
16975
|
+
});
|
16976
|
+
exports.RecursionChecker = undefined;
|
16977
|
+
|
16978
|
+
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
16979
|
+
|
16980
|
+
var _ast = __webpack_require__(2);
|
16981
|
+
|
16982
|
+
var _token = __webpack_require__(3);
|
16983
|
+
|
16984
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
16985
|
+
|
16986
|
+
var RecursionChecker = exports.RecursionChecker = function () {
|
16987
|
+
|
16988
|
+
/*
|
16989
|
+
* Each routine call (i.e. procedure or function call) in the source
|
16990
|
+
* code is of the form:
|
16991
|
+
* R(e1, ..., en)
|
16992
|
+
* where R is the identifier for the routine.
|
16993
|
+
*
|
16994
|
+
* The token R is called the 'location' of the call.
|
16995
|
+
* Observe that the location includes not only the name of the
|
16996
|
+
* routine but also its position in the source code.
|
16997
|
+
*
|
16998
|
+
* The call graph is a dictionary whose keys are strings
|
16999
|
+
* and whose values are again dictionaries.
|
17000
|
+
* The outer and the inner dictionaries are indexed by routine names
|
17001
|
+
* in such a way that:
|
17002
|
+
*
|
17003
|
+
* _callGraph[F][G]
|
17004
|
+
*
|
17005
|
+
* is the location of the first call to G inside the body of F.
|
17006
|
+
*/
|
17007
|
+
function RecursionChecker() {
|
17008
|
+
_classCallCheck(this, RecursionChecker);
|
17009
|
+
|
17010
|
+
this._currentRoutine = null;
|
17011
|
+
this._callGraph = {};
|
17012
|
+
}
|
17013
|
+
|
17014
|
+
/*
|
17015
|
+
* If there is a cycle in the call graph (using either procedure calls
|
17016
|
+
* or function calls), return a list:
|
17017
|
+
* [c1, ..., cn]
|
17018
|
+
* where ci is the i-th call involved in a cycle.
|
17019
|
+
* A call is of the form:
|
17020
|
+
* {caller: F , callee: G, location: L}
|
17021
|
+
* where F is the name (string) of the caller,
|
17022
|
+
* G is the name (string) of the callee,
|
17023
|
+
* and L is the location of the call.
|
17024
|
+
*
|
17025
|
+
* Otherwise return null.
|
17026
|
+
*/
|
17027
|
+
|
17028
|
+
|
17029
|
+
_createClass(RecursionChecker, [{
|
17030
|
+
key: 'callCycle',
|
17031
|
+
value: function callCycle(ast) {
|
17032
|
+
/* Build the call graph */
|
17033
|
+
this._visitNode(ast);
|
17034
|
+
|
17035
|
+
/* Find a cycle in the call graph */
|
17036
|
+
return this._findCallCycle();
|
17037
|
+
}
|
17038
|
+
|
17039
|
+
/* Visitor -- build the call graph */
|
17040
|
+
|
17041
|
+
}, {
|
17042
|
+
key: '_addEdge',
|
17043
|
+
value: function _addEdge(caller, callee) {
|
17044
|
+
if (!(caller in this._callGraph)) {
|
17045
|
+
this._callGraph[caller] = {};
|
17046
|
+
}
|
17047
|
+
if (!(callee.value in this._callGraph[caller])) {
|
17048
|
+
this._callGraph[caller][callee.value] = callee;
|
17049
|
+
}
|
17050
|
+
}
|
17051
|
+
}, {
|
17052
|
+
key: '_visitNode',
|
17053
|
+
value: function _visitNode(node) {
|
17054
|
+
if (node === null || node instanceof _token.Token) {
|
17055
|
+
/* Skip */
|
17056
|
+
} else if (node instanceof Array) {
|
17057
|
+
this._visitNodes(node);
|
17058
|
+
} else {
|
17059
|
+
this._visitTaggedNode(node);
|
17060
|
+
}
|
17061
|
+
}
|
17062
|
+
}, {
|
17063
|
+
key: '_visitNodes',
|
17064
|
+
value: function _visitNodes(nodes) {
|
17065
|
+
var _iteratorNormalCompletion = true;
|
17066
|
+
var _didIteratorError = false;
|
17067
|
+
var _iteratorError = undefined;
|
17068
|
+
|
17069
|
+
try {
|
17070
|
+
for (var _iterator = nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
17071
|
+
var node = _step.value;
|
17072
|
+
|
17073
|
+
this._visitNode(node);
|
17074
|
+
}
|
17075
|
+
} catch (err) {
|
17076
|
+
_didIteratorError = true;
|
17077
|
+
_iteratorError = err;
|
17078
|
+
} finally {
|
17079
|
+
try {
|
17080
|
+
if (!_iteratorNormalCompletion && _iterator.return) {
|
17081
|
+
_iterator.return();
|
17082
|
+
}
|
17083
|
+
} finally {
|
17084
|
+
if (_didIteratorError) {
|
17085
|
+
throw _iteratorError;
|
17086
|
+
}
|
17087
|
+
}
|
17088
|
+
}
|
17089
|
+
}
|
17090
|
+
}, {
|
17091
|
+
key: '_visitTaggedNode',
|
17092
|
+
value: function _visitTaggedNode(node) {
|
17093
|
+
switch (node.tag) {
|
17094
|
+
case _ast.N_DefProgram:
|
17095
|
+
case _ast.N_DefInteractiveProgram:
|
17096
|
+
this._visitProgramDefinition(node);
|
17097
|
+
break;
|
17098
|
+
case _ast.N_DefProcedure:
|
17099
|
+
case _ast.N_DefFunction:
|
17100
|
+
this._visitRoutineDefinition(node);
|
17101
|
+
break;
|
17102
|
+
case _ast.N_StmtProcedureCall:
|
17103
|
+
this._visitProcedureCall(node);
|
17104
|
+
break;
|
17105
|
+
case _ast.N_ExprFunctionCall:
|
17106
|
+
this._visitFunctionCall(node);
|
17107
|
+
break;
|
17108
|
+
}
|
17109
|
+
this._visitNodes(node.children);
|
17110
|
+
}
|
17111
|
+
}, {
|
17112
|
+
key: '_visitProgramDefinition',
|
17113
|
+
value: function _visitProgramDefinition(node) {
|
17114
|
+
this._currentRoutine = 'program';
|
17115
|
+
}
|
17116
|
+
}, {
|
17117
|
+
key: '_visitRoutineDefinition',
|
17118
|
+
value: function _visitRoutineDefinition(node) {
|
17119
|
+
this._currentRoutine = node.name.value;
|
17120
|
+
}
|
17121
|
+
}, {
|
17122
|
+
key: '_visitProcedureCall',
|
17123
|
+
value: function _visitProcedureCall(node) {
|
17124
|
+
this._addEdge(this._currentRoutine, node.procedureName);
|
17125
|
+
}
|
17126
|
+
}, {
|
17127
|
+
key: '_visitFunctionCall',
|
17128
|
+
value: function _visitFunctionCall(node) {
|
17129
|
+
this._addEdge(this._currentRoutine, node.functionName);
|
17130
|
+
}
|
17131
|
+
|
17132
|
+
/* Find a cycle in the call graph */
|
17133
|
+
|
17134
|
+
}, {
|
17135
|
+
key: '_findCallCycle',
|
17136
|
+
value: function _findCallCycle() {
|
17137
|
+
var visited = {};
|
17138
|
+
var parents = {};
|
17139
|
+
for (var f in this._callGraph) {
|
17140
|
+
visited[f] = true;
|
17141
|
+
parents[f] = true;
|
17142
|
+
var cycle = this._findCallCycleFrom(visited, parents, [], f);
|
17143
|
+
if (cycle != null) {
|
17144
|
+
return cycle;
|
17145
|
+
}
|
17146
|
+
delete parents[f];
|
17147
|
+
}
|
17148
|
+
return null;
|
17149
|
+
}
|
17150
|
+
}, {
|
17151
|
+
key: '_findCallCycleFrom',
|
17152
|
+
value: function _findCallCycleFrom(visited, parents, path, f) {
|
17153
|
+
for (var g in this._callGraph[f]) {
|
17154
|
+
path.push({
|
17155
|
+
'caller': f,
|
17156
|
+
'callee': g,
|
17157
|
+
'location': this._callGraph[f][g]
|
17158
|
+
});
|
17159
|
+
if (g in parents) {
|
17160
|
+
while (path[0].caller !== g) {
|
17161
|
+
path.shift();
|
17162
|
+
}
|
17163
|
+
path.push();
|
17164
|
+
return path; /* Cycle */
|
17165
|
+
}
|
17166
|
+
if (!(g in visited)) {
|
17167
|
+
visited[g] = true;
|
17168
|
+
parents[g] = true;
|
17169
|
+
var cycle = this._findCallCycleFrom(visited, parents, path, g);
|
17170
|
+
if (cycle !== null) {
|
17171
|
+
return cycle;
|
17172
|
+
}
|
17173
|
+
delete parents[g];
|
17174
|
+
}
|
17175
|
+
path.pop();
|
17176
|
+
}
|
17177
|
+
return null;
|
17178
|
+
}
|
17179
|
+
}]);
|
17180
|
+
|
17181
|
+
return RecursionChecker;
|
17182
|
+
}();
|
17183
|
+
|
17184
|
+
/***/ }),
|
17185
|
+
/* 19 */
|
17186
|
+
/***/ (function(module, exports, __webpack_require__) {
|
17187
|
+
|
17188
|
+
"use strict";
|
17189
|
+
|
17190
|
+
|
16912
17191
|
Object.defineProperty(exports, "__esModule", {
|
16913
17192
|
value: true
|
16914
17193
|
});
|
@@ -16920,9 +17199,9 @@ var _ast = __webpack_require__(2);
|
|
16920
17199
|
|
16921
17200
|
var _instruction = __webpack_require__(9);
|
16922
17201
|
|
16923
|
-
var _value = __webpack_require__(
|
17202
|
+
var _value = __webpack_require__(5);
|
16924
17203
|
|
16925
|
-
var _runtime = __webpack_require__(
|
17204
|
+
var _runtime = __webpack_require__(4);
|
16926
17205
|
|
16927
17206
|
var _i18n = __webpack_require__(0);
|
16928
17207
|
|
@@ -18120,7 +18399,7 @@ var Compiler = exports.Compiler = function () {
|
|
18120
18399
|
}();
|
18121
18400
|
|
18122
18401
|
/***/ }),
|
18123
|
-
/*
|
18402
|
+
/* 20 */
|
18124
18403
|
/***/ (function(module, exports, __webpack_require__) {
|
18125
18404
|
|
18126
18405
|
"use strict";
|
@@ -18135,13 +18414,13 @@ var _createClass = function () { function defineProperties(target, props) { for
|
|
18135
18414
|
|
18136
18415
|
var _instruction = __webpack_require__(9);
|
18137
18416
|
|
18138
|
-
var _value = __webpack_require__(
|
18417
|
+
var _value = __webpack_require__(5);
|
18139
18418
|
|
18140
18419
|
var _exceptions = __webpack_require__(1);
|
18141
18420
|
|
18142
18421
|
var _i18n = __webpack_require__(0);
|
18143
18422
|
|
18144
|
-
var _runtime = __webpack_require__(
|
18423
|
+
var _runtime = __webpack_require__(4);
|
18145
18424
|
|
18146
18425
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
18147
18426
|
|
@@ -18202,6 +18481,13 @@ function fail(startPos, endPos, reason, args) {
|
|
18202
18481
|
* - the current instruction pointer
|
18203
18482
|
* - a stack of local values
|
18204
18483
|
* - a map from local names to values
|
18484
|
+
*
|
18485
|
+
* Each local variable has a type and a value.
|
18486
|
+
* - The actual type of the current value held by a variable
|
18487
|
+
* should always be an instance of the type.
|
18488
|
+
* - The type of a variable should be the join of all the
|
18489
|
+
* types held historically by the variable.
|
18490
|
+
* - The Frame does not impose these conditions.
|
18205
18491
|
*/
|
18206
18492
|
|
18207
18493
|
var Frame = function () {
|
@@ -18210,6 +18496,7 @@ var Frame = function () {
|
|
18210
18496
|
|
18211
18497
|
this._routineName = routineName;
|
18212
18498
|
this._instructionPointer = instructionPointer;
|
18499
|
+
this._variableTypes = {};
|
18213
18500
|
this._variables = {};
|
18214
18501
|
this._stack = [];
|
18215
18502
|
|
@@ -18221,7 +18508,16 @@ var Frame = function () {
|
|
18221
18508
|
|
18222
18509
|
_createClass(Frame, [{
|
18223
18510
|
key: 'setVariable',
|
18224
|
-
|
18511
|
+
|
18512
|
+
|
18513
|
+
/* Precondition:
|
18514
|
+
* Let oldType = this._variableTypes[name]
|
18515
|
+
* if this._variableTypes[name] is defined.
|
18516
|
+
* Otherwise, let oldType = new TypeAny().
|
18517
|
+
* Then the following condition must hold:
|
18518
|
+
* type = joinTypes(value.type(), oldType) */
|
18519
|
+
value: function setVariable(name, type, value) {
|
18520
|
+
this._variableTypes[name] = type;
|
18225
18521
|
this._variables[name] = value;
|
18226
18522
|
}
|
18227
18523
|
}, {
|
@@ -18229,6 +18525,15 @@ var Frame = function () {
|
|
18229
18525
|
value: function unsetVariable(name, value) {
|
18230
18526
|
delete this._variables[name];
|
18231
18527
|
}
|
18528
|
+
}, {
|
18529
|
+
key: 'getVariableType',
|
18530
|
+
value: function getVariableType(name) {
|
18531
|
+
if (name in this._variableTypes) {
|
18532
|
+
return this._variableTypes[name];
|
18533
|
+
} else {
|
18534
|
+
return new _value.TypeAny();
|
18535
|
+
}
|
18536
|
+
}
|
18232
18537
|
}, {
|
18233
18538
|
key: 'getVariable',
|
18234
18539
|
value: function getVariable(name) {
|
@@ -18596,17 +18901,15 @@ var VirtualMachine = exports.VirtualMachine = function () {
|
|
18596
18901
|
var newValue = frame.popValue();
|
18597
18902
|
|
18598
18903
|
/* Check that types are compatible */
|
18599
|
-
var
|
18600
|
-
|
18601
|
-
|
18602
|
-
|
18603
|
-
|
18604
|
-
fail(instruction.startPos, instruction.endPos, 'incompatible-types-on-assignment', [instruction.variableName, oldType, newType]);
|
18605
|
-
}
|
18904
|
+
var oldType = frame.getVariableType(instruction.variableName);
|
18905
|
+
var valType = newValue.type();
|
18906
|
+
var newType = (0, _value.joinTypes)(oldType, valType);
|
18907
|
+
if (newType === null) {
|
18908
|
+
fail(instruction.startPos, instruction.endPos, 'incompatible-types-on-assignment', [instruction.variableName, oldType, valType]);
|
18606
18909
|
}
|
18607
18910
|
|
18608
18911
|
/* Proceed with assignment */
|
18609
|
-
frame.setVariable(instruction.variableName, newValue);
|
18912
|
+
frame.setVariable(instruction.variableName, newType, newValue);
|
18610
18913
|
frame.instructionPointer++;
|
18611
18914
|
}
|
18612
18915
|
}, {
|
@@ -19048,7 +19351,7 @@ var VirtualMachine = exports.VirtualMachine = function () {
|
|
19048
19351
|
}();
|
19049
19352
|
|
19050
19353
|
/***/ }),
|
19051
|
-
/*
|
19354
|
+
/* 21 */
|
19052
19355
|
/***/ (function(module, exports, __webpack_require__) {
|
19053
19356
|
|
19054
19357
|
"use strict";
|
@@ -19462,7 +19765,7 @@ function fileBoardFormat(filename) {
|
|
19462
19765
|
return BOARD_FORMATS[DEFAULT_FORMAT];
|
19463
19766
|
}
|
19464
19767
|
|
19465
|
-
var fs = __webpack_require__(
|
19768
|
+
var fs = __webpack_require__(22);
|
19466
19769
|
|
19467
19770
|
function readJboardFromFile(filename) {
|
19468
19771
|
var format = fileBoardFormat(filename);
|
@@ -19477,7 +19780,7 @@ function writeJboardToFile(filename, jboard) {
|
|
19477
19780
|
}
|
19478
19781
|
|
19479
19782
|
/***/ }),
|
19480
|
-
/*
|
19783
|
+
/* 22 */
|
19481
19784
|
/***/ (function(module, exports) {
|
19482
19785
|
|
19483
19786
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gobstones-code-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Alfonso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|