Skip to content
New issue

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

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

Already on GitHub? # 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
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant