diff --git a/index.dart.js b/index.dart.js index 7a518c0..f2de514 100644 --- a/index.dart.js +++ b/index.dart.js @@ -834,10 +834,10 @@ return new H.c7(a, b, c, d.k("c7<0>")) }, cU() { - return new P.bg("No element") + return new P.set_error_test("No element") }, lg() { - return new P.bg("Too many elements") + return new P.set_error_test("Too many elements") }, d0: function d0(a) { this.a = a @@ -1152,7 +1152,7 @@ bz(a) { throw H.b(P.V(a)) }, - ah(a) { + TypeErrorDecoder_extract_attern(a) { var s, r, q, p, o, n a = H.jY(a.replace(String({}), "$receiver$")) s = a.match(/\\\$[a-zA-Z]+\\\$/g) @@ -1164,7 +1164,7 @@ n = s.indexOf("\\$receiver\\$") return new H.fc(a.replace(new RegExp("\\\\\\$arguments\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$", "g"), "((?:x|[^x])*)"), r, q, p, o, n) }, - fd(a) { + TypeErrorDecoder_provoke_call_error_on(a) { return function ($expr$) { var $argumentsExpr$ = "$arguments$" try { @@ -1174,7 +1174,7 @@ } }(a) }, - ji(a) { + TypeErrorDecoder_provoke_property_error_on(a) { return function ($expr$) { try { $expr$.$method$ @@ -1183,22 +1183,22 @@ } }(a) }, - hO(a, b) { - var s = b == null, - r = s ? null : b.method - return new H.d_(a, r, s ? null : b.receiver) + JsNoSuchMethodError(message, match) { + var t1 = match == null, + t2 = t1 ? null : match.method + return new H.d_(message, t2, t1 ? null : match.receiver) }, - x(a) { + unwrap_Exception(a) { if (a == null) return new H.eY(a) - if (a instanceof H.bI) return H.aC(a, a.a) + if (a instanceof H.bI) return H.save_stack_trace(a, a.a) if (typeof a !== "object") return a - if ("dartException" in a) return H.aC(a, a.dartException) + if ("dartException" in a) return H.save_stack_trace(a, a.dartException) return H.n_(a) }, - aC(a, b) { - if (t.R.b(b)) - if (b.$thrownJsError == null) b.$thrownJsError = a - return b + save_stack_trace(ex, error) { + if (t.R.b(error)) + if (error.$thrownJsError == null) error.$thrownJsError = ex + return error }, n_(a) { var s, r, q, p, o, n, m, l, k, j, i, h, g, f, e = null @@ -1209,11 +1209,11 @@ q = r & 65535 if ((C.a.O(r, 16) & 8191) === 10) switch (q) { case 438: - return H.aC(a, H.hO(H.d(s) + " (Error " + q + ")", e)) + return H.save_stack_trace(a, H.JsNoSuchMethodError(H.d(s) + " (Error " + q + ")", e)) case 445: case 5007: p = H.d(s) + " (Error " + q + ")" - return H.aC(a, new H.c2(p, e)) + return H.save_stack_trace(a, new H.c2(p, e)) } } if (a instanceof TypeError) { @@ -1228,12 +1228,12 @@ h = $.kw() g = $.kv() f = o.V(s) - if (f != null) return H.aC(a, H.hO(s, f)) + if (f != null) return H.save_stack_trace(a, H.JsNoSuchMethodError(s, f)) else { f = n.V(s) if (f != null) { f.method = "call" - return H.aC(a, H.hO(s, f)) + return H.save_stack_trace(a, H.JsNoSuchMethodError(s, f)) } else { f = m.V(s) if (f == null) { @@ -1258,10 +1258,10 @@ } else p = !0 } else p = !0 } else p = !0 - if (p) return H.aC(a, new H.c2(s, f == null ? e : f.method)) + if (p) return H.save_stack_trace(a, new H.c2(s, f == null ? e : f.method)) } } - return H.aC(a, new H.dB(typeof s == "string" ? s : "")) + return H.save_stack_trace(a, new H.dB(typeof s == "string" ? s : "")) } if (a instanceof RangeError) { if (typeof s == "string" && s.indexOf("call stack") !== -1) return new P.c5() @@ -1271,7 +1271,7 @@ } catch (d) { } return null }(a) - return H.aC(a, new P.a_(!1, e, e, typeof s == "string" ? s.replace(/^RangeError:\s*/, "") : s)) + return H.save_stack_trace(a, new P.a_(!1, e, e, typeof s == "string" ? s.replace(/^RangeError:\s*/, "") : s)) } if (typeof InternalError == "function" && a instanceof InternalError) if (typeof s == "string" && s === "too much recursion") return new P.c5() @@ -2188,18 +2188,18 @@ mC(a) { var s, r, q, p = this, o = t.K - if (p === o) return H.bv(p, a, H.mH) + if (p === o) return H.bv(p, a, H.is_object) if (!H.an(p)) if (!(p === t._)) o = p === o else o = !0 else o = !0 - if (o) return H.bv(p, a, H.mK) + if (o) return H.bv(p, a, H.is_top) o = p.y s = o === 6 ? p.z : p if (s === t.cp) r = H.aS else if (s === t.cb || s === t.cY) r = H.mG else if (s === t.N) r = H.mI - else r = s === t.y ? H.e8 : null + else r = s === t.y ? H.is_bool : null if (r != null) return H.bv(p, a, r) if (s.y === 9) { q = s.z @@ -2222,8 +2222,8 @@ else s = !0 else s = !0 if (s) r = H.ml - else if (q === t.K) r = H.mk - else r = H.my + else if (q === t.K) r = H.as_top + else r = H.general_Nullable_as_check_implementation q.a = r return q.a(a) }, @@ -2268,18 +2268,18 @@ var s = this if (a == null) return a else if (s.b(a)) return a - H.jA(a, s) + H.failed_as_check(a, s) }, - my(a) { + general_Nullable_as_check_implementation(object) { var s = this - if (a == null) return a - else if (s.b(a)) return a - H.jA(a, s) + if (object == null) return object + else if (s.b(object)) return object + H.failed_as_check(object, s) }, - jA(a, b) { - throw H.b(H.m5(H.jn(a, H.jQ(a, b), H.U(b, null)))) + failed_as_check(a, b) { + throw H.b(H.m5(H.Error_compose(a, H.jQ(a, b), H.U(b, null)))) }, - jn(a, b, c) { + Error_compose(a, b, c) { var s = P.b4(a), r = H.U(b == null ? H.Z(a) : b, null) return s + ": type '" + H.d(r) + "' is not a subtype of type '" + H.d(c) + "'" @@ -2288,27 +2288,29 @@ return new H.cq("TypeError: " + a) }, Q(a, b) { - return new H.cq("TypeError: " + H.jn(a, null, b)) + return new H.cq("TypeError: " + H.Error_compose(a, null, b)) }, - mH(a) { + is_object(a) { return a != null }, - mk(a) { + as_top(a) { return a }, - mK(a) { + is_top(a) { return !0 }, ml(a) { return a }, - e8(a) { + is_bool(a) { return !0 === a || !1 === a }, - oP(a) { - if (!0 === a) return !0 - if (!1 === a) return !1 - throw H.b(H.Q(a, "bool")) + as_bool(object) { + if (true === object) + return true; + if (false === object) + return false; + throw H.b(H.Q(object, "bool")) }, oR(a) { if (!0 === a) return !0 @@ -3634,7 +3636,7 @@ k = O.iW(s, q) if (typeof k == "string") r.c = k } catch (f) { - j = H.x(f) + j = H.unwrap_Exception(f) P.jW(j) } return r @@ -3940,7 +3942,7 @@ b.aM(0, a) }, mm(a, b) { - b.aN(H.x(a), H.am(a)) + b.aN(H.unwrap_Exception(a), H.am(a)) }, mp(a, b) { var s, r, q = new P.h6(b), @@ -4509,7 +4511,7 @@ try { s = JSON.parse(a) } catch (q) { - r = H.x(q) + r = H.unwrap_Exception(q) p = P.ab(String(r), null, null) throw H.b(p) } @@ -4549,7 +4551,7 @@ s = a.decode(b) return s } catch (r) { - H.x(r) + H.unwrap_Exception(r) } return null }, @@ -4900,7 +4902,7 @@ return new P.b3(1e6 * a) }, b4(a) { - if (typeof a == "number" || H.e8(a) || a == null) return J.aD(a) + if (typeof a == "number" || H.is_bool(a) || a == null) return J.aD(a) if (typeof a == "string") return JSON.stringify(a) return P.l6(a) }, @@ -4950,7 +4952,7 @@ return new P.dz(a) }, S(a) { - return new P.bg(a) + return new P.set_error_test(a) }, V(a) { return new P.cL(a) @@ -5071,7 +5073,7 @@ dz: function dz(a) { this.a = a }, - bg: function bg(a) { + set_error_test: function bg(a) { this.a = a }, cL: function cL(a) { @@ -5149,7 +5151,7 @@ return !0 } } catch (s) { - H.x(s) + H.unwrap_Exception(s) } return !1 }, @@ -5158,7 +5160,7 @@ return null }, i_(a) { - if (a == null || typeof a == "string" || typeof a == "number" || H.e8(a)) return a + if (a == null || typeof a == "string" || typeof a == "number" || H.is_bool(a)) return a if (a instanceof P.W) return a.a if (H.jR(a)) return a if (t.f.b(a)) return a @@ -5342,7 +5344,7 @@ s = J.aB(a) if (typeof s.gbJ(a) == "string") q = s.gbJ(a) } catch (r) { - H.x(r) + H.unwrap_Exception(r) } return q }, @@ -7121,7 +7123,7 @@ p = q return p } catch (s) { - if (t.b7.b(H.x(s))) { + if (t.b7.b(H.unwrap_Exception(s))) { if ((this.c & 1) !== 0) throw H.b(P.y("The error handler of Future.then must return a value of the returned future's type", "onError")) throw H.b(P.y("The error handler of Future.catchError must return a value of the future's type", "onError")) } else throw s @@ -7219,7 +7221,7 @@ try { a.aW(new P.fA(p), new P.fB(p), t.P) } catch (q) { - s = H.x(q) + s = H.unwrap_Exception(q) r = H.am(q) P.nC(new P.fC(p, s, r)) } @@ -7283,7 +7285,7 @@ try { p.ay(p.$ti.c.a(a)) } catch (q) { - s = H.x(q) + s = H.unwrap_Exception(q) r = H.am(q) p.af(s, r) } @@ -7328,7 +7330,7 @@ q = m.a.a l = q.b.b.bI(q.d) } catch (p) { - s = H.x(p) + s = H.unwrap_Exception(p) r = H.am(p) if (m.c) { q = m.b.a.c.a @@ -7373,7 +7375,7 @@ p = q.a q.c = p.b.b.aV(p.d, this.b) } catch (o) { - s = H.x(o) + s = H.unwrap_Exception(o) r = H.am(o) q = this.a q.c = P.eh(s, r) @@ -7393,7 +7395,7 @@ p.b = !1 } } catch (o) { - r = H.x(o) + r = H.unwrap_Exception(o) q = H.am(o) p = k.a.a.c n = p.a @@ -7446,7 +7448,7 @@ } P.jF(null, null, this, a) } catch (q) { - s = H.x(q) + s = H.unwrap_Exception(q) r = H.am(q) P.hc(s, r) } @@ -7460,7 +7462,7 @@ } P.jG(null, null, this, a, b) } catch (q) { - s = H.x(q) + s = H.unwrap_Exception(q) r = H.am(q) P.hc(s, r) } @@ -7891,7 +7893,7 @@ }) return s } catch (r) { - H.x(r) + H.unwrap_Exception(r) } return null }, @@ -7906,7 +7908,7 @@ }) return s } catch (r) { - H.x(r) + H.unwrap_Exception(r) } return null }, @@ -8364,7 +8366,7 @@ return s != null ? "UnimplementedError: " + s : "UnimplementedError" } } - P.bg.prototype = { + P.set_error_test.prototype = { j(a) { return "Bad state: " + this.a } @@ -9305,19 +9307,19 @@ }(a) n = s ? !0 : !(a.attributes instanceof NamedNodeMap) } catch (p) { - H.x(p) + H.unwrap_Exception(p) } r = "element unprintable" try { r = J.aD(a) } catch (p) { - H.x(p) + H.unwrap_Exception(p) } try { q = W.bH(a) this.cj(a, b, n, r, q, m, l) } catch (p) { - if (H.x(p) instanceof P.a_) throw p + if (H.unwrap_Exception(p) instanceof P.a_) throw p else { this.ai(a, b) window @@ -9402,7 +9404,7 @@ throw H.b(q) } } catch (o) { - H.x(o) + H.unwrap_Exception(o) q = s; ++n.b p = q.parentNode @@ -9440,7 +9442,7 @@ var s, r, q, p = this, o = {} if (a == null) return a - if (H.e8(a)) return a + if (H.is_bool(a)) return a if (typeof a == "number") return a if (typeof a == "string") return a if (a instanceof P.b2) return new Date(a.a) @@ -9514,7 +9516,7 @@ var s, r, q, p, o, n, m, l, k = this, j = {} if (a == null) return a - if (H.e8(a)) return a + if (H.is_bool(a)) return a if (typeof a == "number") return a if (typeof a == "string") return a if (a instanceof Date) return P.iR(a.getTime(), !0) @@ -9638,7 +9640,7 @@ s = String(this.a) return s } catch (r) { - H.x(r) + H.unwrap_Exception(r) s = this.bT(0) return s } @@ -9785,7 +9787,7 @@ return o } } catch (n) { - H.x(n) + H.unwrap_Exception(n) } return "" }, @@ -10019,7 +10021,7 @@ for (l = 0; l < r; ++l) if (o.u(m, l)) J.iD(n, l * q, m * q, q, q) } catch (f) { - H.x(f) + H.unwrap_Exception(f) k = H.am(f) j = e.a j = j.style @@ -10767,7 +10769,7 @@ q(J.as, [J.dh, J.av, J.ad]) r(J.eE, J.p) q(J.aJ, [J.bP, J.cX]) - q(P.n, [H.d0, H.dn, H.c1, P.a6, H.d_, H.dB, H.dp, H.dN, P.cD, P.de, P.a_, P.dc, P.dD, P.dz, P.bg, P.cL, P.cN]) + q(P.n, [H.d0, H.dn, H.c1, P.a6, H.d_, H.dB, H.dp, H.dN, P.cD, P.de, P.a_, P.dc, P.dD, P.dz, P.set_error_test, P.cL, P.cN]) r(P.bT, P.cg) q(P.bT, [H.bm, W.M]) r(H.ap, H.bm) @@ -11405,14 +11407,14 @@ return C.e.bI(new H.hx()) }) s($, "oy", "kn", function () { - return H.ah(H.fd({ + return H.TypeErrorDecoder_extract_attern(H.TypeErrorDecoder_provoke_call_error_on({ toString: function () { return "$receiver$" } })) }) s($, "oz", "ko", function () { - return H.ah(H.fd({ + return H.TypeErrorDecoder_extract_attern(H.TypeErrorDecoder_provoke_call_error_on({ $method$: null, toString: function () { return "$receiver$" @@ -11420,10 +11422,10 @@ })) }) s($, "oA", "kp", function () { - return H.ah(H.fd(null)) + return H.TypeErrorDecoder_extract_attern(H.TypeErrorDecoder_provoke_call_error_on(null)) }) s($, "oB", "kq", function () { - return H.ah(function () { + return H.TypeErrorDecoder_extract_attern(function () { var $argumentsExpr$ = "$arguments$" try { null.$method$($argumentsExpr$) @@ -11433,10 +11435,10 @@ }()) }) s($, "oE", "kt", function () { - return H.ah(H.fd(void 0)) + return H.TypeErrorDecoder_extract_attern(H.TypeErrorDecoder_provoke_call_error_on(void 0)) }) s($, "oF", "ku", function () { - return H.ah(function () { + return H.TypeErrorDecoder_extract_attern(function () { var $argumentsExpr$ = "$arguments$" try { (void 0).$method$($argumentsExpr$) @@ -11446,10 +11448,10 @@ }()) }) s($, "oD", "ks", function () { - return H.ah(H.ji(null)) + return H.TypeErrorDecoder_extract_attern(H.TypeErrorDecoder_provoke_property_error_on(null)) }) s($, "oC", "kr", function () { - return H.ah(function () { + return H.TypeErrorDecoder_extract_attern(function () { try { null.$method$ } catch (p) { @@ -11458,10 +11460,10 @@ }()) }) s($, "oH", "kw", function () { - return H.ah(H.ji(void 0)) + return H.TypeErrorDecoder_extract_attern(H.TypeErrorDecoder_provoke_property_error_on(void 0)) }) s($, "oG", "kv", function () { - return H.ah(function () { + return H.TypeErrorDecoder_extract_attern(function () { try { (void 0).$method$ } catch (p) { diff --git a/out.js b/out.js index 010787c..4938940 100644 --- a/out.js +++ b/out.js @@ -3019,10 +3019,13 @@ for (b = 12242424242424, i = 0; i < 10; ++i) b += b * i; A.Future_Future$delayed(new A.Duration(1000000), type$.dynamic).then$1$1(new A.main_closure(), type$.Null); + new A.main_closure0().call$0(); A.print(a); }, main_closure: function main_closure() { }, + main_closure0: function main_closure0() { + }, printString(string) { if (typeof dartPrint == "function") { dartPrint(string); @@ -3363,13 +3366,13 @@ call$0() { this.callback.call$0(); }, - $signature: 3 + $signature: 2 }; A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = { call$0() { this.callback.call$0(); }, - $signature: 3 + $signature: 2 }; A._TimerImpl.prototype = { _TimerImpl$2(milliseconds, callback) { @@ -3891,12 +3894,18 @@ }, $signature: 1 }; + A.main_closure0.prototype = { + call$0() { + A.print("closuer"); + }, + $signature: 2 + }; (function installTearOffs() { var _static_1 = hunkHelpers._static_1, _static_0 = hunkHelpers._static_0; - _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 2); - _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 2); - _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 2); + _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 3); + _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 3); + _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 3); _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0); })(); (function inheritance() { @@ -3914,7 +3923,7 @@ _inheritMany(A.Closure, [A.Closure0Args, A.Closure2Args, A.TearOffClosure, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._Future__chainForeignFuture_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A.main_closure]); _inheritMany(A.TearOffClosure, [A.StaticClosure, A.BoundClosure]); _inherit(A._TypeError, A._Error); - _inheritMany(A.Closure0Args, [A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A.Future_Future$delayed_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._rootHandleError_closure, A._RootZone_bindCallbackGuarded_closure]); + _inheritMany(A.Closure0Args, [A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A.Future_Future$delayed_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._rootHandleError_closure, A._RootZone_bindCallbackGuarded_closure, A.main_closure0]); _inherit(A._Future__chainForeignFuture_closure0, A.Closure2Args); _inherit(A._RootZone, A._Zone); _inheritMany(A.ArgumentError, [A.RangeError, A.IndexError]); @@ -3923,7 +3932,7 @@ typeUniverse: { eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: [] }, mangledGlobalNames: { int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List", Object: "Object", Map: "Map" }, mangledNames: {}, - types: ["~()", "Null(@)", "~(~())", "Null()", "Null(~())", "Null(Object,StackTrace)", "_Future<@>(@)"], + types: ["~()", "Null(@)", "Null()", "~(~())", "Null(~())", "Null(Object,StackTrace)", "_Future<@>(@)"], arrayRti: Symbol("$ti") }; A._Universe_addRules(init.typeUniverse, JSON.parse('{"PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"JSArray":{"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"Iterable":["1"]},"JSNumber":{"num":[]},"JSInt":{"int":[],"num":[],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"num":[],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"TrustedGetRuntimeType":[]},"LateError":{"Error":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Function":[]},"Closure2Args":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"_CyclicInitializationError":{"Error":[]},"RuntimeError":{"Error":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"_Future":{"Future":["1"]},"AsyncError":{"Error":[]},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"_StringStackTrace":{"StackTrace":[]}}')); @@ -4049,12 +4058,12 @@ Function.prototype.call$1$1 = function (a) { return this(a); }; - Function.prototype.call$1 = function (a) { - return this(a); - }; Function.prototype.call$0 = function () { return this(); }; + Function.prototype.call$1 = function (a) { + return this(a); + }; Function.prototype.call$2 = function (a, b) { return this(a, b); }; diff --git a/test.dart b/test.dart index 07c1988..2baaa09 100644 --- a/test.dart +++ b/test.dart @@ -1,5 +1,6 @@ // js -import 'dart:js' as js; +import 'dart:js' as Js; +import 'dart:html'; void main() { print("Hello, World!"); @@ -16,5 +17,10 @@ void main() { print("延时1秒执行 then "); print(value); }); + + var closuer = () { + print("closuer"); + }; + closuer(); print(a); } \ No newline at end of file