Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Should dart:core print() be user-redefinable? #3486

Closed
DartBot opened this issue Jun 10, 2012 · 19 comments
Closed

Should dart:core print() be user-redefinable? #3486

DartBot opened this issue Jun 10, 2012 · 19 comments
Assignees
Labels
area-core-library SDK core library issues (core, async, ...); use area-vm or area-web for platform specific libraries. library-core P1 A high priority bug; for example, a single project is unusable or has many test failures type-enhancement A request for a change that isn't a bug
Milestone

Comments

@DartBot
Copy link

DartBot commented Jun 10, 2012

This issue was originally filed by renggli...@gmail.com


What steps will reproduce the problem?

<!DOCTYPE html>
<html>
  <head>
    <title>Some Tests</title>
  </head>
  <body>
    <h1>Some Tests</h1>
    <pre id="log"></pre>
    <script type="text/javascript">
        if (console) {
            var log = console.log;
            var element = document.getElementById('log');
            console.log = function(text) {
                element.appendChild(document.createTextNode(text + '\n'));
                log.apply(this, arguments);
            }
        }
    </script>
    <script type="application/dart" src="SomeTests.dart"></script>
    <script src="http://dart.googlecode.com/svn/branches/bleeding_edge/dart/client/dart.js&quot;&gt;&lt;/script>
  </body>
</html>

What is the expected output? What do you see instead?

I can redefine console.log to see the console output as part of the HTML page. This works well when the Dart code is run as Javascript in the standard Chrome browser, but fails to have any effect when run with the Chromium browser with the built-in Dart VM.

What version of the product are you using? On what operating system?

Dart SDK version 8344
Chromium Version 21.0.1165.0 (140714)

@dgrove
Copy link
Contributor

dgrove commented Jun 11, 2012

Set owner to antonm@google.com.
Added Area-Dartium, Triaged labels.

@DartBot
Copy link
Author

DartBot commented Jun 18, 2012

This comment was originally written by antonm@google.com


I strongly doubt we should support something like that. What's your use case? Cannot you just use a level of indirection to achieve the goal?

Overall, I think it might be rather an issue with dart2js, Vijay, Stephen, any thoughts?


cc @rakudrama.
cc @vsmenon.
Added NeedsInfo label.

@DartBot
Copy link
Author

DartBot commented Jun 18, 2012

This comment was originally written by renggl...@gmail.com


The use case is to redirect the output of existing code calling "console.log" (or its Dart equivalent "print") somewhere else. Redefining console.log is a pretty standard technique in Javascript, so I expected this to work in Dart as well.

@vsmenon
Copy link
Member

vsmenon commented Jun 18, 2012

renggli: When you "redefine" console.log in JS, you're just putting a new function in JS scope, not redefining the underlying log. E.g., if you look carefully, you'll see the old native log is still there on the prototype:

console.log = function(s) { window.alert(s) }
function (s) { window.alert(s) }
console
Console
  log: function (s) { window.alert(s) }
  memory: MemoryInfo
  profiles: Array[0]
  proto: Console
    ..
    log: function log() { [native code] }
    ..
    proto: Object

Redefining in JS should have no effect on Dart code (which should not see your patch). Ideally, we'd make this true for Dart2JS as well, but there are limits to what we can do if you mix arbitrary JS with Dart2JS generated JS.

Currently Dart's print forwards to Dart's console.log in the browser. Would redefining print or the default stream print outputs to suffice?

@DartBot
Copy link
Author

DartBot commented Jun 18, 2012

This comment was originally written by renggli...@gmail.com


Ok, fair enough. Feel free to close the issue.

Not sure how to redefine print though?

@vsmenon
Copy link
Member

vsmenon commented Jun 18, 2012

Repurposing this bug.


Removed the owner.
Removed Type-Defect, Area-Dartium labels.
Added Type-Enhancement, Area-Library, Triaged labels.
Changed the title to: "Should dart:core print() be user-redefinable? ".

@DartBot
Copy link
Author

DartBot commented Jun 19, 2012

This comment was originally written by antonm@google.com


Lasse, any opinion on this? That technically should be rather trivial to do and Ivan was planning to introduce hooks to override similar methods.


cc @lrhn.
cc @iposva-google.

@lrhn
Copy link
Member

lrhn commented Jun 20, 2012

The print method in Dart is extremely low-level, and doesn't guarantee anything, so the only thing you can reasonably use it for is low-level logging/debugging, or perhaps, if on the command line, for actual output.

I can see some types of applications wanting to hook into that, to present these messages in a more accessible way. On the other hand, "print" is not a logging framework, and depending on it for any kind of communication between libraries, or code that are not written by the same people, is going to be awkward.

At best, other parts of the system should not be using "print" at all in production.
If you are including code that you didn't write, and which uses print, it's probably not very good code ... or it's code written for command line use where the output isn't properly abstracted. That's just not very good code for non-command line use. In the long run, or even the very short run, rewriting the code to have a proper output abstraction is much safer than hooking "print".

In your own code, by all means create your own "log" method that you can redirect wherever you want. You'll want that if the log is useful at all.

So, in summary, I can't really object (much) to adding hooks on print, because it should be harmless at best, useless at worst, but on the other hand, I see it as incredibly low priority.

@pavelgj
Copy link

pavelgj commented Apr 11, 2013

One of the use-cases that I have is tools. For instance I'm working on dart unittest adapter for karma test runner. In JS mode karma overrides console.log and sends it to the server console via a websocket. I need the same thing for karma-dart adapter, so I need to be able to tap into the print output stream.

I know about unittest.logMessage but it's not always convenient and obviously it doesn't work if test subject libraries choose to just use print for debugging.

@jmesserly
Copy link

Added C1 label.

@dgrove
Copy link
Contributor

dgrove commented Apr 24, 2013

Set owner to @floitschG.

@dgrove
Copy link
Contributor

dgrove commented Apr 27, 2013

Removed Priority-Medium label.
Added Priority-High label.

@peter-ahe-google
Copy link
Contributor

print is already user definable in dart2js. Just add a JavaScript function named "dartPrint". This is documented in the beginning of unminified output from dart2js:

// Generated by dart2js, the Dart to JavaScript compiler.
// The code supports the following hooks:
// dartPrint(message) - if this function is defined it is called
// instead of the Dart [print] method.
// dartMainRunner(main) - if this function is defined, the Dart [main]
// method will not be invoked directly.
// Instead, a closure that will invoke [main] is
// passed to [dartMainRunner].

I think Anton implemented the same in Dartium.

@pavelgj
Copy link

pavelgj commented May 2, 2013

dartPrint might be an acceptable solution for my use case, except:

  1. it does not work in dart2js when used from DartEditor as it overrides dartPrint.
  2. couldn't get it to work in Dartium

@pavelgj
Copy link

pavelgj commented May 2, 2013

BTW, I created a FR to support dartMainRunner in Dartium: https://code.google.com/p/dart/issues/detail?id=10390

@dgrove
Copy link
Contributor

dgrove commented May 21, 2013

Is dartPrint something that should be documented in the core libraries?

If it is, we also need it to be implemented in Dartium.

@floitschG
Copy link
Contributor

Groundwork is laid.
But will probably not make it into M5.


Added this to the M6 milestone.

@lrhn
Copy link
Member

lrhn commented Aug 27, 2013

Removed Priority-High label.
Added Priority-Medium label.

@lrhn
Copy link
Member

lrhn commented Aug 27, 2013

Removed Priority-Medium label.
Added Priority-High label.

@DartBot DartBot added Type-Enhancement P1 A high priority bug; for example, a single project is unusable or has many test failures area-core-library SDK core library issues (core, async, ...); use area-vm or area-web for platform specific libraries. library-core labels Aug 27, 2013
@DartBot DartBot added this to the M7 milestone Aug 27, 2013
@kevmoo kevmoo added type-enhancement A request for a change that isn't a bug and removed type-enhancement labels Mar 1, 2016
copybara-service bot pushed a commit that referenced this issue Sep 1, 2023
…li_util, clock, convert, crypto, csslib, dartdoc, ecosystem, ffi, fixnum, http, lints, logging, markdown, matcher, mime, native, path, pool, shelf, source_map_stack_trace, sse, stack_trace, stream_channel, string_scanner, term_glyph, test, test_descriptor, test_process, tools, typed_data, watcher, yaml, yaml_edit

Revisions updated by `dart tools/rev_sdk_deps.dart`.

async (https://github.com/dart-lang/async/compare/b65622a..75efa6c):
  75efa6c  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#250)

bazel_worker (https://github.com/dart-lang/bazel_worker/compare/c29d162..f950bbf):
  f950bbf  2023-08-31  Parker Lougheed  Regenerate worker protocol protos to add constructors and comments (#78)
  9b4c6a0  2023-08-30  Parker Lougheed  Update e2e_test dependencies (#79)

boolean_selector (https://github.com/dart-lang/boolean_selector/compare/303635d..f255921):
  f255921  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#50)

browser_launcher (https://github.com/dart-lang/browser_launcher/compare/27ec600..1f69393):
  1f69393  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#48)

cli_util (https://github.com/dart-lang/cli_util/compare/9b7ce78..44118e3):
  44118e3  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#88)

clock (https://github.com/dart-lang/clock/compare/263e508..1e75f08):
  1e75f08  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#55)

convert (https://github.com/dart-lang/convert/compare/79ee174..c058c8f):
  c058c8f  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#86)

crypto (https://github.com/dart-lang/crypto/compare/8b704c6..1e26879):
  1e26879  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#151)

csslib (https://github.com/dart-lang/csslib/compare/7e91228..bd30a1a):
  bd30a1a  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#188)

dartdoc (https://github.com/dart-lang/dartdoc/compare/5fda5eb..695b218):
  695b218c  2023-08-30  Sam Rawlins  Tidy Category: (#3488)
  b26af96f  2023-08-30  Sam Rawlins  Tidy up library exports (#3487)
  be35cb00  2023-08-29  Devon Carew  Update dependabot.yaml (#3486)
  649bb8d2  2023-08-29  Sam Rawlins  Migrate to create_api_docs.dart (#3482)

ecosystem (https://github.com/dart-lang/ecosystem/compare/f777da7..89e58de):
  89e58de  2023-09-01  Hossein Yousefi  also install flutter on validate (#160)
  f95d0f2  2023-09-01  Hossein Yousefi  Add use-flutter arg to validate (#159)
  8743a9d  2023-09-01  Moritz  Pass a parameter for Flutter `firehose` support (#158)
  54d1628  2023-08-31  Moritz  Setup Flutter in publish workflow (#157)
  8fa89c6  2023-08-31  Moritz  Add flutter support (#155)
  65817bf  2023-08-29  Moritz  Switch to Pub API (#152)

ffi (https://github.com/dart-lang/ffi/compare/e2c01a9..d36e05a):
  d36e05a  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#208)

fixnum (https://github.com/dart-lang/fixnum/compare/00fa120..87ed065):
  87ed065  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#114)

http (https://github.com/dart-lang/http/compare/cad7d60..7fb6fd6):
  7fb6fd6  2023-08-31  Brian Quinlan  Clarify how to set the body without a content type header (#1014)

lints (https://github.com/dart-lang/lints/compare/54cd7a0..da44af3):
  da44af3  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#144)

logging (https://github.com/dart-lang/logging/compare/5214987..bcaad0f):
  bcaad0f  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#147)

markdown (https://github.com/dart-lang/markdown/compare/56e75df..6cfd6f1):
  6cfd6f1  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#554)
  52be591  2023-08-30  Parker Lougheed  Fix a few more lints, no longer ignore line length (#552)

matcher (https://github.com/dart-lang/matcher/compare/ce8f409..80910d6):
  80910d6  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#227)

mime (https://github.com/dart-lang/mime/compare/799b398..37ef637):
  37ef637  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#104)

native (https://github.com/dart-lang/native/compare/5a1361b..a2dfedc):
  a2dfedc  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#117)
  8dfb0d2  2023-09-01  dependabot[bot]  Bump nttld/setup-ndk from 1.2.0 to 1.3.1 (#118)

path (https://github.com/dart-lang/path/compare/7c2324b..96d9183):
  96d9183  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#150)

pool (https://github.com/dart-lang/pool/compare/7700102..a5bee35):
  a5bee35  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#73)

shelf (https://github.com/dart-lang/shelf/compare/73edd2b..2926f76):
  2926f76  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#376)

source_map_stack_trace (https://github.com/dart-lang/source_map_stack_trace/compare/16e54fd..196d7bf):
  196d7bf  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#41)

sse (https://github.com/dart-lang/sse/compare/8cc5b11..eeb2588):
  eeb2588  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#87)
  2bb1a6e  2023-09-01  dependabot[bot]  Bump nanasess/setup-chromedriver from 2.1.1 to 2.2.0 (#88)

stack_trace (https://github.com/dart-lang/stack_trace/compare/4ddd86d..bcf2a0b):
  bcf2a0b  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#140)

stream_channel (https://github.com/dart-lang/stream_channel/compare/e54234f..0ce7ab6):
  0ce7ab6  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#94)

string_scanner (https://github.com/dart-lang/string_scanner/compare/413b57a..da9142c):
  da9142c  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#62)

term_glyph (https://github.com/dart-lang/term_glyph/compare/423700a..1b28285):
  1b28285  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#41)

test (https://github.com/dart-lang/test/compare/d0fc4bd..27dcae1):
  27dcae11  2023-09-01  dependabot[bot]  Bump github/codeql-action from 2.21.2 to 2.21.5 (#2086)
  cf0a0a73  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#2085)

test_descriptor (https://github.com/dart-lang/test_descriptor/compare/36d8617..030193d):
  030193d  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#55)

test_process (https://github.com/dart-lang/test_process/compare/b360784..2a6ee23):
  2a6ee23  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#47)

tools (https://github.com/dart-lang/tools/compare/b72fae8..2c8cbd6):
  2c8cbd6  2023-09-01  Jonas Finnemann Jensen  Extension discovery 2.0.0 (#156)
  3e12c2e  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#157)
  0f28f80  2023-08-28  Kenzie Davisson  Prepare extension_discovery for 1.0.1 release (#154)

typed_data (https://github.com/dart-lang/typed_data/compare/a20be90..80e8943):
  80e8943  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#72)

watcher (https://github.com/dart-lang/watcher/compare/7457413..1aed03e):
  1aed03e  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#149)

yaml (https://github.com/dart-lang/yaml/compare/7930148..ae00187):
  ae00187  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#150)

yaml_edit (https://github.com/dart-lang/yaml_edit/compare/87dcf31..4a9734d):
  4a9734d  2023-09-01  dependabot[bot]  Bump actions/checkout from 3.5.3 to 3.6.0 (#56)
  83f9033  2023-07-01  dependabot[bot]  Bump actions/checkout from 3.5.2 to 3.5.3 (#54)

Change-Id: Ie6b9d9ef138730b98e9df8cbb31c6cc330ada9f8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/323703
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Devon Carew <devoncarew@google.com>
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-core-library SDK core library issues (core, async, ...); use area-vm or area-web for platform specific libraries. library-core P1 A high priority bug; for example, a single project is unusable or has many test failures type-enhancement A request for a change that isn't a bug
Projects
None yet
Development

No branches or pull requests

9 participants