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

Original QuickJS Notes #1

Open
shiqimei opened this issue Jun 12, 2023 · 0 comments
Open

Original QuickJS Notes #1

shiqimei opened this issue Jun 12, 2023 · 0 comments

Comments

@shiqimei
Copy link
Contributor

TODO

Bugs: - modules: better error handling with cyclic module references

Misc ideas:

  • use custom printf to avoid compatibility issues with floating point numbers
  • consistent naming for preprocessor defines
  • unify coding style and naming conventions
  • use names from the ECMA spec in library implementation
  • use byte code emitters with typed arguments (for clarity)
  • use 2 bytecode DynBufs in JSFunctionDef, one for reading, one for writing
    and use the same wrappers in all phases
  • use more generic method for line numbers in resolve_variables and resolve_labels
  • use custom timezone support to avoid C library compatibility issues

Memory:

  • use memory pools for objects, etc?
  • test border cases for max number of atoms, object properties, string length
  • add emergency malloc mode for out of memory exceptions.
  • test all DynBuf memory errors
  • test all js_realloc memory errors
  • improve JS_ComputeMemoryUsage() with more info

Built-in standard library:

  • BSD sockets
  • modules: use realpath in module name normalizer and put it in quickjs-libc
  • modules: if no ".", use a well known module loading path ?
  • get rid of __loadScript, use more common name

REPL:

  • debugger
  • readline: support MS Windows terminal
  • readline: handle dynamic terminal resizing
  • readline: handle double width unicode characters
  • multiline editing
  • runtime object and function inspectors
  • interactive object browser
  • use more generic approach to display evaluation results
  • improve directive handling: dispatch, colorize, completion...
  • save history
  • close all predefined methods in repl.js and jscalc.js

Optimization ideas:

  • 64-bit atoms in 64-bit mode ?
  • 64-bit small bigint in 64-bit mode ?
  • reuse stack slots for disjoint scopes, if strip
  • add heuristic to avoid some cycles in closures
  • small String (0-2 charcodes) with immediate storage
  • perform static string concatenation at compile time
  • optimize string concatenation with ropes or miniropes?
  • add implicit numeric strings for Uint32 numbers?
  • optimize s += a + b, s += a.b and similar simple expressions
  • ensure string canonical representation and optimise comparisons and hashes?
  • remove JSObject.first_weak_ref, use bit+context based hashed array for weak references
  • property access optimization on the global object, functions,
    prototypes and special non extensible objects.
  • create object literals with the correct length by backpatching length argument
  • remove redundant set_loc_uninitialized/check_uninitialized opcodes
  • peephole optim: push_atom_value, to_propkey -> push_atom_value
  • peephole optim: put_loc x, get_loc_check x -> set_loc x
  • convert slow array to fast array when all properties != length are numeric
  • optimize destructuring assignments for global and local variables
  • implement some form of tail-call-optimization
  • optimize OP_apply
  • optimize f(...b)

Test262o: 0/11262 errors, 463 excluded
Test262o commit: 7da91bceb9ce7613f87db47ddd1292a2dda58b42 (es5-tests branch)

Result: 35/75280 errors, 909 excluded, 585 skipped
Test262 commit: 31126581e7290f9233c29cefd93f66c6ac78f1c9

VERSION 2021-03-27
Changelog 2021-03-27:
  • faster Array.prototype.push and Array.prototype.unshift
  • added JS_UpdateStackTop()
  • fixed Windows console
  • misc bug fixes

2020-11-08:

  • improved function parameter initializers
  • added std.setenv(), std.unsetenv() and std.getenviron()
  • added JS_EvalThis()
  • misc bug fixes

2020-09-06:

  • added logical assignment operators
  • added IsHTMLDDA support
  • faster for-of loops
  • os.Worker now takes a module filename as parameter
  • qjsc: added -D option to compile dynamically loaded modules or workers
  • misc bug fixes

2020-07-05:

  • modified JS_GetPrototype() to return a live value
  • REPL: support unicode characters larger than 16 bits
  • added os.Worker
  • improved object serialization
  • added std.parseExtJSON
  • misc bug fixes

2020-04-12:

  • added cross realm support
  • added AggregateError and Promise.any
  • added env, uid and gid options in os.exec()
  • misc bug fixes

2020-03-16:

  • reworked error handling in std and os libraries: suppressed I/O
    exceptions in std FILE functions and return a positive errno value
    when it is explicit
  • output exception messages to stderr
  • added std.loadFile(), std.strerror(), std.FILE.prototype.tello()
  • added JS_GetRuntimeOpaque(), JS_SetRuntimeOpaque(), JS_NewUint32()
  • updated to Unicode 13.0.0
  • misc bug fixes

2020-01-19:

  • keep CONFIG_BIGNUM in the makefile
  • added os.chdir()
  • qjs: added -I option
  • more memory checks in the bignum operations
  • modified operator overloading semantics to be closer to the TC39
    proposal
  • suppressed "use bigint" mode. Simplified "use math" mode
  • BigDecimal: changed suffix from 'd' to 'm'
  • misc bug fixes

2020-01-05:

  • always compile the bignum code. Added '--bignum' option to qjs.
  • added BigDecimal
  • added String.prototype.replaceAll
  • misc bug fixes

2019-12-21:

  • added nullish coalescing operator (ES2020)
  • added optional chaining (ES2020)
  • removed recursions in garbage collector
  • test stack overflow in the parser
  • improved backtrace logic
  • added JS_SetHostPromiseRejectionTracker()
  • allow exotic constructors
  • improved c++ compatibility
  • misc bug fixes

2019-10-27:

  • added example of C class in a module (examples/test_point.js)
  • added JS_GetTypedArrayBuffer()
  • misc bug fixes

2019-09-18:

  • added os.exec and other system calls
  • exported JS_ValueToAtom()
  • qjsc: added 'qjsc_' prefix to the generated C identifiers
  • added cross-compilation support
  • misc bug fixes

2019-09-01:

  • added globalThis
  • documented JS_EVAL_FLAG_COMPILE_ONLY
  • added import.meta.url and import.meta.main
  • added 'debugger' statement
  • misc bug fixes

2019-08-18:

  • added os.realpath, os.getcwd, os.mkdir, os.stat, os.lstat,
    os.readlink, os.readdir, os.utimes, std.popen
  • module autodetection
  • added import.meta
  • misc bug fixes

2019-08-10:

  • added public class fields and private class fields, methods and
    accessors (TC39 proposal)
  • changed JS_ToCStringLen() prototype
  • qjsc: handle '-' in module names and modules with the same filename
  • added std.urlGet
  • exported JS_GetOwnPropertyNames() and JS_GetOwnProperty()
  • exported some bigint C functions
  • added support for eshost in run-test262
  • misc bug fixes

2019-07-28:

  • added dynamic import
  • added Promise.allSettled
  • added String.prototype.matchAll
  • added Object.fromEntries
  • reduced number of ticks in await
  • added BigInt support in Atomics
  • exported JS_NewPromiseCapability()
  • misc async function and async generator fixes
  • enabled hashbang support by default

2019-07-21:

  • updated test262 tests
  • updated to Unicode version 12.1.0
  • fixed missing Date object in qjsc
  • fixed multi-context creation
  • misc ES2020 related fixes
  • simplified power and division operators in bignum extension
  • fixed several crash conditions

2019-07-09:

  • first public release
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant