minigrace
Version:
A compiler for the Grace programming language
883 lines (859 loc) • 36.6 kB
JavaScript
let gracecode_dom_sourceFile = "/Users/black/Development/mg/gracelang/minigrace/modules/dom.grace";
let gracecode_dom_sha256 = "42771c2147130776ea6f89f96bc53e3db613e647cc0b7f5438053fd082ad997f";
let gracecode_dom_minigraceRevision = "b57591d29fc5ee5270d114920bf671367b8c3ecb";
let gracecode_dom_minigraceGeneration = "5171";
if (typeof gctCache !== "undefined")
gctCache["dom"] = "dialect:\n standard\nfreshScopes:\nmethodTypes:$100:\n document \u2192 Object\n doesObject(domObj:Unknown)haveProperty(name:Unknown) \u2192 Boolean\n draw(ctx:Unknown, graphics:Unknown, width:Unknown, height:Unknown) \u2192 Done\n filledOval(ctx:Unknown, g:Unknown) \u2192 Done\n filledRect(ctx:Unknown, g:Unknown) \u2192 Done\n for(iterable:Unknown)waiting(delay:Number)do(block:Unknown) \u2192 Object\n framedOval(ctx:Unknown, g:Unknown) \u2192 Done\n framedRect(ctx:Unknown, g:Unknown) \u2192 Done\n image(ctx:Unknown, g:Unknown) \u2192 Done\n while(cond:Unknown)waiting(delay:Unknown)do(block:Unknown) \u2192 Object\n window \u2192 Object\nmodules:\n standard\npath:\n /Users/black/Development/mg/gracelang/minigrace/modules/dom.grace\nscope:$100:\n asDebugString String (go) $scope_string\n asString String (go) $scope_string\n basicAsString String (go) $scope_string\n document Object (mth) $scope_done\n doesObject(1)haveProperty(1) Boolean (mth) $scope_done\n draw(4) Done (mth) $scope_done\n filledOval(2) Done (mth) $scope_done\n filledRect(2) Done (mth) $scope_done\n for(1)waiting(1)do(1) Object (mth) $scope_done\n framedOval(2) Done (mth) $scope_done\n framedRect(2) Done (mth) $scope_done\n image(2) Done (mth) $scope_done\n isMe(1) Boolean (go) $scope_boolean\n myIdentityHash Number (go) $scope_number\n noObject Unknown (def) $scope_done public\n while(1)waiting(1)do(1) Object (mth) $scope_done\n window Object (mth) $scope_done\nself:\n $100\ntypes:\n";
if (typeof originalSourceLines !== "undefined") {
originalSourceLines["dom"] = [
"dialect \"standard\"",
"native \"js\" code ‹",
"",
" function unwrapDOMObject(obj) {",
" if (obj.hasOwnProperty(\"_wrappedDOMObject\")) {",
" return obj._wrappedDOMObject;",
" }",
"",
" return obj;",
" }",
"",
" function wrapDOMFunction(obj, fn) {",
" return function(argcv) {",
" var args = [];",
" var numArgs = argcv.sum();",
" for (var i=1; i <= numArgs; i++)",
" args.push(wrapGraceObject(arguments[i]));",
" return wrapDOMObject(obj[fn].apply(obj, args));",
" };",
" }",
"",
" function wrapDOMField(o, obj, k) {",
" o.methods[k + \":=(1)\"] = function(argcv, val) {",
" obj[k] = wrapGraceObject(val);",
" return GraceDone;",
" };",
" return function() {",
" return wrapDOMObject(obj[k]);",
" };",
" }",
"",
" function wrapDOMObject(obj) {",
" switch(typeof obj) {",
" case \"boolean\":",
" return new GraceBoolean(obj);",
" case \"string\":",
" return new GraceString(obj);",
" case \"number\":",
" return new GraceNum(obj);",
" case \"undefined\":",
" return var_noObject;",
" default:",
" break;",
" }",
" if (obj === null) {",
" return var_noObject;",
" }",
" if (obj._graceWrapper)",
" return obj._graceWrapper;",
" var o = Grace_allocObject(GraceObject, \"wrappedDomObject\");",
" o._wrappedDOMObject = obj;",
" o.methods.asString = function() {",
" return new GraceString(\"DOMObject(\" + obj + \")\");",
" };",
" o.methods[\"==(1)\"] = function(argcv, other) {",
" return (this === other) ? GraceTrue : GraceFalse;",
" };",
" o.methods[\"≠(1)\"] = function(argcv, other) {",
" return (this !== other) ? GraceTrue : GraceFalse;",
" };",
" o.methods.hash = publicVersion(object_identityHash, 'hash');",
" for (var k in obj) {",
" switch(typeof obj[k]) {",
" case \"function\":",
" var wrappedFun = wrapDOMFunction(obj, k);",
" if (k === \"drawImage\") {",
" o.methods[k + \"(3)\"] = wrappedFun;",
" o.methods[k + \"(5)\"] = wrappedFun;",
" o.methods[k + \"(9)\"] = wrappedFun;",
" } else if (k === \"arc\") {",
" o.methods[k + \"(5)\"] = wrappedFun;",
" o.methods[k + \"(6)\"] = wrappedFun;",
" } else {",
" o.methods[k] = wrappedFun;",
" o.methods[k + \"(1)\"] = wrappedFun;",
" o.methods[k + \"(2)\"] = wrappedFun;",
" o.methods[k + \"(3)\"] = wrappedFun;",
" o.methods[k + \"(4)\"] = wrappedFun;",
" // we don't know how many arguments this method takes",
" }",
" break;",
" case \"string\":",
" case \"boolean\":",
" case \"number\":",
" case \"object\":",
" o.methods[k] = wrapDOMField(o, obj, k);",
" break;",
" case \"undefined\":",
" o.methods[k] = null;",
" break;",
" default:",
" throw new GraceExceptionPacket(ExceptionObject,",
" new GraceString(\"JavaScript value \" + obj[k] + \" has unknown type\"));",
" }",
" }",
" o.methods._methods = function() {",
" var l = [];",
" for (var m in o.methods) {",
" l.push(new GraceString(m));",
" }",
" return new GraceList(l);",
" };",
" try {",
" obj._graceWrapper = o;",
" } catch(e) {}",
" return o;",
" }",
"",
" function wrapGraceObject(o) {",
" if (o === undefined || o === null) {",
" return var_noObject;",
" }",
" if (o instanceof GraceString) {",
" return o._value;",
" }",
" if (o instanceof GraceNum) {",
" return o._value;",
" }",
" if (o instanceof GraceBoolean) {",
" return o._value;",
" }",
" if (o.real) { // A block",
" if (o._wrappedDOMObject)",
" return o._wrappedDOMObject;",
" var f = function() {",
" var args = [];",
" for (var i=0; i<arguments.length; i++) {",
" args.push(wrapDOMObject(arguments[i]));",
" }",
" var ret;",
" minigrace.trapErrors(function() {",
" ret = wrapGraceObject(o.real.apply(o.receiver, args));",
" });",
" return ret;",
" };",
" o._wrappedDOMObject = f;",
" }",
" if (o._wrappedDOMObject)",
" return o._wrappedDOMObject;",
" return o;",
" }",
"",
" function arc(ctx, g) {",
" var p = g.location.data;",
" var w = g.theWidth._value;",
" var h = g.theHeight._value;",
" ctx.translate(p.x._value + w, p.y._value + h);",
" ctx.scale(w / 2, h / 2);",
" ctx.arc(0, 0, 1, 0, 2 * Math.PI);",
" }",
"",
" function run(ctx, name, g) {",
" var p = g.location.data;",
" ctx[name](p.x._value, p.y._value, g.theWidth._value, g.theHeight._value);",
" }",
"›",
"",
"def noObject is public = singleton \"noObject\"",
"",
"native \"js\" code ‹",
" if (typeof window !== \"undefined\") {",
" if (!window.var_domNoObject) {",
" window.var_domNoObject = var_noObject;",
" } else {",
" var_noObject = window.var_domNoObject;",
" }",
" }",
"›",
"// This horrible piece of code ensures that noObject (local to this module) is",
"// unchanged from one program run to the next. Why does this matter?",
"// Because DOM objects survive from one run to the next, and wrappedDOMObjects",
"// cache Grace objects, including noObject.",
"",
"method document -> Object {",
" native \"js\" code ‹",
" if (typeof(document) === \"undefined\") {",
" return wrapDOMObject(null);",
" // This return is here because objectdraw requests `dom.document` in",
" // its initialization. When used as a dialect, the initialization",
" // code runs inside the compiler, where there is no document.",
" // Raising an exception at this point kills the compiler.",
" // throw new GraceExceptionPacket(EnvironmentExceptionObject,",
" // new GraceString(\"There is no 'document' in this context.\"));",
" }",
" return wrapDOMObject(document);",
" ›",
"}",
"method window -> Object {",
" native \"js\" code ‹",
" return wrapDOMObject(window);",
" ›",
"}",
"method for(iterable) waiting(delay:Number) do(block) -> Object {",
" native \"js\" code ‹",
" result = Grace_allocObject(GraceObject, \"dom.for(1)waiting(1)do(1)\");",
" result.methods[\"then(1)\"] = function(argcv, b) {",
" this.data.then = b;",
" };",
" var iter = callmethod(var_iterable, \"iterator\", [0]);",
" const func = function() {",
" minigrace.trapErrors(function() {",
" if (Grace_isTrue(callmethod(iter, \"hasNext\", [0]))) {",
" const val = callmethod(iter, \"next\", [0]);",
" callmethod(var_block, \"apply(1)\", [1], val);",
" setTimeout(func, var_delay._value);",
" } else {",
" if (result.data.then)",
" callmethod(result.data.then, \"apply\", [0]);",
" }",
" });",
" };",
" func();",
" ›",
"}",
"method while(cond) waiting(delay) do(block) -> Object {",
" native \"js\" code ‹",
" var result = Grace_allocObject(GraceObject, \"dom.while(1)waiting(1)do(1)\");",
" result.methods[\"then(1)\"] = function(argcv, block) {",
" this.data.then = block;",
" };",
" const func = function() {",
" minigrace.trapErrors(function() {",
" if (Grace_isTrue(callmethod(var_cond, \"apply\", [0]))) {",
" callmethod(var_block, \"apply\", [0]);",
" setTimeout(func, var_delay._value);",
" } else {",
" if (result.data.then)",
" callmethod(result.data.then, \"apply\", [0]);",
" }",
" });",
" };",
" func();",
" ›",
"}",
"method doesObject(domObj) haveProperty (name) -> Boolean {",
" native \"js\" code ‹",
" return var_name._value in unwrapDOMObject(var_domObj) ? GraceTrue : GraceFalse;",
" ›",
"}",
"method framedRect(ctx, g) -> Done {",
" native \"js\" code ‹",
" var_ctx = var_ctx._wrappedDOMObject;",
" var_g = var_g.data;",
" var_ctx.save();",
" var_ctx.strokeStyle = color(var_g);",
" run(var_ctx, \"strokeRect\", var_g);",
" var_ctx.restore();",
" ›",
"}",
"method filledRect(ctx, g) -> Done {",
" native \"js\" code ‹",
" var_ctx = var_ctx._wrappedDOMObject;",
" var_g = var_g.data;",
" var_ctx.save();",
" var_ctx.fillStyle = color(var_g);",
" run(var_ctx, \"fillRect\", var_g);",
" var_ctx.restore();",
" ›",
"}",
"method framedOval(ctx, g) -> Done {",
" native \"js\" code ‹",
" var_ctx = var_ctx._wrappedDOMObject;",
" var_g = var_g.data;",
" var_ctx.beginPath();",
" var_ctx.save();",
" arc(var_ctx, var_g);",
" var_ctx.restore();",
" var_ctx.save();",
" var_ctx.strokeStyle = color(var_g);",
" var_ctx.stroke();",
" var_ctx.restore();",
" var_ctx.closePath();",
" ›",
"}",
"method filledOval(ctx, g) -> Done {",
" native \"js\" code ‹",
" var_ctx = var_ctx._wrappedDOMObject;",
" var_g = var_g.data;",
" var_ctx.beginPath();",
" var_ctx.save();",
" arc(var_ctx, var_g);",
" var_ctx.restore();",
" var_ctx.save();",
" var_ctx.fillStyle = color(var_g);",
" var_ctx.fill();",
" var_ctx.restore();",
" var_ctx.closePath();",
" ›",
"}",
"method image(ctx, g) -> Done {",
" native \"js\" code ‹",
" var_ctx = var_ctx._wrappedDOMObject;",
" var_g = var_g.data;",
" var_ctx.drawImage(var_g.theImage, var_g.x._value, var_g.y._value, var_g.theWidth._value, var_g.theHeight._value);",
" ›",
"}",
"method draw(ctx, graphics, width, height) -> Done {",
" native \"js\" code ‹",
" var_ctx._wrappedDOMObject.clearRect(0, 0, var_width._value, var_height._value);",
"",
" const list = var_graphics._value;",
"",
" for (var i = 0, l = list.length; i < l; i++) {",
" const graphic = list[i];",
" if (Grace_isTrue(graphic.data.isVisible)) {",
" graphic.methods[\"draw(1)\"].call(graphic, [1], var_ctx);",
" }",
" }",
" ›",
"}" ];
}
function gracecode_dom() {
importedModules["dom"] = this;
const var_$module = this;
this.definitionModule = "dom";
this.definitionLine = 1;
setLineNumber(1); // compilenode dialect
// Dialect "standard"
const var_$dialect = do_import("standard", gracecode_standard);
this.outer = var_$dialect;
this.closureKeys = this.closureKeys || [];
this.closureKeys.push("outer_dom_1");
this.outer_dom_1 = var_$dialect;
var func0 = function(argcv) { // method document, line 174
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 0) && (numArgs !== 0)) {
raiseTypeArgError("document", 0, numArgs - 0);
}
setLineNumber(175); // compilenode call
var result = GraceDone; // start native code from line 175
if (typeof(document) === "undefined") {
return wrapDOMObject(null);
// This return is here because objectdraw requests `dom.document` in
// its initialization. When used as a dialect, the initialization
// code runs inside the compiler, where there is no document.
// Raising an exception at this point kills the compiler.
// throw new GraceExceptionPacket(EnvironmentExceptionObject,
// new GraceString("There is no 'document' in this context."));
}
return wrapDOMObject(document);
// end native code insertion
setLineNumber(174); // compilenode member
var call2 = selfRequest(var_$dialect, "Object", [0]);
setLineNumber(175); // typecheck
assertTypeOrMsg(result, call2, "result of method document", "Object");
return result;
}; // end of method document
setLineNumber(174); // compilenode member
var call3 = selfRequest(var_$dialect, "Object", [0]);
func0.returnType = call3;
this.methods["document"] = func0;
func0.methodName = "document";
func0.paramCounts = [0];
func0.paramNames = [];
func0.definitionLine = 174;
func0.definitionModule = "dom";
var func4 = function(argcv) { // method window, line 188
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 0) && (numArgs !== 0)) {
raiseTypeArgError("window", 0, numArgs - 0);
}
setLineNumber(189); // compilenode call
var result = GraceDone; // start native code from line 189
return wrapDOMObject(window);
// end native code insertion
setLineNumber(188); // compilenode member
var call6 = selfRequest(var_$dialect, "Object", [0]);
setLineNumber(189); // typecheck
assertTypeOrMsg(result, call6, "result of method window", "Object");
return result;
}; // end of method window
setLineNumber(188); // compilenode member
var call7 = selfRequest(var_$dialect, "Object", [0]);
func4.returnType = call7;
this.methods["window"] = func4;
func4.methodName = "window";
func4.paramCounts = [0];
func4.paramNames = [];
func4.definitionLine = 188;
func4.definitionModule = "dom";
var func8 = function(argcv, var_iterable, var_delay, var_block) { // method for(_)waiting(_)do(_), line 193
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 3) && (numArgs !== 3)) {
raiseTypeArgError("for(_)waiting(_)do(_)", 0, numArgs - 3);
}
setLineNumber(193); // compilenode member
var call9 = selfRequest(var_$dialect, "Number", [0]);
assertTypeOrMsg(var_delay, call9, "argument 2 in request of `for(_)waiting(_)do(_)`", "Number");
setLineNumber(194); // compilenode call
var result = GraceDone; // start native code from line 194
result = Grace_allocObject(GraceObject, "dom.for(1)waiting(1)do(1)");
result.methods["then(1)"] = function(argcv, b) {
this.data.then = b;
};
var iter = callmethod(var_iterable, "iterator", [0]);
const func = function() {
minigrace.trapErrors(function() {
if (Grace_isTrue(callmethod(iter, "hasNext", [0]))) {
const val = callmethod(iter, "next", [0]);
callmethod(var_block, "apply(1)", [1], val);
setTimeout(func, var_delay._value);
} else {
if (result.data.then)
callmethod(result.data.then, "apply", [0]);
}
});
};
func();
// end native code insertion
setLineNumber(193); // compilenode member
var call11 = selfRequest(var_$dialect, "Object", [0]);
setLineNumber(194); // typecheck
assertTypeOrMsg(result, call11, "result of method for(_)waiting(_)do(_)", "Object");
return result;
}; // end of method for(_)waiting(_)do(_)
setLineNumber(193); // compilenode member
var call12 = selfRequest(var_$dialect, "Number", [0]);
func8.paramTypes = [type_Unknown, call12, type_Unknown];
var call13 = selfRequest(var_$dialect, "Object", [0]);
func8.returnType = call13;
this.methods["for(1)waiting(1)do(1)"] = func8;
func8.methodName = "for(1)waiting(1)do(1)";
func8.paramCounts = [1, 1, 1];
func8.paramNames = ["iterable", "delay", "block"];
func8.definitionLine = 193;
func8.definitionModule = "dom";
var func14 = function(argcv, var_cond, var_delay, var_block) { // method while(_)waiting(_)do(_), line 215
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 3) && (numArgs !== 3)) {
raiseTypeArgError("while(_)waiting(_)do(_)", 0, numArgs - 3);
}
setLineNumber(216); // compilenode call
var result = GraceDone; // start native code from line 216
var result = Grace_allocObject(GraceObject, "dom.while(1)waiting(1)do(1)");
result.methods["then(1)"] = function(argcv, block) {
this.data.then = block;
};
const func = function() {
minigrace.trapErrors(function() {
if (Grace_isTrue(callmethod(var_cond, "apply", [0]))) {
callmethod(var_block, "apply", [0]);
setTimeout(func, var_delay._value);
} else {
if (result.data.then)
callmethod(result.data.then, "apply", [0]);
}
});
};
func();
// end native code insertion
setLineNumber(215); // compilenode member
var call16 = selfRequest(var_$dialect, "Object", [0]);
setLineNumber(216); // typecheck
assertTypeOrMsg(result, call16, "result of method while(_)waiting(_)do(_)", "Object");
return result;
}; // end of method while(_)waiting(_)do(_)
setLineNumber(215); // compilenode member
var call17 = selfRequest(var_$dialect, "Object", [0]);
func14.returnType = call17;
this.methods["while(1)waiting(1)do(1)"] = func14;
func14.methodName = "while(1)waiting(1)do(1)";
func14.paramCounts = [1, 1, 1];
func14.paramNames = ["cond", "delay", "block"];
func14.definitionLine = 215;
func14.definitionModule = "dom";
var func18 = function(argcv, var_domObj, var_name) { // method doesObject(_)haveProperty(_), line 235
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 2) && (numArgs !== 2)) {
raiseTypeArgError("doesObject(_)haveProperty(_)", 0, numArgs - 2);
}
setLineNumber(236); // compilenode call
var result = GraceDone; // start native code from line 236
return var_name._value in unwrapDOMObject(var_domObj) ? GraceTrue : GraceFalse;
// end native code insertion
setLineNumber(235); // compilenode member
var call20 = selfRequest(var_$dialect, "Boolean", [0]);
setLineNumber(236); // typecheck
assertTypeOrMsg(result, call20, "result of method doesObject(_)haveProperty(_)", "Boolean");
return result;
}; // end of method doesObject(_)haveProperty(_)
setLineNumber(235); // compilenode member
var call21 = selfRequest(var_$dialect, "Boolean", [0]);
func18.returnType = call21;
this.methods["doesObject(1)haveProperty(1)"] = func18;
func18.methodName = "doesObject(1)haveProperty(1)";
func18.paramCounts = [1, 1];
func18.paramNames = ["domObj", "name"];
func18.definitionLine = 235;
func18.definitionModule = "dom";
var func22 = function(argcv, var_ctx, var_g) { // method framedRect(_,_), line 240
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 2) && (numArgs !== 2)) {
raiseTypeArgError("framedRect(_,_)", 0, numArgs - 2);
}
setLineNumber(241); // compilenode call
var result = GraceDone; // start native code from line 241
var_ctx = var_ctx._wrappedDOMObject;
var_g = var_g.data;
var_ctx.save();
var_ctx.strokeStyle = color(var_g);
run(var_ctx, "strokeRect", var_g);
var_ctx.restore();
// end native code insertion
return result;
}; // end of method framedRect(_,_)
setLineNumber(240); // compilenode member
var call24 = selfRequest(var_$dialect, "Done", [0]);
func22.returnType = call24;
this.methods["framedRect(2)"] = func22;
func22.methodName = "framedRect(2)";
func22.paramCounts = [2];
func22.paramNames = ["ctx", "g"];
func22.definitionLine = 240;
func22.definitionModule = "dom";
var func25 = function(argcv, var_ctx, var_g) { // method filledRect(_,_), line 250
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 2) && (numArgs !== 2)) {
raiseTypeArgError("filledRect(_,_)", 0, numArgs - 2);
}
setLineNumber(251); // compilenode call
var result = GraceDone; // start native code from line 251
var_ctx = var_ctx._wrappedDOMObject;
var_g = var_g.data;
var_ctx.save();
var_ctx.fillStyle = color(var_g);
run(var_ctx, "fillRect", var_g);
var_ctx.restore();
// end native code insertion
return result;
}; // end of method filledRect(_,_)
setLineNumber(250); // compilenode member
var call27 = selfRequest(var_$dialect, "Done", [0]);
func25.returnType = call27;
this.methods["filledRect(2)"] = func25;
func25.methodName = "filledRect(2)";
func25.paramCounts = [2];
func25.paramNames = ["ctx", "g"];
func25.definitionLine = 250;
func25.definitionModule = "dom";
var func28 = function(argcv, var_ctx, var_g) { // method framedOval(_,_), line 260
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 2) && (numArgs !== 2)) {
raiseTypeArgError("framedOval(_,_)", 0, numArgs - 2);
}
setLineNumber(261); // compilenode call
var result = GraceDone; // start native code from line 261
var_ctx = var_ctx._wrappedDOMObject;
var_g = var_g.data;
var_ctx.beginPath();
var_ctx.save();
arc(var_ctx, var_g);
var_ctx.restore();
var_ctx.save();
var_ctx.strokeStyle = color(var_g);
var_ctx.stroke();
var_ctx.restore();
var_ctx.closePath();
// end native code insertion
return result;
}; // end of method framedOval(_,_)
setLineNumber(260); // compilenode member
var call30 = selfRequest(var_$dialect, "Done", [0]);
func28.returnType = call30;
this.methods["framedOval(2)"] = func28;
func28.methodName = "framedOval(2)";
func28.paramCounts = [2];
func28.paramNames = ["ctx", "g"];
func28.definitionLine = 260;
func28.definitionModule = "dom";
var func31 = function(argcv, var_ctx, var_g) { // method filledOval(_,_), line 275
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 2) && (numArgs !== 2)) {
raiseTypeArgError("filledOval(_,_)", 0, numArgs - 2);
}
setLineNumber(276); // compilenode call
var result = GraceDone; // start native code from line 276
var_ctx = var_ctx._wrappedDOMObject;
var_g = var_g.data;
var_ctx.beginPath();
var_ctx.save();
arc(var_ctx, var_g);
var_ctx.restore();
var_ctx.save();
var_ctx.fillStyle = color(var_g);
var_ctx.fill();
var_ctx.restore();
var_ctx.closePath();
// end native code insertion
return result;
}; // end of method filledOval(_,_)
setLineNumber(275); // compilenode member
var call33 = selfRequest(var_$dialect, "Done", [0]);
func31.returnType = call33;
this.methods["filledOval(2)"] = func31;
func31.methodName = "filledOval(2)";
func31.paramCounts = [2];
func31.paramNames = ["ctx", "g"];
func31.definitionLine = 275;
func31.definitionModule = "dom";
var func34 = function(argcv, var_ctx, var_g) { // method image(_,_), line 290
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 2) && (numArgs !== 2)) {
raiseTypeArgError("image(_,_)", 0, numArgs - 2);
}
setLineNumber(291); // compilenode call
var result = GraceDone; // start native code from line 291
var_ctx = var_ctx._wrappedDOMObject;
var_g = var_g.data;
var_ctx.drawImage(var_g.theImage, var_g.x._value, var_g.y._value, var_g.theWidth._value, var_g.theHeight._value);
// end native code insertion
return result;
}; // end of method image(_,_)
setLineNumber(290); // compilenode member
var call36 = selfRequest(var_$dialect, "Done", [0]);
func34.returnType = call36;
this.methods["image(2)"] = func34;
func34.methodName = "image(2)";
func34.paramCounts = [2];
func34.paramNames = ["ctx", "g"];
func34.definitionLine = 290;
func34.definitionModule = "dom";
var func37 = function(argcv, var_ctx, var_graphics, var_width, var_height) { // method draw(_,_,_,_), line 297
var returnTarget = invocationCount;
invocationCount++;
const numArgs = arguments.length - 1;
if ((numArgs > 4) && (numArgs !== 4)) {
raiseTypeArgError("draw(_,_,_,_)", 0, numArgs - 4);
}
setLineNumber(298); // compilenode call
var result = GraceDone; // start native code from line 298
var_ctx._wrappedDOMObject.clearRect(0, 0, var_width._value, var_height._value);
const list = var_graphics._value;
for (var i = 0, l = list.length; i < l; i++) {
const graphic = list[i];
if (Grace_isTrue(graphic.data.isVisible)) {
graphic.methods["draw(1)"].call(graphic, [1], var_ctx);
}
}
// end native code insertion
return result;
}; // end of method draw(_,_,_,_)
setLineNumber(297); // compilenode member
var call39 = selfRequest(var_$dialect, "Done", [0]);
func37.returnType = call39;
this.methods["draw(4)"] = func37;
func37.methodName = "draw(4)";
func37.paramCounts = [4];
func37.paramNames = ["ctx", "graphics", "width", "height"];
func37.definitionLine = 297;
func37.definitionModule = "dom";
setLineNumber(2); // compilenode call
var result = GraceDone; // start native code from line 2
function unwrapDOMObject(obj) {
if (obj.hasOwnProperty("_wrappedDOMObject")) {
return obj._wrappedDOMObject;
}
return obj;
}
function wrapDOMFunction(obj, fn) {
return function(argcv) {
var args = [];
var numArgs = argcv.sum();
for (var i=1; i <= numArgs; i++)
args.push(wrapGraceObject(arguments[i]));
return wrapDOMObject(obj[fn].apply(obj, args));
};
}
function wrapDOMField(o, obj, k) {
o.methods[k + ":=(1)"] = function(argcv, val) {
obj[k] = wrapGraceObject(val);
return GraceDone;
};
return function() {
return wrapDOMObject(obj[k]);
};
}
function wrapDOMObject(obj) {
switch(typeof obj) {
case "boolean":
return new GraceBoolean(obj);
case "string":
return new GraceString(obj);
case "number":
return new GraceNum(obj);
case "undefined":
return var_noObject;
default:
break;
}
if (obj === null) {
return var_noObject;
}
if (obj._graceWrapper)
return obj._graceWrapper;
var o = Grace_allocObject(GraceObject, "wrappedDomObject");
o._wrappedDOMObject = obj;
o.methods.asString = function() {
return new GraceString("DOMObject(" + obj + ")");
};
o.methods["==(1)"] = function(argcv, other) {
return (this === other) ? GraceTrue : GraceFalse;
};
o.methods["≠(1)"] = function(argcv, other) {
return (this !== other) ? GraceTrue : GraceFalse;
};
o.methods.hash = publicVersion(object_identityHash, 'hash');
for (var k in obj) {
switch(typeof obj[k]) {
case "function":
var wrappedFun = wrapDOMFunction(obj, k);
if (k === "drawImage") {
o.methods[k + "(3)"] = wrappedFun;
o.methods[k + "(5)"] = wrappedFun;
o.methods[k + "(9)"] = wrappedFun;
} else if (k === "arc") {
o.methods[k + "(5)"] = wrappedFun;
o.methods[k + "(6)"] = wrappedFun;
} else {
o.methods[k] = wrappedFun;
o.methods[k + "(1)"] = wrappedFun;
o.methods[k + "(2)"] = wrappedFun;
o.methods[k + "(3)"] = wrappedFun;
o.methods[k + "(4)"] = wrappedFun;
// we don't know how many arguments this method takes
}
break;
case "string":
case "boolean":
case "number":
case "object":
o.methods[k] = wrapDOMField(o, obj, k);
break;
case "undefined":
o.methods[k] = null;
break;
default:
throw new GraceExceptionPacket(ExceptionObject,
new GraceString("JavaScript value " + obj[k] + " has unknown type"));
}
}
o.methods._methods = function() {
var l = [];
for (var m in o.methods) {
l.push(new GraceString(m));
}
return new GraceList(l);
};
try {
obj._graceWrapper = o;
} catch(e) {}
return o;
}
function wrapGraceObject(o) {
if (o === undefined || o === null) {
return var_noObject;
}
if (o instanceof GraceString) {
return o._value;
}
if (o instanceof GraceNum) {
return o._value;
}
if (o instanceof GraceBoolean) {
return o._value;
}
if (o.real) { // A block
if (o._wrappedDOMObject)
return o._wrappedDOMObject;
var f = function() {
var args = [];
for (var i=0; i<arguments.length; i++) {
args.push(wrapDOMObject(arguments[i]));
}
var ret;
minigrace.trapErrors(function() {
ret = wrapGraceObject(o.real.apply(o.receiver, args));
});
return ret;
};
o._wrappedDOMObject = f;
}
if (o._wrappedDOMObject)
return o._wrappedDOMObject;
return o;
}
function arc(ctx, g) {
var p = g.location.data;
var w = g.theWidth._value;
var h = g.theHeight._value;
ctx.translate(p.x._value + w, p.y._value + h);
ctx.scale(w / 2, h / 2);
ctx.arc(0, 0, 1, 0, 2 * Math.PI);
}
function run(ctx, name, g) {
var p = g.location.data;
ctx[name](p.x._value, p.y._value, g.theWidth._value, g.theHeight._value);
}
// end native code insertion
setLineNumber(158); // compilenode string
var string42 = new GraceString("noObject");
var call41 = selfRequest(var_$dialect, "singleton(1)", [1], string42);
var var_noObject = call41;
var reader43_noObject = function() { // reader method noObject
if (var_noObject === undefined) raiseUninitializedVariable("noObject");
return var_noObject;
};
reader43_noObject.isDef = true;
this.methods["noObject"] = reader43_noObject;
setLineNumber(160); // compilenode call
var result = GraceDone; // start native code from line 160
if (typeof window !== "undefined") {
if (!window.var_domNoObject) {
window.var_domNoObject = var_noObject;
} else {
var_noObject = window.var_domNoObject;
}
}
// end native code insertion
return this;
}
if (typeof global !== "undefined")
global.gracecode_dom = gracecode_dom;
if (typeof window !== "undefined")
window.gracecode_dom = gracecode_dom;
gracecode_dom.definitionModule = "dom";
gracecode_dom.sourceFile = gracecode_dom_sourceFile;
gracecode_dom.sha256 = gracecode_dom_sha256;
gracecode_dom.minigraceRevision = gracecode_dom_minigraceRevision;
gracecode_dom.minigraceGeneration = gracecode_dom_minigraceGeneration;
gracecode_dom.imports = [ ["standard", "5016aa3a5b2e0d35a67289d21c1e41cf8d73bef931ceea7b35f6a8b10a1386cf"] ];
gracecode_dom.definitionLine = 1;