diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2021-05-03 01:30:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-02 19:30:03 -0400 |
commit | ea917384feb1c800438d13dddac9ee977d2c47fe (patch) | |
tree | e3d5069ac4f96713c98519853cfe25e93c32f883 /core | |
parent | c9ac851b9005e5a1e90016e52b3a10dd1f1012b7 (diff) |
refactor(core): convert core.print() to a builtin op (#10436)
Diffstat (limited to 'core')
-rw-r--r-- | core/bindings.rs | 40 | ||||
-rw-r--r-- | core/core.js | 5 | ||||
-rw-r--r-- | core/lib.rs | 1 | ||||
-rw-r--r-- | core/ops_builtin.rs | 19 |
4 files changed, 25 insertions, 40 deletions
diff --git a/core/bindings.rs b/core/bindings.rs index ea45daff4..8a32bc5da 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -13,7 +13,6 @@ use serde::Serialize; use serde_v8::to_v8; use std::convert::TryFrom; use std::convert::TryInto; -use std::io::{stdout, Write}; use std::option::Option; use url::Url; use v8::MapFnTo; @@ -22,9 +21,6 @@ lazy_static::lazy_static! { pub static ref EXTERNAL_REFERENCES: v8::ExternalReferences = v8::ExternalReferences::new(&[ v8::ExternalReference { - function: print.map_fn_to() - }, - v8::ExternalReference { function: opcall.map_fn_to() }, v8::ExternalReference { @@ -117,7 +113,6 @@ pub fn initialize_context<'s>( deno_val.set(scope, core_key.into(), core_val.into()); // Bind functions to Deno.core.* - set_func(scope, core_val, "print", print); set_func(scope, core_val, "opcall", opcall); set_func( scope, @@ -268,41 +263,6 @@ pub extern "C" fn promise_reject_callback(message: v8::PromiseRejectMessage) { }; } -fn print( - scope: &mut v8::HandleScope, - args: v8::FunctionCallbackArguments, - _rv: v8::ReturnValue, -) { - let arg_len = args.length(); - if !(0..=2).contains(&arg_len) { - return throw_type_error(scope, "Expected a maximum of 2 arguments."); - } - - let obj = args.get(0); - let is_err_arg = args.get(1); - - let mut is_err = false; - if arg_len == 2 { - let int_val = match is_err_arg.integer_value(scope) { - Some(v) => v, - None => return throw_type_error(scope, "Invalid argument. Argument 2 should indicate whether or not to print to stderr."), - }; - is_err = int_val != 0; - }; - let tc_scope = &mut v8::TryCatch::new(scope); - let str_ = match obj.to_string(tc_scope) { - Some(s) => s, - None => v8::String::new(tc_scope, "").unwrap(), - }; - if is_err { - eprint!("{}", str_.to_rust_string_lossy(tc_scope)); - stdout().flush().unwrap(); - } else { - print!("{}", str_.to_rust_string_lossy(tc_scope)); - stdout().flush().unwrap(); - } -} - fn opcall<'s>( scope: &mut v8::HandleScope<'s>, args: v8::FunctionCallbackArguments, diff --git a/core/core.js b/core/core.js index e5998fbc8..729ca4faa 100644 --- a/core/core.js +++ b/core/core.js @@ -124,6 +124,10 @@ opSync("op_close", rid); } + function print(str, isErr = false) { + opSync("op_print", [str, isErr]); + } + // Provide bootstrap namespace window.__bootstrap = {}; // Extra Deno.core.* exports @@ -132,6 +136,7 @@ opSync, ops, close, + print, resources, registerErrorClass, handleAsyncMsgFromRust, diff --git a/core/lib.rs b/core/lib.rs index adfd9a6a2..4e7345c40 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -65,6 +65,7 @@ pub use crate::ops::OpState; pub use crate::ops::OpTable; pub use crate::ops::PromiseId; pub use crate::ops_builtin::op_close; +pub use crate::ops_builtin::op_print; pub use crate::ops_builtin::op_resources; pub use crate::ops_json::op_async; pub use crate::ops_json::op_sync; diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs index 96aca5c53..546d9cf32 100644 --- a/core/ops_builtin.rs +++ b/core/ops_builtin.rs @@ -7,6 +7,7 @@ use crate::resources::ResourceId; use crate::Extension; use crate::OpState; use crate::ZeroCopyBuf; +use std::io::{stdout, Write}; pub(crate) fn init_builtins() -> Extension { Extension::builder() @@ -17,6 +18,7 @@ pub(crate) fn init_builtins() -> Extension { )) .ops(vec![ ("op_close", op_sync(op_close)), + ("op_print", op_sync(op_print)), ("op_resources", op_sync(op_resources)), ]) .build() @@ -52,3 +54,20 @@ pub fn op_close( Ok(()) } + +/// Builtin utility to print to stdout/stderr +pub fn op_print( + _state: &mut OpState, + args: (String, bool), + _zero_copy: Option<ZeroCopyBuf>, +) -> Result<(), AnyError> { + let (msg, is_err) = args; + if is_err { + eprint!("{}", msg); + stdout().flush().unwrap(); + } else { + print!("{}", msg); + stdout().flush().unwrap(); + } + Ok(()) +} |