refactored inheritance circularity avoidance

pull/89/head
jmoenig 2019-12-19 09:00:54 +01:00
rodzic 735a0551b1
commit 34c8d245c2
4 zmienionych plików z 21 dodań i 13 usunięć

Wyświetl plik

@ -17,6 +17,9 @@
* NEW Slovak translation, thanks, Peter Lukacovic
* German
### 2019-12-19
* objects, threads: refactored inheritance circularity avoidance
### 2019-12-18
* gui, api: rearranged Snap! API into its own file
* added API documentation

Wyświetl plik

@ -7,8 +7,8 @@
<script type="text/javascript" src="src/morphic.js?version=2019-11-12"></script>
<script type="text/javascript" src="src/widgets.js?version=2019-10-16"></script>
<script type="text/javascript" src="src/blocks.js?version=2019-12-13"></script>
<script type="text/javascript" src="src/threads.js?version=2019-12-18"></script>
<script type="text/javascript" src="src/objects.js?version=2019-12-16"></script>
<script type="text/javascript" src="src/threads.js?version=2019-12-19"></script>
<script type="text/javascript" src="src/objects.js?version=2019-12-19"></script>
<script type="text/javascript" src="src/gui.js?version=2019-12-18"></script>
<script type="text/javascript" src="src/paint.js?version=2019-06-27"></script>
<script type="text/javascript" src="src/lists.js?version=2019-12-08"></script>

Wyświetl plik

@ -84,7 +84,7 @@ BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, BooleanSlotMorph,
localize, TableMorph, TableFrameMorph, normalizeCanvas, VectorPaintEditorMorph,
HandleMorph, AlignmentMorph, Process, XML_Element, WorldMap, copyCanvas*/
modules.objects = '2019-December-15';
modules.objects = '2019-December-19';
var SpriteMorph;
var StageMorph;
@ -6462,8 +6462,20 @@ SpriteMorph.prototype.chooseExemplar = function () {
menu.popUpAtHand(this.world());
};
SpriteMorph.prototype.setExemplar = function (another) {
SpriteMorph.prototype.setExemplar = function (another, enableError) {
var ide;
// check for circularity
if (another instanceof SpriteMorph &&
contains(another.allExemplars(), this)) {
if (enableError) {
throw new Error(
localize('unable to inherit\n(disabled or circular?)')
);
}
return; // silently fail so stored projects can still be loaded
}
this.emancipate();
this.exemplar = another;
if (another) {

Wyświetl plik

@ -61,7 +61,7 @@ StageMorph, SpriteMorph, StagePrompterMorph, Note, modules, isString, copy,
isNil, WatcherMorph, List, ListWatcherMorph, alert, console, TableMorph, Color,
TableFrameMorph, ColorSlotMorph, isSnapObject, newCanvas, Symbol, SVG_Costume*/
modules.threads = '2019-December-18';
modules.threads = '2019-December-19';
var ThreadManager;
var Process;
@ -4554,14 +4554,7 @@ Process.prototype.doSet = function (attribute, value) {
case 'parent':
this.assertType(rcvr, 'sprite');
value = value instanceof SpriteMorph ? value : null;
// avoid circularity
if (value instanceof SpriteMorph &&
contains(value.allExemplars(), rcvr)) {
throw new Error(
localize('unable to inherit\n(disabled or circular?)')
);
}
rcvr.setExemplar(value);
rcvr.setExemplar(value, true); // throw an error in case of circularity
break;
case 'temporary?':
this.assertType(rcvr, 'sprite');