From 693b2b0f5d809570d684fc2a93c9f25ac7f6467d Mon Sep 17 00:00:00 2001 From: Andrea Ferretti Date: Wed, 21 Sep 2016 17:35:45 +0200 Subject: Added js console object --- lib/js/jsconsole.nim | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 lib/js/jsconsole.nim (limited to 'lib/js/jsconsole.nim') diff --git a/lib/js/jsconsole.nim b/lib/js/jsconsole.nim new file mode 100644 index 000000000..7bdc8922e --- /dev/null +++ b/lib/js/jsconsole.nim @@ -0,0 +1,32 @@ +# +# +# Nim's Runtime Library +# (c) Copyright 2012 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## Wrapper for the `console` object for the `JavaScript backend +## `_. + +when not defined(js) and not defined(Nimdoc): + {.error: "This module only works on the JavaScript platform".} + +type Console* {.importc.} = ref object of RootObj + +{.push importcpp .} + +proc log*[A](console: Console, a: A) +proc debug*[A](console: Console, a: A) +proc info*[A](console: Console, a: A) +proc error*[A](console: Console, a: A) + +{.pop.} + +proc log*(console: Console, a: string) = console.log(cstring(a)) +proc debug*(console: Console, a: string) = console.log(cstring(a)) +proc info*(console: Console, a: string) = console.log(cstring(a)) +proc error*(console: Console, a: string) = console.log(cstring(a)) + +var console* {.importc, nodecl.}: Console \ No newline at end of file -- cgit 1.4.1-2-gfad0 From 25ee55adfc94f3a71a4764f7e8ee86b2a97bccf9 Mon Sep 17 00:00:00 2001 From: Andrea Ferretti Date: Thu, 22 Sep 2016 11:39:24 +0200 Subject: Update to allow varargs in js console logging --- lib/js/jsconsole.nim | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'lib/js/jsconsole.nim') diff --git a/lib/js/jsconsole.nim b/lib/js/jsconsole.nim index 7bdc8922e..2e3eda8b8 100644 --- a/lib/js/jsconsole.nim +++ b/lib/js/jsconsole.nim @@ -15,6 +15,14 @@ when not defined(js) and not defined(Nimdoc): type Console* {.importc.} = ref object of RootObj +proc convertToConsoleLoggable*[T](v: T): RootRef {.importcpp: "#".} +template convertToConsoleLoggable*(v: string): RootRef = cast[RootRef](cstring(v)) + +proc log*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.log(#)".} +proc debug*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.debug(#)".} +proc info*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.info(#)".} +proc error*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.error(#)".} + {.push importcpp .} proc log*[A](console: Console, a: A) @@ -23,7 +31,6 @@ proc info*[A](console: Console, a: A) proc error*[A](console: Console, a: A) {.pop.} - proc log*(console: Console, a: string) = console.log(cstring(a)) proc debug*(console: Console, a: string) = console.log(cstring(a)) proc info*(console: Console, a: string) = console.log(cstring(a)) -- cgit 1.4.1-2-gfad0 From 4c52239394897637ca41441497472d3f3f771f9e Mon Sep 17 00:00:00 2001 From: Andrea Ferretti Date: Thu, 6 Oct 2016 10:54:52 +0200 Subject: Updated js console logging to avoid wrapping into array --- lib/js/jsconsole.nim | 21 ++++----------------- tests/js/tconsole.nim | 8 ++++++-- 2 files changed, 10 insertions(+), 19 deletions(-) (limited to 'lib/js/jsconsole.nim') diff --git a/lib/js/jsconsole.nim b/lib/js/jsconsole.nim index 2e3eda8b8..cd1bd8d2a 100644 --- a/lib/js/jsconsole.nim +++ b/lib/js/jsconsole.nim @@ -18,22 +18,9 @@ type Console* {.importc.} = ref object of RootObj proc convertToConsoleLoggable*[T](v: T): RootRef {.importcpp: "#".} template convertToConsoleLoggable*(v: string): RootRef = cast[RootRef](cstring(v)) -proc log*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.log(#)".} -proc debug*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.debug(#)".} -proc info*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.info(#)".} -proc error*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.error(#)".} - -{.push importcpp .} - -proc log*[A](console: Console, a: A) -proc debug*[A](console: Console, a: A) -proc info*[A](console: Console, a: A) -proc error*[A](console: Console, a: A) - -{.pop.} -proc log*(console: Console, a: string) = console.log(cstring(a)) -proc debug*(console: Console, a: string) = console.log(cstring(a)) -proc info*(console: Console, a: string) = console.log(cstring(a)) -proc error*(console: Console, a: string) = console.log(cstring(a)) +proc log*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.log.apply(null, #)".} +proc debug*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.debug.apply(null, #)".} +proc info*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.info.apply(null, #)".} +proc error*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.error.apply(null, #)".} var console* {.importc, nodecl.}: Console \ No newline at end of file diff --git a/tests/js/tconsole.nim b/tests/js/tconsole.nim index 1898bfd5e..f6da71c20 100644 --- a/tests/js/tconsole.nim +++ b/tests/js/tconsole.nim @@ -1,9 +1,13 @@ discard """ - output: "Hello, console" + output: '''Hello, console +1 2 3 +1 'hi' 1.1''' """ # This file tests the JavaScript console import jsconsole -console.log("Hello, console") \ No newline at end of file +console.log("Hello, console") +console.log(1, 2, 3) +console.log(1, "hi", 1.1) \ No newline at end of file -- cgit 1.4.1-2-gfad0 From f0308e9bcf79990be85edc16592d0bfbdfc338bd Mon Sep 17 00:00:00 2001 From: Andrea Ferretti Date: Thu, 6 Oct 2016 11:35:29 +0200 Subject: New version of js console using macros - avoid the use of .apply method --- lib/js/jsconsole.nim | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'lib/js/jsconsole.nim') diff --git a/lib/js/jsconsole.nim b/lib/js/jsconsole.nim index cd1bd8d2a..d9ced95f0 100644 --- a/lib/js/jsconsole.nim +++ b/lib/js/jsconsole.nim @@ -13,14 +13,32 @@ when not defined(js) and not defined(Nimdoc): {.error: "This module only works on the JavaScript platform".} +import macros + type Console* {.importc.} = ref object of RootObj proc convertToConsoleLoggable*[T](v: T): RootRef {.importcpp: "#".} template convertToConsoleLoggable*(v: string): RootRef = cast[RootRef](cstring(v)) -proc log*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.log.apply(null, #)".} -proc debug*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.debug.apply(null, #)".} -proc info*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.info.apply(null, #)".} -proc error*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]) {.importcpp: "#.error.apply(null, #)".} +proc logImpl(console: Console) {.importcpp: "log", varargs.} +proc debugImpl(console: Console) {.importcpp: "debug", varargs.} +proc infoImpl(console: Console) {.importcpp: "info", varargs.} +proc errorImpl(console: Console) {.importcpp: "error", varargs.} + +proc makeConsoleCall(console: NimNode, procName: NimNode, args: NimNode): NimNode = + result = newCall(procName, console) + for c in args: result.add(c) + +macro log*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]): untyped = + makeConsoleCall(console, bindSym "logImpl", args) + +macro debug*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]): untyped = + makeConsoleCall(console, bindSym "debugImpl", args) + +macro info*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]): untyped = + makeConsoleCall(console, bindSym "infoImpl", args) + +macro error*(console: Console, args: varargs[RootRef, convertToConsoleLoggable]): untyped = + makeConsoleCall(console, bindSym "errorImpl", args) var console* {.importc, nodecl.}: Console \ No newline at end of file -- cgit 1.4.1-2-gfad0