Compare commits

..

1,014 commits

Author SHA1 Message Date
Seonghyun Kim
bab3a57975 Fix RELEASE_ASSERT_NOT_REACHED on CoverInitializedName used as a value
A CoverInitializedName such as `{ a = 0 }` (object shorthand with default) is
only valid when the enclosing object literal is refined into a destructuring
pattern. When such an object literal is instead consumed as a real value -- the
base of a member access, call, computed access, or tagged template, e.g.
`( {... { a = 0 }. b = 1 } )` -- the pending CoverInitializedName error was
discarded by a later assignment, so no SyntaxError was raised and the
AssignmentPattern property value reached bytecode generation, hitting
RELEASE_ASSERT_NOT_REACHED in Node::generateExpressionByteCode.

Report the pending CoverInitializedName as an early SyntaxError in the two
LeftHandSideExpression member-access loops the moment the base is consumed as a
value, since it can no longer be refined into a pattern.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-18 19:02:02 +09:00
Seonghyun Kim
181019c0c3 Reject object binding pattern rest followed by a binding pattern (Issue #1334)
BindingRestProperty in an object binding pattern only accepts a
BindingIdentifier, unlike BindingRestElement in an array binding pattern
which also accepts a BindingPattern. Throw a SyntaxError when `...` is
followed by `{` or `[` in a declaration context.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-18 16:09:00 +09:00
Seonghyun Kim
c37e2b4851 A class definition is always strict mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-18 10:05:18 +09:00
Seonghyun Kim
2dee22f5c7 Update test/vendortest with Issue #1577 regression tests
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-17 10:06:57 +09:00
Seonghyun Kim
5e3b91b052 Fix using declaration in a switch case clobbering its disposable record (Issue #1577 Crash #2)
A `using` declaration in a switch case preceded by another statement
aborted with Assertion `isDisposableResourceRecord()' failed / SEGV in
finalizeDisposable.

The switch releases its discriminant register before generating the
case bodies, but pushLexicalBlock had allocated the disposable-record
register on top of it. The early giveUpRegister therefore freed the
disposable register instead, and a statement in the case body (e.g.
`o.k = 1`) reused that register slot, clobbering the record;
Initialize/FinalizeDisposable then dereferenced a non-pointer value.

When the switch block contains a `using` declaration, defer releasing
the discriminant temporaries until after finalizeLexicalBlock has
popped the disposable register (preserving LIFO order). Switches
without `using` are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-17 10:06:57 +09:00
Seonghyun Kim
e7221f4211 Fix labeled continue targeting a for-of loop (Issue #1577 Crash #1)
`L: for (const v of [...]) { continue L; }` aborted with
Assertion `!v.isEmpty()' failed, and `continue OUTER` from a nested
loop silently terminated the script.

A `continue <label>` whose label targets a for-of loop was left to be
resolved by LabelledStatementNode after the loop body, by which point
the for-of iterator-cleanup try block had registered the jump as a
complex case. It was then morphed into a JumpComplexCase that unwound
the try block, wrongly closing the iterator and leaving an empty Value
in the result register.

A previous per-loop attempt (8fd141b2) was reverted (60b1202a) because
a single m_currentLoopLabel leaked into nested loops and broke test262.

Track all labels directly targeting a loop (m_currentLoopLabels), clear
the list when entering each loop body so nested loops never inherit it,
and let for-of/for-in resolve continues for its own labels to
continuePosition (a plain jump, identical to an unlabeled continue)
before the try block is registered as a complex case.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-17 10:06:57 +09:00
Seonghyun Kim
b30b63fc63 Fix continue/break at first instruction of env-allocating block (Issue #1571)
A continue/break that is the first instruction inside a lexical block which
allocates an environment (e.g. `for(;c;){ continue; eval(); const x=1; }`) was
emitted as a plain Jump, skipping the block's CloseLexicalEnvironment. The
leaked environment then caused a subsequent outer-scope `const` to initialize
in the wrong environment, producing a spurious
`ReferenceError: Cannot access '...' before initialization`.

registerJumpPositionsToComplexCase compared jump positions against frontlimit
(= lexicalBlockStartPosition, the first body instruction) with strict `>`, so a
jump located exactly at the first body instruction was never morphed into a
JumpComplexCase and the block environment was left un-popped. Use `>=` for
break/continue/labelledBreak/labelledContinue.

With the environment now unwound correctly, the hasBinding guard band-aid in
InterpreterSlowPath::initializeByName is no longer needed and is removed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
60b1202a72 Fix labeled continue regression in test262 tests
Remove the conditional labeled continue processing from loop statements.
The LabelledStatementNode correctly handles all labeled continues after the
labeled statement completes. Loops should only handle their own regular
(unlabeled) continues.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
0a2fcaaf5e Add missing m_currentLoopLabel field and fix Crashes #1-2
- Add m_currentLoopLabel to ByteCodeGenerateContext for tracking labeled loop labels (Issue #1571)
- Fix Crash #1: Add bounds checking in inline cache proto traverse with std::min clamping
- Fix Crash #2: Check hasBinding before initializeBinding to prevent assertion on unreachable code paths

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
09f0a10bba Fix DoWhileStatementNode labeled continue handling (Issue #1571)
Issue #1571: Labeled continue in do-while loops with allocated blocks
- Proper morphing for labeled continues crossing block boundaries
- Fixes environment record consistency in labeled loops
- Completes fix pattern across all loop statement types

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
7e2b3292fd Fix WhileStatementNode labeled continue handling (Issue #1571)
Issue #1571: Labeled continue in while loops with allocated blocks
- Proper morphing for labeled continues crossing block boundaries
- Fixes environment record consistency in labeled loops
- Applies fix pattern to all loop statement types

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
8fd141b29c Fix ForInOfStatementNode labeled continue handling (Issues #1571 Crashes #3-4)
Issue #1571 Crash #3: Labeled continue in for-of loop
- Iterator value issue when labeled continue triggered early
- Proper sequencing of iterator cleanup vs control flow

Issue #1571 Crash #4: With statement + labeled for-of
- Environment unwinding coordination with iterator cleanup
- CloseLexicalEnvironment called at correct time

Solution: Consume labeled continues with proper morphing
- Ensures iterator cleanup finalizer runs before unwinding
- Control flow record management stays consistent
- Both for-in and for-of (and for-await-of) properly handled

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
c80623fc00 Fix ForStatementNode labeled continue handling (Issues #1571 Crashes #3-13)
Issue #1571 Crashes #3-4: Labeled continue in for loops
- Consume labeled continues targeting this loop with proper morphing
- Ensures iterator cleanup and environment unwinding work correctly

Issue #1571 Crashes #5-13: Environment record mismatch in labeled loops
- Proper morphing of labeled continues across allocated block boundaries
- Fixes crashes from scope-creating constructs in labeled loops
- Plain Jump path preserved for non-allocated blocks (zero overhead)

Solution: Call consumeLabelledContinuePositions with morphing enabled
- If no allocated block: plain Jump (fast path)
- If allocated block: JumpComplexCase with proper unwinding (correct path)
- Morphing is automatic via morphJumpPositionIntoComplexCase

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
92ee65bc0c Update LabelledStatementNode to pass label to child loop
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
07cdae7850 Update test cases
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-16 15:35:01 +09:00
Seonghyun Kim
ef525f337f Add programCount range check for edge case in blockOperation
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-06-15 11:50:30 +09:00
Ádám László Kulcsár
29fdbc741f Improve eval in devtools
Fix accidental deadlock possible inside the debugger and improve formatting when inspecting arrays.

Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-06-10 10:48:28 +09:00
Máté Tokodi
ebe3761308 Add support for scope variables and call stack in the Devtools Debugger
Signed-off-by: Máté Tokodi <mate.tokodi@szteszoftver.hu>
2026-06-10 10:44:10 +09:00
Ádám László Kulcsár
c423a4bfa0 Implement eval in Devtools debugger
Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-06-01 23:56:51 +09:00
epsilon
4b40f92aba Fix OOB read in string::rfind 2026-05-27 19:21:59 +09:00
Seonghyun Kim
779f6bedf5 Check stack overflow in ProxyObject::getPrototype, ProxyObject::getPrototypeObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-27 11:31:45 +09:00
Seonghyun Kim
d581b27af6 Check overflow when TypedArrayObject allocating for 32-bit systems
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-27 11:31:45 +09:00
Seonghyun Kim
3b43994a7d Don't assume spread element is fast mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-27 11:31:45 +09:00
Seonghyun Kim
299a7ff451 Fix crash in ArrayBuffer transfer
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-27 11:31:45 +09:00
Seonghyun Kim
36f5fb5836 Add size checking on ArrayBuffer.prototype.transfer
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-21 16:15:10 +09:00
Ádám László Kulcsár
d6aae0777f Fix bug with Devtools filenames
Fix bug where filenames could contain memory garbage.

Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-05-14 19:57:40 +09:00
Seonghyun Kim
590345cc62 Update vendor test
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
c02c6595be Handle oom explicitly
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
166fa7c66b Disable GC on c++ catch block w/ASAN
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
3cf7d60b43 Fix memory error when FinalizationRegistry cleanup callback throws
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
2bbd27caac Add stack overflow check in ProxyObject::ownPropertyKeys
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
78e5e333b9 Compute ByteCodeLOC only !NDEBUG && ESCARGOT_DEBUGGER in ByteCodeBlock::pushCode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
22bedcec9e In Evaluator::EvaluatorResult::resultOrErrorToString error can be null even if the task was successful
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
aa727d22a1 Use PointerFree allocatior for FunctionContextVarMap
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
121d2fefca Fix StringObject::defineOwnProperty
* Check if this is an index property within the string length due to proxy object

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
2e9a6393b9 In InterpreterSlowPath::arrayDefineOwnPropertyBySpreadElementOperation,
setArrayLength can convert the array to non-fast mode when length exceeds thresholds

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
685a71c3d1 Check if the size exceeds the maximum allowed size for TypedArray construction
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
78576a5af9 Update vendor test
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
c8588c323c prevent stack overflow when parsing huge json array
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
2cc649c97e Use correct index in DataViewObject::setViewValue
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
Seonghyun Kim
98f54274d1 Fix buffer access bug in builtinTypedArrayCopyWithin
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-05-14 13:33:33 +09:00
SAY-5
0a79d6c1f7 Fix out-of-bounds read in lexer comment/hashbang skipping
skipSingleLine, skipSingleLineComment, and skipMultiLineComment incremented
the source index and then called peekCharWithoutEOF() without re-checking
eof(), causing a one-byte heap read past the source buffer when the input
ends with a bare \r or a trailing '*'. Guard each follow-up peek with eof().

Fixes #1568

Signed-off-by: SAY-5 <say.apm35@gmail.com>
2026-05-12 15:57:50 +09:00
Ádám László Kulcsár
634fe864d7 Add -Wno-maybe-uninitialized build option for GCC 16
Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-05-11 20:40:32 +09:00
Ádám László Kulcsár
475149426f Implement escargot debugger restart support
Implement restart in escargot and python debugger.
Also add debugger test.

Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-05-07 16:12:31 +09:00
Ádám László Kulcsár
7683468efb Add heap snapshots to devtools debugger
Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-04-29 09:37:05 +09:00
Máté Tokodi
48eb4b6af9 Add support for breakpoints in the Devtools Debugger
- Add, remove breakpoints
- Resume execution
- Step Into, Step Out, Step Over
- Deactivate/Reactivate all breakpoints

Signed-off-by: Máté Tokodi <mate.tokodi@szteszoftver.hu>
2026-04-28 16:43:39 +09:00
Ádám László Kulcsár
e9833cd791 Rework python debugger tester
Delete debugger_tester.sh script and rewrite it in python. Also add option to run individial tests.

Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-04-28 16:42:06 +09:00
Ádám László Kulcsár
769e86e32a Add ability to take heap snapshots with python debugger
Signed-off-by: Ádám László Kulcsár <adam.kulcsar@szteszoftver.hu>
2026-04-23 11:35:55 +09:00
Seonghyun Kim
ad3844437e Update ArrayBuffer::isDetachedBuffer check
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-23 11:35:23 +09:00
Ádám László Kulcsár
633fe63795 Add funcitonality to take heap snapshots
Signed-off-by: Ádám László Kulcsár <kuladam@inf.u-szeged.hu>
2026-04-16 15:42:23 +09:00
Seonghyun Kim
e52f0ce0cf Fix read private property on inner object method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-16 09:25:12 +09:00
Seonghyun Kim
2624608567 Update clang compile option for old clang
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-16 09:25:12 +09:00
Ádám László Kulcsár
0ac274d1fc Add correct debugging to .mjs files
Add breakpoint on the start of the first source code line so that module file imports can be debugged.
Also extend debugger test script since Escargot uses realpaths with modules.

Signed-off-by: Ádám László Kulcsár <kuladam@inf.u-szeged.hu>
2026-04-14 21:35:29 +09:00
Máté Tokodi
ab7a13e089 Fix Devtools debugger websocket buffer handling
The type of `m_receiveBufferFill` was uint8_t causing it to roll over
when parsing longer messages from Devtools, causing message data to be
truncated incorrectly.

Signed-off-by: Máté Tokodi <mate.tokodi@szteszoftver.hu>
2026-04-09 12:27:01 +09:00
Seonghyun Kim
f25f05faca Validate input on CodeCacheReader
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-08 10:00:03 +09:00
Seonghyun Kim
a7f9695bf3 Check buffer size before reading buffer on CodeCacheReader
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-08 10:00:03 +09:00
Seonghyun Kim
50215a5ce8 Check wrong input in Serializer::deserializeFrom
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-08 10:00:03 +09:00
Seonghyun Kim
13e3a62312 Disable 32-bit pointer using with asan since it makes bdwgc related error
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-08 10:00:03 +09:00
Seonghyun Kim
2156cfa5b8 Fix compiler issue with int128(gcc-10 upper)
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-08 10:00:03 +09:00
Seonghyun Kim
b4f2b24e4a Fix compile error on clang-20
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-04-08 10:00:03 +09:00
Máté Tokodi
97e8115ab1 Add basics of Chrome Devtools debugger support
- Use routing table for request dispatch in DebuggerHttpRouter, for
  handling choosing which debugger stack to use based on the http
  upgrade request:
    - DebuggerEscargot for the python debugger and VSCode
    - DebuggerDevtools for connecting to Chrome Devtools
- Parse mesasges with 16bit message size
- Reply to the first few messages chrome sends
- Refactor Debugger:
    - Rename DebuggerRemote to DebuggerEscargot
    - DebuggerEscargot and DebuggerDevtools inherit from
      DebuggerTcp which inherits from Debugger
- Add debugger info to README.md

Signed-off-by: Máté Tokodi <mate.tokodi@szteszoftver.hu>
2026-03-28 13:08:51 +09:00
Hyukwoo Park
989e6922b6 Remove duplicated parameter-check methods
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2026-03-13 13:27:59 +09:00
Seonghyun Kim
6ebbd22c06 Optimize very big object expression through big bloom filter
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-03-10 16:01:03 +09:00
Seonghyun Kim
069fba1151 Optimize big object expression through bloom filter
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-03-10 16:01:03 +09:00
Máté Tokodi
9819a8de49 Debugger: add dedicated message for VSCode watch
Processing VSCode watches skips waitForResolvingPendingBreakpoints
(previously having multiple watches in VSC would call this when
processing the first watch, which would process pending messages while
trying to wait for break point changes while in eval mode (not in
waiting mode) and cause and Invalid message error and the closure of the
debgger connection when hitting the second watch message)

Allow '*.mjs' files in the python debugger

Add watches to the python debugger, add test

Signed-off-by: Máté Tokodi mate.tokodi@szteszoftver.hu
2026-03-09 08:19:57 +09:00
kwonjeomsim
f41ec3426b Change bottom-up to top-down check 2026-03-09 08:19:04 +09:00
kwonjeomsim
1b36b95006 Change location of optimization logic 2026-03-09 08:19:04 +09:00
kwonjeomsim
c69b8ada67 Add codes checking assignment pattern and rest parameter usage 2026-03-09 08:19:04 +09:00
kwonjeomsim
f6e0b04be4 Change location of removing unused parameters 2026-03-09 08:19:04 +09:00
kwonjeomsim
4d4cded5be Change AtomicStringMap allocation and deal with parameters over 16 2026-03-09 08:19:04 +09:00
kwonjeomsim
5c16ae5d84 Change m_parameterUsed to bit operation and Add hashset 2026-03-09 08:19:04 +09:00
kwonjeomsim
12a37ed4d1 Change unused parameter check point 2026-03-09 08:19:04 +09:00
kwonjeomsim
fb8b241655 Add InterpretedCodeBlock::ParameterUsed info to codecache 2026-03-09 08:19:04 +09:00
kwonjeomsim
339a5d1838 Add parsing process that remove unused function parameter bytecodes 2026-03-09 08:19:04 +09:00
Seonghyun Kim
bb00312798 Update gbs.conf to fix build error on ci
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-03-06 13:05:41 +09:00
Seonghyun Kim
c9f13d0730 Fix compile error on old gcc
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-03-05 17:20:30 +09:00
Seonghyun Kim
e35a8cb14d Add enconding option for python code generator
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-03-05 17:20:30 +09:00
Seonghyun Kim
af4c67a706 Implement VMInstanceRef::enqueueEvaluateJob
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-12 14:35:37 +09:00
Seonghyun Kim
c90e358e2f Generate YarrCanonicalizeUCS2.cpp from UnicodeData.txt
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-11 09:53:27 +09:00
Seonghyun Kim
17bdb07cc6 Update es-actions for clang
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-10 14:53:17 +09:00
Hyukwoo Park
eeea83ef3e Enable self-hosted runners only for the origin escargot repo
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2026-02-07 20:00:39 +09:00
Seonghyun Kim
d50bb8897a Update analysis-actions.yml
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-05 16:56:44 +09:00
Seonghyun Kim
a3abf7e40a Revise source generate from unicode data logic
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-05 16:56:44 +09:00
Seonghyun Kim
32281e3d22 Update processMemoryUsage function for posix
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-05 16:56:44 +09:00
Seonghyun Kim
ea826db76a Add thread memory usage test case
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-04 17:21:25 +09:00
Seonghyun Kim
7bd328b5df When thread exit, we should unmap mapped memory which is mapped from bdwgc
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-04 17:21:25 +09:00
Seonghyun Kim
20c7641b16 Implement tizen gbs build test on CI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-02-03 12:48:04 +09:00
Seonghyun Kim
e44005a1d2 Android timezone data load for adb-shell
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-30 17:34:13 +09:00
Seonghyun Kim
a130b108a5 Implement Global::finalizeGC to prevent memory leak
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-30 09:54:22 +09:00
Máté Tokodi
fb2ad1eb04 Fix exporting async functions in ESM modules
Add mjs file matching to regression test script
2026-01-28 13:48:08 +09:00
Seonghyun Kim
32e9a72156 Fix typo in Intl::initNumberFormatSkeleton
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-27 12:57:45 +09:00
Seonghyun Kim
2a3447dc1c Add missing package for tizen build
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-08 19:25:39 +09:00
Seonghyun Kim
3b242a2e6e Update coverage-scan
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-07 12:20:48 +09:00
Seonghyun Kim
95036c339e Evaluate destructuring correctly
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-07 12:20:48 +09:00
Seonghyun Kim
50f1d7a2f1 When closing the iterator, handle exceptions that occur when retrieving the return function correctly.
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-07 12:20:48 +09:00
Seonghyun Kim
3f07b5696c Update TypedArray.prototype.toLocaleString to pass argv
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-06 16:17:04 +09:00
Seonghyun Kim
a138441b98 Use new Calendar functions in Intl + Fix timezone bug in Intl.DateTimeFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-06 16:17:04 +09:00
Seonghyun Kim
a474595528 Update test262 driver
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-06 16:17:04 +09:00
Seonghyun Kim
75394413ac Fix ShadowRealm.prototype.importValue memory error
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-06 16:17:04 +09:00
Seonghyun Kim
1ab58f5470 Revise DecodeURI function to test max unicode codepoint
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-06 16:17:04 +09:00
Seonghyun Kim
a622791f6e Apply updated rules of TypedArray.[[Set]]
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-05 10:44:02 +09:00
Seonghyun Kim
142cf01ad4 In TypedArrayObject::integerIndexedElementSet check detached buffer correctly
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-05 10:44:02 +09:00
Seonghyun Kim
c231374c38 Update TypedArray.prototype.copyWithin to respect new ECMAScript spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2026-01-05 10:44:02 +09:00
Seonghyun Kim
ec0d3f1c61 Implement ShadowRealm.prototype.importValue
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-31 10:22:29 +09:00
Seonghyun Kim
982f15c83d Revise ShadowRealm
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-31 10:22:29 +09:00
Seonghyun Kim
23b88e0d3d When matchAll, 'v' is also unicode flag
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-31 10:22:29 +09:00
Seonghyun Kim
94abd9142c Apply updated spec of RegExp prototype functions
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-31 10:22:29 +09:00
Seonghyun Kim
bf4d55e27a Don't use error value on closeing iterator in Promise builtins
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-31 10:22:29 +09:00
Seonghyun Kim
f5ae276846 Disallow -0 year on DateObject parsing
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-31 10:22:29 +09:00
Seonghyun Kim
ef4b1ef414 Implement Iterator.concat method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-30 14:53:22 +09:00
Seonghyun Kim
5537c312dc Replement DateView constructor to respect new ECMAScript spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-26 16:06:16 +09:00
Seonghyun Kim
b66f1f6678 Reject promise with broken promise in AsyncGenerator.prototype.return
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-26 16:06:16 +09:00
Seonghyun Kim
d49aece60c Fixup Date.prototype.setYear
* Read [[DateValue]] and then call ToNumber when stored time-value is valid

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-26 16:06:16 +09:00
Seonghyun Kim
be331e04c3 Use correct Realm on ScriptClassConstructorFunctionObjectReturnValueBinderWithConstruct
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-26 16:06:16 +09:00
Seonghyun Kim
c7a1b4154b Fixup resizable and detached check in ArrayBuffer
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-26 16:06:16 +09:00
Seonghyun Kim
e74404b9a2 Use tryToUseAsIndex in Array.prototype.join
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-24 09:37:03 +09:00
Seonghyun Kim
8aae441360 Update testing files
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-24 09:37:03 +09:00
Seonghyun Kim
c54390bf2e Generate unicode related files from raw unicode text file
* Generate UnicodeIdentifierTables.cpp from DerivedCoreProperties.txt
* Generate YarrCanonicalizeUnicode.cpp from CaseFolding.txt
* Generate UnicodePatternTables.h from UCD

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-24 09:37:03 +09:00
Seonghyun Kim
c599abdc60 Runs coverage tests on self-hosted runner
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-18 18:53:40 +09:00
Seonghyun Kim
8f24498310 Fix minor Temporal issues
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-18 18:03:08 +09:00
Seonghyun Kim
7bb1e520a5 Fix issues on Temporal::calendarResolveFields
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-18 18:03:08 +09:00
Seonghyun Kim
82924e7db5 Fix comptued eraYear check bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-18 18:03:08 +09:00
Seonghyun Kim
f541c5c63f Implement Temporal ISODateToFields method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-18 18:03:08 +09:00
Seonghyun Kim
2f42f070f3 islamic and islamic-rgsa is not supported calendar for Temporal
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-16 16:45:19 +09:00
Seonghyun Kim
5c64d63fd1 Implement missing part of TemporalObjects.prototype.toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-16 16:45:19 +09:00
Seonghyun Kim
2b7a5657ef Extend time limit of analysis-action
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-16 16:45:19 +09:00
Seonghyun Kim
345a295cba Update indian era code for icu-78
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-16 16:45:19 +09:00
Seonghyun Kim
ce0d795280 Update Calendar::diffYearDueToICU4CAndSpecDiffer for icu-78
* see https://unicode-org.atlassian.net/browse/ICU-23167

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-16 16:45:19 +09:00
Seonghyun Kim
4e589b1a52 Use key of era data correctly for icu-78
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-16 16:45:19 +09:00
Seonghyun Kim
15d86aeeb9 Update test set to icu-78 and ubuntu24.04
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
71706514f4 Fix extended year bug with iso8601 calendar
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
ee64383623 Update Temporal methods
* Update Temporal::calendarDateUntil for non-iso 8601 calendars
* Update monthCode, monthsInYear logic for chinese, dangi calendar

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
e6417b8ed8 Update Temporal
* Update calendarAdd method
* Use correct era code for ethioaa calendar
* Implement special path for hebrew calendar

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
7667784d79 Consider single era correctly in Temporal
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
b1dd07f05c Show correct era code and eraYear to islamic calendars
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
2325f6fc64 Improve Temporal + intl402
* Update test262
* Apply basic of https://tc39.es/proposal-intl-era-monthcode/

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-15 18:43:33 +09:00
Seonghyun Kim
1175bb303b Implement Array.fromAsync
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-03 13:54:50 +09:00
Seonghyun Kim
d06a31a1a2 Update Intl.DateTimeFormat.formatRange, formatRangeToParts for Temporal
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
369278e640 Implement overwrapping options of Temporal...toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
7dd0c1821e Implement Temporal.Duration.prototype.toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
33d32009da Implement Temporal.{PlainTime, PlainDateTime}.prototype.toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
c3841a7176 Implement Temporal.{PlainYearMonth, PlainMonthDay}.prototype.toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
0a2eec0e85 Skip Temporal test on arm32-linux
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
75cdb470ba Implement Temporal.Instant.prototype.toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
45313ea2ce Implement Temporal.ZonedDateTime.prototype.toLocaleString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
66e105e9f8 Treat timezones correctly
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-12-02 13:41:54 +09:00
Seonghyun Kim
4a4f8a6d7e Call GC_gcollect_and_unmap and GC_invoke_finalizers on Global::finalize
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 17:26:47 +09:00
Seonghyun Kim
ef5ef0b9b4 Update GCutil
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 14:25:16 +09:00
Seonghyun Kim
18d3f010a0 Date.prototype.toTemporalInstant
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 14:25:16 +09:00
Seonghyun Kim
297162133e Implement Temporal.Duration.compare
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 14:25:16 +09:00
Seonghyun Kim
ba05eaec99 Implement Temporal.Duration.total, round
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 14:25:16 +09:00
Seonghyun Kim
5bbfa73dcd Implement Temporal.Instant.toZonedDateTimeISO
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 14:25:16 +09:00
Seonghyun Kim
5240b9cbec Implement Temporal.Now.*ISO() functions
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-20 14:25:16 +09:00
Ivan Maidanski
72172f6c47 Update LICENSE.BOEHM-GC
The license file is copied from third_party/GCutil/LICENSE.

Signed-off-by: Ivan Maidanski <ivmai@mail.ru>
2025-11-20 10:40:24 +09:00
Ivan Maidanski
d017677d54 Change build scripts after move bdwgc files to gcutil repository root
Change `GCutil/bdwgc` to `GCutil` in escargot.spec, android CMakeLists.txt.
Remove `-I .../GCutil/bdwgc -I .../GCutil/bdwgc/include/gc`.

Signed-off-by:  Ivan Maidanski <ivmai@mail.ru>
2025-11-19 16:06:58 +09:00
Seonghyun Kim
98de57bc8a Fix windows CI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-18 17:58:10 +09:00
Seonghyun Kim
fdac7ae1c3 Implement Temporal.ZonedDateTime.round, startOfDay, getTimeZoneTransition, valueOf, compare
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
dccf2f9256 Implement Temporal.ZonedDateTime.since, until
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
83c9e9a50a Implement Temporal.ZonedDateTime.add, subtract
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
0c41944316 Implement Temporal.ZonedDateTime.with* functions
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
3844dced3f Support more timezone names on Temporal
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
0249b5efb5 Implement Temporal.ZonedDateTime.to* functions
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
1c3248ce35 Implement Temporal.PlainDateTime.toZonedDateTime
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
ef617652dc Implement Temporal.PlainDate.to* functions
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-17 11:17:29 +09:00
Seonghyun Kim
bb3c62e2cc Implement from, toString, equals, getter of Temporal.ZonedDateTimeObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-10 13:20:35 +09:00
Seonghyun Kim
acd242f7df Implement constructor of Temporal.ZonedDateTimeObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-11-10 13:20:35 +09:00
Seonghyun Kim
5618ae6f7b Implement Temporal.PlainDateTime.compare
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-21 15:10:15 +09:00
Seonghyun Kim
dc7640a152 Implement Temporal.PlainDateTime.{ toPlainTime, toPlainDate }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-21 15:10:15 +09:00
Seonghyun Kim
5e5eb5d631 Implement Temporal.PlainDateTime.{ equals, round }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-21 15:10:15 +09:00
Seonghyun Kim
fa3432f1d6 Implement Temporal.PlainDateTime.{ since, until }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-21 15:10:15 +09:00
Seonghyun Kim
9d634be004 Implement Temporal.PlainDateTime.{ add, subtract }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-21 15:10:15 +09:00
Seonghyun Kim
cb01142c4c Implement Temporal.PlainDateTime.{ with * }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-21 15:10:15 +09:00
Seonghyun Kim
f9ca29d5cb Implement basic of Temporal.PlainDateTime
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-17 14:58:40 +09:00
Seonghyun Kim
c3c3bca85e Implement basic of Temporal.PlainMonthDay
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-17 14:58:40 +09:00
Seonghyun Kim
600fa1a906 Implement Temporal.PlainYearMonth.{ until, since }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-14 14:21:15 +09:00
Seonghyun Kim
b9041e60b7 Implmenet Temporal.PlainYearMonth.{ add, subtract }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-14 14:21:15 +09:00
Seonghyun Kim
70e0721082 Implement Temporal.PlainYearMonth.{ compare, with, toPlainDate }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-14 14:21:15 +09:00
Seonghyun Kim
36e4562e68 Fix minor issues in PlainYearMonth
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-10-14 14:21:15 +09:00
2jaeheon
77a3b8554f ci(macos): add ad-hoc codesign for .dylib artifacts
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
Co-authored-by: M-SE0K <seg082911@gmail.com>
2025-10-02 13:10:02 +09:00
2Jaeheon
77741e8d13 ci: fix-windows build
Signed-off-by: 2Jaeheon <jaeheon0826@jbnu.ac.kr>
2025-09-26 16:06:22 +09:00
Hyukwoo Park
4f0a1cff00 Fix conflicts in actions
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2025-09-26 09:10:37 +09:00
2Jaeheon
9e414f3933 ci: add -DCMAKE_POLICY_VERSION_MINIMUM to builds
Signed-off-by: 2Jaeheon <jaeheon0826@jbnu.ac.kr>
2025-09-24 17:30:15 +09:00
Seonghyun Kim
641e3813c4 Implement basic of Temporal.PlainYearMonth
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-22 16:48:25 +09:00
Hyukwoo Park
8b39a2c3ff Enable workflow_dispatch in release action
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2025-09-20 18:35:42 +09:00
Seonghyun Kim
8e5636c198 Implement Temporal.PlainDate.{ since, until }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-18 16:17:04 +09:00
Seonghyun Kim
5b74588aa1 Implement Temporal.PlainDate.{ add, subtract, equals, with, withCalendar }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-18 16:17:04 +09:00
Seonghyun Kim
141797871f Implement basic of Temporal.PlainDate
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-18 16:17:04 +09:00
Seonghyun Kim
90d8da7fe8 Implement Temporal.PlainTime.{ since, until, round, equals }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-18 16:17:04 +09:00
Seonghyun Kim
d7c2db8f3f Implement Temporal.PlainTime.{ toString, add, subtract, from }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-18 16:17:04 +09:00
Seonghyun Kim
84a305785a Implement base of Temporal.PlainTime
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-18 16:17:04 +09:00
2Jaeheon
293729c869 implement: code review bot
Signed-off-by: 2Jaeheon <jaeheon0826@jbnu.ac.kr>
2025-09-18 16:15:47 +09:00
Hyukwoo Park
40e54ebead Fix cmake build error in macOS-actions
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2025-09-15 12:15:03 +09:00
Seonghyun Kim
8d140c3c0f Implement Temporal.Duration.{ add, subtract, with, toLocalString, toJSON }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-09 11:38:59 +09:00
Seonghyun Kim
7135cbaefe Implement Temporal.Instant.{add, subtract, compare}
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-09 11:38:59 +09:00
Seonghyun Kim
34c2f0a20e Implement Temporal.Instant.{since, until}, Temporal.duration.{toString, negated}
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-09 11:38:59 +09:00
Seonghyun Kim
5711241b99 Implement Temporal.Instant.{ toLocalString, toJSON, round }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-04 13:22:13 +09:00
Seonghyun Kim
96beab3416 Implement basic methods of Temporal.Instant
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-04 13:22:13 +09:00
Seonghyun Kim
06e356f15a Introduce Int128 library
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-04 13:22:13 +09:00
Seonghyun Kim
6175024ffc Implement basic of Temporal.Duration
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-04 13:22:13 +09:00
Seonghyun Kim
3c1ddaaa50 Implement basic of Temporal.Now and Temporal.Instant
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-09-04 13:22:13 +09:00
Seonghyun Kim
52bbc7a9bc Update README and CMakeFiles
* rename ESCARGOT_ENABLE_SHADOWREALM to ESCARGOT_SHADOWREALM in build stuff

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-26 17:00:40 +09:00
Seonghyun Kim
fc47134b6e Rename ESCARGOT_ENABLE_SHADOWREALM to ENABLE_SHADOWREALM in source code
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-25 12:38:24 +09:00
kwonjeomsim
2482f40fe2 Implement ShadowRealm Wrapped function 2025-08-22 14:21:26 +09:00
kwonjeomsim
25a5bf17c3 Implement ShadowRealm constructor and prototype.evaluate method 2025-08-22 14:21:26 +09:00
Seonghyun Kim
6cfdea8169 Update release.yml
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-22 14:21:01 +09:00
Patrick Kim
1577634b8f
Update README.md 2025-08-21 17:24:56 +09:00
Seonghyun Kim
7993469edf Bump version to 4.3.0
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:59 +09:00
Seonghyun Kim
d8e2610f90 Implement using vairable with for-of statement
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
39b990ed7a Implement AsyncDisposableStack
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
c3fadf767b Implement %IteratorPrototype% [ @@dispose ] and %AsyncIteratorPrototype% [ @@asyncDispose ]
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
fff09af8c3 Implement basic of await using statement
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
4a372c5b01 Implement DisposableStackObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
26a2d9d39c Fix using statement bugs
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
98c145bdff Fix parser error while parse using variable
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
954b5bc77f Implement basic of using variable
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
b2ba17408c Implement SuppressedError
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
Seonghyun Kim
b50bda684b Update windows SDK version
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-21 17:22:15 +09:00
HyukWoo Park
1e11e1d668 Support SharedArrayBuffer in WASM Memory
Signed-off-by: HyukWoo Park <hyukwoo.park@jbnu.ac.kr>
2025-08-13 11:23:15 +09:00
HyukWoo Park
a11e806c20 Update walrus module
Signed-off-by: HyukWoo Park <hyukwoo.park@jbnu.ac.kr>
2025-08-13 11:23:15 +09:00
Seonghyun Kim
152bd60e3a Fix compile error & disable outdated tests
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-13 11:22:55 +09:00
Seonghyun Kim
108b0a2d87 Implement Uint8Array.fromHex, Uint8Array.prototype.{ toHex, setFromHex }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-13 11:22:55 +09:00
Seonghyun Kim
e8b7538e24 Implement Uint8Array.prototype.{setFromBase64, toBase64} and Uint8Array.fromBase64
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-13 11:22:55 +09:00
Seonghyun Kim
c31d8d6fdb Add GC disable, enable api to public header
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-11 12:56:36 +09:00
Seonghyun Kim
c543b17857 Revise TypedArray builtins for support resizble ArrayBuffer correctly
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-11 12:56:36 +09:00
Seonghyun Kim
b1e87e6801 Implement Iterator.from method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-11 12:56:36 +09:00
Seonghyun Kim
989e924b49 RelativeTimeFormat should have own NumberFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
a526fc2ad8 Implement Intl.Segmenter.prototype.segment method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
39be7b7d97 Implement Intl.Segmenter constructor
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
e5fe9d44c6 Move many Normal StaticStrings into Intl lazy StaticStrings
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
a058a43145 Implement new methods of Intl.Locale
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
3d230333be Update Intl.Locale constructor for supporting newer spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
7454b14725 Implement Intl.DurationFormat.prototype.formatToParts
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
54b0cf8f65 Implement Intl.DurationFormat, Intl.DurationFormat.supportedLocalesOf and Intl.DurationFormat.prototype.format
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-07 11:42:40 +09:00
Seonghyun Kim
c2083928a7 Remove useless check on ErrorObject::stack set function
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
Seonghyun Kim
f00b8128a9 Update Runtime ICU binder for Windows
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
Seonghyun Kim
db0badf787 Impelement Intl.DateTimeFormat.prototype.formatRangeToParts
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
Seonghyun Kim
05553d2264 Impelement Intl.DateTimeFormat.prototype.formatRange
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
Seonghyun Kim
2e33b02111 Add toStringTag to Intl.DateTimeFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
Seonghyun Kim
5de198e3a7 Revise hour12, hourCycle, locale hc extension handling in Intl.DateTimeFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
Seonghyun Kim
50299f0b15 Revise Intl.DateTimeFormat
* Parse GMT offset as timezone
* replace space (u202F) and thinSpace (u2009) from ICU result

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-08-01 10:16:26 +09:00
2jaeheon
6242f0977e Implement Iterator.prototype.flatMap method
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-30 15:05:46 +09:00
2jaeheon
6d0874b866 Implement getIteratorFlattenable
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-30 15:05:46 +09:00
clover2123
ae94df12b7 Disable -Os option for the latest gcc version
Signed-off-by: clover2123 <hyukwoo.park@jbnu.ac.kr>
2025-07-29 19:14:23 +09:00
Seonghyun Kim
383f275ad9 Update Intl.DateTimeFormat constructor for support Updated spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-23 10:30:50 +09:00
Seonghyun Kim
8d890f97ec Use collation and ignorePunctuation option correctly in Intl.Collator
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-23 10:30:50 +09:00
kwonjeomsim
953fb9163d Implement Map/WeakMap.prototype.getOrInsertComputed 2025-07-22 11:29:15 +09:00
2jaeheon
47d09c2a5f fix: Store Date value before ToNumber to handle side effects correctly
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-21 09:55:18 +09:00
Seonghyun Kim
4be0de65b9 The toLocaleString method of each non-undefined non-null element must be called with two arguments.
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-21 09:09:51 +09:00
Seonghyun Kim
e640af3007 Enable Math.f16round
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-21 09:09:51 +09:00
Seonghyun Kim
0f55e4461a Implement Intl.PluralRules.selectRange
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-21 09:09:51 +09:00
Seonghyun Kim
b2ecf54887 Implement more options to Intl.PluralRules
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-21 09:09:51 +09:00
Seonghyun Kim
a264ee2026 Implement Intl.NumberFormat.prototype.formatRangeToParts function
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-21 09:09:51 +09:00
Seonghyun Kim
7b71600aa7 Implement Intl.NumberFormat.prototype.formatRange
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-21 09:09:51 +09:00
kwonjeomsim
edbdfc7888 Catch syntax error when try to increase/decrease yield and new.target keyword 2025-07-20 10:53:37 +09:00
Anwar Fuadi
0daf586b6e Implement Math.f16round(x). 2025-07-17 15:17:30 +09:00
Seonghyun Kim
f15ce4357a Update Intl.NumberFormat constructor, format and resolvedOptions method for Intl.NumberFormat V3 spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-16 14:20:42 +09:00
Seonghyun Kim
4da625eeee Implement new useGrouping option for NumberFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-16 14:20:42 +09:00
Seonghyun Kim
eb69692309 Update test env to ICU 77
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-14 10:21:43 +09:00
Seonghyun Kim
1d1abe1e69 Implement ECMA-402 Intl.supportedValuesOf
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-14 10:21:43 +09:00
2jaeheon
5632e3f811 parser: Throw SyntaxError for non-simple left-hand side in compound assignments
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-12 22:56:11 +09:00
Seonghyun Kim
6cae4dc1e2 Fix up WeakMap, WeakSet memory leak and add cctest to test WeakMap and WeakSet
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-11 13:44:38 +09:00
kwonjeomsim
8582684c0b Implement Map/WeakMap.prototype.getOrInsert 2025-07-11 10:21:47 +09:00
2jaeheon
e488659903 Implement Iterator.prototype.drop method
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-10 21:49:42 +09:00
Seonghyun Kim
dfeec6e03b Fix memory leak in WeakMapObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-10 18:53:34 +09:00
Seonghyun Kim
f2b6d3d5e0 Try to parse date with ICU
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-10 18:53:34 +09:00
Seonghyun Kim
2405fac873 Apply unicode 17 rules to parser
- Update UnicodeIdentifierTables.cpp to unicode 17
- zero width joiner and zero width non-joiner are not a valid identifier start

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-10 18:53:34 +09:00
Seonghyun Kim
bf59245ee0 Improve small config memory usage
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-09 16:11:46 +09:00
Seonghyun Kim
49984a0247 Implement missing part of resizeble buffer
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-09 10:45:06 +09:00
Seonghyun Kim
9528f75cba Implement Math.sumPrecise
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-09 10:45:06 +09:00
Soonbeom Kwon
5c53d26131 Implement Iterator.prototype.every, take, toArray method 2025-07-07 16:32:16 +09:00
Seonghyun Kim
6ecf44ae02 Implement Atomics.pause
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-04 11:15:11 +09:00
Seonghyun Kim
84f5d459cf Read SharedArrayBuffer length before compute index
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-04 11:15:11 +09:00
2jaeheon
3274c456bd Implement Iterator.prototype.forEach method
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-03 22:34:48 +09:00
2jaeheon
6d2208a3e6 Implement Iterator.prototype.some method
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-03 22:34:48 +09:00
Seonghyun Kim
9b2f4723e8 Fix reading attribute code on dynamic import
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-03 14:27:34 +09:00
Seonghyun Kim
048b6e1d17 Update parser due to spec update
* fix import attribute parsing bug

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-03 14:27:34 +09:00
Soonbeom Kwon
cebb533875 Adjust iteratorFilterClosure to spec and fix counter variable 2025-07-03 12:41:03 +09:00
Soonbeom Kwon
8b2b02439f Combine IteratorData struct 2025-07-03 12:41:03 +09:00
Soonbeom Kwon
dc5ae66e0e Implement Iterator.prototype.reduce method 2025-07-03 12:41:03 +09:00
Soonbeom Kwon
d9792ddaf1 Implement Iterator.prototype.filter method 2025-07-03 12:41:03 +09:00
Seonghyun Kim
2bcc19e587 Implement Float16Array
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-02 16:15:46 +09:00
2jaeheon
901d29e3bb Implement Iterator.prototype.find method
Signed-off-by: 2jaeheon <jaeheon0826@jbnu.ac.kr>
2025-07-02 10:49:17 +09:00
Seonghyun Kim
7a47be7877 Fix JSON builtin bug related with rawJSON spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-01 19:39:37 +09:00
Seonghyun Kim
4c7cd64424 Implement Error.isError method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-01 19:39:37 +09:00
Seonghyun Kim
157a309f97 Implement Promise.try method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-01 19:39:37 +09:00
Seonghyun Kim
2986b98885 Implement RegExp.escape method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-01 19:39:37 +09:00
Seonghyun Kim
d92a795390 Update clang-format version to 20
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-07-01 18:39:28 +09:00
Seonghyun Kim
67198fc8b0 Implement JSON.parse source text access spec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-30 15:41:34 +09:00
Seonghyun Kim
87a09becd9 Remove nullptr ctor in Optional class to make it clearly
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-30 12:53:21 +09:00
Seonghyun Kim
2c80cd43f1 Update test262 driver and test result file
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-30 12:53:21 +09:00
Seonghyun Kim
8ae1f976d9 Update yarr version
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-30 12:53:21 +09:00
Seonghyun Kim
6a00b188d8 Implement Set.prototype.symmetricDifference method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
Seonghyun Kim
422dd0bc61 Implement Set.prototype.{isSubsetOf, isSupersetOf}
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
Seonghyun Kim
dfed47ebb9 Implement Set.prototype.difference
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
Seonghyun Kim
39d284b2b2 Implement Set.prototype.isDisjointFrom
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
Seonghyun Kim
8984acc04f Implement Set.prototype.intersection
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
Seonghyun Kim
04f9d99f13 Implement Set.prototype.union method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
Seonghyun Kim
53058a0d45 Fix clang-cl ci
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-25 14:15:23 +09:00
HyukWoo Park
a9a2335ef5 Update test262
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2025-06-25 09:53:04 +09:00
Hyukwoo Park
64db935469 Replace imp module by version-compatible importlib in test262 runner
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2025-06-25 09:53:04 +09:00
Hyukwoo Park
595a85757e Add pkg-config install in README
Signed-off-by: Hyukwoo Park <hyukwoo.park@jbnu.ac.kr>
2025-06-25 09:53:04 +09:00
Seonghyun Kim
a4021a97f4 Remove GC_size with alloc logic since it produces ci error
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-23 17:31:19 +09:00
Seonghyun Kim
9f59be13c2 Add tempory fix until https://github.com/actions/runner-images/issues/12435 fixed
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-23 17:31:19 +09:00
Seonghyun Kim
4c6220f22c Move tcoBuffer variable from ByteCodeInterpreter to ThreadLocal
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-23 17:31:19 +09:00
Seonghyun Kim
21f6cd3f73 Fix memory expand error on TightVectorWithNoSizeUseGCRealloc
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-19 11:09:46 +09:00
Seonghyun Kim
18a470f3f8 Disable TCs since we found some regression
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
8ea4218205 Use disappearing link instead of finalizer for BackingStore
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
72fc9d0680 Set GC warning proc for release mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
fd133c5868 Use disappearing link instead of finalizer for implementing WeakRefs
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
ef7441c412 Improve String hasher
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
302a6ecd44 Use ParserStringView instead of AtomicString for validating parameter in esprima
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
f1a7274e95 Optimize StringBuilder
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
f3b070f91d Don't allocate new memory if there is enough memory in Vector
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-18 17:50:07 +09:00
Seonghyun Kim
9ae947d83b Expand object property storage when create object with construct operation
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-11 14:03:47 +09:00
Seonghyun Kim
5611aca4e1 Check length before calling memcpy
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-11 14:03:47 +09:00
Seonghyun Kim
895052f59e Use 64bit address mode on 64bit system for JNI
* some JVMs invade our 32bit address space, so we cannot use force-32bit mode with JVMs

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-09 15:51:21 +09:00
Seonghyun Kim
932d82cbf9 Replace std::list with Vector
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-09 15:51:21 +09:00
Seonghyun Kim
81e5797483 Revert StringBuilder with RopeString
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-05 22:23:12 +09:00
Seonghyun Kim
595971175c Allow template literal with new line on return statement
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-05 22:23:12 +09:00
Seonghyun Kim
ccf80322c8 Fix unicode RegExp processing bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-05 22:23:12 +09:00
Seonghyun Kim
72205bb381 Fix super property set error in class
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-02 12:45:48 +09:00
Seonghyun Kim
795aa354f1 Fix print error on ByteCodeGenerator
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-02 12:45:48 +09:00
Seonghyun Kim
b1a3ccc12e Update Finalizer public API
Allow multiple register of callbacks

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-02 12:45:48 +09:00
Seonghyun Kim
0e5925f7b0 Update android build files for mac, ubuntu
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-06-02 12:45:48 +09:00
Seonghyun Kim
62e6e01ed1 Update android build files
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-30 16:20:18 +09:00
Seonghyun Kim
80141b3e71 Implement PersistentRefHolder::{setWeak, isWeak, clearWeak}
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-30 10:21:27 +09:00
Seonghyun Kim
268306b456 Fix cmake file error
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-29 11:44:47 +09:00
Seonghyun Kim
58c0a0bb0a Fix subString bugs
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-27 11:19:42 +09:00
Seonghyun Kim
50d31696d9 Update default value of threading and update READMD.md
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-27 11:19:42 +09:00
Seonghyun Kim
be859fdcee Improve ENABLE_TLS_ACCESS_BY_PTHREAD_KEY
* Enable this flag in 32bit address mode in 64bit
* Use first key of pthread_create_key

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-27 11:19:42 +09:00
Seonghyun Kim
edb0346d4e Implement TLS access with pthread_key_t
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-26 09:38:29 +09:00
Seonghyun Kim
9f985fb1dc Don't make copy of large string in small config mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-20 20:44:27 +09:00
Seonghyun Kim
2a00a728ca Update GCutil
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-20 20:44:27 +09:00
Seonghyun Kim
2c0c041c9a Improve TLS valriable r/w on ELF shared-libary
since calling __tls_get_addr performace is too bad, we should r/w TLS variables with special offset
users can turn on this feature with ESCARGOT_ENABLE_TLS_ACCESS_BY_ADDRESS flag

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-14 14:34:31 +09:00
Seonghyun Kim
e575d34387 Update finalizer public API
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 17:54:41 +09:00
Seonghyun Kim
e4c132d591 Update GCutil
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 12:27:36 +09:00
Seonghyun Kim
aa14a49a70 Enhance Vector::erase method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 12:27:36 +09:00
Seonghyun Kim
c2ef5b9e12 Reduce calling count of String::charAt
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 09:56:33 +09:00
Seonghyun Kim
adcd8025b7 Don't save CompressibleString and Reloadable string on AtomicStringMap
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 09:56:33 +09:00
Seonghyun Kim
ebe450e623 Calling fastTickCount function in CompressibleString is too expensive
Use last GC marking instead

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 09:56:33 +09:00
Seonghyun Kim
560cd36c21 Add VMInstance config flags
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 09:56:33 +09:00
Seonghyun Kim
7b95d4e9b8 free CreateObjectPrepare::CreateObjectData explicitly since CreateObjectData is big
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-12 09:56:33 +09:00
Seonghyun Kim
3aff294c29 Change default Memory::setGCFrequency value to 12 due to bdwgc update
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-07 11:11:38 +09:00
Seonghyun Kim
4a952115d0 Remove unnecessary strlen and memory copys
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-07 11:11:38 +09:00
Seonghyun Kim
ecf2a586b7 Optimize StringBuilder for huge String
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-05-07 11:11:38 +09:00
Seonghyun Kim
782269345c Update tizen build files and GCutil
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-30 10:17:50 +09:00
Seonghyun Kim
2b84e6b800 Update GCutil
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-29 12:09:43 +09:00
Seonghyun Kim
e89d796bb1 When init class, init class methods first
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-16 15:15:17 +09:00
Anwar Fuadi
4ebb3a229d Change from C/Function-style cast to C++-style cast. 2025-04-14 11:02:32 +09:00
Seonghyun Kim
b51cb6ff2e Add missed typed GC marking for ObjectStructureWithoutTransition
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-08 15:23:55 +09:00
Seonghyun Kim
5a7f8d6114 Fix script parser error with class parsing
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-06 16:14:09 +09:00
Seonghyun Kim
13990e9538 Add -DCMAKE_POLICY_VERSION_MINIMUM=3.5 to github workflow
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-03 15:14:39 +09:00
Seonghyun Kim
e78a2432cd Every value can be used in callDynamicImportRejected function
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2025-04-03 15:14:39 +09:00
HyukWoo Park
5f9aefa716 Fix async test script in test262
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2025-01-31 08:38:23 +09:00
HyukWoo Park
a57df7576b Fix memory leaks in Debugger
* shared structure `BreakpointLocationsInfo` between debuggger and ByteCodeBlock can cause memory leaks
* correctly delete each `BreakpointLocationsInfo`

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2025-01-17 10:44:49 +09:00
HyukWoo Park
19498b41b4 Implement PlainDate.prototype calendar-date properties
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2025-01-14 17:27:24 +09:00
HyukWoo Park
5b935ec247 Re-implement Temporal and Temporal.PlainDate basics
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2025-01-08 10:26:05 +09:00
HyukWoo Park
5cdf638814 Fix package installation failure in actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2025-01-07 12:23:23 +09:00
HyukWoo Park
58536d0ea0 Refactor TemporalObject
* merge Temporal into TemporalObject
* add each Temporal prototype object into global object

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-12-11 11:34:15 +09:00
HyukWoo Park
e4287d5f6b Refactor static strings for Temporal
* redefine all lazy strings of Temporal objects

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-12-11 11:34:15 +09:00
HyukWoo Park
fdec6267da Update test262 version
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-12-10 15:48:37 +09:00
HyukWoo Park
037a748d22 Handle out-of-bound access in TypedArray
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-12-10 15:48:37 +09:00
HyukWoo Park
a02c48d286 Fix bugs in RegExp
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-12-02 17:51:47 +09:00
HyukWoo Park
204295833b Skip pkg-config install in macos
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-11-26 16:48:55 +09:00
HyukWoo Park
c7623e41ce Update release action
* include icu libraries for release
* add build option for deployment
* check the result of deployment in action

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-11-26 16:48:55 +09:00
Seonghyun Kim
5c22c9f32d Update maven release files
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-11-18 15:02:41 +09:00
HyukWoo Park
6d2dd5ecec Update release actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-11-08 11:45:17 +09:00
HyukWoo Park
d70a651c56 Add RISC-V (64bit) test environment in actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-11-08 11:45:17 +09:00
HyukWoo Park
9df6de10a2 Fix a parsing bug in nullish-coalescing
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-11-07 17:49:03 +09:00
HyukWoo Park
92602e2ca2 Update release action
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-10-31 15:37:23 +09:00
HyukWoo Park
081e241c2f Fix x86 build in actions to use i386 ICU package
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-10-31 15:37:23 +09:00
HyukWoo Park
ff7b02722d Fix icu4c build path in macOS
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-10-31 15:37:23 +09:00
HyukWoo Park
98a7eaf95d Update macOS build including both x64 and arm64
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-10-23 16:34:16 +09:00
Seonghyun Kim
2f3ba80a08 Fix one of assignment optimizer bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-10-21 10:56:13 +09:00
HyukWoo Park
cf0ef1247b Update macOS version in actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-10-16 16:17:51 +09:00
Seonghyun Kim
f388c52797 Fix crash while buildStacktrace
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-10-10 10:45:05 +09:00
HyukWoo Park
cd4b7ddbea Fix minor parsing errors
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-27 08:16:34 +09:00
Seonghyun Kim
7365c2ae4b Fix crash when got stack overflow error while computing bytecode position
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-09-24 10:18:56 +09:00
Seonghyun Kim
32f1ebbd26 Fix bug in callConstructor with class
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-09-19 14:32:57 +09:00
HyukWoo Park
91eef62f47 Refactor parsing of optional chaining
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-19 13:48:53 +09:00
Seonghyun Kim
1e1599aa09 Implement ValueRef::callConsturctor
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-09-13 16:14:22 +09:00
HyukWoo Park
0434ba9237 Fix this binding error within eval and arrow function
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-12 20:20:07 +09:00
HyukWoo Park
0eac4dcff9 Add stack checker in Proxy call and construct methods
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-12 20:20:07 +09:00
Seonghyun Kim
55d3c17718 ByteCodeBlock of top CodeBlock should not be removed from VMInstance
* If there is GC jobs from Script init to Script execution, the ByteCode can be remove by ByteCode prunning. this is wrong

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-09-10 13:53:32 +09:00
HyukWoo Park
6a0087c6cb Fix minor defect in Yarr
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-09 15:50:08 +09:00
HyukWoo Park
e801bb623f Update README
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-09 15:49:45 +09:00
HyukWoo Park
5fcdf4e101 Fix generation of arguments object used in nested arrow functions and eval codes
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-09-05 10:38:47 +09:00
HyukWoo Park
7589396230 Fix calculation of identifiers located in parameter scoped functions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-08-30 09:37:09 +09:00
HyukWoo Park
d398f1ece3 Fix minor type-casting defect in TypedArray
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-08-20 18:30:53 +09:00
HyukWoo Park
cadbad68b9 Update README
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-08-20 18:30:53 +09:00
Seonghyun Kim
2ec730bed4 Implement basic of Iterator helper and Iterator.prototype.map
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-08-09 15:40:40 +09:00
HyukWoo Park
23ef57997a Fix minor buffer overflow in lexer
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-08-06 15:34:25 +09:00
HyukWoo Park
fff4e2fdd4 Fix minor build errors for clang compiler
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-08-06 15:34:25 +09:00
HyukWoo Park
3045a8ef7e Add android release in actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-08-05 09:21:27 +09:00
HyukWoo Park
dd479c42bb Update android build
* update NDK version 27
* enable 16KB page size

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-31 17:52:47 +09:00
Seonghyun Kim
0f6ea4612a Fix memory error on Yarr
If we want to store WTF::String with Vector or HashSet,
we would use another type of allocator

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-25 16:29:03 +09:00
Seonghyun Kim
96d165ff5a Fix test262 driver error around IsAsyncTest function
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-25 16:29:03 +09:00
Seonghyun Kim
adf735966f DataViewObject sometimes have true for m_isAuto & detached when byteLength is below zero
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-25 16:29:03 +09:00
Seonghyun Kim
023bb16baa Revise Array, ArrayBuffer, BigInt, DataView builtins
* Implement missing features on ArrayBuffer
* Fix minor bug on BigInt, DataView and Array

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-25 16:29:03 +09:00
Seonghyun Kim
902d76f0dd Update yarr generated unicode data file to unicode 15.1
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-25 16:29:03 +09:00
HyukWoo Park
246ecf6456 Fix buffer overflow error in RegExp
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-25 12:35:25 +09:00
HyukWoo Park
b7a70c5c33 Update WASM js-api
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-25 10:07:09 +09:00
Seonghyun Kim
9b1076d5c6 Update yarr generated unicode data file to unicode 15.1
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-24 10:21:42 +09:00
Seonghyun Kim
21903f956e In RegExp ctor, we should replace \n into \\n
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-24 10:21:42 +09:00
Seonghyun Kim
7762be63d1 Implement accessor unicodeSets for RegExp prototype
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-24 10:21:42 +09:00
Seonghyun Kim
6374a4857d Fix unicode string indexing bug in RegExpExec
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-24 10:21:42 +09:00
Seonghyun Kim
a66b725ce4 RegExp.prototype[Symbols.match] builtin function should read flags property instead of global
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-24 10:21:42 +09:00
Seonghyun Kim
eda2f8d4fa If there is unicode flag is set but find un-paired utf-16 surrogate in RegExp interpreter,
We should not use utf-16 surrogate pair rule for input.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-24 10:21:42 +09:00
HyukWoo Park
7fc59b7171 Revise WASM cache structure
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-18 16:15:23 +09:00
HyukWoo Park
f07651568b Update wasm-js testsuite
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-18 16:15:23 +09:00
HyukWoo Park
19f32213ee Fix test runner to print out fail list
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-18 16:15:23 +09:00
Seonghyun Kim
0fbacc3b2e Fix Unicode Identifier paring bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-18 14:27:49 +09:00
Seonghyun Kim
b95ae71b67 Fix Bug in RegExpObject::createRegExpMatchedArray
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-18 14:27:49 +09:00
HyukWoo Park
6c0926c4c0 Fix out-of-bound source code accesses in Lexer
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-16 15:47:40 +09:00
Seonghyun Kim
bddd8a8fe2 RegExp.prototype.compile should not accept sub-class of RegExp
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-16 14:25:28 +09:00
Seonghyun Kim
b3deb87407 Add YarrSyntaxChecker to test RegExp pattern and flag
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-16 14:25:28 +09:00
Seonghyun Kim
9c09d721af Implement 'd' flag for RegExp
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-16 14:25:28 +09:00
Seonghyun Kim
9876b4c852 Fix parse RegExp option bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-16 14:25:28 +09:00
Seonghyun Kim
4c2efa224e Implement StackCheck in yarr
* Move many WTF class from WTFBridge to class file

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-16 14:25:28 +09:00
Seonghyun Kim
3d4d9a9f2b RegExp.prototype.compile method should check the function is called by cross-realm
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-16 14:25:28 +09:00
Seonghyun Kim
8ac5782dec Update test262 exclude file
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-12 16:44:02 +09:00
Seonghyun Kim
72cb18b19b in RegExp(yarr), UCHAR_ALPHABETIC chars not applied by u_tolower, u_toupper
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-12 16:44:02 +09:00
Seonghyun Kim
4b8024efb7 Update yarr source to webkitgtk-2.44.2
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-12 16:44:02 +09:00
HyukWoo Park
01bfe58f7f Fix wrong memory allocation of ToStringRecursionPreventer in VMInstance
* fix it to make GC correctly trace ToStringRecursionPreventer structure

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-07-05 10:21:05 +09:00
Seonghyun Kim
e2423b2428 Fix shell and test262 driver bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-04 13:41:04 +09:00
Seonghyun Kim
d59154a794 Implement String.prototype.{ isWellFormed, toWellFormed }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-04 13:38:59 +09:00
Seonghyun Kim
18ec8bc1fc Fix bug when resize size of ArrayBuffer from zero
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-04 13:35:01 +09:00
Seonghyun Kim
d9bfe96623 Implement Promise.withResolvers
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-03 09:48:25 +09:00
Seonghyun Kim
23d21fd7ec Implement Map.groupBy
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-03 09:48:25 +09:00
Seonghyun Kim
277738e347 Implement Object.groupBy method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-07-03 09:48:25 +09:00
Seonghyun Kim
db24c809c8 Add missing function if there is no ENABLE_COMPRESSIBLE_STRING flag
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-06-28 12:06:58 +09:00
HyukWoo Park
3024cb7065 Add codecov configuration file
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-06-28 10:59:12 +09:00
HyukWoo Park
1053742b3d Fix coverage analysis command to correctly collect infos
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-06-20 09:58:16 +09:00
Seonghyun Kim
000a19868f Prune Async, Generator function ByteCodeBlock if possible
* Don't hold Async, Generator function ByteCodeBlock while GC

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-06-19 13:26:12 +09:00
Seonghyun Kim
f646e364a7 Fix error on run-tests.py
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-06-13 12:40:30 +09:00
HyukWoo Park
1050ee4f5b Update TCO debug mode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-06-05 11:06:25 +09:00
Seonghyun Kim
25fe6b8d5a Update spec file and run-test tool
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-05-28 17:05:50 +09:00
HyukWoo Park
5d5e89f6d8 Replace every getIndexedProperty by getIndexedPropertyValue in TypedArray builtin methods
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-28 14:29:56 +09:00
HyukWoo Park
91c83757e5 Update TypedArray.prototype.toReversed builtin method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-28 14:29:56 +09:00
HyukWoo Park
b692b277d0 Update Array.prototype.toReversed builtin method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-28 14:29:56 +09:00
HyukWoo Park
23d203b7b2 Update Array.prototype.toSpliced builtin method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-28 14:29:56 +09:00
HyukWoo Park
47cc02e8d8 Update TypedArray.prototype.toSorted builtin method
* fix some errors in sort method too
* refactor other sort and toSorted methods

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-23 17:02:15 +09:00
HyukWoo Park
696cff8d27 Fix bugs in Array.prototype.sort
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-23 17:02:15 +09:00
HyukWoo Park
f5a08722e9 Update Array.prototype.toSorted builtin method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-23 17:02:15 +09:00
HyukWoo Park
52e3239f63 Update build options and submodules
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-22 17:40:10 +09:00
HyukWoo Park
57c23d62f0 Fix Error creation process to check and trigger Error relevant callbacks correctly
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-14 10:08:26 +09:00
HyukWoo Park
77f0c49ad5 Add ESCARGOT_USE_EXTENDED_API build option to managed APIs used only for third party
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-14 10:08:26 +09:00
Seonghyun Kim
a34205a555 Remove AVD cache from CI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-05-07 09:23:02 +09:00
Seonghyun Kim
af5ac14862 When finalize ThreadLocal, we should remove gc event listener from bdwgc
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-05-07 09:23:02 +09:00
HyukWoo Park
f039511557 Fix calculation of outer limit of complex jump correctly
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-02 10:17:14 +09:00
HyukWoo Park
2c36e6eb67 Remove redundant code modules in complex jump
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-02 10:17:14 +09:00
HyukWoo Park
08eb095b3c Replace checks of undefined or null routine in for statement by one unified bytecode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-02 10:17:14 +09:00
HyukWoo Park
5ec3d007fa Fix build error in actions CI
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-05-02 10:17:14 +09:00
HyukWoo Park
fdda755329 Fix not to store duplicated properties in Template
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-04-24 15:43:07 +09:00
HyukWoo Park
29ea705677 Mark structure as referenced by inline caching for template
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-04-24 15:43:07 +09:00
HyukWoo Park
05d1dadbe4 LoadLiteral bytecode should have a seperate dst register
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-04-24 15:43:07 +09:00
HyukWoo Park
fa209656d5 Reset m_fastModeData of ArrayObject for the case of exception during ArrayObject creation
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-04-24 15:43:07 +09:00
HyukWoo Park
28451a704f Update Walrus module
* fix build error

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-04-05 12:08:07 +09:00
HyukWoo Park
5a5238049c Implement Immutable Prototype Exotic Object
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-04-03 16:49:20 +09:00
HyukWoo Park
99f7a16312 Fix to access global builtin properties before delete operation
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-28 16:35:15 +09:00
HyukWoo Park
33037e20d8 Throw an exception when attributes parameter of Reflect.defineProperty is not an Object
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-28 16:35:15 +09:00
HyukWoo Park
5f918f17e6 Fix an error in getting a new.target method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-28 16:35:15 +09:00
HyukWoo Park
46cd288264 Fix parsing error about await keyword
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-28 16:35:15 +09:00
HyukWoo Park
870bc3991a Fix the type of GeneratorFunction.prototype
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-26 13:29:51 +09:00
HyukWoo Park
232a555df2 Fix optional chaining parsing to correctly throw a syntax error for left-hand side assignment
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-26 13:29:51 +09:00
HyukWoo Park
2bde2b91e3 Fix wrong register calculation in AssignmentExpressionSimpleNode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-26 13:29:51 +09:00
HyukWoo Park
babcedce95 Adjust buffer size of source code loading
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-20 14:57:06 +09:00
HyukWoo Park
01c132434c Fix missing parameters in collectByteCodeLOCData
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-20 14:57:06 +09:00
HyukWoo Park
23cbadecad Add missing type check in left-hand-expression parsing
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-20 14:57:06 +09:00
HyukWoo Park
5ee4a5bd4e Fix buffer overflow error in builtinHelperFileRead method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-15 09:30:40 +09:00
HyukWoo Park
bccdc4225e Update deprecated actions modules
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-12 13:50:42 +09:00
HyukWoo Park
86525d1000 Fix object set inline caching method
* fix inline caching to insert a new cache item after validation
* refactor set inline caching method

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-12 13:50:42 +09:00
HyukWoo Park
5275ce42e3 Remove unnecessary codes in ObjectStructure
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-03-12 13:50:42 +09:00
HyukWoo Park
023b7ea014 Implement general tail call optimization
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-02-20 17:16:10 +09:00
Seonghyun Kim
65558531f8 Fix yml file to run test cases on test machine
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-02-14 15:28:56 +09:00
Seonghyun Kim
6218b1bafc Update GCutil and object value allocator for fix performance problem
There was a problem running bubble test in web-tooling-benchmark
too many gc were occured because GC_get_bytes_since_gc() cannot track GC_free event
so, I am start to use GC_REALLOC on 64-32bit
and fixes build error with mem_stats profiler(valgrind)

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-02-14 15:28:56 +09:00
HyukWoo Park
c4ab1cf57d Merge tail call bytecodes
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-02-05 14:19:01 +09:00
Seonghyun Kim
55a36a294a Fix crash
Force keep ByteCodeBlock* pointer in calling function routine.
Some compiler don't keep pointer of ByteCodeBlock* in stack when calling function
If don't keep the pointer, we can lose the ByteCodeBlock while GC

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-02-01 10:49:00 +09:00
Seonghyun Kim
c884c0605b Improve Object creation performance
* Convert rootedObjectStructureSet(Vector) into HashSet
* Use inline storage for properties in CreateObjectData

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-02-01 10:49:00 +09:00
Seonghyun Kim
2b6e3fcc7d Update object creation code from script
* Use ObjectCreatePrepare code everytime
* Implement simple inline-cache object structure in ObjectCreatePrepare

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-02-01 10:49:00 +09:00
Seonghyun Kim
9a5c1b57a9 Add google-perf build option
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-02-01 10:49:00 +09:00
Seonghyun Kim
bd95de3c46 Implement more things for CreateObjectPrepare operation
* It should support methods and spread element

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-01-18 16:40:37 +09:00
Seonghyun Kim
ded2d1145e Introduce new way of create object in script
* Prepare the property and key list before object creation
* The new way reduce size of object structure with transition

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-01-18 16:40:37 +09:00
Seonghyun Kim
70a5bf444a Fix bugs on Temporal
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-01-18 16:40:37 +09:00
HyukWoo Park
f09fe2a4c0 Fix buffer overflow in text reading
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-16 15:59:02 +09:00
HyukWoo Park
3aac2156a9 Fix FinalizationRegistry
* unregisterToken should be weak reference
* add finalizer for unregisterToken
* fix cleanupSome method

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-12 18:50:50 +09:00
HyukWoo Park
47b9fb1074 Implement FinalizationRegistry of Symbol type
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-12 15:08:35 +09:00
HyukWoo Park
364b5f4717 Implement WeakRef of Symbol type
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-12 15:08:35 +09:00
HyukWoo Park
1749160613 Implement Symbol value of WeakSet
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-12 15:08:35 +09:00
HyukWoo Park
9dc7a55cbe Implement Symbol key of WeakMap
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-12 15:08:35 +09:00
Zoltan Herczeg
ac75d5c715 Fix memory and conversion issues in python debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2024-01-12 12:18:53 +09:00
HyukWoo Park
ca43b39174 Revise Symbol description getter methods
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-10 14:34:43 +09:00
HyukWoo Park
86f230325f Implement finalizer for Symbol
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-10 14:34:43 +09:00
HyukWoo Park
1982e20d42 Remove redundant checks in Object conversion macro
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-08 09:46:36 +09:00
HyukWoo Park
96762b2187 Update TypedArray.prototype.with
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-04 10:09:32 +09:00
HyukWoo Park
9e87e85dc7 Update Array.prototype.with
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-04 10:09:32 +09:00
HyukWoo Park
a4afdefbf2 Fix defects
* using references for auto variables
* embed identifier operations for non-generic block infos

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2024-01-03 08:54:05 +09:00
Seonghyun Kim
5170135d7b Implement generic BlockInfo vector for CodeBlock for reducing memory usage
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2024-01-02 15:09:40 +09:00
Seonghyun Kim
1b9be45708 Add Generic-BlockInfo for reducing memory usage of BlockInfo
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-12-28 09:31:13 +09:00
Seonghyun Kim
b0543cfe9c Use realloc for ByteCodeGeneration
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-12-28 09:31:13 +09:00
HyukWoo Park
c12763a4df Update test262 version
* fix an error in TemporalObject

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-20 16:00:08 +09:00
HyukWoo Park
282cd3f359 Add timeout limits for hosted-runners in actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-20 16:00:08 +09:00
HyukWoo Park
698b932878 Fix broken badge in README
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-20 16:00:08 +09:00
HyukWoo Park
3026aab3ca Fix minor code defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-19 10:24:18 +09:00
HyukWoo Park
a3fa9d7ef0 Fix parsing bugs in increment or decrement operations
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-18 08:41:26 +09:00
HyukWoo Park
dcbcd7dac5 Add untracked flag for web-tooling-benchmark submodule
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-18 08:41:26 +09:00
HyukWoo Park
9bc09564f4 Fix parsing bugs in UnaryExpression and Exponentiation operation
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-15 15:07:53 +09:00
HyukWoo Park
4121b297fc Run web-tooling-benchmark in actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-12 17:09:31 +09:00
HyukWoo Park
b50e5fcf8c Add web-tooling-benchmark test
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-12 17:09:31 +09:00
HyukWoo Park
93d4648908 Refactor Code Cache
* reduce FILE I/O to accelerate load/store process
* add code caching functions for clean code

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-08 08:44:25 +09:00
Seonghyun Kim
59a626b871 Improve performance with large object
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-12-07 16:36:24 +09:00
Seonghyun Kim
5d59757208 Optimize JSON.parse with large input
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-12-07 16:36:24 +09:00
Seonghyun Kim
b117b8b205 Optimize JSONStringifyQuote
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-12-07 16:36:24 +09:00
HyukWoo Park
8aa918e372 Fix a wrong assertion in tail call without parameters
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-12-06 13:09:38 +09:00
Seonghyun Kim
799bc4fcc9 Fix global-await issue
* Print unhandled reject error for developer in shell
* Fix await expression parsing bug

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-12-01 10:47:36 +09:00
Seonghyun Kim
184295ccb6 Use string length with hash for identify source code in CodeCache
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-30 10:03:22 +09:00
Seonghyun Kim
41206722f0 Fix SIGBUS on arm cpu
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-29 13:13:46 +09:00
Seonghyun Kim
f04616e4a5 Make every function cacheable even if script is not cacheable
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-29 13:13:46 +09:00
Seonghyun Kim
2c070415ba Revise load/store CodeCache for function
* Store CodeCache for function in same file with Script where it is located
* Implement load function ByteCode when loading Script

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-29 13:13:46 +09:00
HyukWoo Park
5bc5fc7876 Add fine-tuned TCO condition check in parsing phase
* check argument count and name of callee

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-11-23 08:26:09 +09:00
HyukWoo Park
1a5b10b821 Simplify TCO check code
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-11-23 08:26:09 +09:00
HyukWoo Park
11d9427bb8 Update TCO to handle tail recursion with non-identical argument counts
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-11-23 08:26:09 +09:00
Seonghyun Kim
e9cec1d0b4 Make option for maxCompiledByteCodeSize in VMInstance
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-21 14:49:31 +09:00
Seonghyun Kim
fcc35d22bf Implement experimental code cache of function
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-21 14:49:31 +09:00
Seonghyun Kim
195039d901 Revise computing and using stack limit
* Compute stack limit correctly through pthread API or Windows internal API
* Store stack limit in TLS(or global) not a VMInstance or ExecutionState

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-20 13:31:17 +09:00
Seonghyun Kim
48150217a8 Divide ExectuionState to ExecutionState and ExtendedExecutionState(with rareData)
* This path reduce gc_malloc count for try-catch, with, generator, async function

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-20 13:31:17 +09:00
Seonghyun Kim
4f8582ec25 Compute stacktrace when creating ErrorObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-09 12:15:14 +09:00
HyukWoo Park
4581040747 Implement TCO for try-catch-finally block
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-11-08 15:16:42 +09:00
Seonghyun Kim
e706ea6e4a Implement Context.throwException on Java API
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-03 10:51:03 +09:00
Seonghyun Kim
4053e103a5 Add missing license file
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-01 12:50:15 +09:00
Seonghyun Kim
2ecb52c9cd Implement JavaErrorObject in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-11-01 12:50:15 +09:00
Seonghyun Kim
d7cf6a58ce Add self-hosted github action machine instead of using jenkins
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-31 13:04:31 +09:00
Seonghyun Kim
5c797fa5ac Add example of MultiThreadExecutor
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-30 11:14:37 +09:00
Seonghyun Kim
2bd31a2136 Implement MultiThreadExecutor on Java API
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-30 11:14:37 +09:00
Seonghyun Kim
5b91e4bb2d Update API
* add Promise builtin, Object::setLength apis on native & java

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-30 11:14:37 +09:00
Seonghyun Kim
bd4b29364b Implement setExtraData, extraData on JavaScriptObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-25 14:21:10 +09:00
Seonghyun Kim
f33168c6f6 Divide one big JNI file into multiple files
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-25 14:21:10 +09:00
HyukWoo Park
49fd86eae8 Enable try operation APIs only for test mode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-10-25 11:23:41 +09:00
HyukWoo Park
28f1f0fb0b Remove unused parameter in toBoolean method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-10-25 11:23:41 +09:00
HyukWoo Park
f77f28fa84 Fix an error in calculation of ExecutionPause length for Code Cache
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-10-25 11:20:43 +09:00
Seonghyun Kim
97e698db34 Fix bug with top-level-await with class variable init
* Prevent native stack overflow
* Fix bug in ExecutionState::inPauserScope

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-24 14:25:01 +09:00
HyukWoo Park
7f7d8c336d Apply TCO for sequence and logical operations located at the end of the return statement
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-10-23 16:03:30 +09:00
Seonghyun Kim
cdb47df97f Generate EscargotInfo.h file in CMAKE_BINARY_DIR/escargot_generated/ not on src
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-19 12:07:35 +09:00
Seonghyun Kim
98133d2206 Update Java API
* Check type on as{*} functions
* Add Context as argument for every callback
* Add Pending job option into evalScript function
* Move few create functions into child class
* Update build files

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-18 17:25:45 +09:00
HyukWoo Park
463d73023a Fix tests according to the update in stack tracing
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-10-17 17:46:14 +09:00
HyukWoo Park
f41a422302 Fix execution state traversal in stack tracing
* fix stack tracing to correctly add execution state in the middle of multiple state links
* remove redundant checks in stack tracing

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-10-17 17:46:14 +09:00
Seonghyun Kim
7697c00fef Add promise API in java layer
* Update android gradle version

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-11 19:02:40 +09:00
Seonghyun Kim
27f44f396d Use robin_map by add include directory instead of adding sub directory in cmake
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-10-05 17:39:41 +09:00
Seonghyun Kim
ae1ba12763 Update mac android build files
* Fix TypedArrayObject.prototye.indexOf bug

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-09-15 11:03:19 +09:00
HyukWoo Park
f79cdc8f0c Fix error in analysis action
* update wasm build of walrus

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-09-15 10:43:31 +09:00
HyukWoo Park
e7ab0df730 Add WASM build test
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-09-12 14:52:29 +09:00
HyukWoo Park
730853fecb Replace wasm engine with walrus
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-09-12 14:52:29 +09:00
Seonghyun Kim
ccb11a6ce1 Fix binary precedence bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-09-12 12:57:23 +09:00
Seonghyun Kim
f6cdc00259 Optimize TypedArrayObject.prototype.set, indexOf, lastIndexOf
* Update cmakefile

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-09-12 12:57:23 +09:00
Seonghyun Kim
2141345fc0 Fix async arrow function parser bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-09-01 13:33:00 +09:00
HyukWoo Park
f56ea256b4 Fix minor code defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-08-11 15:07:48 +09:00
HyukWoo Park
b09fdcb929 Replace redundant sandbox runs with try-catch statement
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-08-11 15:07:48 +09:00
HyukWoo Park
b980f68488 Fix minor code defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-07-25 10:47:49 +09:00
Seonghyun Kim
498966bca1 Implement riscv64 build support
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-24 16:57:25 +09:00
Seonghyun Kim
95aa9934a0 Add arm32 test
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-24 11:17:03 +09:00
Seonghyun Kim
87fda52727 Fix crash with ObjectStructureWithMap and inline cache
If inline cache refers ObjectStructure, ObjectStructure should keep its contents.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-20 10:58:53 +09:00
Seonghyun Kim
74735f9029 Update public API for using NewTarget from outside of escargot
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-18 18:58:52 +09:00
Seonghyun Kim
0c834fe76d Update Jenkinsfiles
* add arm64 version of jenkins
* fix arm64-gcc issue

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-18 16:44:16 +09:00
Seonghyun Kim
2cc4dc09c1 Update build files
* Fix build error on gcc-13
* User can use variables CMAKE_SYSTEM_NAME and CMAKE_SYSTEM_PROCESSOR for compile

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-17 10:04:23 +09:00
Seonghyun Kim
0927db97c5 Fix issues on ARM32
* convert Infinity into int64_t not produces same result with x86.
* Unaligned 8-byte access on ARM64 causes SIGBUS

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-17 10:04:23 +09:00
HyukWoo Park
78d2520e8b Fix code format of robin_map
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-07-14 13:31:37 +09:00
HyukWoo Park
7b207535e3 Fix minor defect
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-07-14 13:31:37 +09:00
Seonghyun Kim
4913754c32 Implement building with clang-cl
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-12 16:46:42 +09:00
Seonghyun Kim
da856ccac9 Implement Windows x64 UWP and x86 DLL build test on github action
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-12 16:46:42 +09:00
Seonghyun Kim
a2886b8db1 Update source and test driver for running test262 on windows
* Update test262 driver for python3 and windows
* Update DateFormat for windows
* Fix compiler warnings on Win64

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-07 09:20:04 +09:00
Seonghyun Kim
1353d2e1a5 update shell
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-07 09:20:04 +09:00
Seonghyun Kim
7946cb8d09 Use own vector instead of std::vector in robin_hash
* using std::vector with bdwgc can cause leak from std::vector

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-07 09:20:04 +09:00
Seonghyun Kim
67216fcac9 Replace gc-allocated std::{unordered_map,unordered_set} with robin-{map,set}
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-07 09:20:04 +09:00
Seonghyun Kim
e5ea30b06c Add robin-map library as third_party
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-07-07 09:20:04 +09:00
Seonghyun Kim
3a3ef88853 Implement building on Win64
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-06-29 10:12:59 +09:00
Seonghyun Kim
0596de75c8 Update windows build
* using cmake instead of maintain another files for windows
* delete own ICU build files for windows
* Fix some bugs running on windows

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-06-22 13:31:23 +09:00
Seonghyun Kim
3aaded1210 Use ucal_* API instead of vzone_* API of ICU
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-06-19 11:37:25 +09:00
Seonghyun Kim
34182762c1 Fix evaluation bug of UpdateExpression with MemberExpression
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-06-14 12:38:57 +09:00
Seonghyun Kim
9093a7244b Implment tizen build of escargot
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-06-14 12:38:57 +09:00
Seonghyun Kim
003d417972 Revise minor things
* Add dumping function for jsc-stress, chakracore, escargot test
* Fix wrong test datas and drivers
* Fix minor bug in yarr

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-06-07 15:32:57 +09:00
Seonghyun Kim
c352be9893 Use tryToUseAsIndex32 instead of toIndex in JSON string replacer
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-31 14:30:10 +09:00
HyukWoo Park
e84107d418 Remove unused parameters in ByteCode macro
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-31 12:49:24 +09:00
HyukWoo Park
e275ba66f5 Remove an unused variable in ALLOCA
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-31 12:49:24 +09:00
HyukWoo Park
7e68583b56 Fix a bug that interpreter reuses an argument buffer of caller in tail call
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-30 14:20:41 +09:00
Seonghyun Kim
0c1a12541b Update test driver
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-30 11:47:58 +09:00
Seonghyun Kim
66489b7660 Implement dumping and run v8 test
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-30 11:47:58 +09:00
Seonghyun Kim
3894bfec5d Enable more v8 tests
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-30 11:47:58 +09:00
Seonghyun Kim
e007a9d4eb Fix minor issues
* when computuing byteLength of ArrayBuffer,
we should use 64-bit integer regard to overflow
* Adding missing ASTAllocator::clear
* Proxy object should care infinity loop

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-30 11:47:58 +09:00
Seonghyun Kim
eb1380ea95 Implement SIGSEGV, SIGABRT handler for easier debugging on android
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-19 13:45:56 +09:00
Seonghyun Kim
9581488a11 Update test files regarding to dump and run spidermonkey on android
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-19 13:45:56 +09:00
HyukWoo Park
0285779f67 Expand TCO on nullish and conditional expression
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-11 15:57:28 +09:00
HyukWoo Park
f621248ccc Update tail calls not to generate End bytecode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-11 15:57:28 +09:00
Seonghyun Kim
015d4bd2bd Update java Runtime Exception processing in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-09 11:00:19 +09:00
Seonghyun Kim
930e5a7636 Process Java RuntimeException with JS exception instead of native exception
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-08 18:07:06 +09:00
HyukWoo Park
1fbf4872c7 Add a build option of tail call optimization
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-08 17:05:02 +09:00
Seonghyun Kim
b0106ced1c Update for android-JNI api
* Add ESCARGOT_BUILD_64BIT_FORCE_LARGE option to android build
* Don't ignore RuntimeExection of java

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-08 14:03:30 +09:00
HyukWoo Park
283873a291 Implement basic tail call optimization for normal function
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-03 11:18:25 +09:00
HyukWoo Park
0e0b759817 Include breakpoint bytecodes only for debugger mode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-05-03 11:18:25 +09:00
Seonghyun Kim
6fcb1afb47 Android should use large-64bit mode when exporting aar
+ set abort handler to bdwgc

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-05-02 17:56:35 +09:00
HyukWoo Park
02e9b999e9 Fix error in optional chaining
* should trigger an exception when callee or target object is indeed undefined in optional chaining

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-28 12:14:30 +09:00
Seonghyun Kim
f9c41a5c65 AssignmentExpressionSimpleNode should have own getRegsiter method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-27 16:21:18 +09:00
Seonghyun Kim
435c536848 Throw jni so load failed exception only if failed in linux, mac
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-27 16:21:18 +09:00
Seonghyun Kim
9a4371398f Update JNI build file and Java sources
* Add jacocoTestReport command to generate coverage

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-26 13:58:10 +09:00
Seonghyun Kim
25539bd485 Update JNI test case to count test case number
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-26 13:58:10 +09:00
Seonghyun Kim
9a29ca809d Use getprop command instead of ICU for getting system timezone
* Old version of ICU doesn't return IANA timezone id when call ucal_getDefaultTimeZone

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-24 16:45:45 +09:00
Seonghyun Kim
6a84aefa64 We need to check the callback was deleted before calling in FinalizationRegistryObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-24 16:45:45 +09:00
Seonghyun Kim
6b43e1c44a Fix float conversion problem
* Use Value(NanInit) function instead of Value(DoubleToIntConvertibleTestNeedsTag, double)
* in armeabi-v7a, Inf to int64_t can return unexpected value

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-24 16:45:45 +09:00
Seonghyun Kim
bcbbfe212d Reading float unaligned address raises SIGBUS in armeabi-v7a
* read unaligned address as int & turn off optimization

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-24 16:45:45 +09:00
HyukWoo Park
94c1a60de3 Update sam exclude file with comments
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-21 14:47:59 +09:00
HyukWoo Park
8f5311010e Make test scripts be compatible with python3
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-21 14:47:59 +09:00
Seonghyun Kim
7a98a9ba52 Update timezone and locale codes
* Use ICU function for reading default system timezone
* Update default locale reading logic(remove POSIX postfix & ignore 'C' locale)
* Refactor global timezone, vzone, tzname codes

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-20 20:48:23 +09:00
Seonghyun Kim
80fea01dd1 Update test262-runner and Android build files
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-20 20:48:23 +09:00
Seonghyun Kim
e4bb91a79f Use int8_t instead of char
* c++ spec not specify char is signed

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-20 20:48:23 +09:00
Seonghyun Kim
e4e7144f94 Fix bugs
* Replace strlen with strnlen in BuiltinRegExp
* Don't use compiler builtin atomic operation in ARM
* Atomics.isLockFree(4) always returns true

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-17 14:22:18 +09:00
Seonghyun Kim
e6e34a3a9d Implement dumping test262 data into disk for running test262 without python
* Implement test262 runner for test which is dumped by tool

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-17 11:00:16 +09:00
HyukWoo Park
c35bd083b5 Remove unused member in ByteCodeGenerateContext
* remove m_openedNonBlockEnvCount

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-17 09:16:01 +09:00
HyukWoo Park
c8cc70d83e Update Stack Overflow checker and disabler
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-17 09:16:01 +09:00
HyukWoo Park
4c144d0383 Update googletest to the latest release version
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-17 09:16:01 +09:00
Seonghyun Kim
fbbad63f6e Update android build files
* build libescargot as static in android
* Add native shell build in order to run test case on android
* Add missing license text for jni
* Update android shell app

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-10 20:02:17 +09:00
HyukWoo Park
16720128aa Update coverage scan
* schedule analysis actions to trigger on every monday, wednesday and friday
* add coverage result badge in README

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-10 16:30:43 +09:00
HyukWoo Park
fa917e8668 Revise github actions with coverage test
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-07 16:57:15 +09:00
Seonghyun Kim
dd010ab68e Divide Value::Value(double) into Value(DoubleToIntConvertibleTestNeedsTag, double) and Value(UnconvertibleDoubleToInt32 v)
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-06 16:41:23 +09:00
HyukWoo Park
3e1fa28c8f Release v4.0.0
* support ECMAScript2022
* enable WASM
* enable debugger and vscode extension
* enable multi target/platform builds
* optimize performance/memory
* fix bugs

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-05 13:26:23 +09:00
HyukWoo Park
8f475978f1 Fix a build warning in RuntimeICUBinder
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-05 13:26:23 +09:00
Seonghyun Kim
7414ebda02 Introduce new Value ctor for NaN, Infinity regard to fix arm clang issue
arm clang optimizer cannot generate correct code
with Value(std::numeric_limits<double>::quiet_NaN())
or Value(std::numeric_limits<double>::infinity())

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-04 14:12:32 +09:00
Seonghyun Kim
8b7456d330 Update android test shell and add arm clang test
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-04-04 14:12:32 +09:00
HyukWoo Park
7175b19a11 Update ahub exclude list
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
HyukWoo Park
4b3dec1d17 Relieve code complexity in intl modules
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
HyukWoo Park
adef94b097 Reduce code complexity in builtinStringReplace method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
HyukWoo Park
f4aebb65ba Reduce Cyclomatic Complexity (CC) in Intl and Date
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
HyukWoo Park
53289897e8 Add AssignmentExpressionNode interface
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
HyukWoo Park
bf3f885519 Remove cycle dependency from interpreter to parser
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
HyukWoo Park
2b31effd4f Remove cycle dependency in CodeBlock
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-04-03 11:22:51 +09:00
Seonghyun Kim
a6ec162bd8 Fix bugs
* if there is too big expression, bytecode generation can be failed
* fix some errors on 64-bit platform through using int

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-30 13:10:13 +09:00
Seonghyun Kim
496e3cee71 Update GCutil and build flags
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-30 13:10:13 +09:00
HyukWoo Park
de4c7eb0db Eliminate duplicated code
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-28 16:17:00 +09:00
HyukWoo Park
2046b1faa9 Divide Interpreter module into Interpreter and InterpreterSlowPath
* to reduce the total size of Interpreter module

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-28 16:17:00 +09:00
HyukWoo Park
9f93022d78 Unlink circular dependency between runtime and parser source codes
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-28 16:17:00 +09:00
HyukWoo Park
4ae794b901 Remove redundant header files
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-28 16:17:00 +09:00
HyukWoo Park
4d884e66c6 Remove duplicated code in ScriptParser
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-28 16:17:00 +09:00
HyukWoo Park
9e3ac3931c Reduce CyclomaticComplexity (CC) in Intl module
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-28 16:17:00 +09:00
HyukWoo Park
ef0b3d56ea Add exclude list for sam analysis
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-21 12:43:54 +09:00
Seonghyun Kim
ba9cb2b21a Every JNI method should check java-null-reference
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-21 09:55:23 +09:00
Seonghyun Kim
ce768a627e Add null checking for Object and Value functions in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-21 09:55:23 +09:00
Seonghyun Kim
3dba75cdaa Implement null check for VMInstance, Context, Evaluator in jni
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-21 09:55:23 +09:00
Seonghyun Kim
b3c9846f2a Update android test shell app & remove unused functions on android
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-21 09:55:23 +09:00
Seonghyun Kim
e0fbe20f01 Improve JNI memory management
* Delete local java ref if needs.
* Create local frame on callback.
* Reference list should be updated when object was deleted.
* We should not store non-js-heap value on java reference list

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-13 19:27:58 +09:00
Seonghyun Kim
8843d2682e Implement JavaScriptJavaCallbackFunctionObject
It has a Java callback what can be called from JavaScript

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-13 19:27:58 +09:00
HyukWoo Park
8d7e353073 Fill omitted member initializations
* fix minor code defects

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-13 17:29:13 +09:00
Seonghyun Kim
6e3220bb1d Prevent multiple escargot-jni so copying from multi thread or multi process
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-10 16:43:59 +09:00
Seonghyun Kim
c1d3b8c142 Implement FunctionObject and consturct expression for JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-10 16:43:59 +09:00
Seonghyun Kim
97cf33f533 Update RuntimeICUBinder
When dlopen icu so, we should try to load so with version like libicuuc.so.63

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-08 16:16:08 +09:00
Seonghyun Kim
559fa4e0fe Implement BigInt API in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-08 16:16:08 +09:00
Seonghyun Kim
22665e7ca2 Implement callable and call function in JNI layer
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-07 14:32:19 +09:00
Seonghyun Kim
8d4513054d Implement concurrent multithread support for java
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-07 14:32:19 +09:00
HyukWoo Park
22c8ca389e Fix minor code defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-03-06 15:22:53 +09:00
Seonghyun Kim
461cfab115 Reimplement JNI memory management
* Use PhantomReference and ReferenceQueue instead of finalizer.
  finalizer could be called by another thread like FinalizerDaemon and it is deprecated.

* Remove NativePointerHolder::destroy function.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-03 17:16:36 +09:00
Seonghyun Kim
e31f548e41 Add generate source and javadoc task in build.gradle
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 16:30:27 +09:00
Seonghyun Kim
e8ce2873b3 Implement GlobalObject and expose JSON.stringify, JSON.parse in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 16:30:27 +09:00
Seonghyun Kim
923edb3151 Implement ArrayObject api in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 16:30:27 +09:00
Seonghyun Kim
c995be8ca1 Implement basic Object api in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 10:00:12 +09:00
Seonghyun Kim
2894c6181d Update return type of Evaluator::evalScript in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 10:00:12 +09:00
Seonghyun Kim
54ad857db9 Implement more JavaScriptValue::to* methods in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 10:00:12 +09:00
Seonghyun Kim
3193067afa Update Bridge parameter and return type in JNI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 10:00:12 +09:00
Seonghyun Kim
546163f6a8 Implement java version of Value::toString, equalsTo, instanceOf and Symbol
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-03-02 10:00:12 +09:00
Seonghyun Kim
3d1ddbaca3 Implement bundleHostJar on android build
* jar file tries to copy so file into /tmp/ folder

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-02-23 10:01:44 +09:00
Seonghyun Kim
3ff6946e45 Implement JavaScriptString class on jni layer
* rename Value into JavaScriptValue

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-02-23 10:01:44 +09:00
Seonghyun Kim
95ca57fc98 Implement running android(jni) test on host machine infra
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-02-22 11:55:59 +09:00
Seonghyun Kim
00a7ec1df2 Implement basic android api for undefined, null, number values
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-02-22 11:55:59 +09:00
Seonghyun Kim
97fde1d04f Allow multiple init, deinit to Globals
* Update android testcases

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-02-20 20:54:23 +09:00
HyukWoo Park
eaa51dc506 Add a cmake option for tizen-x64 build
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-02-17 11:44:45 +09:00
HyukWoo Park
b23f53065e Fix to cache AVD upon each architecture
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-02-02 22:16:31 +09:00
HyukWoo Park
86b792ebe3 Enable build for Mac OS
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-02-02 22:16:31 +09:00
Seonghyun Kim
8d328cedf0 Introduce NativePointerHolder on java and add java finalize method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-02-02 09:56:25 +09:00
Seonghyun Kim
341c3fda5d We need to test both 32 and 64-bit on android
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-27 16:45:25 +09:00
Seonghyun Kim
f9246aa0b5 Add simple android API test and unit test & Update CI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-27 16:45:25 +09:00
Seonghyun Kim
64f3f2e514 Implement simple Bridge Java with JavaScript
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-26 18:39:40 +09:00
Seonghyun Kim
dd8fc32ec1 Implement initial version of android API
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-26 18:39:40 +09:00
Seonghyun Kim
ad5f086f63 Update README.md and CI
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-25 19:20:45 +09:00
Seonghyun Kim
0b11603af4 Add android build artifact
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-25 19:20:45 +09:00
Seonghyun Kim
f94ad89e4f Tizen aarch64 should use 64BIT_LARGE mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-17 14:20:53 +09:00
HyukWoo Park
2b11f2f56c Update actions to newly run and test on arm architectures
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-17 13:03:18 +09:00
HyukWoo Park
52ef2a57d6 Fix a typo in ARM CPU macro
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-17 13:03:18 +09:00
HyukWoo Park
4c5a226df4 Fix a bug in virtual stack access
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-17 13:03:18 +09:00
HyukWoo Park
3dfdcb3afc Eliminate a redundant compiler flag
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-17 13:03:18 +09:00
Seonghyun Kim
6002bb00b6 Fix Android build properties & fix interpreter for clang
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-12 17:04:03 +09:00
Seonghyun Kim
ea81b6f8ee Update android build flags
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2023-01-09 16:15:17 +09:00
HyukWoo Park
f6fa45162f Resolve CMake deprecation warning
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-05 10:44:31 +09:00
HyukWoo Park
81bcf2ed13 Enable threaded interpreter for arm64 architecture
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-05 10:44:31 +09:00
HyukWoo Park
85f02cb647 Unify CI environments as to ubuntu-latest
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-05 10:44:31 +09:00
HyukWoo Park
8d7334ef4b Fix troubles in ubuntu-22.04 environment
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2023-01-04 10:26:08 +09:00
HyukWoo Park
581f020176 Fix code defects found by cppcheck
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-11-11 09:48:25 +09:00
HyukWoo Park
867b30ae17 Upgrade actions version
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-11-11 09:46:53 +09:00
Csizi Gergő Lajos
8e1ea20583 Fix some Temporal issues
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-10-31 12:09:03 +09:00
Seonghyun Kim
ea0c2c4c82 Reduce ObjectStructure memory usage
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-10-28 09:46:07 +09:00
HyukWoo Park
cb31d43274 Fix minor defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-10-24 10:51:24 +09:00
HyukWoo Park
7049e81782 Fix test262 runner to print full result
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-10-11 11:25:32 +09:00
Csizi Gergő Lajos
837ced6e3e Add Addition and Subtraction operations for TemporalObjects
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-10-11 11:13:49 +09:00
Zoltan Herczeg
bd20dbf916 Rework plain date and time constructors
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-10-07 16:56:39 +09:00
HyukWoo Park
d7b08b00db Update ArrayBuffer with auto length
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-09-29 11:57:58 +09:00
Seonghyun Kim
15db6c3c2e Update Identifier parsing rule regarding to unicode 14 & fix parser bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-29 10:43:21 +09:00
Seonghyun Kim
87c8a581bd Remove useless peekChar calling in Lexer::lex
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-29 10:43:21 +09:00
Zoltan Herczeg
135ee35c54 Pass optimization flags to wabt in release
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-09-29 10:42:35 +09:00
Seonghyun Kim
d698343196 Remove busy waiting & fix memory bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-29 10:34:59 +09:00
Seonghyun Kim
682f176d6d Implement Atomics.waitAsync
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-29 10:34:59 +09:00
Zoltan Herczeg
c1b02c23e0 Support dynamic import of JSON modules
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-09-29 10:33:58 +09:00
Gergo Csizi
920be3b9d0 Add TemporalZonedDateTime object
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-09-23 10:16:15 +09:00
HyukWoo Park
90e3e6f474 Remove wrong assertions in Temporal
* this value could be a Value other than Object in Temporal builtin functions

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-09-19 13:14:52 +09:00
HyukWoo Park
dcd7179b09 Update test262 to the latest version
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-09-19 13:14:52 +09:00
Seonghyun Kim
693dcf114c Implement PrivateIdentifier in ... expression
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-16 14:39:58 +09:00
HyukWoo Park
2f634771af Refactor BufferAddressObserver
* remove redundant slots
* rename observer callback

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-09-15 15:24:58 +09:00
Seonghyun Kim
24d80757bd Update byteLength and arrayLength of TypedArrayObject when ArrayObject.prototype.resize is called
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-14 18:28:03 +09:00
HyukWoo Park
7d59581294 Fix wrong code in Array.prototype.at
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-09-14 11:07:48 +09:00
HyukWoo Park
a1698590b3 Fix minor defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-09-14 11:07:48 +09:00
Zoltan Herczeg
3a0b874a7e Implement JSON module parsing
Currently only the import statement is supported

Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-09-13 16:46:36 +09:00
Seonghyun Kim
b992df9a06 Fix wrong assert in JSGetterSetter
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-09-07 18:38:50 +09:00
Zoltan Herczeg
fd81fa4e52 Support more class static initializer features
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-08-31 14:53:28 +09:00
Gergo Csizi
7852ed629b Add TemporalTimeZone object
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-08-31 14:53:06 +09:00
Zoltan Herczeg
afa8f4aecc Move JSON parse / stringify operations into runtime
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-08-30 17:46:11 +09:00
Seonghyun Kim
6f9f2d1f5d When parsing function parameter with pattern,
we should update isAssignmentTarget variable.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-08-30 17:45:31 +09:00
Zoltan Herczeg
289c3bdabb Reduce keyword comparisons in the parser
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-08-30 11:02:52 +09:00
Zoltan Herczeg
1a5414a0ba Support class static initializers
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-08-22 15:21:50 +09:00
Gergo Csizi
a7ddbe9eb5 Rename Temporal classes and simplify code
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-08-17 15:35:29 +09:00
Gergo Csizi
2cadeba54c Add TemporalPlainMonthDay object
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-08-12 11:31:18 +09:00
Gergo Csizi
17b089db85 Add TemporalInstant object
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-08-10 15:09:10 +09:00
Gergo Csizi
d055deea48 Add TemporalPlainYearMonth object
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-08-08 16:24:55 +09:00
HyukWoo Park
d2a17f09cd Update finalizer with shrink function
* add shrink function to resize finalizer list
* shrink the list when about an half of the list is empty

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-08-03 16:40:35 +09:00
Zoltan Herczeg
c3dbe442ef Further reduce string comparisons in the parser
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-08-01 15:23:13 +09:00
HyukWoo Park
bf1ff52089 Fix finalizer to prevent any possible memory defect
* replace erase operation of vector with non-memory operations
* erase operation requires additional memory allocations which may incur other GC in sequence
* fix GCutil to make gc finalizer not to be invoked in nested calls
2022-08-01 13:28:00 +09:00
HyukWoo Park
b700d08424 Fix TypedArray access
* clearly declare each GC member of ArrayBuffer
* add detached buffer check in TypedArray access

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-08-01 13:28:00 +09:00
HyukWoo Park
3d7729c96b Fix a minor memory access defect
* for non-argument call case, interpreter may access a too far stack address which will never be read
* fix typos in ArrayExpressionNode too

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-08-01 13:28:00 +09:00
HyukWoo Park
5eca40faec Change BigInt operations as to constant functions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-08-01 13:26:41 +09:00
HyukWoo Park
13adaf9ad6 Fix gcc warning about strict-aliasing
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-07-27 16:01:53 +09:00
Zoltan Herczeg
b476b72ea2 Improve keyword handling in the parser
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-07-27 16:01:28 +09:00
HyukWoo Park
a2bcfd2e9b Replace character string with basic AtomicString
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-07-27 16:00:09 +09:00
HyukWoo Park
b165161ae8 Update the version of ICU in CI
* update the ICU version to 70 because previous 67 version has been deleted in archive

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-07-27 15:59:14 +09:00
Gergo Csizi
2103db26e9 Fix some Temporal issues
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-07-19 16:46:50 +09:00
HyukWoo Park
8b8c13db7d Remove unnecessary bytecode generation in callee initialization
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-07-15 15:31:37 +09:00
HyukWoo Park
79c3b4c73f Fix a bug in explicitly declared funtion name with exception case
* remove a redundant bytecode addition in node line info calculation

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-07-15 15:31:37 +09:00
Gergo Csizi
da449c8797 Add TemporalDuration
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-07-12 11:11:00 +09:00
Seonghyun Kim
65baa3944e Fix parsing async arrow function bug
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-06-30 11:29:39 +09:00
HyukWoo Park
bb350fc8fd Remove a redundant cmake flag
* DEBUGGER flag removed

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-06-29 19:51:33 +09:00
Gergo Csizi
2806a898f2 Add TemporalPlainTime
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-06-27 13:27:49 +09:00
Zoltan Herczeg
28817212d7 Improve the text of wait before exit
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-06-27 13:26:33 +09:00
HyukWoo Park
3bdf67dc83 Update WebAssembly engine version
* update wabt to v1.0.29

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-06-24 11:09:53 +09:00
Gergo Csizi
d21dde719c Rewrite the ISO8601 parser
The previous parser implementation didn't parse valid ISO8601 strings.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-06-24 11:09:23 +09:00
HyukWoo Park
f23646ca1b Fix debugger to match with the updated vscode extension
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-06-24 11:09:13 +09:00
HyukWoo Park
944d244e0a Add code owner
* add @zherczeg as a code owner of debugger

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-06-24 11:09:13 +09:00
Seonghyun Kim
e7b1cb2dde Revise FillOpcodeTable operation by using inline asm label.
we can remove one if-statement in interpreter through this commit.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-06-24 10:32:13 +09:00
Seonghyun Kim
2678a383ec Improve dealing way of program counter in interpreter
* Use direct address instead of using offset of program when calling interpreter
* We don't need to restore the pointer of program counter in ExecutionState

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-06-24 10:32:13 +09:00
Gergo Csizi
2e2b6a8398 Add getters for PlainDate, PlainDateTime and Calendar
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-06-17 13:28:51 +09:00
HyukWoo Park
430006301b Fix minor defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-06-15 09:36:32 +09:00
Seonghyun Kim
93a0e853fe Implement inline cache version of get object opcode. Replace the opcode in runtime.
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-06-15 09:36:00 +09:00
Seonghyun Kim
633df26291 Reduce sizeof GetObjectPreComputedCase by 1-word
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-06-15 09:36:00 +09:00
Gergo Csizi
0980c57817 Add TemporalPlainDateTime, TemporalPlainDate objects
Basic implementation of TemporalPlainDateTime, TemporalPlainDate.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-05-27 14:57:22 +09:00
Zoltan Herczeg
ae893f84c6 Support eval code debugging
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-05-27 14:57:08 +09:00
Seonghyun Kim
25771515ff Merge Equals, NotEquals binary opcodes into one opcode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-27 09:54:04 +09:00
HyukWoo Park
f486922d87 Remove redundant string allocation in debugger
* no need to newly allocate string for string send
* sendString takes a constant string to guarantee that send operation would not modify the original string

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-05-23 16:02:45 +09:00
HyukWoo Park
488de00180 Directly insert properties for builtin objects
* replace defineOwnProperty with directDefineOwnProperty method
* directly insert new properties for builtin objects

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-05-23 16:02:33 +09:00
Seonghyun Kim
3a5f883ad4 Allow to save Int32 convertible double value as double in Value for performance
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-23 16:02:20 +09:00
Seonghyun Kim
2737ccd987 Update Value constructors
Improve Value::Value(double) performance.
Add missing double and int32 type testing on interpreter

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-23 16:02:20 +09:00
HyukWoo Park
ebd5a42641 Fix backtrace info within eval code
* collect backtrace info including eval codes

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-05-20 08:44:14 +09:00
Zoltan Herczeg
de7aae0eba Support WebSocket close
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-05-20 08:43:32 +09:00
HyukWoo Park
786cb68d27 Fix the type of prototype in Temporal
* prototype object of Temporal should be ordinary object
* fix the type of prototype as to PrototypeObject

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-05-11 15:59:43 +09:00
HyukWoo Park
8fa6031fec Add DerivedObject for sub classes of Object
* check index property set in DerivedObject::defineOwnProperty method only
* index property check is removed for normal Object because PrototypeObject would check it instead

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-05-11 15:59:43 +09:00
Gergo Csizi
1763b6f38d Add Temporal JavaScript feature
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-05-06 19:58:51 +09:00
Seonghyun Kim
04eb482d1e Add Object::constructorName API
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-03 19:05:38 +09:00
Seonghyun Kim
3d7bbe9c6a Update function name & init member variables in debug mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-03 18:47:43 +09:00
Seonghyun Kim
4ed055e82c Add special method for add property in object what was not existent.
the new method not check the existent of proeprty.
it can used for builtin-functions

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-03 18:47:43 +09:00
Seonghyun Kim
64403a2ea2 Implement get fast source, flags proeprty for RegExpObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-03 18:47:43 +09:00
Seonghyun Kim
f61cf477f4 Improve yarr performance
* In interpreter we can use ByteTerm* instead of int for program counter
* Too big inline function is not good for performance
* considering utf-16 string is only needed for UChar not LChar

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-05-03 18:47:43 +09:00
Gergo Csizi
856a1e2045 Show information about new generated test262 excludelist
After update the excludelist with make_excludelist.py it doesn't gave
information about failing and new passing tests. This patch will fix this.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-04-29 17:03:03 +09:00
HyukWoo Park
0f034c7f0b Mark non-fast mode ArrayObject by existing fast-mode data
* set dummy element address to denote non-fast mode array
* represent non-fast mode array without creating ObjectRareData

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-25 10:47:32 +09:00
HyukWoo Park
d231bc0800 Rename tagging operations
* rename tagging operations to clearly recognize typeTag and tag (vtable address)
* add global tag values for ScriptSimpleFunctionObject

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-22 16:11:56 +09:00
HyukWoo Park
de11a8a032 Fix uninitialized address usage in StringBuilder
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-22 16:11:56 +09:00
Seonghyun Kim
4cec2cda5a Remove useless comment
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-22 16:11:23 +09:00
Seonghyun Kim
83e4254ed0 Fix bug in Vector
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-22 16:11:23 +09:00
Seonghyun Kim
8eb836f60d TypedArrayObject should have raw buffer directly.
For achieve it, I add BufferAddressObserverManager.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-22 16:11:23 +09:00
Seonghyun Kim
71a6afeaae Improve accessing TypedArray Performance
Add Object::getIndexedPropertyValue method for achive that
the function removes redundant creation of ObjectGetResult.
And Improve TypedArray object reading performance through better implementation

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-22 16:11:23 +09:00
HyukWoo Park
467ca4708f Fix minor debugger error
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-20 17:18:47 +09:00
HyukWoo Park
48b59453c6 Handle getting of undefined value by simple literal loading
* undefined value is obtained through GlobalVariableGet bytecode
* convert this case into simple LoadLiteral bytecode

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-19 13:37:13 +09:00
HyukWoo Park
9f901623dd Enable first breakpoint for Script created by initializeFunctionScript
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-18 17:19:19 +09:00
HyukWoo Park
02aac43bcf Minor fix for debugger
* debugger always stops at the start of new Script execution
* BreakpointLocationsInfo is added to debugger when Escargot generates bytecode for execution only

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-18 17:19:19 +09:00
Seonghyun Kim
705b959d3f Remove useless ObjectRareData allocation in RegExpObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-18 17:15:36 +09:00
Seonghyun Kim
292ead9d73 Implement checking update ArrayObject while enumerate
We can find disappered index without using the flag

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-18 17:15:36 +09:00
Seonghyun Kim
ba7c596e59 Implement PrototypeObject
PrototypeObject always returns true in Object::isEverSetAsPrototypeObject.
thus it don't need another space for mark it was used for prototype object.
this object can reduce a lots allocation of ObjectRaraData

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-18 17:15:36 +09:00
HyukWoo Park
ab86e7137c Fix wrong node position in switch statement
* switch statement has the last location in switch block which incurs an index error in BreakPoint insertion
* fix switch statement to have the start position after switch keyword

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-18 17:13:58 +09:00
Zoltan Herczeg
03c8cf55e2 Fix tcp connection available check in the debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-04-14 16:38:11 +09:00
HyukWoo Park
a25c6fa5e8 Add a specific API to create a Script by wrapping the source code with an anonymous function
* `initializeFunctionScript` API is added
* unlike dynamically created function, `initializeFunctionScript` supports debugger
* origin line offset is added for correct source code calculation in debugger

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-14 10:57:47 +09:00
HyukWoo Park
d3f6ef74f9 Add ErrorThrowCallback API
* ErrorThrowCallback is invoked when an Error is thrown
* ErrorThrowCallback overwrites the result of ErrorCreationCallback

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-13 15:22:59 +09:00
Zoltan Herczeg
49c40cd26e Implement object store in the debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-04-12 14:13:56 +09:00
Seonghyun Kim
35c6836f2e Divide get object inline cache into 2 case
Divice get object inline cache into simple and complex cases
the simple case should test just one object chain with plain data property
the complex case should consider every case of inline cache

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-12 12:01:08 +09:00
Seonghyun Kim
18707ead9e Store Value instead of dobule in NumberInEncodedValue.
store double can cause type test cost for `the double is Int32`
If store double valus as Value, the test cost disapper

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-12 11:35:25 +09:00
Seonghyun Kim
f4d0b2c940 Improve array get, set performance in interpreter
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-08 10:26:23 +09:00
Seonghyun Kim
9eab9b21f4 Cache data address of ArrayBuffer for improve performance
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-08 10:26:23 +09:00
HyukWoo Park
09c78e357d Fix a minor bug in DoubleInEncodedValue conversion
* DoubleInEncodedValue might have an integer value that is also not a small integer (SMI)
* When converting to Value, DoubleInEncodedValue should be correctly converted to the original value using Value(double) constructor
* fix test runner to run cctest for x86 environment

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-08 10:25:12 +09:00
HyukWoo Park
160c6b3183 Update fast construct method for ScriptSimpleFunctionObject
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-06 09:55:14 +09:00
HyukWoo Park
d0716850af Rename required register numbers for ByteCodeBlock
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-06 09:55:14 +09:00
HyukWoo Park
2593b3cabe Do not notify bytecode release for debugging-unmarked function
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-04-05 11:19:46 +09:00
Seonghyun Kim
45eaf29c4c Reimplement object set inline cache to store multiple item of inline cache
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-05 11:18:18 +09:00
Seonghyun Kim
e6ff2808c8 Fix get object inline cache bug
we must convert form of inline cache when find complex case(max index is greater than 1) of get object.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-04-05 11:18:18 +09:00
Seonghyun Kim
635c609330 Refactor DoubleInEncodedValue
I store its tag information in the same location with PointerValues
It can reduce memory access count when finding type

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-31 14:30:42 +09:00
Zoltan Herczeg
21d0e6aa42 Implement scope chain property enumeration in the debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-03-28 17:15:34 +09:00
Seonghyun Kim
9be98a8082 Improve Value <-> EncodedValue conversion performance
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-28 14:39:52 +09:00
Seonghyun Kim
ebf4756480 Binding function object in interpreter and compute required stack size early
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-28 14:39:52 +09:00
Seonghyun Kim
b76294bcca Init local stack allocated var values in interpreter
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-28 14:39:52 +09:00
HyukWoo Park
a84b75d407 Update ErrorCreationCallback handling to ignore adding stackdata into stack property
* if ErrorCreationCallback is registered and this callback already inserts `stack` property for evert created ErrorObject,
  we just ignore adding `stack` data into ErrorObject

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-28 10:38:47 +09:00
HyukWoo Park
de9c7cefd9 Mark String::emptyString as source of AtomicString
* String::emptyString is the default string value of empty AtomicString
* so, mark emptyString as source of AtomicString too

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-28 10:36:37 +09:00
HyukWoo Park
1b38eeca32 Update Debugger to selectively generate debugging byte codes
* we can choose JS source code for debugging target
* selectively generating debugging byte code (breakpoint)
* add debugger init option (--skip=) to exclude certain source code from debugging
* rename debugger functions
* explicitly present the python version for debugger tool

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-25 17:41:23 +09:00
Seonghyun Kim
c9f14d2a87 Implement ScriptSimpleFunctionObject for enhance function call performance
many general function can use ScriptSimpleFunctionObject.
It has simple call operation

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-23 10:53:36 +09:00
HyukWoo Park
8ed787168c Minor fix in Promise reject callback
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-23 10:53:04 +09:00
Seonghyun Kim
91223b79ab Fix symbol lookup error on FunctionTemplate
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-21 09:00:40 +09:00
HyukWoo Park
2c83b022f3 Update PromiseRejectCallback for PromiseHandlerAddedAfterReject event
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-16 14:46:39 +09:00
Seonghyun Kim
5d984c935c Implement fast path of get symbol from object.
the path is used on Value::instanceOf and Value::toPrimitiveSlowCase

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-16 14:46:17 +09:00
Seonghyun Kim
6d5a1ce7ac Revise object get inline cache
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-14 14:32:57 +09:00
Seonghyun Kim
f79a169daa Improve enumerate performance
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-14 14:32:57 +09:00
Seonghyun Kim
a484082e44 Reduce memory usage
* remove useless GC_MALLOC_EXPLICITLY_TYPED
  typed-malloc information is allocated with each malloc operation

* Implement fast path for ObjectPropertyName

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-14 14:32:57 +09:00
Boram Bae
ada969cc24 Improve object enumeration performance
Signed-off-by: Boram Bae <boram21.bae@samsung.com>
2022-03-11 13:59:14 +09:00
HyukWoo Park
716ff17dd7 Update PromiseRejectCallback
* PromiseRejectCallback is invoked when a Promise is rejected but it does not have any reject handler

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-10 15:35:36 +09:00
Seonghyun Kim
9a1060f48c Refactor basic String classes
* Implement String with inline buffer. this reduce malloc count & reduce memory usage
* Remove typed-gc-malloc from some classes.
  typed malloc classes should have storage for descriptor each malloc.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-08 16:27:33 +09:00
HyukWoo Park
ac6b7106b9 Optimize string comparison with typeof operation
* insert AtomicString for typeof strings by parser
* refactoring equal operations

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-07 13:35:51 +09:00
HyukWoo Park
47530e7ebb Optimize Object::getPrototypeFromConstructor for function case
* quickly get `prototype` property of function object

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-03-07 13:34:21 +09:00
Boram Bae
006c9e91a0 Use memset instead of loop
Signed-off-by: Boram Bae <boram21.bae@samsung.com>
2022-03-07 13:34:02 +09:00
Boram Bae
3d83a5fd47 Use original desc if this and receiver are same
* This way you can reduce the getOwnProperty calls.

Signed-off-by: Boram Bae <boram21.bae@samsung.com>
2022-03-03 18:16:30 +09:00
Seonghyun Kim
e245fe2871 Implement InlineCache in Object initialize
* Prevent too many recursive call with RopeString::charAt
* Add option to configure ObjectStructure

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-03 15:31:38 +09:00
Boram Bae
9beb788245 Update based on review
Signed-off-by: Boram Bae <boram21.bae@samsung.com>
2022-03-02 14:49:49 +09:00
Boram Bae
97ba88bc86 Use arrayLength for length property if possible
Signed-off-by: Boram Bae <boram21.bae@samsung.com>
2022-03-02 14:49:49 +09:00
Seonghyun Kim
4d69bed6c5 Improve performance little
* divide Value::toBoolean into 2 functions for better function call inlinling
* try to avoid call RopeString::flattenRopeString if possible
  flatten RopeString for read one char is waste I think

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-03-02 14:48:18 +09:00
Seonghyun Kim
925543bc15 Turn on inline cache for array, arguments object
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-02-23 13:47:03 +09:00
Boram Bae
9367246301 Use a static string If a char belongs to ASCII
Signed-off-by: Boram Bae <boram21.bae@samsung.com>
2022-02-23 13:38:57 +09:00
HyukWoo Park
ea5c495733 Optimize enumeration of object without index property case
* directly insert property key when there is no index property name
* add hasOwnEnumeration function because some Objects(Array, Proxy...) possibly have index properties
but we cannot know this in advance with hasIndexPropertyName() function

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-02-22 20:02:15 +09:00
Gergo Csizi
38ec2cbefa Fix crash in the debugger
If Escargot is compiled with debugger but run without the debug server
then the Escargot will crash. This patch will fix this problem.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-02-22 10:06:56 +09:00
HyukWoo Park
375e2b7dc2 Update version of WASM engine
* enable exception in wabt engine because Escargot function invoked from wasm function could trigger an exception
* fix compile warning
* fix Thread to be reclaimed after each wasm function call
* extend wasm gc interval

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-02-22 10:06:37 +09:00
HyukWoo Park
f6eeb2c1fc Fix source name to always have valid string value
* set empty string for no name case

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-02-08 18:54:32 +09:00
Zoltan Herczeg
92a8db40c8 Implement scope chain retrieval
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-02-08 18:53:38 +09:00
Gergo Csizi
bc02ddc1fa clean up the debugger
Removed unnecessary semicolons and brackets.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-01-28 10:25:24 +09:00
Gergo Csizi
64b0d56ccb Migrate the debugger from python2 to python3
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-01-27 11:28:55 +09:00
Seonghyun Kim
8fc73a6e13 Update script module API
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-01-21 10:19:49 +09:00
Gergo Csizi
3a20bde083 Remove unused exception argument from debugger
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-01-19 21:12:34 +09:00
HyukWoo Park
ba540cd129 Remove redundant structures in stack tracing
* stack trace vector does not need to hold ExecutionState vector

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-01-18 15:28:21 +09:00
HyukWoo Park
913bcc7882 Rename StackTrace structures
* to clearly distinguish StackTraceData and StackTraceDataVector

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-01-18 15:28:21 +09:00
Gergo Csizi
4bbd9d6cc6 Add breakpoint at the end of script execution
With --wait-before-exit it can be turned on in the debugger-server or in the debugger-client.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2022-01-18 15:27:35 +09:00
HyukWoo Park
bd35e41168 Add setName API of FunctionObject
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-01-13 13:24:09 +09:00
HyukWoo Park
ba1021cc14 Re-align property order of FunctionTemplete according to FunctionObject property order
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-01-13 13:24:09 +09:00
SeongHyun Kim
0af32fafde Implement build for Windows UWP
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-01-12 13:44:04 +09:00
HyukWoo Park
f0b058ec5b Fix ByteCodeBlock nullify in gc callback
* we need to reset ByteCodeBlock only for normal functions
* add assertion to check invalid operation

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-01-11 17:31:48 +09:00
Seonghyun Kim
067d3c4d86 Fix crash with using let, for and {break or continue} together
m_complexJumpContinueIgnoreCount, m_complexJumpBreakIgnoreCount are
should follow size of m_recursiveStatementStack

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2022-01-05 13:36:36 +09:00
Seonghyun Kim
b1b505ae42 disable gc while calling Object finalizer 2022-01-05 13:36:36 +09:00
Zoltan Herczeg
a80e5f285c Implement eval in debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2022-01-03 17:07:48 +09:00
HyukWoo Park
e2758f5a2c Add createFunction API with source name parameter
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2022-01-03 11:28:48 +09:00
Seonghyun Kim
400507c0f3 Treat parsingEnabled flag in Debugger correctly
* turn on parserEnable flag in ScriptParser only
* Always store breakpointLocations in debugger(debugger can be turn on later)

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-12-29 15:58:08 +09:00
Seonghyun Kim
f44b380f16 Implement --accept-timeout option on DebuggerRemote
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-12-29 15:58:08 +09:00
Seonghyun Kim
de02b5453f Add callee into StackTraceData
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-12-28 10:31:15 +09:00
Zoltan Herczeg
8ba5e690cb Implement backtrace getting in the Debugger API
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-12-21 17:27:21 +09:00
Seonghyun Kim
ba1393c8e1 Add InlineStorage for FunctionEnvironmentRecordOnHeap
for runnung octane, we should make 1.05M copies of FunctionEnvironmentRecordOnHeap.
but almost copies(0.84M) of FunctionEnvironmentRecordOnHeap use under 5 heapStorage.
If we inline heapStorage, we can reduce count of GC_MALLOC.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-12-20 18:04:35 +09:00
HyukWoo Park
c7c7320f5a Add reference counter in ReloadableString
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-12-16 13:32:46 +09:00
HyukWoo Park
5e8524bf8b Add reference counter in CompressibleString
* remove stack searching for CompressibleString usage
* add reference counter and update it whenever each StringBufferAccessData is created and descturcted

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-12-16 13:32:46 +09:00
Zoltan Herczeg
8d584f10a0 Implement stop at breakpoint in C-API debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-12-16 10:59:47 +09:00
Zoltan Herczeg
a481cd6dd8 Start creating a debugger API
- The debugger callbacks are implemented as class
- Using std::vector for storing data

Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-12-10 16:46:22 +09:00
Seonghyun Kim
e99603ae66 Remove defines from EscargotPublic.h
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-12-10 12:46:07 +09:00
Seonghyun Kim
faf8db179c Fix error in DebuggerTcp::isThereAnyEvent
if there is remained receive buffer data,
user should call receive function again

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-12-10 12:45:32 +09:00
HyukWoo Park
8c51b7c9a6 Fix bugs in debugger
* fix debugger to add breakpoint at the first line
* fix debugger not to insert any breakpoint when compiling dynamic code
* add some assertion code to detect undesirable cases

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-12-03 11:57:22 +09:00
Gergo Csizi
eb509d32bd Fix delete operation in the debugger
The delete operation did not work with breakpoint index.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2021-12-01 17:07:34 +09:00
Gergo Csizi
45675c8b0b Add --command argument for the debugger
--command takes one string which contains commands to be executed at the start of the program.
The commands must be separated with semicolon.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2021-12-01 16:50:16 +09:00
HyukWoo Park
f68ca49933 Implement SharedArrayBuffer.prototype.grow builtin method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-29 10:38:11 +09:00
Seonghyun Kim
3e6afe1c50 Improve debugger function
* Implement port option
* Set 'this' value correctly for eval in debugger
* Implement eval without stopping state
* Implement pumpDebuggerEvents function
* Remove useless variable m_thisExpressionIndex in class context information

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-11-26 15:11:49 +09:00
HyukWoo Park
01f988160a Fix slow test run in actions
* exclude octane test for small configuration due to low performance

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-26 14:23:49 +09:00
Zoltan Herczeg
56157aaa74 Simplify the parsing API of the debugger.
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-11-26 14:00:03 +09:00
Gergo Csizi
ff2c8073b7 Fix crash in debugger
There was a crash in debugger when a not existing variable was printed or evaluated.
This patch will fix this issue.

Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2021-11-25 14:27:09 +09:00
Zoltan Herczeg
d79eb6f9e1 Hide debugger enabled from public use.
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-11-23 16:51:06 +09:00
Zoltan Herczeg
e3b1a9f5e6 Introduce abstract base class for debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-11-23 10:52:17 +09:00
HyukWoo Park
12c91f055c Fix atomic operations
* simplify atomicOperation function
* merge all atomic operations into SharedArrayBufferObject's member function
* fix slice builtin method to correctly perform operation atomically

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-22 15:02:25 +09:00
Gergo Csizi
9f0574a8bd Add p command for the debugger
Signed-off-by: Gergo Csizi gergocs@inf.u-szeged.hu
2021-11-22 10:14:30 +09:00
HyukWoo Park
ab15bd5574 Implement setIndexedPropertyHandler for ObjectTemplate
* rename data related to PropertyHandler
* refactoring ObjectWithPropertyHandler to handle NamedProperty and IndexedProperty both
* add cctest

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-17 17:22:35 +09:00
HyukWoo Park
fa052c8902 Refactoring ObjectTemplate's PropertyHandler
* update to common PropertyHandler data and strucuture to represent IndexedProperty and NamedProperty both
* check property name in each ObjectWithPropertyHandler method

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-17 17:22:35 +09:00
Zoltan Herczeg
67131c43cd Fix execution resume after setting a breakpoint.
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-11-15 12:02:37 +09:00
HyukWoo Park
5784b5096d Implement getter built-in methods of growable SharedArrayBuffer
* implement internal resizable sharedarray data
* update growable and maxByteLength getter builtin methods

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-11 15:20:43 +09:00
HyukWoo Park
de48b644dc Update test262 testsuite version
* update test262 to the latest version (commit id: 1ad9bb)

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-11 15:20:43 +09:00
HyukWoo Park
ba8b499800 Trivial defect fix
* replace toPropertyKey with ObjectPropertyName constructor
* remove unused MetaNode in parsing

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-11 09:44:00 +09:00
Mate Dabis
7b400aa58f Fix python version for escargot debugger
Signed-off-by: Mate Dabis <mdabis@inf.u-szeged.hu>
2021-11-10 14:53:11 +09:00
HyukWoo Park
c295ee69e1 Refactoring createFunctionSourceFromScriptSource
* use memcpy for string merging
* remove unused functions

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-10 14:52:54 +09:00
HyukWoo Park
239e0683f8 Enable created function's format check only for non-reloadable string in test mode
* format check requires double-parsing for the same source string
* format check is necessary to filter out a few format cases only
* in general mode, format check is limited to speed up the function creation process

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-10 14:52:54 +09:00
Mate Dabis
a5035c4ad8 Fix argument checking for b (break) command in python debugger
Signed-off-by: Mate Dabis <mdabis@inf.u-szeged.hu>
2021-11-10 14:52:11 +09:00
HyukWoo Park
f47def1f22 Replace TemplatePropertyName with existing ObjectStructurePropertyName
* usually property name is delivered as Value format
* replace `TemplatePropertyName` with `ObjectStructurePropertyName` to handle Value format nicely

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-10 14:51:47 +09:00
HyukWoo Park
30f3b3a348 Revise createFunctionSourceFromScriptSource
* add simple syntax checker method in parser to check parameters and body string
* fix it to check parameters and body string seperately
* add several TCs for this patch too

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-11-01 17:03:58 +09:00
Seonghyun Kim
8986e222f4 Fix compile error on gcc version 5
gcc version 5 cannot decide how many bits are require for enum well
if there is enum has type. it generates warning but we don't need to set type into enum for gcc 5

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-29 12:38:57 +09:00
HyukWoo Park
4366a01196 Update customized logging
* enabled by ESCARGOT_USE_CUSTOM_LOGGING flag
* user can registers customized logging through Platform's inherited functions

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-29 12:30:46 +09:00
HyukWoo Park
78b1aa7d2e Update lint checker to include cctest file
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-29 12:30:32 +09:00
HyukWoo Park
18449ff9a6 Implement resizable ArrayBuffer
* update some new features of resizable ArrayBuffer

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-29 12:30:32 +09:00
SeongHyun Kim
c1a5a53bb7 Mark enum as unsigned
we need to mark enum as unsigned.
because processing enum in msvc is little different

ex) enum Type { A, B }
struct Foo { Type type: 1; }
Foo f; f.type = 1;
if (f.type == Type::B) { puts("failed in msvc."); }

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-28 12:21:12 +09:00
SeongHyun Kim
110359e4db Update source & build files for windows
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
Signed-off-by: SeongHyun Kim <sh8281.kim@samsung.com>
2021-10-25 18:48:10 +09:00
Seonghyun Kim
eeb15679c5 we should reset firstCoverInitializedNameError when skipping arrow function in parser
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-25 13:55:02 +09:00
Mate Dabis
5530392636 Fix argument checking for object command in python debugger
JerryScript-DCO-1.0-Signed-off-by: Mate Dabis mdabis@inf.u-szeged.hu
2021-10-21 13:13:46 +09:00
HyukWoo Park
01d6ed1047 Fix Template to inherit parent's NativeDataAccessorProperties
* according to api, ObjectTemplate should inherit its parent's NativeDataAccessorProperties of InstanceTemplate too

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-18 15:16:25 +09:00
Seonghyun Kim
848873c6c7 Implement special case for Function constructor with ReloadableString
* Add new api for Function::create

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-18 13:34:28 +09:00
Seonghyun Kim
765ccac4d7 Fix compile error in release mode with debugger
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-18 13:34:28 +09:00
HyukWoo Park
711d75f500 Fix minor defects
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-14 18:37:06 +09:00
Seonghyun Kim
b6b0c9a1b6 We should notify what length means stringLength or bufferLength
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-14 18:30:52 +09:00
Seonghyun Kim
1091bcecd9 Cache of lastBreakpointInfo in ByteCodeGenerator is not always advancing
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-10-14 18:30:52 +09:00
Ryan Hyun Choi
e479b456a9 Fix SharedArrayBuffer's create()
* Enable threading in api-test
* Add a SharedArrayBuffer test

Signed-off-by: Ryan Choi <ryan.choi@samsung.com>
2021-10-14 16:43:10 +09:00
Zoltan Herczeg
c2ab3e1f3d Implement backtrace recording for Promise.then calls
Furthermore rework detection of recorded backtrace.

Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-10-12 12:32:49 +09:00
HyukWoo Park
9f156c6dc6 Fix minor gcc build errors
* for gcc version >= 9.3.0
* fix errors about -Werror=class-memaccess and -Werror=ignored-qualifiers

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-08 16:46:59 +09:00
HyukWoo Park
aef7ba0c98 Update GC event callback registration
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-10-07 08:39:04 +09:00
Zoltan Herczeg
1dff039743 Implement backtrace recording for the debugger
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-10-06 11:43:19 +09:00
Seonghyun Kim
a30b318b4a Implement GenericIteratorObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-29 16:15:21 +09:00
HyukWoo Park
d369ca50b0 Fix clang build errors
* fix some tiny errors in wasm
* update wasm version to 1.0.24
* run tidy check in actions

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-29 14:35:44 +09:00
Seonghyun Kim
458d7a2e4c Remove useless global variables in Intl
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-27 16:40:21 +09:00
Seonghyun Kim
5185932e6d Implement Intl.ListFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-27 16:40:21 +09:00
Seonghyun Kim
988492a339 Add toStringTag into Intl Object
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-27 16:40:21 +09:00
HyukWoo Park
659745ceed Store function name value correctly to access it in inner function scope
* handle exceptional case of function name which is that function name needs to be allocated on the heap with other lexical variables

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-27 16:38:22 +09:00
HyukWoo Park
843f4af78e Assign source name for dynamically created functions
* get source name through outer lexical scope

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-27 16:37:12 +09:00
HyukWoo Park
faa56e648d Fix typo about gotException in ModuleExecutionResult
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-27 16:37:12 +09:00
HyukWoo Park
07c91a33e6 Add callback for Error creation
* registered callback is triggered for each Error constructor call

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-14 16:39:15 +09:00
HyukWoo Park
f864d828fb Refactoring BackingStore structure
* divide BackingStore structure into NonShared and Shared
* update BackingStoreRef API to clarify its usage

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-14 15:54:17 +09:00
HyukWoo Park
1a258a0635 Add SharedArrayBufferObject create api
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-14 15:54:17 +09:00
Seonghyun Kim
d1658fd41b Some platforms have restriction of typed-malloc maximum size.
for reducing size, I move ascii table and number table into native heap area.

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-13 10:22:27 +09:00
Seonghyun Kim
5b362cf5b9 Implement newly added function of Intl.Locale
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-13 10:22:27 +09:00
Seonghyun Kim
e8426a8a4f Refactor: Remove duplicated code with macro
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-13 10:22:27 +09:00
Seonghyun Kim
acf49742d1 Fix Symbol of Intl.PluralRules
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-13 10:22:27 +09:00
Seonghyun Kim
7692878218 Add try-catch-finally condition variable into ExecutionState
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-09 15:17:12 +09:00
Seonghyun Kim
131e05f2ed Implement Intl.DisplayNames.prototype.of function
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-09 09:41:01 +09:00
Seonghyun Kim
155d9b6e95 Implement constructor and getResolvedOptions of Intl.DisplayNames
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-09 09:41:01 +09:00
Zoltan Herczeg
4ec34f2685 Initial debugger documentation
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-09-08 18:09:48 +09:00
Zoltan Herczeg
ed55d51384 Support default class constructors in the debugger
These functions have no source code and should be ignored by the debugger

Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-09-03 17:05:32 +09:00
HyukWoo Park
81bae461df Handle BigInt type in CreateListFromArrayLike method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-03 12:55:47 +09:00
HyukWoo Park
0ee0e3ae36 Fix to c++ style casting in ByteCode
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-03 11:03:56 +09:00
HyukWoo Park
d925600bf2 Refactoring ByteCode dump
* byteCodeStart parameter is used only for Jump codes
* allocating global variable to represent this code start position instead
* remove all redundant parameter for each dump method

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-03 11:03:56 +09:00
HyukWoo Park
9e15a05497 Fix minor defects
* remove unused variable
* clarify math calculation in NumberObject

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-09-03 11:03:56 +09:00
Seonghyun Kim
d25c251c93 Implement basic of new IntlDateTimeFormat
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-01 16:37:54 +09:00
Seonghyun Kim
5f6b42c5bc Update locale info
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-01 16:37:54 +09:00
Seonghyun Kim
11ab2b42f6 Update AsyncFromSyncIteratorPrototype functions because spec is updated
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-09-01 16:37:54 +09:00
HyukWoo Park
54fadc4ff8 Remove redundant defineOwnPropertyThrowsExceptionWhenStrictMode method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-30 10:00:12 +09:00
HyukWoo Park
d6eb9fec6f Update Error cause
* https://tc39.es/proposal-error-cause

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-30 10:00:12 +09:00
HyukWoo Park
98ec4e5cab Implement TypedArray.prototype.findLast and TypedArray.prototype.findLastIndex
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-25 11:19:36 +09:00
Zoltan Herczeg
ff4d4d593d Add debugger test cases for class fields
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
2021-08-24 15:26:23 +09:00
HyukWoo Park
b1aec3b7b9 Implement Object.hasOwn property
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-24 12:30:55 +09:00
Seonghyun Kim
a07fe9ed1e Use Function's Context when throw exception
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-18 15:04:09 +09:00
Seonghyun Kim
8d63665e28 Implement Array.prototype.findLast, findLastIndex
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-18 15:04:09 +09:00
Seonghyun Kim
8a51147dc9 Update test262 test suite
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-18 15:04:09 +09:00
HyukWoo Park
90e70b4e91 Add omitted source info in ExecutionStateRef::computeStackTraceData
* add source name and source code info to Evaluator::StackTraceData

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-17 20:04:32 +09:00
Seonghyun Kim
19298e2216 Implement Atomics.wait, notify
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-17 20:03:39 +09:00
Seonghyun Kim
f85efad8da Implement Atomics.isLockfree
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-17 20:03:39 +09:00
HyukWoo Park
a2d15f4e66 Add build target for x86_64
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-17 13:15:07 +09:00
HyukWoo Park
0d65ad5e3d Implement lazy builtin initialization
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-12 13:43:23 +09:00
Seonghyun Kim
7b77fcd4cd If object has native data accessor with actsLikeJS is true, the object should be non inline cacheable
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-11 15:28:35 +09:00
Seonghyun Kim
bd45251b5d If there is a argument with default value, function length should not increase after the argument
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-06 13:18:50 +09:00
HyukWoo Park
a91417a38c Reorganize builtin and Intl source files
* make builtins and intl directory

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-06 13:16:58 +09:00
HyukWoo Park
06e954de18 Fix build error and warning
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-08-05 13:29:02 +09:00
Seonghyun Kim
207b6b4fbd Implement atomic operation in Atomics builtins
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-05 13:28:08 +09:00
Seonghyun Kim
dd97c866f4 Implement ArrayBuffer type for divide ArrayBufferObject and SharedArrayBufferObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-08-02 14:23:06 +09:00
HyukWoo Park
a39423acb7 Revise CMake build script
* remove target specific cmake files and merge it into one cmake file (target.cmake)
* refactoring some cmake commands

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-30 11:28:52 +09:00
HyukWoo Park
afa76c5f68 Fix build warnings of WebAssembly build
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-30 11:28:52 +09:00
HyukWoo Park
84451fd28e Add setLength method to FunctionTemplate
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-29 13:37:54 +09:00
Seonghyun Kim
dbae3ae8fe Implement Serialization of SharedArrayBufferObject & $262.agent.* functions for testing
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-29 13:36:15 +09:00
HyukWoo Park
13c774e49f Add ThreadLocal structure
* ThreadLocal manage global values allocated for each thread
* Update PlatformRef to allow users to add thread-local custom data

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-27 16:40:08 +09:00
HyukWoo Park
98bc107937 Add Global object shared by all threads
* Platform is also managed in Global object
* Global has life time same to program

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-27 16:40:08 +09:00
Seonghyun Kim
52d51d976e Implement serializing of Symbol and BigInt
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-27 15:29:24 +09:00
Seonghyun Kim
dff3ddd475 Add new api test related with Serializing Symbol, BigInt
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-27 15:29:24 +09:00
Seonghyun Kim
2d77fbd81f Implement simple Value serialization
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-27 15:29:24 +09:00
Seonghyun Kim
878e911e7d Implement value Serializer test
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-27 15:29:24 +09:00
Seonghyun Kim
5c3f60aa47 Add functions what return version info and configure info into Globals class
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-27 15:29:24 +09:00
HyukWoo Park
703c0edecc Update PromiseHook for Promise API
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-21 15:17:06 +09:00
Seonghyun Kim
77a68579a5 Implement per thread isolating
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-15 17:47:41 +09:00
HyukWoo Park
ac2bb84b6f Update PromiseHook
* PromiseHook is triggered for each Promise event
* PromiseHook is registered and used by third party app

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-15 10:54:18 +09:00
Seonghyun Kim
f43d845975 Implement BackingStore::reallocate
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-08 16:38:00 +09:00
HyukWoo Park
f2fd751c1e Fix EncodedSmallValue encoding
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-08 15:31:21 +09:00
Seonghyun Kim
76fa95cad6 Implement AssignmentTargetType spec
https://tc39.es/ecma262/#sec-static-semantics-assignmenttargettype

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-07 10:02:16 +09:00
Seonghyun Kim
133f76ade6 We should throw SyntaxError when there is escaped reserved keyword in strict mode
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-07 10:02:16 +09:00
HyukWoo Park
4709a66250 Update Atomics compareExchange and exchange method
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-06 12:34:54 +09:00
HyukWoo Park
8797883d56 Update SharedArrayBuffer.prototype.slice
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-06 12:34:54 +09:00
HyukWoo Park
5e93b90059 Revise TypedArray constructor
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-06 12:34:54 +09:00
HyukWoo Park
6cd9886200 Remove redundant string comparison in cmake build
* cmake variable initialized with `ON` can be directly used in conditional statement
* fix a minor code defect in ArrayObject too

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-06 11:15:47 +09:00
HyukWoo Park
0b0ddee8e1 Refactoring index property handling
* when trying to use index property, we use only 32bit for index value (uint32_t)
* rename ArrayIndex as to Index32 and IndexProperty
* add cctest to verify the new api

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-05 13:20:38 +09:00
Seonghyun Kim
12855be3f6 Implement accessing class private members in eval
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-05 13:08:59 +09:00
HyukWoo Park
43577f33e3 Fix a bug in array index conversion
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-02 12:54:09 +09:00
Seonghyun Kim
8c3cd2f3b1 Implement chain of ClassPrivateMemberData
* Each chain piece represents one of class
* User can uses private member with same name parent with child class
* We should check nearest [[homeObject]] of function to find where function is located

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-01 16:36:39 +09:00
Seonghyun Kim
9c437bd8d7 Update rules related with constructor and prototype in class parsing
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-01 16:36:39 +09:00
Seonghyun Kim
1fbaf749bf Implement ObjectPrivateMemberStructre for reducing memory usage
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-01 16:36:39 +09:00
Seonghyun Kim
4aeee459b3 Implement private class members initialize order
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-01 16:36:39 +09:00
Seonghyun Kim
050812963e Implement one of nesting class private rule
- We need to check object value is homeobject if there is same private name on parent class

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-07-01 16:36:39 +09:00
HyukWoo Park
ef4387828c Refactor SharedArrayBuffer and Atomics
* update Atomics builtin operations
* fix hierarchy between SharedArrayBuffer and ArrayBuffer

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-07-01 09:19:56 +09:00
HyukWoo Park
70ecdf0214 Fix minor code defects
* fix to static functions
* fix to const functions
* remove unused variables

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-30 13:55:52 +09:00
HyukWoo Park
dd9e38f2bd Unify getter/setter methods for 32bit and 64bit platforms
* run additional test262 for 32bit-release environment

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-29 17:16:17 +09:00
HyukWoo Park
9de4409e4f Update basic Atomics operations (threading)
* add Atomics builtin object and its basic operations

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-29 17:16:05 +09:00
HyukWoo Park
a3aedf3fc5 Update CI for small build configuration
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-29 17:16:05 +09:00
Seonghyun Kim
5a9b538077 class expression private name tests should refer parent class's private names
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-28 12:58:10 +09:00
Seonghyun Kim
1c5f4ab506 Implement private field optional chaining
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-28 12:58:10 +09:00
HyukWoo Park
c5d10c08da Update CodeCache for private class field
* add CodeCache routine for ComplexSetObjectOperation and ComplexGetObjectOperation
* fix to use c++ style cast

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-28 10:38:37 +09:00
Seonghyun Kim
e341516cae Implement isModuleNamespaceObject
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-23 15:58:46 +09:00
Seonghyun Kim
4de5ea05bf Implement basic of class private static method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-23 15:55:18 +09:00
Seonghyun Kim
e7f21e36e4 Implement basic of private static field
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-23 15:55:18 +09:00
HyukWoo Park
a30be877b3 Update CI for threading test
* move x86 test to github actions
* Jenkins evaluates threading features on test262 TC

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-17 11:09:33 +09:00
HyukWoo Park
324baba180 Update basic SharedArrayBuffer features (threading)
* add SharedArrayBuffer object
* update BackingStore to represent shared data block

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-17 11:09:33 +09:00
Seonghyun Kim
25679c9980 Fix negative ValueRef integer bug with ESCARGOT_USE_32BIT_IN_64BIT flag
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-17 11:03:40 +09:00
Hosung Kim
5a67c9d66a Add toInteger to public api
Signed-off-by: Hosung Kim hs852.kim@samsung.com
2021-06-09 15:45:46 +09:00
Seonghyun Kim
7b0a24f1a7 Implement basic of class private field and method
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-06-08 13:00:26 +09:00
HyukWoo Park
dfdb1203d6 Fix a bug when a native function instantiated from FunctionTemplate is called as super
* create a new object of which proto is set based on newTarget

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-07 14:53:15 +09:00
HyukWoo Park
616f32bb79 Remove ESCARGOT_OBJECT_SUBCLASS_MUST_REDEFINE macro
* override keyword specified instead

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-03 10:52:31 +09:00
HyukWoo Park
006b189d5f Update ObjectRef::enumerateObjectOwnProperties api
* add tryToUseAsArrayIndex api for enumeration
* fix UInt-naming

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-03 10:52:31 +09:00
HyukWoo Park
75d5a1dfb7 Add conversion from ObjectGetResult to ObjectPropertyDescriptor
* update ObjectGetResult::convertToPropertyDescriptor
* directly convert ObjectGetResult to ObjectPropertyDescriptor instead of creating a new Object for descriptor

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-06-02 10:33:16 +09:00
HyukWoo Park
bf7a0978bf Collect WASM heap after wasm_func_call
* wabt allocates a Thread object for each wasm func call but it's never reclaimed
* invoke collectHeap right after each wasm_func_call

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-28 11:08:26 +09:00
Ryan Hyun Choi
b0cace6695 Add RegExpObjectRef::match() in public API
Signed-off-by: Ryan Choi <ryan.choi@samsung.com>
2021-05-27 17:08:24 +09:00
Ryan Hyun Choi
c6562e7940 Add RegExpObjectRef::create() in public API
* Make create() to accept options in enum

Signed-off-by: Ryan Choi <ryan.choi@samsung.com>
2021-05-27 14:52:12 +09:00
HyukWoo Park
a16fcc9412 Update es-actions to test various build options within x64 environment
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-26 09:36:47 +09:00
Seonghyun Kim
712118801d Add ArrayBufferObject malloc, free handler into Platform
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-05-24 10:11:08 +09:00
HyukWoo Park
4423397fca Drop the package update command in es-actions
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-18 17:30:39 +09:00
HyukWoo Park
b605adbb1f Refactor GC allocation with bitmap info
* replace each Object's member marking with Object::fillGCDescriptor
* BigInt allocation is fixed to be handled by simple GC_MALLOC_ATOMIC call

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-18 15:34:07 +09:00
Seonghyun Kim
ae6c6189c0 Refactor useless checking punctuator logic in parser
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-05-18 15:32:05 +09:00
HyukWoo Park
b504600e41 Add collecting heap process for WASM
* periodically check and collect WASM heap using GC event

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-17 15:28:03 +09:00
Seonghyun Kim
a190dae51a Implement basic parsing of class private field
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
2021-05-17 14:32:54 +09:00
HyukWoo Park
28fad70183 Rebalance CI workload
Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-14 09:43:47 +09:00
Hosung Kim
122e93ed4b Enable symbol visibility of ObjectPropertyDescriptorRef
Signed-off-by: Hosung Kim hs852.kim@samsung.com
2021-05-13 14:26:33 +09:00
HyukWoo Park
d3acce83a3 Add optional parameter to represent possible ASCII case for string api
* for non-ASCII case, ASCII string checking is skipped

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
2021-05-12 20:14:36 +09:00
Hosung Kim
c05f35930f Fix ObjectPropertyDescriptor
Signed-off-by: Hosung Kim hs852.kim@samsung.com
2021-05-12 16:35:45 +09:00
794 changed files with 273387 additions and 61518 deletions

24
.ahub/sam/exclude.txt Normal file
View file

@ -0,0 +1,24 @@
# Exclude external third-party libraries
/escargot/third_party/double_conversion/double-conversion.cc
/escargot/third_party/double_conversion/bignum.h
/escargot/third_party/GCutil/
/escargot/third_party/libbf/libbf.c
/escargot/third_party/lz4/lz4.cpp
/escargot/third_party/rapidjson/include/rapidjson/document.h
/escargot/third_party/rapidjson/include/rapidjson/reader.h
/escargot/third_party/rapidjson/include/rapidjson/encodings.h
/escargot/third_party/yarr/
# Exclude parser/interpreter codes which have intensive control statements and similar patterns essentially used for compilation and execution
/escargot/src/parser/Lexer.h
/escargot/src/parser/Lexer.cpp
/escargot/src/parser/esprima_cpp/esprima.cpp
/escargot/src/interpreter/ByteCodeInterpreter.h
/escargot/src/interpreter/ByteCodeInterpreter.cpp
/escargot/src/parser/CodeBlock.h
# Exclude huge-scaled Object classes that represent built-in JavaScript Objects
/escargot/src/runtime/GlobalObject.h
/escargot/src/runtime/Object.h
/escargot/src/runtime/DateObject.h
/escargot/src/runtime/Value.h

3
.github/CODEOWNERS vendored
View file

@ -1,4 +1,5 @@
# This is a comment. # This is a comment.
# Each line is a file pattern followed by one or more owners. # Each line is a file pattern followed by one or more owners.
* @ksh8281 @clover2123 @bbrto21 * @ksh8281 @clover2123 @bbrto21
/src/debugger/ @zherczeg

88
.github/workflows/analysis-actions.yml vendored Normal file
View file

@ -0,0 +1,88 @@
name: Analysis
on:
schedule:
# trigger on every monday, wednesday and friday
- cron: '30 22 * * 1,3,5'
workflow_dispatch:
jobs:
coverity-scan:
if: github.repository == 'Samsung/escargot'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build ICU(64)
run: |
git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu64-build/
cd $GITHUB_WORKSPACE/icu64-build/icu4c/source
LDFLAGS="-Wl,-rpath=$GITHUB_WORKSPACE/icu64/lib/" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu64/"
make -j8
make install
- name: Download Coverity Tool
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
run: |
wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=Samsung%2Fescargot" -O cov-analysis-linux64.tar.gz
mkdir cov-analysis-linux64
tar xzf cov-analysis-linux64.tar.gz --strip 1 -C cov-analysis-linux64
- name: Build
env:
BUILD_OPTIONS: -DESCARGOT_MODE=release -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_CODE_CACHE=ON -DESCARGOT_WASM=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
export PATH=$GITHUB_WORKSPACE/cov-analysis-linux64/bin:$PATH
LDFLAGS="-L$GITHUB_WORKSPACE/icu64/lib/ -Wl,-rpath=$GITHUB_WORKSPACE/icu64/lib/" PKG_CONFIG_PATH="$GITHUB_WORKSPACE/icu64/lib/pkgconfig/" cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/coverity_scan $BUILD_OPTIONS
cov-build --dir cov-int ninja -Cout/coverity_scan
- name: Submit
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
NOTI_MAIL: ${{ secrets.COVERITY_SCAN_MAIL }}
run: |
tar czvf escargot.tgz cov-int
curl \
--form token=$TOKEN \
--form email=$NOTI_MAIL \
--form file=@escargot.tgz \
--form version="4.3.0" \
--form description="escargot coverity scan" \
https://scan.coverity.com/builds?project=Samsung%2Fescargot
coverage-scan:
if: github.repository == 'Samsung/escargot'
runs-on: [self-hosted, linux, x64, test]
timeout-minutes: 600
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Build x64
env:
BUILD_OPTIONS: -DESCARGOT_MODE=release -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_COVERAGE=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
LDFLAGS=" -L/usr/icu78-64/lib/ -Wl,-rpath=/usr/icu78-64/lib/" PKG_CONFIG_PATH="/usr/icu78-64/lib/pkgconfig/" cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/coverage64 -DESCARGOT_ARCH=x64 $BUILD_OPTIONS
ninja -Cout/coverage64
LDFLAGS=" -L/usr/icu78-32/lib/ -Wl,-rpath=/usr/icu78-32/lib/" PKG_CONFIG_PATH="/usr/icu78-32/lib/pkgconfig/" cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/coverage32 -DESCARGOT_ARCH=x86 $BUILD_OPTIONS
ninja -Cout/coverage32
- name: Run test262 and collect coverage data
# test262 is unstable in actions env, but coverage data will be accumulated
continue-on-error: true
run: |
# set locale
sudo locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
locale
LD_LIBRARY_PATH=/usr/icu78-64/lib/ GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/coverage64/escargot" new-es regression-tests test262 octane chakracore sunspider-js modifiedVendorTest jsc-stress v8 spidermonkey intl jetstream-only-cdjs
LD_LIBRARY_PATH=/usr/icu78-32/lib/ GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86 --engine="$GITHUB_WORKSPACE/out/coverage32/escargot" new-es regression-tests test262 octane chakracore sunspider-js modifiedVendorTest jsc-stress v8 spidermonkey intl jetstream-only-cdjs
- name: Generate coverage report
run: |
gcovr --gcov-ignore-parse-errors --exclude-unreachable-branches --exclude-throw-branches --exclude '.*third_party/' --exclude '.*shell/' --exclude '.*api/' -r . --xml coverage.xml
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
files: ./coverage.xml
name: codecov-umbrella
verbose: true

97
.github/workflows/android-release.yml vendored Normal file
View file

@ -0,0 +1,97 @@
name: Android-Release
on:
push:
tags:
- "v*.*.*"
jobs:
build-android-on-ubuntu:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Set up JDK
uses: actions/setup-java@v4.1.0
with:
distribution: "zulu"
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- name: Build with Gradle
working-directory: ./build/android
run: |
./gradlew bundleHostJar
./gradlew javadocJar
./gradlew sourcesJar
./gradlew :escargot:testDebugUnitTest
mv ./escargot/build/libs/escargot.jar ./escargot/build/libs/escargot-ubuntu.jar
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: build-artifact-ubuntu
path: |
./build/android/escargot/build/**/escargot-*.aar
./build/android/escargot/build/**/escargot-*.jar
!./build/android/escargot/build/**/escargot-*Shell.aar
if-no-files-found: error
build-android-on-macos:
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
brew update
brew install ninja icu4c
- name: Set up JDK
uses: actions/setup-java@v4.1.0
with:
distribution: "zulu"
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- name: Build with Gradle
working-directory: ./build/android
run: |
./gradlew bundleHostJar
./gradlew :escargot:testDebugUnitTest
mv ./escargot/build/libs/escargot.jar ./escargot/build/libs/escargot-mac.jar
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: build-artifact-mac
path: |
./build/android/escargot/build/libs/escargot-mac.jar
if-no-files-found: error
merge-update-release:
needs: [build-android-on-ubuntu, build-android-on-macos]
runs-on: ubuntu-latest
steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
pattern: build-artifact-*
merge-multiple: true
- name: Set release date
run: |
echo "RELEASE_DATE=$(date --rfc-3339=date)" >> $GITHUB_ENV
- name: Merge build artifacts
working-directory: ./artifacts
run: |
ls -R ./
echo ${RELEASE_DATE}
find . -type f -name "escargot-*.aar" -exec mv {} . \;
find . -type f -name "escargot-*.jar" -exec mv {} . \;
ls -R ./
find ./ -type f -name "escargot-*.aar" -o -name "escargot-*.jar" | zip Android-Release-${{ env.RELEASE_DATE }}.zip -@
- name: Upload to release
uses: softprops/action-gh-release@v2
with:
files: |
artifacts/Android-Release-${{ env.RELEASE_DATE }}.zip

110
.github/workflows/code-review.yml vendored Normal file
View file

@ -0,0 +1,110 @@
name: Review Bot (PR)
on:
pull_request_target:
types: [opened, synchronize, reopened]
branches: [ "master" ]
concurrency:
group: review-${{ github.event.pull_request.number }}
cancel-in-progress: true
permissions:
contents: read
pull-requests: write
jobs:
review:
if: github.repository == 'Samsung/escargot'
runs-on: [self-hosted, escargot-review]
steps:
- name: Compute diff range (incremental on synchronize)
id: shas
uses: actions/github-script@v7
with:
script: |
const action = context.payload.action;
const pr = context.payload.pull_request.number;
const baseSha = context.payload.pull_request.base.sha;
const headSha = context.payload.pull_request.head.sha;
let base = baseSha;
let skip = false;
if (action === 'synchronize') {
const before = context.payload.before;
if (before) {
base = before;
} else {
skip = true;
}
}
core.setOutput('base', base);
core.setOutput('head', headSha);
core.setOutput('pr', pr);
core.setOutput('skip', String(skip));
- name: Skip review (no before on synchronize)
if: ${{ steps.shas.outputs.skip == 'true' }}
run: |
echo "[Review Bot] Skipping review: 'before' SHA missing on synchronize event."
- name: Call review server
id: call
if: ${{ steps.shas.outputs.skip != 'true' }}
env:
REVIEW_SERVER: ${{ secrets.REVIEW_SERVER }}
run: |
set -euo pipefail
REVIEW_SERVER="${REVIEW_SERVER}"
BASE_SHA="${{ steps.shas.outputs.base }}"
HEAD_SHA="${{ steps.shas.outputs.head }}"
PR_NUMBER="${{ steps.shas.outputs.pr }}"
curl -sS --fail-with-body --show-error \
--connect-timeout 10 --max-time 7200 \
-X POST "${REVIEW_SERVER}/review" \
-H "Content-Type: application/json" \
-d "{\"base_sha\":\"${BASE_SHA}\",\"head_sha\":\"${HEAD_SHA}\",\"pull_request_number\":${PR_NUMBER}}" \
-o review.json
echo "==== review.json ===="
cat review.json
- name: Post review comments
if: ${{ steps.shas.outputs.skip != 'true' }}
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const pr = context.payload.pull_request.number;
let raw;
try {
raw = fs.readFileSync('review.json', 'utf8');
} catch (e) {
core.warning(`review.json not found: ${e}`);
return;
}
let data;
try {
data = JSON.parse(raw);
} catch (e) {
core.warning(`Failed to parse review.json as JSON: ${e}`);
return;
}
const comments = Array.isArray(data.comments) ? data.comments : [];
for (const c of comments) {
await github.request('POST /repos/{owner}/{repo}/pulls/{pull_number}/comments', {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr,
body: c.body,
commit_id: c.commit_id,
path: c.path,
line: c.line,
side: c.side,
headers: { 'accept': 'application/vnd.github+json' }
});
await new Promise(r => setTimeout(r, 200));
}

View file

@ -1,105 +1,637 @@
name: Escargot Actions name: ES-Actions
on: on:
push: push:
branches: [ master ] branches: [ master ]
pull_request: pull_request:
branches: [ master ] branches: [ master ]
workflow_dispatch:
env: env:
RUNNER: tools/run-tests.py RUNNER: tools/run-tests.py
jobs: jobs:
clang_build: check-tidy:
runs-on: ubuntu-latest runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
sudo add-apt-repository "deb [trusted=yes] http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main"
sudo apt-get update
sudo apt-get install -y clang-format-20
- name: Test
run: tools/check_tidy.py
build-on-macos:
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Packages
run: |
brew update
brew install ninja icu4c
- name: Build x64
env:
BUILD_OPTIONS: -DESCARGOT_WASM=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
# check cpu
sysctl -a | grep machdep.cpu
# add icu path to pkg_config_path
export PKG_CONFIG_PATH="$(brew --prefix icu4c)/lib/pkgconfig"
echo $PKG_CONFIG_PATH
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -H. -Bout/debug/ -DESCARGOT_MODE=debug $BUILD_OPTIONS
ninja -Cout/debug/
$RUNNER --engine="./out/debug/escargot" new-es
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -H. -Bout/release/ -DESCARGOT_MODE=release $BUILD_OPTIONS
ninja -Cout/release/
cp test/octane/*.js .
./out/release/escargot run.js
build-on-macos-arm64:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Packages
run: |
brew update
brew install ninja icu4c
- name: Build arm64
env:
BUILD_OPTIONS: -DESCARGOT_WASM=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
# check cpu
sysctl -a | grep machdep.cpu
# add icu path to pkg_config_path
export PKG_CONFIG_PATH="$(brew --prefix icu4c)/lib/pkgconfig"
echo $PKG_CONFIG_PATH
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -H. -Bout/debug/ -DESCARGOT_MODE=debug $BUILD_OPTIONS
ninja -Cout/debug/
$RUNNER --engine="./out/debug/escargot" new-es
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -H. -Bout/release/ -DESCARGOT_MODE=release $BUILD_OPTIONS
ninja -Cout/release/
cp test/octane/*.js .
./out/release/escargot run.js
build-test-on-android:
runs-on: ubuntu-latest
strategy:
matrix:
arch: [x86, x86_64]
api: [28]
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Set up JDK
uses: actions/setup-java@v4.1.0
with:
distribution: "zulu"
java-version: 17
- name: Gradle cache
uses: gradle/actions/setup-gradle@v3
- name: Create AVD and run tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api }}
arch: ${{ matrix.arch }}
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -camera-back none -no-snapshot-save -gpu swiftshader_indirect -noaudio -no-boot-anim
disable-animations: true
script: cd build/android/;./gradlew connectedDebugAndroidTest -DESCARGOT_BUILD_TLS_ACCESS_BY_PTHREAD_KEY=ON
build-test-tizen:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: prepare deb sources for GBS
run: echo "deb [trusted=yes] http://download.tizen.org/tools/latest-release/Ubuntu_24.04/ /" | sudo tee /etc/apt/sources.list.d/tizen.list
- name: install GBS
run: sudo apt-get update && sudo apt-get install -y gbs
- name: build
run: |
gbs -c .github/workflows/gbs.conf build -A armv7l -P profile.tizen --incremental --define "enable_shell 1"
test-on-windows-clang-cl:
runs-on: windows-2022
strategy:
matrix:
# clang-cl with cannot generate c++ exception code well
# if clang-cl bug fixed, we can add x64
# clang version and STL version are sometimes not matched in github actions,
# so I add -D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH
arch: [
{cpu: "x86", flag: "-m32 -D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH"}
#, {cpu: "x64", flag: "-D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH"}
]
steps:
- name: Set git cllf config
run: |
git config --global core.autocrlf input
git config --global core.eol lf
- uses: actions/checkout@v4
with:
submodules: true
- uses: szenius/set-timezone@v2.0
with:
timezoneWindows: "Pacific Standard Time"
- uses: lukka/get-cmake@latest
with:
cmakeVersion: "~3.25.0"
- uses: GuillaumeFalourd/setup-windows10-sdk-action@v2
with:
sdk-version: 26100
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Download and Install Visual C++ Redistributable
shell: powershell
run: |
$vcRedistUrl64 = "https://aka.ms/vs/17/release/vc_redist.x64.exe" # Or the appropriate URL for your target architecture/version
$vcRedistPath64 = "$env:TEMP\vc_redist.x64.exe"
$vcRedistUrl32 = "https://aka.ms/vs/17/release/vc_redist.x86.exe" # Or the appropriate URL for your target architecture/version
$vcRedistPath32 = "$env:TEMP\vc_redist.x86.exe"
Write-Host "Downloading Visual C++ Redistributable from $vcRedistUrl64"
Invoke-WebRequest -Uri $vcRedistUrl64 -OutFile $vcRedistPath64
Write-Host "Downloading Visual C++ Redistributable from $vcRedistUrl32"
Invoke-WebRequest -Uri $vcRedistUrl32 -OutFile $vcRedistPath32
Write-Host "Installing Visual C++ Redistributable silently"
Start-Process -FilePath $vcRedistPath64 -ArgumentList "/install /quiet /norestart" -Wait
Start-Process -FilePath $vcRedistPath32 -ArgumentList "/install /quiet /norestart" -Wait
Write-Host "Visual C++ Redistributable installation complete."
- uses: ilammy/msvc-dev-cmd@v1.13.0
with:
arch: ${{ matrix.arch.cpu }}
sdk: "10.0.26100.0"
- uses: egor-tensin/setup-clang@v1
with:
version: 19.1.7
platform: ${{ matrix.arch.cpu }}
- name: Build ${{ matrix.arch.cpu }} Release
run: |
CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch.cpu }} -Bout/ -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_BUILD_TYPE=release -DCMAKE_C_FLAGS="${{ matrix.arch.flag }}" -DCMAKE_CXX_FLAGS="${{ matrix.arch.flag }}"
CMake --build out/ --config Release
- name: Run octane
run: |
copy test\octane\*.js
dir
.\out\escargot.exe run.js
# clang-cl with cannot generate c++ exception code well. if clang-cl bug fixed, we can enable test262
# - name: Run test262
# run: |
# set GC_FREE_SPACE_DIVISOR=1
# pip install chardet
# python tools\run-tests.py --engine=%cd%\out\escargot.exe test262 --test262-extra-arg="--skip Temporal --skip intl402 --skip Atomics"
# shell: cmd
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
test-on-windows-x86-x64:
runs-on: windows-2022
strategy:
matrix:
arch: [x86, x64]
steps:
- name: Set git cllf config
run: |
git config --global core.autocrlf input
git config --global core.eol lf
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: szenius/set-timezone@v2.0
with:
timezoneWindows: "Pacific Standard Time"
- uses: lukka/get-cmake@latest
with:
cmakeVersion: "~3.25.0" # <--= optional, use most recent 3.25.x version
- uses: GuillaumeFalourd/setup-windows10-sdk-action@v2
with:
sdk-version: 26100
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Download and Install Visual C++ Redistributable
shell: powershell
run: |
$vcRedistUrl64 = "https://aka.ms/vs/17/release/vc_redist.x64.exe" # Or the appropriate URL for your target architecture/version
$vcRedistPath64 = "$env:TEMP\vc_redist.x64.exe"
$vcRedistUrl32 = "https://aka.ms/vs/17/release/vc_redist.x86.exe" # Or the appropriate URL for your target architecture/version
$vcRedistPath32 = "$env:TEMP\vc_redist.x86.exe"
Write-Host "Downloading Visual C++ Redistributable from $vcRedistUrl64"
Invoke-WebRequest -Uri $vcRedistUrl64 -OutFile $vcRedistPath64
Write-Host "Downloading Visual C++ Redistributable from $vcRedistUrl32"
Invoke-WebRequest -Uri $vcRedistUrl32 -OutFile $vcRedistPath32
Write-Host "Installing Visual C++ Redistributable silently"
Start-Process -FilePath $vcRedistPath64 -ArgumentList "/install /quiet /norestart" -Wait
Start-Process -FilePath $vcRedistPath32 -ArgumentList "/install /quiet /norestart" -Wait
Write-Host "Visual C++ Redistributable installation complete."
- uses: ilammy/msvc-dev-cmd@v1.13.0
with:
arch: ${{ matrix.arch }}
sdk: "10.0.26100.0"
- name: Build ${{ matrix.arch }} Release
run: |
CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} -DESCARGOT_ARCH=${{ matrix.arch }} -Bout/ -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_WASM=ON -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=release
CMake --build out/ --config Release
# windows internal ICU doesn't support Temporal and intl402 well
# github action windows runner only have 2 CPUs. that's why I disable Atomics(timeout occured with some tests)
- name: Run test262
run: |
set GC_FREE_SPACE_DIVISOR=1
pip install chardet
python tools\run-tests.py --engine=%cd%\out\escargot.exe test262 --test262-extra-arg="--skip Temporal --skip intl402 --skip Atomics --skip sm"
shell: cmd
- name: Run octane
run: |
copy test\octane\*.js
dir
.\out\escargot.exe run.js
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
build-on-windows-x64-uwp-x86-shared:
runs-on: windows-2022
steps:
- name: Set git cllf config
run: |
git config --global core.autocrlf input
git config --global core.eol lf
- uses: actions/checkout@v4
with:
submodules: true
- uses: lukka/get-cmake@latest
with:
cmakeVersion: "~3.25.0" # <--= optional, use most recent 3.25.x version
- uses: GuillaumeFalourd/setup-windows10-sdk-action@v2
with:
sdk-version: 26100
- uses: ilammy/msvc-dev-cmd@v1.13.0
with:
arch: x64
sdk: "10.0.26100.0"
uwp: true
- name: Build x64 UWP Release
run: |
CMake -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=x64 -Bout/win64_release_uwp/ -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON
CMake --build out\win64_release_uwp --config Release
shell: cmd
- uses: ilammy/msvc-dev-cmd@v1.13.0
with:
arch: x86
sdk: "10.0.26100.0"
- name: Build x86 DLL Release
run: |
CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=x86 -Bout/win32_release_shared/ -DESCARGOT_OUTPUT=shared_lib -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=release
CMake --build out/win32_release_shared --config Release
shell: cmd
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
build-test-on-x86-release:
runs-on: ubuntu-24.04
strategy:
matrix:
tc: ['new-es octane', 'v8 chakracore spidermonkey', 'jetstream-only-simple-parallel-1', 'jetstream-only-simple-parallel-2 jsc-stress', 'jetstream-only-simple-parallel-3 jetstream-only-cdjs']
steps:
- uses: actions/checkout@v4
with: with:
submodules: true submodules: true
- name: Install Packages - name: Install Packages
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install ninja-build gcc-multilib g++-multilib sudo apt-get install -y ninja-build gcc-multilib g++-multilib make g++ pkg-config automake libtool git build-essential checkinstall libncurses-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev
- name: Build - name: Build python2
env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_MODE=debug -DESCARGOT_OUTPUT=shell_test -GNinja
run: | run: |
CC=clang CXX=clang++ cmake -H. -Bout/clang/x86 -DESCARGOT_ARCH=x86 $BUILD_OPTIONS mkdir $GITHUB_WORKSPACE/python2-build/
CC=clang CXX=clang++ cmake -H. -Bout/clang/x64 -DESCARGOT_ARCH=x64 $BUILD_OPTIONS cd $GITHUB_WORKSPACE/python2-build/
ninja -Cout/clang/x86 wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
ninja -Cout/clang/x64 tar xzf Python-2.7.18.tgz
cd Python-2.7.18
./configure --prefix=/usr/local/python2.7
make -j8
sudo make install
sudo update-alternatives --install /usr/bin/python python /usr/local/python2.7/bin/python2.7 1
- name: Build ICU
run: |
git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu-build/
cd $GITHUB_WORKSPACE/icu-build/icu4c/source
LDFLAGS="-m32 -Wl,-rpath=$GITHUB_WORKSPACE/icu32/lib/" CFLAGS="-m32" CXXFLAGS="-m32" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu32/"
make -j8
make install
ls $GITHUB_WORKSPACE/icu32/lib/
- name: Build x86
env:
BUILD_OPTIONS: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_THREADING=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TLS_ACCESS_BY_ADDRESS=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
export CXXFLAGS="-I$GITHUB_WORKSPACE/icu32/include"
export LDFLAGS="-L$GITHUB_WORKSPACE/icu32/lib/ -Wl,-rpath=$GITHUB_WORKSPACE/icu32/lib/"
export PKG_CONFIG_PATH=$GITHUB_WORKSPACE/icu32/lib/pkgconfig
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/release/x86 $BUILD_OPTIONS
ninja -Cout/release/x86
- name: Run release-x86 test
env:
GC_FREE_SPACE_DIVISOR: 1
run: LD_LIBRARY_PATH=$GITHUB_WORKSPACE/icu32/lib $RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/release/x86/escargot" ${{ matrix.tc }}
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
debugger_test: build-test-on-x64-release:
runs-on: ubuntu-latest runs-on: ubuntu-24.04
strategy:
matrix:
tc: ['octane v8 web-tooling-benchmark', 'chakracore spidermonkey new-es']
build_opt: ['', '-DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON', '-DESCARGOT_SMALL_CONFIG=ON -DESCARGOT_USE_CUSTOM_LOGGING=ON']
exclude:
# exclude octane, v8, web-tooling-benchmark due to low performance incurred by SMALL_CONFIG
- tc: 'octane v8 web-tooling-benchmark'
build_opt: '-DESCARGOT_SMALL_CONFIG=ON -DESCARGOT_USE_CUSTOM_LOGGING=ON'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
submodules: true submodules: true
- uses: actions/setup-python@v2
with:
python-version: '2.7'
- name: Install Packages - name: Install Packages
run: sudo apt-get install ninja-build run: |
sudo apt-get update
sudo apt-get install -y ninja-build g++ pkg-config automake libtool git build-essential checkinstall libncurses-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev
- name: Build ICU(64)
run: |
git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu64-build/
cd $GITHUB_WORKSPACE/icu64-build/icu4c/source
LDFLAGS="-Wl,-rpath=$GITHUB_WORKSPACE/icu64/lib/" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu64/"
make -j8
make install
- name: Build python2
run: |
mkdir $GITHUB_WORKSPACE/python2-build/
cd $GITHUB_WORKSPACE/python2-build/
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar xzf Python-2.7.18.tgz
cd Python-2.7.18
./configure --prefix=/usr/local/python2.7
make -j8
sudo make install
sudo update-alternatives --install /usr/bin/python python /usr/local/python2.7/bin/python2.7 1
- name: Build x64
env:
BUILD_OPTIONS: -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TLS_ACCESS_BY_ADDRESS=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
export CXXFLAGS="-I$GITHUB_WORKSPACE/icu64/include"
export LDFLAGS="-L$GITHUB_WORKSPACE/icu64/lib -Wl,-rpath=$GITHUB_WORKSPACE/icu64/lib"
export PKG_CONFIG_PATH=$GITHUB_WORKSPACE/icu64/lib/pkgconfig
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/release/x64 $BUILD_OPTIONS ${{ matrix.build_opt }}
ninja -Cout/release/x64
- name: Run release-x64 test
env:
GC_FREE_SPACE_DIVISOR: 1
run: |
export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/icu64/lib
# set locale
sudo locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
locale
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/release/x64/escargot" ${{ matrix.tc }}
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
build-test-on-x86-x64-debug:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
sudo apt-get update
sudo apt-get install -y ninja-build gcc-multilib g++-multilib make g++ pkg-config automake libtool git build-essential checkinstall libncurses-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev
- name: Build ICU(32)
run: |
git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu32-build/
cd $GITHUB_WORKSPACE/icu32-build/icu4c/source
LDFLAGS="-m32 -Wl,-rpath=$GITHUB_WORKSPACE/icu32/lib/" CFLAGS="-m32" CXXFLAGS="-m32" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu32/"
make -j8
make install
- name: Build ICU(64)
run: |
git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu64-build/
cd $GITHUB_WORKSPACE/icu64-build/icu4c/source
LDFLAGS="-Wl,-rpath=$GITHUB_WORKSPACE/icu64/lib/" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu64/"
make -j8
make install
- name: Build x86/x64
env:
BUILD_OPTIONS_X86: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_MODE=debug -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TLS_ACCESS_BY_ADDRESS=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
BUILD_OPTIONS_X64: -DESCARGOT_MODE=debug -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TLS_ACCESS_BY_ADDRESS=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/debug/x86 $BUILD_OPTIONS_X86
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/debug/x64 $BUILD_OPTIONS_X64
ninja -Cout/debug/x86
ninja -Cout/debug/x64
- name: Run debug-mode test
run: |
export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/icu32/lib
$RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/debug/x86/escargot" modifiedVendorTest regression-tests new-es intl sunspider-js
export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/icu64/lib
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/debug/x64/escargot" modifiedVendorTest regression-tests new-es intl sunspider-js
build-test-on-self-hosted-linux:
if: github.repository == 'Samsung/escargot'
runs-on: [self-hosted, linux, x64, test]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Build - name: Build
env: env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=debug -DESCARGOT_DEBUGGER=1 -DESCARGOT_OUTPUT=shell_test -GNinja BUILD_OPTIONS: -DESCARGOT_THREADING=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TLS_ACCESS_BY_ADDRESS=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: | run: |
cmake -H. -Bout/debugger $BUILD_OPTIONS LDFLAGS=" -L/usr/icu78-32/lib/ -Wl,-rpath=/usr/icu78-32/lib/" PKG_CONFIG_PATH="/usr/icu78-32/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bbuild/out_linux -DESCARGOT_ARCH=x86 -DESCARGOT_MODE=debug -DESCARGOT_TCO_DEBUG=ON $BUILD_OPTIONS
LDFLAGS=" -L/usr/icu78-32/lib/ -Wl,-rpath=/usr/icu78-32/lib/" PKG_CONFIG_PATH="/usr/icu78-32/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bbuild/out_linux_release -DESCARGOT_ARCH=x86 $BUILD_OPTIONS
LDFLAGS=" -L/usr/icu78-32/lib/ -Wl,-rpath=/usr/icu78-32/lib/" PKG_CONFIG_PATH="/usr/icu78-32/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bbuild/out_linux_release_clang -DESCARGOT_ARCH=x86 $BUILD_OPTIONS
gcc -shared -m32 -fPIC -o backtrace-hooking-32.so tools/test/test262/backtrace-hooking.c
LDFLAGS=" -L/usr/icu78-64/lib/ -Wl,-rpath=/usr/icu78-64/lib/" PKG_CONFIG_PATH="/usr/icu78-64/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bbuild/out_linux64 -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=debug -DESCARGOT_TCO_DEBUG=ON $BUILD_OPTIONS
LDFLAGS=" -L/usr/icu78-64/lib/ -Wl,-rpath=/usr/icu78-64/lib/" PKG_CONFIG_PATH="/usr/icu78-64/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bbuild/out_linux64_release -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release $BUILD_OPTIONS
LDFLAGS=" -L/usr/icu78-64/lib/ -Wl,-rpath=/usr/icu78-64/lib/" PKG_CONFIG_PATH="/usr/icu78-64/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bbuild/out_linux64_release_clang -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release $BUILD_OPTIONS
cmake --build build/out_linux/
cmake --build build/out_linux64/
cmake --build build/out_linux_release/
cmake --build build/out_linux_release_clang/
cmake --build build/out_linux64_release/
cmake --build build/out_linux64_release_clang/
- name: Test
run: |
LD_LIBRARY_PATH=/usr/icu78-32/lib/ GC_FREE_SPACE_DIVISOR=1 $RUNNER --arch=x86 --engine="${{ github.workspace }}/build/out_linux_release/escargot" test262
LD_LIBRARY_PATH=/usr/icu78-32/lib/ GC_FREE_SPACE_DIVISOR=1 $RUNNER --arch=x86 --engine="${{ github.workspace }}/build/out_linux_release_clang/escargot" test262
LD_LIBRARY_PATH=/usr/icu78-32/lib/ GC_FREE_SPACE_DIVISOR=1 ESCARGOT_LD_PRELOAD=${{ github.workspace }}/backtrace-hooking-32.so $RUNNER --arch=x86 --engine="${{ github.workspace }}/build/out_linux/escargot" test262
LD_LIBRARY_PATH=/usr/icu78-64/lib/ GC_FREE_SPACE_DIVISOR=1 $RUNNER --arch=x86_64 --engine="${{ github.workspace }}/build/out_linux64_release/escargot" test262
LD_LIBRARY_PATH=/usr/icu78-64/lib/ GC_FREE_SPACE_DIVISOR=1 $RUNNER --arch=x86_64 --engine="${{ github.workspace }}/build/out_linux64_release_clang/escargot" test262
LD_LIBRARY_PATH=/usr/icu78-64/lib/ python tools/kangax/run-kangax.py --engine="${{ github.workspace }}/build/out_linux64/escargot"
build-test-on-self-hosted-arm-linux:
if: github.repository == 'Samsung/escargot'
runs-on: [self-hosted, linux, arm, test]
strategy:
matrix:
compiler: [ {cxx: g++, cc: gcc}, {cxx: clang++, cc: clang} ]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Build
run: |
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bout -DCMAKE_C_COMPILER=${{ matrix.compiler.cc }} -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm32 -DESCARGOT_MODE=release -DESCARGOT_THREADING=ON -DESCARGOT_TEMPORAL=OFF -DESCARGOT_TCO=ON -DESCARGOT_TLS_ACCESS_BY_ADDRESS=${{ matrix.compiler.tls }} -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
cmake --build ./out/
- name: Test
run: |
GC_FREE_SPACE_DIVISOR=1 $RUNNER --engine="${{ github.workspace }}/out/escargot" --test262-extra-arg="--skip intl402 --skip sm --skip Temporal" new-es v8 spidermonkey chakracore test262
build-test-on-self-hosted-arm64-linux:
if: github.repository == 'Samsung/escargot'
runs-on: [self-hosted, linux, arm64, test]
strategy:
matrix:
compiler: [ {cxx: g++-11, cc: gcc-11}, {cxx: clang++, cc: clang} ]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Build
run: |
LDFLAGS=" -L/usr/icu78-64/lib/ -Wl,-rpath=/usr/icu78-64/lib/" PKG_CONFIG_PATH="/usr/icu78-64/lib/pkgconfig/" cmake -DCMAKE_C_COMPILER=${{ matrix.compiler.cc }} -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H./ -Bout -DESCARGOT_MODE=release -DESCARGOT_THREADING=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
cmake --build ./out/
- name: Test
run: |
export LD_LIBRARY_PATH=/usr/icu78-64/lib/
GC_FREE_SPACE_DIVISOR=1 $RUNNER --engine="${{ github.workspace }}/out/escargot" --test262-extra-arg="--skip intl402 --skip sm" test262 chakracore spidermonkey v8 new-es
build-test-on-riscv64-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Build in riscv64 container
uses: uraimo/run-on-arch-action@v3
with:
arch: riscv64
distro: ubuntu22.04
# Install deps into the container. With the token, the container will be cached
# The image is cached publically like a package
githubToken: ${{ github.token }}
install: |
apt-get update
apt-get install -y cmake build-essential ninja-build pkg-config python3 git libicu-dev
run: |
cmake -H. -Bout/riscv64 -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
ninja -Cout/riscv64
python3 ./tools/run-tests.py --engine="./out/riscv64/escargot" new-es intl sunspider-js
build-test-debugger:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
sudo apt-get update
sudo apt-get install -y ninja-build
- name: Build
env:
BUILD_OPTIONS: -DESCARGOT_MODE=debug -DESCARGOT_DEBUGGER=1 -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/debugger $BUILD_OPTIONS
ninja -Cout/debugger ninja -Cout/debugger
- name: Debugger Test - name: Debugger Test
run: | run: |
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/debugger/escargot" debugger-server-source $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/debugger/escargot" debugger-server-source
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/debugger/escargot" debugger-client-source $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/debugger/escargot" debugger-client-source
cctest: build-test-api:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
submodules: true submodules: true
- uses: actions/setup-python@v2
with:
python-version: '2.7'
- name: Install Packages
run: sudo apt-get install ninja-build
- name: Build
env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=debug -DESCARGOT_OUTPUT=cctest -GNinja
run: |
cmake -H. -Bout/cctest $BUILD_OPTIONS
ninja -Cout/cctest
- name: Run Test
run: $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/cctest/cctest" cctest
codecache_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: true
- uses: actions/setup-python@v2
with:
python-version: '2.7'
- name: Install Packages - name: Install Packages
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install ninja-build gcc-multilib g++-multilib sudo apt-get install -y ninja-build gcc-multilib g++-multilib
- name: Install ICU - name: Build x86/x64
env:
BUILD_OPTIONS_X86: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_MODE=debug -DESCARGOT_THREADING=ON -DESCARGOT_DEBUGGER=1 -DESCARGOT_USE_EXTENDED_API=ON -DESCARGOT_TEST=ON -DESCARGOT_OUTPUT=cctest -GNinja
BUILD_OPTIONS_X64: -DESCARGOT_MODE=debug -DESCARGOT_THREADING=1 -DESCARGOT_DEBUGGER=1 -DESCARGOT_USE_EXTENDED_API=ON -DESCARGOT_TEST=ON -DESCARGOT_OUTPUT=cctest -GNinja
run: | run: |
wget http://mirrors.kernel.org/ubuntu/pool/main/i/icu/libicu-dev_66.1-2ubuntu2_i386.deb cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/cctest/x86 $BUILD_OPTIONS_X86
dpkg -X libicu-dev_66.1-2ubuntu2_i386.deb $GITHUB_WORKSPACE/icu32 ninja -Cout/cctest/x86
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/cctest/x64 $BUILD_OPTIONS_X64
ninja -Cout/cctest/x64
- name: Run Test
run: |
$RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/cctest/x86/cctest" cctest
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/cctest/x64/cctest" cctest
build-test-codecache:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
# for i386 ICU
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y ninja-build gcc-multilib g++-multilib
sudo apt-get install -y libicu-dev:i386 # install i386 ICU
- name: Build x86 - name: Build x86
env: env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x86 -DESCARGOT_MODE=debug -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_CODE_CACHE=ON -DESCARGOT_OUTPUT=shell_test -GNinja BUILD_OPTIONS: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_MODE=debug -DESCARGOT_CODE_CACHE=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: | run: |
CXXFLAGS=" -I$GITHUB_WORKSPACE/icu32/usr/include" LDFLAGS=" -L$GITHUB_WORKSPACE/icu32/usr/lib/i386-linux-gnu" cmake -H. -Bout/codecache/x86 $BUILD_OPTIONS cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/codecache/x86 $BUILD_OPTIONS
ninja -Cout/codecache/x86 ninja -Cout/codecache/x86
- name: Build x64 - name: Build x64
env: env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=debug -DESCARGOT_CODE_CACHE=ON -DESCARGOT_OUTPUT=shell_test -GNinja BUILD_OPTIONS: -DESCARGOT_MODE=debug -DESCARGOT_CODE_CACHE=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: | run: |
cmake -H. -Bout/codecache/x64 $BUILD_OPTIONS cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/codecache/x64 $BUILD_OPTIONS
ninja -Cout/codecache/x64 ninja -Cout/codecache/x64
- name: Build x64 Release Mode
env:
BUILD_OPTIONS: -DESCARGOT_MODE=release -DESCARGOT_CODE_CACHE=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: |
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/codecache/release/x64 $BUILD_OPTIONS
ninja -Cout/codecache/release/x64
- name: Run x86 test - name: Run x86 test
run: | run: |
$RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/codecache/x86/escargot" sunspider-js $RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/codecache/x86/escargot" sunspider-js
@ -118,114 +650,67 @@ jobs:
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" octane-loading $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" octane-loading
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" octane-loading $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" octane-loading
rm -rf $HOME/Escargot-cache/ rm -rf $HOME/Escargot-cache/
- name: Run x64 release test
run: |
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/release/x64/escargot" web-tooling-benchmark
rm -rf $HOME/Escargot-cache/
- name: Handle error cases - name: Handle error cases
run: | run: |
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js
rm $HOME/Escargot-cache/3217641879501852439 rm $HOME/Escargot-cache/2728638815_17149
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js
ls -1q $HOME/Escargot-cache/ | wc -l ls -1q $HOME/Escargot-cache/ | wc -l
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js
rm $HOME/Escargot-cache/cache_list rm $HOME/Escargot-cache/cache_list
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/codecache/x64/escargot" sunspider-js
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
wasm_js_test: build-test-wasmjs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
submodules: true submodules: recursive
- uses: actions/setup-python@v2
with:
python-version: '2.7'
- name: Install Packages - name: Install Packages
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install ninja-build gcc-multilib g++-multilib sudo apt-get install -y ninja-build gcc-multilib g++-multilib make g++ pkg-config automake libtool git build-essential checkinstall libncurses-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev
- name: Install ICU - name: Build ICU(32)
run: | run: |
wget http://mirrors.kernel.org/ubuntu/pool/main/i/icu/libicu-dev_66.1-2ubuntu2_i386.deb git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu-build/
dpkg -X libicu-dev_66.1-2ubuntu2_i386.deb $GITHUB_WORKSPACE/icu32 cd $GITHUB_WORKSPACE/icu-build/icu4c/source
- name: Patch WABT LDFLAGS="-m32 -Wl,-rpath=$GITHUB_WORKSPACE/icu32/lib/" CFLAGS="-m32" CXXFLAGS="-m32" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu32/"
working-directory: ./third_party/wasm/wabt make -j8
make install
- name: Build ICU(64)
run: | run: |
cp ../../../tools/test/wasm-js/wabt_patch . git clone --depth 1 --single-branch -b release-78.1 https://github.com/unicode-org/icu.git $GITHUB_WORKSPACE/icu64-build/
patch -p0 < wabt_patch cd $GITHUB_WORKSPACE/icu64-build/icu4c/source
LDFLAGS="-Wl,-rpath=$GITHUB_WORKSPACE/icu64/lib/" ./runConfigureICU Linux/gcc --prefix="$GITHUB_WORKSPACE/icu64/"
make -j8
make install
- name: Build x86 - name: Build x86
env: env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x86 -DESCARGOT_MODE=debug -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_WASM=ON -DESCARGOT_OUTPUT=shell_test -GNinja BUILD_OPTIONS: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_MODE=debug -DESCARGOT_WASM=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: | run: |
CXXFLAGS=" -I$GITHUB_WORKSPACE/icu32/usr/include" LDFLAGS=" -L$GITHUB_WORKSPACE/icu32/usr/lib/i386-linux-gnu" cmake -H. -Bout/wasm/x86 $BUILD_OPTIONS cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/wasm/x86 $BUILD_OPTIONS
ninja -Cout/wasm/x86 ninja -Cout/wasm/x86
- name: Build x64 - name: Build x64
env: env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=debug -DESCARGOT_WASM=ON -DESCARGOT_OUTPUT=shell_test -GNinja BUILD_OPTIONS: -DESCARGOT_MODE=debug -DESCARGOT_WASM=ON -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -DESCARGOT_OUTPUT=shell -GNinja
run: | run: |
cmake -H. -Bout/wasm/x64 $BUILD_OPTIONS cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/wasm/x64 $BUILD_OPTIONS
ninja -Cout/wasm/x64 ninja -Cout/wasm/x64
- name: Run x86 test - name: Run x86 test
run: $RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/wasm/x86/escargot" wasm-js run: |
export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/icu32/lib
$RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/wasm/x86/escargot" wasm-js
- name: Run x64 test - name: Run x64 test
run: $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/wasm/x64/escargot" wasm-js
wasm_spec_test:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./third_party/wasm/wabt
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Prepare Build
run: | run: |
git fetch -t export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/icu64/lib
mkdir build $RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/wasm/x64/escargot" wasm-js
- name: Build WABT - if: ${{ failure() }}
working-directory: ./third_party/wasm/wabt/build uses: mxschmitt/action-tmate@v3
run: | timeout-minutes: 60
cmake ..
cmake --build .
- name: Run Spec Test
run: sudo ./test/run-tests.py --bindir=./build test/spec/
coverity_scan:
if: github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Install Packages
run: sudo apt-get install ninja-build
- name: Patch WABT
working-directory: ./third_party/wasm/wabt
run: |
cp ../../../tools/test/wasm-js/wabt_patch .
patch -p0 < wabt_patch
- name: Download Coverity Tool
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
run: |
wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=Samsung%2Fescargot" -O cov-analysis-linux64.tar.gz
mkdir cov-analysis-linux64
tar xzf cov-analysis-linux64.tar.gz --strip 1 -C cov-analysis-linux64
- name: Build
env:
BUILD_OPTIONS: -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release -DESCARGOT_CODE_CACHE=ON -DESCARGOT_WASM=ON -DESCARGOT_OUTPUT=shell_test -GNinja
run: |
export PATH=$GITHUB_WORKSPACE/cov-analysis-linux64/bin:$PATH
cmake -H. -Bout/coverity_scan $BUILD_OPTIONS
cov-build --dir cov-int ninja -Cout/coverity_scan
- name: Submit
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
NOTI_MAIL: ${{ secrets.COVERITY_SCAN_MAIL }}
run: |
tar czvf escargot.tgz cov-int
curl \
--form token=$TOKEN \
--form email=$NOTI_MAIL \
--form file=@escargot.tgz \
--form version="3.0.0" \
--form description="escargot coverity scan" \
https://scan.coverity.com/builds?project=Samsung%2Fescargot

11
.github/workflows/gbs.conf vendored Normal file
View file

@ -0,0 +1,11 @@
[general]
profile = profile.tizen
[profile.tizen]
repos = repo.tizen_base_reference,repo.tizen_reference
[repo.tizen_reference]
url = https://download.tizen.org/snapshots/TIZEN/Tizen/Tizen-Unified/reference/repos/standard/packages/
[repo.tizen_base_reference]
url = https://download.tizen.org/snapshots/TIZEN/Tizen/Tizen-Base/reference/repos/standard/packages/

322
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,322 @@
name: Release
on:
push:
tags:
- "v*.*.*"
workflow_dispatch:
env:
RUNNER: tools/run-tests.py
BUILD_OPTIONS: -DESCARGOT_MODE=release -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_DEPLOY=ON -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_OUTPUT=shell -GNinja
jobs:
build-macOS:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-15, macos-latest]
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
brew update
brew install ninja icu4c zip
- name: Build x64
run: |
# check cpu
sysctl -a | grep machdep.cpu
# add icu path to pkg_config_path
export PKG_CONFIG_PATH="$(brew --prefix icu4c)/lib/pkgconfig"
echo $PKG_CONFIG_PATH
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -H. -Bout/ $BUILD_OPTIONS
ninja -Cout/
- name: Check
run: |
file out/escargot
strip out/escargot
# set deploy directory
mkdir -p deploy
# set escargot
cp out/escargot ./deploy/.
LIBS=$(otool -L ./deploy/escargot | grep "icu" | awk '{print $1}')
for LIB in $LIBS; do
BASENAME=$(basename "$LIB")
install_name_tool -change "$LIB" "@executable_path/$BASENAME" deploy/escargot
done
# set icu libs
ICU_LIBS=("libicuuc" "libicui18n" "libicudata")
ICU_SOURCE_PATH="$(brew --prefix icu4c)/lib"
ICU_VERSION=$(find "$ICU_SOURCE_PATH" -name "libicuuc.*.dylib" | grep -oE '\.[0-9]+\.' | head -n 1 | tr -d '.')
if [ -z "$ICU_VERSION" ]; then
echo "ICU version could not be detected."
exit 1
else
echo "Detected ICU Version: $ICU_VERSION"
fi
for LIB in "${ICU_LIBS[@]}"; do
cp -a $ICU_SOURCE_PATH/$LIB.*.dylib ./deploy/.
install_name_tool -id "@loader_path/$LIB.$ICU_VERSION.dylib" "./deploy/$LIB.$ICU_VERSION.dylib"
done
# check results
echo "Check results..."
ls ./deploy
otool -L ./deploy/escargot
otool -L ./deploy/libicu*.dylib
# Ad-hoc sign
set -e
cd deploy
for f in libicu*.dylib; do [ -e "$f" ] || continue; codesign -f -s - "$f"; done
codesign --force --deep -s - ./escargot
for f in ./escargot libicu*.dylib; do [ -e "$f" ] || continue; codesign --verify --strict --verbose=6 "$f"; done
cd ..
# run test
$RUNNER --engine="$GITHUB_WORKSPACE/deploy/escargot" new-es
# zip results
if [ "${{ matrix.os }}" == "macos-15" ]; then
zip -j escargot-mac64.zip deploy/*
elif [ "${{ matrix.os }}" == "macos-latest" ]; then
zip -j escargot-mac64arm.zip deploy/*
fi
- name: Upload mac64
if: ${{ matrix.os == 'macos-15' }}
uses: actions/upload-artifact@v4
with:
name: build-artifact-mac64
path: ./escargot-mac64.zip
- name: Upload mac64arm
if: ${{ matrix.os == 'macos-latest' }}
uses: actions/upload-artifact@v4
with:
name: build-artifact-mac64arm
path: ./escargot-mac64arm.zip
build-linux:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Packages
run: |
# for i386 ICU
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y ninja-build libicu-dev gcc-multilib g++-multilib zip patchelf
sudo apt-get install -y libicu-dev:i386 # install i386 ICU
- name: Build x86/x64
run: |
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/x86 -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_TEMPORAL=ON $BUILD_OPTIONS
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/x64 -DESCARGOT_TEMPORAL=ON $BUILD_OPTIONS
ninja -Cout/x86
ninja -Cout/x64
- name: Check
run: |
file out/x86/escargot
file out/x64/escargot
strip out/x86/escargot
strip out/x64/escargot
# set locale
sudo locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
locale
# set deploy directory and copy escargot binary
mkdir -p deploy-x86
mkdir -p deploy-x64
cp out/x86/escargot ./deploy-x86/.
cp out/x64/escargot ./deploy-x64/.
# set icu libs
ldd deploy-x86/escargot | grep "icu" | grep "=>" | awk '{print $3}' | xargs -I '{}' cp '{}' deploy-x86/
ldd deploy-x64/escargot | grep "icu" | grep "=>" | awk '{print $3}' | xargs -I '{}' cp '{}' deploy-x64/
for LIB in ./deploy-x86/libicu*; do
patchelf --set-rpath '$ORIGIN' "$LIB"
done
for LIB in ./deploy-x64/libicu*; do
patchelf --set-rpath '$ORIGIN' "$LIB"
done
# check results
echo "Check results..."
ls ./deploy-x86
ldd deploy-x86/escargot
ldd deploy-x86/libicu*
ls ./deploy-x64
ldd deploy-x64/escargot
ldd deploy-x64/libicu*
# run test
$RUNNER --engine="$GITHUB_WORKSPACE/deploy-x86/escargot" new-es
$RUNNER --engine="$GITHUB_WORKSPACE/deploy-x64/escargot" new-es
# zip results
zip -j escargot-linux-x86.zip deploy-x86/*
zip -j escargot-linux-x64.zip deploy-x64/*
- name: Upload
uses: actions/upload-artifact@v4
with:
name: build-artifact-linux
path: escargot-linux-*.zip
build-windows:
runs-on: windows-2022
strategy:
matrix:
arch: [x86, x64]
steps:
- name: Set git cllf config
run: |
git config --global core.autocrlf input
git config --global core.eol lf
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: szenius/set-timezone@v2.0
with:
timezoneWindows: "Pacific Standard Time"
- uses: lukka/get-cmake@latest
with:
cmakeVersion: "~3.25.0"
- uses: GuillaumeFalourd/setup-windows10-sdk-action@v2
with:
sdk-version: 26100
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Download and Install Visual C++ Redistributable
shell: powershell
run: |
$vcRedistUrl64 = "https://aka.ms/vs/17/release/vc_redist.x64.exe" # Or the appropriate URL for your target architecture/version
$vcRedistPath64 = "$env:TEMP\vc_redist.x64.exe"
$vcRedistUrl32 = "https://aka.ms/vs/17/release/vc_redist.x86.exe" # Or the appropriate URL for your target architecture/version
$vcRedistPath32 = "$env:TEMP\vc_redist.x86.exe"
Write-Host "Downloading Visual C++ Redistributable from $vcRedistUrl64"
Invoke-WebRequest -Uri $vcRedistUrl64 -OutFile $vcRedistPath64
Write-Host "Downloading Visual C++ Redistributable from $vcRedistUrl32"
Invoke-WebRequest -Uri $vcRedistUrl32 -OutFile $vcRedistPath32
Write-Host "Installing Visual C++ Redistributable silently"
Start-Process -FilePath $vcRedistPath64 -ArgumentList "/install /quiet /norestart" -Wait
Start-Process -FilePath $vcRedistPath32 -ArgumentList "/install /quiet /norestart" -Wait
Write-Host "Visual C++ Redistributable installation complete."
- uses: ilammy/msvc-dev-cmd@v1.13.0
with:
arch: ${{ matrix.arch }}
sdk: "10.0.26100.0"
- name: Install zip if not available
run: |
if (-Not (Get-Command zip -ErrorAction SilentlyContinue)) {
choco install zip -y
}
- name: Build ${{ matrix.arch }}
run: |
CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} -DESCARGOT_ARCH=${{ matrix.arch }} -Bout/ -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_WASM=ON -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_SHADOWREALM=ON -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=release
CMake --build out/ --config Release
- name: Check
run: |
python tools\run-tests.py --engine=%cd%\out\escargot.exe new-es
rename out\escargot.exe escargot-win-${{ matrix.arch }}.exe
zip -j escargot-win-${{ matrix.arch}}.zip out\escargot-win-${{ matrix.arch }}.exe
shell: cmd
- name: Upload
uses: actions/upload-artifact@v4
with:
name: build-artifact-win-${{ matrix.arch }}
path: escargot-win-${{ matrix.arch }}.zip
check-build-mac64:
needs: [build-macOS]
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
pattern: build-artifact-mac64
merge-multiple: true
- name: Check
run: |
unzip artifacts/escargot-mac64.zip -d artifacts
otool -L artifacts/escargot
otool -L artifacts/*.dylib
$RUNNER --engine="$GITHUB_WORKSPACE/artifacts/escargot" new-es
check-build-mac64arm:
needs: [build-macOS]
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
pattern: build-artifact-mac64arm
merge-multiple: true
- name: Check
run: |
unzip artifacts/escargot-mac64arm.zip -d artifacts
otool -L artifacts/escargot
otool -L artifacts/*.dylib
$RUNNER --engine="$GITHUB_WORKSPACE/artifacts/escargot" new-es
check-build-linux:
needs: [build-linux]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
pattern: build-artifact-linux
merge-multiple: true
- name: Check
run: |
dpkg -l | grep libicu-dev
mkdir -p result-x86
mkdir -p result-x64
unzip artifacts/escargot-linux-x86.zip -d result-x86
unzip artifacts/escargot-linux-x64.zip -d result-x64
ldd result-x86/escargot
ldd result-x86/libicu*
ldd result-x64/escargot
ldd result-x64/libicu*
$RUNNER --engine="$GITHUB_WORKSPACE/result-x86/escargot" new-es
$RUNNER --engine="$GITHUB_WORKSPACE/result-x64/escargot" new-es
update-release:
needs: [check-build-mac64, check-build-mac64arm, check-build-linux, build-windows]
runs-on: ubuntu-latest
steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
pattern: build-artifact-*
merge-multiple: true
- name: Upload to release
uses: softprops/action-gh-release@v2
with:
files: |
artifacts/escargot-*

8
.gitignore vendored
View file

@ -1,5 +1,5 @@
#error_report #error_report
escargot /escargot
escargot.x* escargot.x*
.project .project
.cproject .cproject
@ -18,7 +18,7 @@ cscope.out
#memps #memps
escargot.asm escargot.asm
escargot.elf escargot.elf
out out/*
build.ninja build.ninja
rules.ninja rules.ninja
.ninja_deps .ninja_deps
@ -38,4 +38,6 @@ cmake_install.cmake
#etc #etc
.vscode .vscode
EscargotInfo.h EscargotInfo.h
third_party/wasm/config.h escargot.pc
escargot_generated/*
.vs/*

View file

@ -1,421 +0,0 @@
image: 10.113.64.54:5000/escargot/escargot:latest
build_x64_release:
stage: build
tags:
- escargot_main_build
before_script:
- unset TIZEN_SDK_HOME
- rm -f .git/index.lock
- rm -f .git/modules/third_party/GCutil/index.lock
- git submodule deinit -f third_party/GCutil
- git submodule init
- git submodule update third_party/GCutil
- ARCH=x64 MODE=release ./build_third_party.sh
- make clean
script:
- VENDORTEST=1 make x64.interpreter.release -j$(nproc)
artifacts:
paths:
- out/linux/x64/interpreter/release/escargot
test_x64_release_sunspider:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: ./escargot test/vendortest/SunSpider/tests/sunspider-1.0.2/*.js; exit $?;
dependencies:
- build_x64_release
test_x64_release_octane:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/octane/index.lock
- git submodule deinit -f test/octane
- git submodule init
- git submodule update test/octane
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-octane | tail -1 > out/octane_result; if ! cat out/octane_result | grep -c 'Score' > /dev/null; then exit 1; fi
dependencies:
- build_x64_release
test_x64_release_test262:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/test262/index.lock
- git submodule deinit -f test/test262
- git submodule init
- git submodule update test/test262
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-test262; exit $?;
dependencies:
- build_x64_release
test_x64_release_jetstream_only_cdjs:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-jetstream-only-cdjs; if cat test/vendortest/driver/jetstream/jetstream-result-raw.res | grep -c 'NaN' > /dev/null; then exit 1; fi; exit $?;
dependencies:
- build_x64_release
test_x64_release_jetstream_only_simple:
stage: test
tags:
- escargot_allow_slow
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-jetstream-only-simple; if cat test/vendortest/driver/jetstream/jetstream-result-raw.res | grep -c 'NaN' > /dev/null; then exit 1; fi; exit $?;
dependencies:
- build_x64_release
test_x64_release_spidermonkey:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-spidermonkey-full; exit $?;
dependencies:
- build_x64_release
test_x64_release_internal:
stage: test
tags:
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-internal-test; exit $?;
dependencies:
- build_x64_release
test_x64_release_v8:
stage: test
tags:
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-v8; exit $?;
dependencies:
- build_x64_release
test_x64_release_chakracore:
stage: test
tags:
- escargot_allow_slow
before_script:
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-chakracore; exit $?;
dependencies:
- build_x64_release
test_x64_release_jsc:
stage: test
tags:
- escargot_allow_slow
before_script:
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/release/escargot ./escargot
script: make run-jsc-stress; exit $?;
dependencies:
- build_x64_release
###############################################################################
build_x86_release:
stage: build
tags:
- escargot_main_build
before_script:
- unset TIZEN_SDK_HOME
- rm -f .git/index.lock
- rm -f .git/modules/third_party/GCutil/index.lock
- git submodule deinit -f third_party/GCutil
- git submodule init
- git submodule update third_party/GCutil
- ARCH=x86 MODE=release ./build_third_party.sh
- make clean
script:
- VENDORTEST=1 make x86.interpreter.release -j$(nproc)
artifacts:
paths:
- out/linux/x86/interpreter/release/escargot
test_x86_release_sunspider:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: ./escargot test/vendortest/SunSpider/tests/sunspider-1.0.2/*.js; exit $?;
dependencies:
- build_x86_release
test_x86_release_octane:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/octane/index.lock
- git submodule deinit -f test/octane
- git submodule init
- git submodule update test/octane
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-octane | tail -1 > out/octane_result; if ! cat out/octane_result | grep -c 'Score' > /dev/null; then exit 1; fi
dependencies:
- build_x86_release
test_x86_release_test262:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/test262/index.lock
- git submodule deinit -f test/test262
- git submodule init
- git submodule update test/test262
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-test262; exit $?;
dependencies:
- build_x86_release
test_x86_release_jetstream_only_cdjs:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-jetstream-only-cdjs; if cat test/vendortest/driver/jetstream/jetstream-result-raw.res | grep -c 'NaN' > /dev/null; then exit 1; fi; exit $?;
dependencies:
- build_x86_release
test_x86_release_jetstream_only_simple:
stage: test
tags:
- escargot_allow_slow
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-jetstream-only-simple; if cat test/vendortest/driver/jetstream/jetstream-result-raw.res | grep -c 'NaN' > /dev/null; then exit 1; fi; exit $?;
dependencies:
- build_x86_release
test_x86_release_spidermonkey:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-spidermonkey-full; exit $?;
dependencies:
- build_x86_release
test_x86_release_internal:
stage: test
tags:
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-internal-test; exit $?;
dependencies:
- build_x86_release
test_x86_release_v8:
stage: test
tags:
- escargot_allow_slow
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-v8; exit $?;
dependencies:
- build_x86_release
test_x86_release_chakracore:
stage: test
tags:
- escargot_allow_slow
before_script:
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-chakracore; exit $?;
dependencies:
- build_x86_release
test_x86_release_jsc:
stage: test
tags:
- escargot_allow_slow
before_script:
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/release/escargot ./escargot
script: make run-jsc-stress; exit $?;
dependencies:
- build_x86_release
###############################################################################
build_x64_debug:
stage: build
tags:
- escargot_main_build
before_script:
- unset TIZEN_SDK_HOME
- rm -f .git/index.lock
- rm -f .git/modules/third_party/GCutil/index.lock
- git submodule deinit -f third_party/GCutil
- git submodule init
- git submodule update third_party/GCutil
- ARCH=x64 MODE=debug ./build_third_party.sh
- make clean
script:
- VENDORTEST=1 make x64.interpreter.debug -j$(nproc)
artifacts:
paths:
- out/linux/x64/interpreter/debug/escargot
test_x64_debug_sunspider:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x64/interpreter/debug/escargot ./escargot
script: ./escargot test/vendortest/SunSpider/tests/sunspider-1.0.2/*.js; exit $?;
dependencies:
- build_x64_debug
#test_x64_debug_octane:
# stage: test
# before_script:
# - git submodule deinit -f test/octane
# - git submodule init
# - git submodule update test/octane
# - cp out/linux/x64/interpreter/debug/escargot ./escargot
# script: make run-octane | tail -1 > out/octane_result; if ! cat out/octane_result | grep -c 'Score' > /dev/null; then exit 1; fi
# dependencies:
# - build_x64_debug
#
#test_x64_debug_test262:
# stage: test
# before_script:
# - git submodule deinit -f test/test262
# - git submodule init
# - git submodule update test/test262
# - cp out/linux/x64/interpreter/debug/escargot ./escargot
# script: make run-test262; exit $?;
# dependencies:
# - build_x64_debug
#
################################################################################
build_x86_debug:
stage: build
tags:
- escargot_main_build
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/third_party/GCutil/index.lock
- unset TIZEN_SDK_HOME
- git submodule deinit -f third_party/GCutil
- git submodule init
- git submodule update third_party/GCutil
- ARCH=x86 MODE=debug ./build_third_party.sh
- make clean
script:
- VENDORTEST=1 make x86.interpreter.debug -j$(nproc)
artifacts:
paths:
- out/linux/x86/interpreter/debug/escargot
test_x86_debug_sunspider:
stage: test
before_script:
- rm -f .git/index.lock
- rm -f .git/modules/test/vendortest/index.lock
- git submodule deinit -f test/vendortest
- git submodule init
- git submodule update test/vendortest
- cp out/linux/x86/interpreter/debug/escargot ./escargot
script: ./escargot test/vendortest/SunSpider/tests/sunspider-1.0.2/*.js; exit $?;
dependencies:
- build_x86_debug
#test_x86_debug_octane:
# stage: test
# before_script:
# - git submodule deinit -f test/octane
# - git submodule init
# - git submodule update test/octane
# - cp out/linux/x86/interpreter/debug/escargot ./escargot
# script: make run-octane | tail -1 > out/octane_result; if ! cat out/octane_result | grep -c 'Score' > /dev/null; then exit 1; fi
# dependencies:
# - build_x86_debug
#
#test_x86_debug_test262:
# stage: test
# before_script:
# - git submodule deinit -f test/test262
# - git submodule init
# - git submodule update test/test262
# script: make run-test262; exit $?;
# dependencies:
# - build_x86_debug
#

22
.gitmodules vendored
View file

@ -2,10 +2,6 @@
path = third_party/GCutil path = third_party/GCutil
url = https://github.com/Samsung/gcutil.git url = https://github.com/Samsung/gcutil.git
ignore = untracked ignore = untracked
[submodule "third_party/windows/icu"]
path = third_party/windows/icu
url = https://github.com/Samsung/icu.git
ignore = untracked
[submodule "test/vendortest"] [submodule "test/vendortest"]
path = test/vendortest path = test/vendortest
url = https://github.com/Samsung/js_vendor_tc.git url = https://github.com/Samsung/js_vendor_tc.git
@ -19,14 +15,18 @@
url = https://github.com/chromium/octane.git url = https://github.com/chromium/octane.git
ignore = untracked ignore = untracked
[submodule "test/kangax"] [submodule "test/kangax"]
path = test/kangax path = test/kangax
url = https://github.com/kangax/compat-table.git url = https://github.com/kangax/compat-table.git
ignore = untracked ignore = untracked
[submodule "third_party/googletest"] [submodule "third_party/googletest"]
path = third_party/googletest path = third_party/googletest
url = https://github.com/google/googletest.git url = https://github.com/google/googletest.git
ignore = untracked ignore = untracked
[submodule "third_party/wasm/wabt"] [submodule "third_party/walrus"]
path = third_party/wasm/wabt path = third_party/walrus
url = https://github.com/WebAssembly/wabt url = https://github.com/Samsung/walrus.git
ignore = untracked
[submodule "test/web-tooling-benchmark"]
path = test/web-tooling-benchmark
url = https://github.com/v8/web-tooling-benchmark
ignore = untracked ignore = untracked

View file

@ -1,15 +1,52 @@
CMAKE_MINIMUM_REQUIRED (VERSION 2.8) CMAKE_MINIMUM_REQUIRED (VERSION 2.8.12 FATAL_ERROR)
PROJECT (ESCARGOT) PROJECT (ESCARGOT)
# CONFIGURATION # CONFIGURATION
SET (CMAKE_VERBOSE_MAKEFILE true) SET (CMAKE_VERBOSE_MAKEFILE true)
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
#SET (ESCARGOT_HOST "linux" CACHE STRING "ESCARGOT_HOST") MESSAGE(STATUS "CMAKE_SYSTEM_NAME: " ${CMAKE_SYSTEM_NAME})
#SET (ESCARGOT_ARCH "x86" CACHE STRING "ESCARGOT_ARCH") MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR})
#SET (ESCARGOT_MODE "release" CACHE STRING "ESCARGOT_MODE")
#SET (ESCARGOT_OUTPUT "shell" CACHE STRING "ESCARGOT_OUTPUT") IF (NOT DEFINED ESCARGOT_ARCH)
SET (ESCARGOT_ASAN "0" CACHE STRING "ESCARGOT_ASAN") IF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "X86" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86"
OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
SET(ESCARGOT_ARCH "x86")
ELSEIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64"
OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "EM64T")
SET(ESCARGOT_ARCH "x64")
ELSEIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm32"
OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l")
SET(ESCARGOT_ARCH "arm")
ELSEIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
SET(ESCARGOT_ARCH "aarch64")
ELSEIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64")
SET(ESCARGOT_ARCH "riscv64")
ENDIF()
ENDIF()
IF (NOT DEFINED ESCARGOT_HOST)
IF (${CMAKE_SYSTEM_NAME} STREQUAL "Windows" OR ${CMAKE_SYSTEM_NAME} STREQUAL "WindowsStore")
SET(ESCARGOT_HOST "windows")
ELSEIF (${CMAKE_SYSTEM_NAME} STREQUAL "Android")
SET(ESCARGOT_HOST "android")
ELSEIF (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
SET(ESCARGOT_HOST "darwin")
ELSE()
SET(ESCARGOT_HOST "linux")
ENDIF()
ENDIF()
IF (NOT DEFINED ESCARGOT_MODE)
SET (ESCARGOT_MODE "release")
ENDIF()
IF (NOT DEFINED ESCARGOT_OUTPUT)
SET (ESCARGOT_OUTPUT "shell")
ENDIF()
IF (NOT DEFINED ESCARGOT_THREADING)
SET (ESCARGOT_THREADING ON)
ENDIF()
SET (ESCARGOT_TARGET escargot) SET (ESCARGOT_TARGET escargot)
SET (ESCARGOT_CCTEST_TARGET cctest) SET (ESCARGOT_CCTEST_TARGET cctest)
@ -20,3 +57,34 @@ PROCESSORCOUNT (NPROCS)
# INCLUDE CMAKE FILES # INCLUDE CMAKE FILES
INCLUDE (${PROJECT_SOURCE_DIR}/build/config.cmake) INCLUDE (${PROJECT_SOURCE_DIR}/build/config.cmake)
INCLUDE (${PROJECT_SOURCE_DIR}/build/escargot.cmake) INCLUDE (${PROJECT_SOURCE_DIR}/build/escargot.cmake)
# Pkgconfig
CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/packaging/escargot.pc.in ${CMAKE_BINARY_DIR}/escargot.pc @ONLY)
IF (ESCARGOT_TLS_ACCESS_BY_PTHREAD_KEY AND ESCARGOT_TLS_ACCESS_BY_ADDRESS)
MESSAGE(FATAL_ERROR "You cannot enable ESCARGOT_TLS_ACCESS_BY_PTHREAD_KEY and ESCARGOT_TLS_ACCESS_BY_ADDRESS at same time")
ENDIF()
MESSAGE(STATUS "Escargot Arch: " ${ESCARGOT_ARCH})
MESSAGE(STATUS "Escargot Host: " ${ESCARGOT_HOST})
MESSAGE(STATUS "Escargot Mode: " ${ESCARGOT_MODE})
MESSAGE(STATUS "Escargot Output: " ${ESCARGOT_OUTPUT})
MESSAGE(STATUS "--------------------------------------------------------------------------------")
MESSAGE(STATUS "ESCARGOT_DEFINITIONS: " ${ESCARGOT_DEFINITIONS})
MESSAGE(STATUS "ESCARGOT_CXXFLAGS: " ${ESCARGOT_CXXFLAGS})
MESSAGE(STATUS "ESCARGOT_LDFLAGS: " ${ESCARGOT_LDFLAGS})
MESSAGE(STATUS "ESCARGOT_INCDIRS: " ${ESCARGOT_INCDIRS})
MESSAGE(STATUS "ESCARGOT_LIBRARIES: " ${ESCARGOT_LIBRARIES})
MESSAGE(STATUS "ESCARGOT_LIBICU_SUPPORT: " ${ESCARGOT_LIBICU_SUPPORT})
MESSAGE(STATUS "ESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN: " ${ESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN})
MESSAGE(STATUS "ESCARGOT_SMALL_CONFIG: " ${ESCARGOT_SMALL_CONFIG})
MESSAGE(STATUS "ESCARGOT_CODE_CACHE: " ${ESCARGOT_CODE_CACHE})
MESSAGE(STATUS "ESCARGOT_WASM: " ${ESCARGOT_WASM})
MESSAGE(STATUS "ESCARGOT_THREADING: " ${ESCARGOT_THREADING})
MESSAGE(STATUS "ESCARGOT_TLS_ACCESS_BY_ADDRESS: " ${ESCARGOT_TLS_ACCESS_BY_ADDRESS})
MESSAGE(STATUS "ESCARGOT_TLS_ACCESS_BY_PTHREAD_KEY: " ${ESCARGOT_TLS_ACCESS_BY_PTHREAD_KEY})
MESSAGE(STATUS "ESCARGOT_EXPORT_ALL: " ${ESCARGOT_EXPORT_ALL})
MESSAGE(STATUS "ESCARGOT_TCO: " ${ESCARGOT_TCO})
MESSAGE(STATUS "ESCARGOT_TEMPORAL: " ${ESCARGOT_TEMPORAL})
MESSAGE(STATUS "ESCARGOT_SHADOWREALM: " ${ESCARGOT_SHADOWREALM})
MESSAGE(STATUS "ESCARGOT_TEST: " ${ESCARGOT_TEST})

118
Jenkinsfile vendored
View file

@ -1,118 +0,0 @@
def isPr() {
env.CHANGE_ID != null
}
node {
try {
stage("Get source") {
def url = 'https://github.com/Samsung/escargot.git'
if (isPr()) {
def refspec = "+refs/pull/${env.CHANGE_ID}/head:refs/remotes/origin/PR-${env.CHANGE_ID} +refs/heads/master:refs/remotes/origin/master"
def extensions = [[$class: 'PreBuildMerge', options: [mergeRemote: "refs/remotes/origin", mergeTarget: "PR-${env.CHANGE_ID}"]]]
checkout([
$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
extensions: extensions,
submoduleCfg: [],
userRemoteConfigs: [[
refspec: refspec,
url: url
]]
])
} else {
def refspec = "+refs/heads/master:refs/remotes/origin/master"
def extensions = []
checkout([
$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'WipeWorkspace']],
submoduleCfg: [],
userRemoteConfigs: [[
refspec: refspec,
url: url
]]
])
}
}
stage('Check tidy') {
sh 'python tools/check_tidy.py'
}
stage('Submodule update') {
sh 'git submodule init test/'
sh 'git submodule init third_party/GCutil/'
sh 'git submodule update'
}
stage('Prepare build(gcc)') {
sh 'LDFLAGS=" -L/usr/icu32/lib/ -Wl,-rpath=/usr/icu32/lib/" PKG_CONFIG_PATH="/usr/icu32/lib/pkgconfig/" cmake -H./ -Bbuild/out_linux -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x86 -DESCARGOT_MODE=debug -DESCARGOT_OUTPUT=shell_test -GNinja'
sh 'LDFLAGS=" -L/usr/icu32/lib/ -Wl,-rpath=/usr/icu32/lib/" PKG_CONFIG_PATH="/usr/icu32/lib/pkgconfig/" cmake -H./ -Bbuild/out_linux_release -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x86 -DESCARGOT_MODE=release -DESCARGOT_OUTPUT=shell_test -GNinja'
sh 'gcc -shared -m32 -fPIC -o backtrace-hooking-32.so tools/test/test262/backtrace-hooking.c'
sh 'LDFLAGS=" -L/usr/icu64/lib/ -Wl,-rpath=/usr/icu64/lib/" PKG_CONFIG_PATH="/usr/icu64/lib/pkgconfig/" cmake -H./ -Bbuild/out_linux64 -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=debug -DESCARGOT_OUTPUT=shell_test -GNinja'
sh 'LDFLAGS=" -L/usr/icu64/lib/ -Wl,-rpath=/usr/icu64/lib/" PKG_CONFIG_PATH="/usr/icu64/lib/pkgconfig/" cmake -H./ -Bbuild/out_linux64_release -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release -DESCARGOT_OUTPUT=shell_test -GNinja'
}
stage('Build(gcc)') {
parallel (
'release-build' : {
sh 'cd build/out_linux/; ninja '
sh 'cd build/out_linux64/; ninja'
},
'debug-build' : {
sh 'cd build/out_linux_release/; ninja'
sh 'cd build/out_linux64_release/; ninja'
},
)
}
stage('Running test') {
timeout(30) {
parallel (
'release-32bit-jetstream-1' : {
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" jetstream-only-simple-parallel-1'
},
'release-32bit-jetstream-2' : {
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" jetstream-only-simple-parallel-2'
},
'release-32bit-jetstream-3' : {
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" jetstream-only-simple-parallel-3'
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" jetstream-only-cdjs'
},
'release-octane' : {
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" octane'
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86_64 --engine="${WORKSPACE}/build/out_linux64_release/escargot" octane'
},
'release-chakracore' : {
sh 'tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" chakracore'
sh 'tools/run-tests.py --arch=x86_64 --engine="${WORKSPACE}/build/out_linux64_release/escargot" chakracore'
},
'debug-32bit-test262' : {
sh 'GC_FREE_SPACE_DIVISOR=1 ESCARGOT_LD_PRELOAD=${WORKSPACE}/backtrace-hooking-32.so tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux/escargot" test262'
},
'release-64bit-test262' : {
sh 'GC_FREE_SPACE_DIVISOR=1 tools/run-tests.py --arch=x86_64 --engine="${WORKSPACE}/build/out_linux64_release/escargot" test262'
},
'32bit' : {
sh 'tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux/escargot" modifiedVendorTest regression-tests new-es intl sunspider-js'
sh 'tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" modifiedVendorTest jsc-stress sunspider-js'
sh 'tools/run-tests.py --arch=x86 --engine="${WORKSPACE}/build/out_linux_release/escargot" v8 spidermonkey regression-tests new-es intl'
},
'64bit' : {
sh 'tools/run-tests.py --arch=x86_64 --engine="${WORKSPACE}/build/out_linux64/escargot" modifiedVendorTest regression-tests new-es intl sunspider-js'
sh 'tools/run-tests.py --arch=x86_64 --engine="${WORKSPACE}/build/out_linux64_release/escargot" modifiedVendorTest jsc-stress sunspider-js'
sh 'tools/run-tests.py --arch=x86_64 --engine="${WORKSPACE}/build/out_linux64_release/escargot" v8 spidermonkey regression-tests new-es intl'
},
'kangax test-suites' : {
sh 'python tools/kangax/run-kangax.py --engine="${WORKSPACE}/build/out_linux64/escargot"'
},
)
}
}
} catch (e) {
throw e
} finally {
cleanWs()
}
}

33
LICENSE.BOEHM-GC Normal file
View file

@ -0,0 +1,33 @@
MIT-style License
Copyright (c) 1988-1989 Hans-J. Boehm, Alan J. Demers
Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
Copyright (c) 1998 by Fergus Henderson. All rights reserved.
Copyright (c) 1999-2001 by Red Hat, Inc. All rights reserved.
Copyright (c) 1999-2011 Hewlett-Packard Development Company, L.P.
Copyright (c) 2004-2005 Andrei Polushin
Copyright (c) 2007 Free Software Foundation, Inc.
Copyright (c) 2008-2022 Ivan Maidanski
Copyright (c) 2011 Ludovic Courtes
Copyright (c) 2018 Petter A. Urkedal
THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
Permission is hereby granted to use or copy this program
for any purpose, provided the above notices are retained on all copies.
Permission to modify the code and to distribute modified code is granted,
provided the above notices are retained, and a notice that the code was
modified is included with the above copyright notice.
Several files (gc/gc_allocator.h, extra/msvc_dbg.c) come with slightly
different licenses, though they are all similar in spirit (the exact
licensing terms are given at the beginning of the corresponding source file).
A few of the files needed to use the GNU-style build procedure come with
a modified GPL license that appears not to significantly restrict use of
the collector, though use of those files for a purpose other than building
the collector may require the resulting code to be covered by the GPL.

214
README.md
View file

@ -2,17 +2,71 @@
[![License](https://img.shields.io/badge/License-LGPL%20v2.1-blue.svg)](LICENSE) [![License](https://img.shields.io/badge/License-LGPL%20v2.1-blue.svg)](LICENSE)
[![GitHub release (latestSemVer)](https://img.shields.io/github/v/release/Samsung/escargot)](https://github.com/Samsung/escargot/releases) [![GitHub release (latestSemVer)](https://img.shields.io/github/v/release/Samsung/escargot)](https://github.com/Samsung/escargot/releases)
![Build status](http://13.209.201.68:8080/job/escargot-pr/job/master/badge/icon) [![Actions Status](https://github.com/Samsung/escargot/workflows/ES-Actions/badge.svg)](https://github.com/Samsung/escargot/actions/workflows/es-actions.yml)
[![Actions Status](https://github.com/Samsung/escargot/workflows/Escargot%20Actions/badge.svg)](https://github.com/Samsung/escargot/actions)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/21647/badge.svg)](https://scan.coverity.com/projects/samsung-escargot) [![Coverity Scan Build Status](https://scan.coverity.com/projects/21647/badge.svg)](https://scan.coverity.com/projects/samsung-escargot)
[![codecov](https://codecov.io/gh/Samsung/escargot/branch/master/graph/badge.svg?token=DX8CN6E7A8)](https://codecov.io/gh/Samsung/escargot)
## Prerequisites
#### On Ubuntu Linux Escargot is a lightweight JavaScript engine developed by [Samsung](https://github.com/Samsung), designed specifically for resource-constrained environments. It is optimized for performance and low memory usage, making it ideal for use in embedded systems, IoT devices, and other applications where resources are limited.
Key features of Escargot include:
* **ECMAScript Compliance**: Escargot supports a significant portion of the latest ECMAScript version ([ECMAScript 2025](https://262.ecma-international.org/16.0/)), ensuring compatibility with modern JavaScript standards while maintaining a lightweight footprint.
* **Memory Efficiency**: The engine is designed with memory constraints in mind, making it suitable for devices with limited RAM and storage.
* **Performance Optimization**: Escargot implements various optimization techniques to ensure fast execution of JavaScript code, even on low-power devices.
* **Extensibility**: The engine can be customized and extended to meet the specific needs of different applications, providing flexibility for developers.
Escargot is an open-source project that allows developers to contribute to its development or use it in their own projects, while also powering several services in Samsung products. The engine's design prioritizes simplicity and efficiency, making it an excellent choice for developers working in embedded or resource-limited environments.
## Contents 📋
* [Building](#Building-)
* [Linux](#Linux)
* [macOS](#macOS)
* [Android](#Android)
* [Windows](#Windows)
* [Testing](#Testing-)
* [Contributing](#Contributing-)
* [Research Papers](#Research-Papers-)
* [License](#License-)
## Building 🛠️
### Supported Platforms and Architectures
| **OS** | **Architecture** |
|-|-|
| **Linux(Ubuntu)** | x86/x64/arm/aarch64 |
| macOS | x64/aarch64 |
| Windows | Win32/x64 |
| Android | x86/x64/arm/aarch64 |
### Build Options
The following build options are supported when generating build rules using cmake.
| **Option** | **Description** | **Flag** | **Value** | **Default** |
|-|-|-|-|-|
| **HOST** | Choose target platform | -DESCARGOT_HOST | linux/darwin/android/windows | |
| **ARCH** | Choose target architecture | -DESCARGOT_ARCH | x64/x86/arm/aarch64 | |
| **MODE** | Choose release/debug mode | -DESCARGOT_MODE | release/debug | release |
| **OUTPUT** | Choose build output type | -DESCARGOT_OUTPUT | shared_lib/static_lib/shell/cctest | shell |
| **LIBICU** | Include libicu library | -DESCARGOT_LIBICU_SUPPORT | ON/OFF | ON |
| **WASM** | Enable WebAssembly support | -DESCARGOT_WASM | ON/OFF | OFF |
| **CODE_CACHE** | Enable code cache | -DESCARGOT_CODE_CACHE | ON/OFF | OFF |
| **TCO** | Enable tail call optimization | -DESCARGOT_TCO | ON/OFF | OFF |
| **THREADING** | Enable threading features (e.g. Atomics, SharedArrayBuffer) | -DESCARGOT_THREADING | ON/OFF | ON |
| **TLS_ADDRESS_OFFSET** | Enable thread local storge access optimization(offset) | -DESCARGOT_TLS_ACCESS_BY_ADDRESS | ON/OFF | OFF |
| **TLS_PTHREAD_KEY** | Enable thread local storge access optimization(pthread_key) | -DESCARGOT_TLS_ACCESS_BY_PTHREAD_KEY | ON/OFF | OFF |
| **TEMPORAL** | Enable Temporal support | -ESCARGOT_TEMPORAL | ON/OFF | OFF |
| **SHADOWREALM** | Enable ShadowRealm support | -ESCARGOT_SHADOWREALM | ON/OFF | OFF |
| **SMALL_CONFIG** | Enable aggressive memory optimizations for tiny devices | -DESCARGOT_SMALL_CONFIG | ON/OFF | OFF |
| **TEST** | Enable additional features used only for testing | -DESCARGOT_TEST | ON/OFF | OFF |
| **DEBUGGER** | Enable Debug server | -DESCARGOT_DEBUGGER | ON/OFF | OFF |
### Linux
General build prerequisites: General build prerequisites:
```sh ```sh
sudo apt-get install autoconf automake cmake libtool libicu-dev ninja-build sudo apt-get install autoconf automake cmake libtool libicu-dev ninja-build pkg-config
``` ```
Prerequisites for x86-64-to-x86 compilation: Prerequisites for x86-64-to-x86 compilation:
@ -21,56 +75,120 @@ sudo apt-get install gcc-multilib g++-multilib
sudo apt-get install libicu-dev:i386 sudo apt-get install libicu-dev:i386
``` ```
#### On macOS Build Escargot:
```sh ```sh
brew install autoconf automake cmake icu4c libtool ninja pkg-config git submodule update --init third_party # update submodules
``` cmake -DESCARGOT_MODE=release -DESCARGOT_OUTPUT=shell -GNinja
Note: For later build steps (cmake, pkg-config) to find ICU libraries, you may
need to set the `PKG_CONFIG_PATH` environment variable, as instructed by brew.
E.g.:
```sh
export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
```
## Build Escargot
```sh
git clone https://github.com/Samsung/escargot.git
cd escargot
git submodule update --init third_party
cmake -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release -DESCARGOT_OUTPUT=shell -GNinja
ninja ninja
``` ```
#### Build options ### macOS
The following build options are supported when generating ninja rules using cmake. General build prerequisites:
* -DESCARGOT_HOST=[ linux | tizen_obs | darwin ]<br>
Compile Escargot for Linux, Tizen, or macOS platform
* -DESCARGOT_ARCH=[ x64 | x86 | arm | i686 | aarch64 ]<br>
Compile Escargot for each architecture
* -DESCARGOT_MODE=[ debug | release ]<br>
Compile Escargot for either release or debug mode
* -DESCARGOT_OUTPUT=[ shared_lib | static_lib | shell | shell_test | cctest ]<br>
Define target output type
* -DESCARGOT_LIBICU_SUPPORT=[ ON | OFF ]<br>
Enable libicu library if set ON. (Optional, default = ON)
## Testing
First, get benchmarks and tests:
```sh ```sh
git submodule update --init brew install autoconf automake cmake icu4c libtool ninja pkg-config
# add icu path to pkg_config_path (x64)
export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
# add icu path to pkg_config_path (arm64)
export PKG_CONFIG_PATH="/opt/homebrew/opt/icu4c/lib/pkgconfig:$PKG_CONFIG_PATH"
``` ```
### Benchmarks Build Escargot:
Test run for each benchmark (Sunspider, Octane, V8, Chakracore, test262,
SpiderMonkey, etc.):
```sh ```sh
tools/run-tests.py --arch=x86_64 spidermonkey test262 v8 git submodule update --init third_party # update submodules
cmake -DESCARGOT_MODE=release -DESCARGOT_OUTPUT=shell -GNinja
ninja
``` ```
### Android
Build prerequisites on Ubuntu:
```sh
sudo apt install openjdk-17-jdk # require java 17
```
Build Escargot using gradle:
```sh
git submodule update --init third_party # update submodules
export ANDROID_SDK_ROOT=.... # set your android SDK root first
cd build/android/
./gradlew bundleReleaseAar # build escargot AAR
./gradlew bundleHostJar # bundle jar for host
./gradlew javadocJar # create java doc
./gradlew sourcesJar # create sources jar
./gradlew assembleDebug # build debug test shell
./gradlew :escargot:connectedDebugAndroidTest # run escargot-jni tests on android device
./gradlew :escargot:testDebugUnitTest # run escargot-jni tests on host
```
### Windows
Install VS2022 with cmake and ninja.
Open [ x86 Native Tools Command Prompt for VS 2022 | x64 Native Tools Command Prompt for VS 2022 ]
```sh
git submodule update --init third_party # update submodules
CMake -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_NAME=[ Windows | WindowsStore ] -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=[ x86 | x64 ] -DCMAKE_GENERATOR_PLATFORM=[ Win32 | x64 ],version=10.0.18362.0 -DESCARGOT_ARCH=[ x86 | x64 ] -DESCARGOT_MODE=release -Bout -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_THREADING=ON
cd out
msbuild ESCARGOT.sln /property:Configuration=Release /p:platform=[ Win32 | x64 ]
```
## Debugger
Make sure Escargot is built with the `-DESCARGOT_DEBUGGER=1` flag (off by default) enabled;
then start Escargot with the `--start-debug-server` option.
### Connect using a debugger client
- Escargot python debugger
- run `./tools/debugger/debugger.py`; It will automatically connect to a debug server on the default port `6501`
- run `./tools/debugger/debugger.py --help` for a list of options
- [Visual Studio Code extension](https://github.com/Samsung/escargot-vscode-extension/?tab=readme-ov-file#how-to-use)
- Chrome Devtools `⚠️ Early in development ⚠️`
- Initial setup:
- Navigate to [chrome://inspect](chrome://inspect)
- Make sure *Discover network targets* is enabled; click configure
- Add `localhost:6501` as a target; click Done
- Usage:
- The started debug server will be listed in the *Remote Target* list (If it is not, the page may need to be reloaded using the browser reload button)
- Click `inspect`
- A new window with the Chrome Devtools debugger UI will open
## Testing ✅
Escargot supports various benchmark sets, which can be run using the [tools/run-tests.py](https://github.com/Samsung/escargot/blob/master/tools/run-tests.py) script.
| Benchmark | flag |
| --- | --- |
| SunSpider 1.0.2 | `sunspider` |
| [Octane 2.0](https://github.com/chromium/octane.git) | `octane` |
| [test262](https://github.com/tc39/test262.git) | `test262` |
| [Web Tooling Benchmark](https://github.com/v8/web-tooling-benchmark) | `web-tooling-benchmark` |
| SpiderMonkey (vendor-made) | `spidermonkey` |
| ChakraCore (vendor-made) | `chakracore` |
| V8 (vendor-made) | `v8` |
Run each benchmark separately or all together as shown below:
```sh
tools/run-tests.py --engine=./out/linux/x64/release/escargot web-tooling-benchmark
tools/run-tests.py --engine=./out/linux/x64/release/escargot spidermonkey test262 v8
```
## Contributing 💡
Escargot welcomes contributions from developers in any form, wheter it's code, documentation, bug reports, or suggestions. By contributing to the project, you agree to license your contributions under the [LGPL-2.1](https://github.com/Samsung/escargot/blob/master/LICENSE) license.
#### ❗ Vulnerability Reporting
⚠️ If you identify any vulnerabilities, please report them through the [Issues page](https://github.com/Samsung/escargot/issues). *Reports sent via other channels may not be considered or may be processed with delays*. Please note that our project assumes the execution of valid JavaScript source code only. Handling of invalid source code is not within the main scope of this project and might not be addressed.
## Research Papers 📝
* [Dynamic code compression for JavaScript engine](https://doi.org/10.1002/spe.3186)
Software: Practice and Experience Vol. 53 (5), pp. 1196-1217, 2023
* [Tail Call Optimization Tailored for Native Stack Utilization in JavaScript Runtimes](https://doi.org/10.1109/ACCESS.2024.3441750)
IEEE Access Vol. 12, pp. 111801-111817, 2024
## License 📜
Escargot is open-source software primarily licensed under [LGPL-2.1](https://github.com/Samsung/escargot/blob/master/LICENSE), with some components covered by other licenses. Complete license and copyright information can be found in the source code.

View file

@ -1 +1 @@
v3.0.0 v4.3.0

10
build/android/.gitignore vendored Normal file
View file

@ -0,0 +1,10 @@
*.iml
.gradle
/local.properties
/.idea/*
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

3
build/android/.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

1
build/android/.idea/.name generated Normal file
View file

@ -0,0 +1 @@
Escargot android

6
build/android/.idea/compiler.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

20
build/android/.idea/gradle.xml generated Normal file
View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/escargot" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

10
build/android/.idea/misc.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

18
build/android/.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../test/kangax" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../test/octane" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../test/test262" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../test/vendortest" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../test/web-tooling-benchmark" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/GCutil" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/googletest" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/walrus" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/walrus/third_party/sljit" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/walrus/third_party/uvwasi" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/walrus/third_party/wasm-c-api" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../../third_party/wasm/wabt" vcs="Git" />
</component>
</project>

1
build/android/app/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,41 @@
plugins {
id 'com.android.application'
}
android {
namespace 'com.samsung.lwe.escargot.shell'
compileSdk 34
defaultConfig {
applicationId "com.samsung.lwe.escargot.shell"
minSdk 28
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation project(path: ':escargot')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

21
build/android/app/proguard-rules.pro vendored Normal file
View file

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View file

@ -0,0 +1,26 @@
package com.samsung.lwe.escargot.shell;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.samsung.lwe.escargot.shell", appContext.getPackageName());
}
}

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.EscargotAndroidTestShell"
tools:targetApi="31">
<profileable android:shell="true" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>

View file

@ -0,0 +1,333 @@
package com.samsung.lwe.escargot.shell;
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import com.samsung.lwe.escargot.Bridge;
import com.samsung.lwe.escargot.Context;
import com.samsung.lwe.escargot.Evaluator;
import com.samsung.lwe.escargot.Globals;
import com.samsung.lwe.escargot.JavaScriptArrayObject;
import com.samsung.lwe.escargot.JavaScriptJavaCallbackFunctionObject;
import com.samsung.lwe.escargot.JavaScriptString;
import com.samsung.lwe.escargot.JavaScriptValue;
import com.samsung.lwe.escargot.Memory;
import com.samsung.lwe.escargot.VMInstance;
import com.samsung.lwe.escargot.util.MultiThreadExecutor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Optional;
public class MainActivity extends AppCompatActivity {
private void copyAssets() {
AssetManager assetManager = getAssets();
String[] files = null;
try {
files = assetManager.list("");
} catch (IOException e) {
Log.e("tag", "Failed to get asset file list.", e);
}
for(String filename : files) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
File outFile = new File(getApplicationContext().getFilesDir(), filename);
out = new FileOutputStream(outFile);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + filename, e);
}
}
Log.e("Escargot shell", getApplicationContext().getFilesDir().getAbsolutePath());
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
String str = "";
private void run()
{
final String base = getApplicationContext().getFilesDir().getAbsolutePath() + "/";
new Thread(() -> {
Globals.initializeGlobals();
Memory.setGCFrequency(2);
VMInstance vm = VMInstance.create(Optional.empty(), Optional.empty());
Context context = Context.create(vm);
{
Context finalContext = context;
context.getGlobalObject().set(context, JavaScriptString.create("print"), JavaScriptJavaCallbackFunctionObject.create(context, "print", 1, false, new JavaScriptJavaCallbackFunctionObject.Callback() {
@Override
public Optional<JavaScriptValue> callback(Context context, JavaScriptValue javaScriptValue, JavaScriptValue[] javaScriptValues) {
StringBuffer sb = new StringBuffer();
sb.append(str);
sb.append('\n');
for (int i = 0; i < javaScriptValues.length; i ++) {
if (i > 0) {
System.out.print(" ");
sb.append(' ');
}
Optional<JavaScriptString> s = javaScriptValues[i].toString(finalContext);
if (s.isPresent()) {
String j = s.get().toJavaString();
System.out.print(j);
sb.append(j);
}
}
System.out.println();
str = sb.toString();
final String ff = str;
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv = ((TextView)findViewById(R.id.output));
tv.setText(ff);
}
});
return Optional.empty();
}
}));
context.getGlobalObject().set(context, JavaScriptString.create("load"), JavaScriptJavaCallbackFunctionObject.create(context, "run", 1, false, new JavaScriptJavaCallbackFunctionObject.Callback() {
@Override
public Optional<JavaScriptValue> callback(Context context, JavaScriptValue javaScriptValue, JavaScriptValue[] javaScriptValues) {
Optional<JavaScriptString> s = javaScriptValues[0].toString(finalContext);
if (s.isPresent()) {
try {
byte[] chars = Files.readAllBytes(Paths.get(s.get().toJavaString()));
String fileContent = new String(chars);
return Evaluator.evalScript(finalContext, fileContent, s.get().toJavaString(), false);
}
catch (Exception ex) {
ex.printStackTrace();
return Optional.empty();
}
}
return Optional.empty();
}
}));
context.getGlobalObject().set(context, JavaScriptString.create("run"), JavaScriptJavaCallbackFunctionObject.create(context, "run", 1, false, new JavaScriptJavaCallbackFunctionObject.Callback() {
@Override
public Optional<JavaScriptValue> callback(Context context, JavaScriptValue javaScriptValue, JavaScriptValue[] javaScriptValues) {
long sm = System.currentTimeMillis();
Optional<JavaScriptString> s = javaScriptValues[0].toString(finalContext);
if (s.isPresent()) {
Evaluator.evalScript(finalContext, "load('" + s.get().toJavaString() + "')", "<code>", false);
}
return Optional.of(JavaScriptValue.create(System.currentTimeMillis() - sm));
}
}));
context.getGlobalObject().set(context, JavaScriptString.create("read"), JavaScriptJavaCallbackFunctionObject.create(context, "read", 1, false, new JavaScriptJavaCallbackFunctionObject.Callback() {
@Override
public Optional<JavaScriptValue> callback(Context context, JavaScriptValue javaScriptValue, JavaScriptValue[] javaScriptValues) {
Optional<JavaScriptString> s = javaScriptValues[0].toString(finalContext);
if (s.isPresent()) {
FileReader in = null;
try {
byte[] chars = Files.readAllBytes(Paths.get(s.get().toJavaString()));
String fileContent = new String(chars);
return Optional.of(JavaScriptString.create(fileContent));
}
catch (Exception ex) {
return Optional.empty();
}
}
return Optional.empty();
}
}));
}
String source = "load('" + base + "test.js" + "');";
String fileName = "<java code>";
Evaluator.evalScript(context,
source,
fileName,
true);
context = null;
vm = null;
Memory.gc();
Memory.gc();
Memory.gc();
Memory.gc();
Memory.gc();
Globals.finalizeGlobals();
}).start();
}
public void runExample()
{
new Thread(() -> {
Looper.prepare();
Handler handler = new Handler(Looper.myLooper());
Globals.initializeGlobals();
VMInstance vmInstance = VMInstance.create(Optional.empty(), Optional.empty());
Context context = Context.create(vmInstance);
context.getGlobalObject().set(context, JavaScriptString.create("print"), JavaScriptJavaCallbackFunctionObject.create(context, "", 1, false, new JavaScriptJavaCallbackFunctionObject.Callback() {
@Override
public Optional<JavaScriptValue> callback(Context context, JavaScriptValue receiverValue, JavaScriptValue[] arguments) {
System.out.println(arguments[0].toString(context).get().toJavaString());
return Optional.empty();
}
}));
context.getGlobalObject().set(context, JavaScriptString.create("end"), JavaScriptJavaCallbackFunctionObject.create(context, "", 1, false, new JavaScriptJavaCallbackFunctionObject.Callback() {
@Override
public Optional<JavaScriptValue> callback(Context context, JavaScriptValue receiverValue, JavaScriptValue[] arguments) {
Looper.myLooper().quitSafely();
return Optional.empty();
}
}));
MultiThreadExecutor executor = new MultiThreadExecutor(vmInstance, new MultiThreadExecutor.WorkerThreadEndNotifier() {
@Override
public void notify(MultiThreadExecutor executor, MultiThreadExecutor.ExecutorInstance instance) {
handler.post(new Runnable() {
@Override
public void run() {
executor.pumpEventsFromThreadIfNeeds();
}
});
}
});
Bridge.register(context, "HTTP", "get", new Bridge.Adapter() {
@Override
public Optional<JavaScriptValue> callback(Context context, Optional<JavaScriptValue> data) {
String url = "";
if (data.isPresent()) {
Optional<JavaScriptString> mayBeString = data.get().toString(context);
if (mayBeString.isPresent()) {
url = mayBeString.get().toJavaString();
}
}
final String finalURL = url;
MultiThreadExecutor.ExecutorInstance instance = executor.startWorker(context, new MultiThreadExecutor.Executor() {
@Override
public MultiThreadExecutor.ResultBuilderContext run() {
try {
HttpURLConnection connection = (HttpURLConnection)new URL(finalURL).openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return new MultiThreadExecutor.ResultBuilderContext(true, response.toString());
} else {
return new MultiThreadExecutor.ResultBuilderContext(false, "error HTTP return code:" + responseCode);
}
} catch (IOException e) {
return new MultiThreadExecutor.ResultBuilderContext(false, e.toString());
}
}
}, new MultiThreadExecutor.ResultBuilder() {
@Override
public JavaScriptValue build(Context scriptContext, MultiThreadExecutor.ResultBuilderContext builderContext) {
return JavaScriptString.create((String)builderContext.data());
}
});
return Optional.of(instance.promise());
}
});
Evaluator.evalScript(context, "" +
"let promise1 = HTTP.get('https://httpbin.org/get');" +
"let promise2 = HTTP.get('http://google.com');" +
"Promise.allSettled([promise1, promise2]).then(function(v) {" +
"print(JSON.stringify(v));" +
"print('http all end!');" +
"end();" +
"});", "", false);
Looper.loop();
Looper.myLooper().quit();
context = null;
vmInstance = null;
Memory.gc();
Memory.gc();
Memory.gc();
Memory.gc();
Memory.gc();
Globals.finalizeGlobals();
}).start();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// copy assets to internal storage (for copying js files which are used by test)
copyAssets();
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
run();
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runExample();
}
});
}
}

View file

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View file

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="run"/>
<Button
android:id="@+id/button2"
android:layout_toRightOf="@id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="mt example"/>
<TextView
android:layout_below="@+id/button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:singleLine="false"
android:text="result"
android:id="@+id/output"
android:textSize="8sp"
/>
</RelativeLayout>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View file

@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.EscargotAndroidTestShell" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View file

@ -0,0 +1,3 @@
<resources>
<string name="app_name">Escargot android test shell</string>
</resources>

View file

@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.EscargotAndroidTestShell" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View file

@ -0,0 +1,17 @@
package com.samsung.lwe.escargot.shell;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

View file

@ -0,0 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '8.10.1' apply false
id 'com.android.library' version '8.10.1' apply false
}

1
build/android/escargot/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,247 @@
plugins {
id 'com.android.library'
id 'jacoco'
id 'maven-publish'
}
ext {
force64Option = System.getProperty("ESCARGOT_BUILD_64BIT_FORCE_LARGE", "ON")
pthreadKeyOption = System.getProperty("ESCARGOT_BUILD_TLS_ACCESS_BY_PTHREAD_KEY", "OFF")
}
android {
namespace 'com.samsung.lwe.escargot'
compileSdk 36
ndkVersion '28.1.13356709'
defaultConfig {
minSdk 28
targetSdk 36
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
externalNativeBuild {
cmake {
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", "-DCMAKE_VERBOSE_MAKEFILE=ON", "-DESCARGOT_HOST=android", "-DESCARGOT_OUTPUT=static_lib", "-DENABLE_SHELL=OFF",
"-DESCARGOT_BUILD_64BIT_FORCE_LARGE="+project.ext.force64Option, "-DESCARGOT_TLS_ACCESS_BY_PTHREAD_KEY="+project.ext.pthreadKeyOption
}
}
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
jniDebuggable = true
ndk {
debuggable = true
}
}
debugShell {
initWith(buildTypes.debug)
externalNativeBuild {
cmake {
arguments "-DCMAKE_VERBOSE_MAKEFILE=ON", "-DESCARGOT_HOST=android", "-DESCARGOT_OUTPUT=static_lib", "-DENABLE_SHELL=ON"
}
}
}
releaseShell {
initWith(buildTypes.release)
jniDebuggable = true
ndk {
debuggable = true
}
externalNativeBuild {
cmake {
arguments "-DCMAKE_VERBOSE_MAKEFILE=ON", "-DESCARGOT_HOST=android", "-DESCARGOT_OUTPUT=static_lib", "-DENABLE_SHELL=ON"
}
}
}
}
sourceSets {
main.java.srcDirs('src/main/java')
test {
java.srcDir('src/androidTest/java')
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
ndkVersion '27.0.12077973'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
publishing {
singleVariant("release") {
// if you don't want sources/javadoc, remove these lines
withSourcesJar()
withJavadocJar()
}
}
}
publishing {
publications {
release(MavenPublication) {
afterEvaluate {
from components.release
}
artifactId "escargot-android"
groupId "com.samsung.lwe.escargot"
version "X.X.X.20XXXXXX.X.XXXXXXXX"
}
}
repositories {
maven {
url "/XXXXXX/android/releases/"
}
}
}
def dirForNativeNoNDK = project.layout.buildDirectory.get().dir("native_nondk")
def srcForNativeNoNDK = project.layout.projectDirectory.dir("src/main/cpp").asFile
task createNativeNoNDK() {
def dstdir = dirForNativeNoNDK.asFile
if (!dstdir.exists()) dstdir.mkdirs()
}
task buildCMakeNativeNoNDK(type: Exec) {
dependsOn createNativeNoNDK
workingDir dirForNativeNoNDK
if (org.gradle.internal.os.OperatingSystem.current().isLinux()) {
commandLine "/usr/bin/env", "cmake", "-DESCARGOT_HOST=linux", "-DESCARGOT_ARCH=x64", "-DESCARGOT_OUTPUT=static_lib",
"-DESCARGOT_BUILD_64BIT_FORCE_LARGE="+project.ext.force64Option,
"-DUNDER_NDK=OFF", srcForNativeNoNDK.absolutePath
} else if (org.gradle.internal.os.OperatingSystem.current().isMacOsX()) {
var javaHome = new ByteArrayOutputStream().withStream { os ->
exec {
executable "/usr/libexec/java_home"
args "-v", "1.8"
standardOutput = os
}
os.toString().trim()
}
var icu4cPath = new ByteArrayOutputStream().withStream { os ->
exec {
commandLine "sh", "-c", "brew --prefix icu4c"
standardOutput = os
}
os.toString().trim()
}
var pkgConfigPath = icu4cPath + "/lib/pkgconfig"
environment("PKG_CONFIG_PATH", pkgConfigPath)
commandLine "/usr/bin/env", "cmake", "-DESCARGOT_HOST=darwin", "-DESCARGOT_ARCH=x64", "-DESCARGOT_OUTPUT=static_lib", "-DUNDER_NDK=OFF",
"-DESCARGOT_BUILD_64BIT_FORCE_LARGE="+project.ext.force64Option,
"-DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF",
"-DJAVA_HOME=" + javaHome, "-DJAVA_INCLUDE_PATH=" + javaHome + "/include",
"-DJAVA_INCLUDE_PATH2=" + javaHome + "/include/darwin", "-DJAVA_AWT_INCLUDE_PATH=" + javaHome + "/include",
srcForNativeNoNDK.absolutePath
} else {
// TODO
}
}
task buildGMakeNativeNoNDK(type: Exec) {
dependsOn buildCMakeNativeNoNDK
workingDir dirForNativeNoNDK
commandLine "/usr/bin/env", "make", "-j" + Runtime.getRuntime().availableProcessors().toString();
}
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {
reports {
xml.required = true
html.required = true
}
def mainSrc = "${project.projectDir}/src/main/java"
sourceDirectories.setFrom(files([mainSrc]))
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*',
'android/**/*.*', '**/*Activity*.*']
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
classDirectories.setFrom(files([debugTree]))
executionData.setFrom(fileTree(dir: "${buildDir}/jacoco/testDebugUnitTest.exec"))
}
project.afterEvaluate {
if (org.gradle.internal.os.OperatingSystem.current().isLinux() || org.gradle.internal.os.OperatingSystem.current().isMacOsX()) {
testDebugUnitTest {
dependsOn buildGMakeNativeNoNDK
systemProperty "java.library.path", dirForNativeNoNDK.asFile.absolutePath + ":" + System.getProperty("java.library.path")
}
testReleaseUnitTest {
dependsOn buildGMakeNativeNoNDK
systemProperty "java.library.path", dirForNativeNoNDK.asFile.absolutePath + ":" + System.getProperty("java.library.path")
}
}
}
task clearHostJar(type: Delete) {
delete 'build/libs/escargot.jar'
}
task bundleHostJar(type: Jar) {
dependsOn buildGMakeNativeNoNDK
dependsOn assemble
from(zipTree('build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar'))
from(dirForNativeNoNDK.asFile.toString() + "/libescargot-jni.so")
from(dirForNativeNoNDK.asFile.toString() + "/libescargot-jni.dylib")
rename("libescargot-jni.dylib", "libescargot-jni.so")
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
archiveClassifier.set('sources')
archivesBaseName = "escargot"
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.sourceFiles
android.libraryVariants.all { variant ->
if (variant.name == 'release') {
owner.classpath += variant.javaCompileProvider.get().classpath
}
}
options.memberLevel = JavadocMemberLevel.PRIVATE
}
task javadocJar(type: Jar, dependsOn: javadoc) {
archiveClassifier.set('javadoc')
archivesBaseName = "escargot"
from javadoc.destinationDir
}
artifacts {
sourcesJar
javadocJar
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.7.0'
testImplementation 'junit:junit:4.13.2'
testImplementation project(path: ':escargot')
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation project(path: ':escargot')
}

View file

@ -0,0 +1,2 @@
-keep class com.samsung.lwe.escargot.* { *; }
-keep enum com.samsung.lwe.escargot.* { *; }

View file

@ -0,0 +1,24 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keep class com.samsung.lwe.escargot.* { *; }
-keep enum com.samsung.lwe.escargot.* { *; }

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>

View file

@ -0,0 +1,59 @@
cmake_minimum_required(VERSION 3.18.1)
project(escargot-jni)
option(UNDER_NDK "Build under the Android NDK" ON)
option(ENABLE_SHELL "Enable shell" OFF)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fexceptions -Wno-conversion-null -fPIC -ftls-model=local-dynamic ")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -ftls-model=local-dynamic ")
if (NOT UNDER_NDK)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -g3")
endif ()
SET (ESCARGOT_ARCH ${ANDROID_SYSROOT_ABI})
# STRING(TOLOWER ${CMAKE_BUILD_TYPE} ESCARGOT_MODE)
SET (ESCARGOT_MODE "release")
SET (ESCARGOT_THREADING ON)
if (ENABLE_SHELL)
SET (ESCARGOT_TEST ON)
SET (ESCARGOT_TEMPORAL ON)
SET (ESCARGOT_EXPORT_ALL ON)
endif ()
ADD_SUBDIRECTORY (${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../ escargot)
FILE (GLOB_RECURSE JNI_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
ADD_LIBRARY (escargot-jni SHARED ${JNI_SRC})
SET(LOG_LIBRARY "")
if (NOT UNDER_NDK)
ADD_DEFINITIONS(-DNDEBUG)
endif ()
if (UNDER_NDK)
FIND_LIBRARY(LOG_LIBRARY log)
# enable 16KB page size (require version of Android NDK >= 27)
TARGET_LINK_OPTIONS(escargot PRIVATE "-Wl,-z,max-page-size=16384")
TARGET_LINK_OPTIONS(escargot-jni PRIVATE "-Wl,-z,max-page-size=16384")
else ()
FIND_PACKAGE(JNI REQUIRED)
INCLUDE_DIRECTORIES(${JNI_INCLUDE_DIRS})
endif ()
TARGET_LINK_LIBRARIES (escargot-jni PRIVATE escargot ${LOG_LIBRARY})
if (ENABLE_SHELL)
SET(CMAKE_EXE_LINKER_FLAGS -Wl,-export-dynamic) # export symbol of Shell.cpp
ADD_COMPILE_OPTIONS(-DNDEBUG -g3 -DESCARGOT_ENABLE_TEST -fPIC)
ADD_LINK_OPTIONS(-static-libstdc++)
ADD_EXECUTABLE(escargot-shell ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/shell/Shell.cpp)
TARGET_INCLUDE_DIRECTORIES(escargot-shell PRIVATE ADD_SUBDIRECTORY
(${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/GCutil/include)
(${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src))
TARGET_LINK_LIBRARIES (escargot-shell PRIVATE escargot ${LOG_LIBRARY})
ADD_EXECUTABLE(test-data-runner ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../tools/test/test-data-runner/test-data-runner.cpp)
TARGET_COMPILE_OPTIONS(test-data-runner PRIVATE -std=c++11 -fPIC)
endif ()

View file

@ -0,0 +1,350 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
JavaVM* g_jvm;
size_t g_nonPointerValueLast = reinterpret_cast<size_t>(ValueRef::createUndefined());
thread_local std::vector<ExecutionStateRef*> ExecutionStateRefTracker::g_lastExecutionStateVector;
jobject createJavaValueObject(JNIEnv* env, jclass clazz, ValueRef* value)
{
jobject valueObject;
if (!value->isStoredInHeap()) {
valueObject = env->NewObject(clazz, env->GetMethodID(clazz, "<init>", "(JZ)V"), reinterpret_cast<jlong>(value), jboolean(false));
} else {
PersistentRefHolder<ValueRef>* pRef = new PersistentRefHolder<ValueRef>(value);
jlong ptr = reinterpret_cast<size_t>(pRef);
valueObject = env->NewObject(clazz, env->GetMethodID(clazz, "<init>", "(J)V"), ptr);
}
return valueObject;
}
jobject createJavaValueObject(JNIEnv* env, const char* className, ValueRef* value)
{
return createJavaValueObject(env, env->FindClass(className), value);
}
ValueRef* unwrapValueRefFromValue(JNIEnv* env, jclass clazz, jobject object)
{
auto ptr = env->GetLongField(object, env->GetFieldID(clazz, "m_nativePointer", "J"));
if (static_cast<size_t>(ptr) <= g_nonPointerValueLast || (static_cast<size_t>(ptr) & 1)) {
return reinterpret_cast<ValueRef*>(ptr);
} else {
PersistentRefHolder<ValueRef>* ref = reinterpret_cast<PersistentRefHolder<ValueRef>*>(ptr);
return ref->get();
}
}
jobject createJavaObjectFromValue(JNIEnv* env, ValueRef* value)
{
if (!value->isStoredInHeap() || value->isNumber()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptValue", value);
} else if (value->isString()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptString", value);
} else if (value->isSymbol()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptSymbol", value);
} else if (value->isBigInt()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptBigInt", value);
} else if (value->isObject()) {
if (value->isArrayObject()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptArrayObject", value);
} else if (value->isGlobalObject()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptGlobalObject", value);
} else if (value->isFunctionObject()) {
if (value->asFunctionObject()->extraData()) {
ScriptObjectExtraData* data = reinterpret_cast<ScriptObjectExtraData*>(value->asFunctionObject()->extraData());
if (data->implementSideData) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptJavaCallbackFunctionObject", value);
}
}
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptFunctionObject", value);
} else if (value->isPromiseObject()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptPromiseObject", value);
} else if (value->isErrorObject()) {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptErrorObject", value);
} else {
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptObject", value);
}
} else {
abort();
}
}
jobject createJavaObject(JNIEnv* env, VMInstanceRef* value)
{
PersistentRefHolder<VMInstanceRef>* pRef = new PersistentRefHolder<VMInstanceRef>(value);
jlong ptr = reinterpret_cast<size_t>(pRef);
jclass clazz = env->FindClass("com/samsung/lwe/escargot/VMInstance");
return env->NewObject(clazz, env->GetMethodID(clazz, "<init>", "(J)V"), ptr);
}
jobject createJavaObject(JNIEnv* env, ContextRef* value)
{
PersistentRefHolder<ContextRef>* pRef = new PersistentRefHolder<ContextRef>(value);
jlong ptr = reinterpret_cast<size_t>(pRef);
jclass clazz = env->FindClass("com/samsung/lwe/escargot/Context");
return env->NewObject(clazz, env->GetMethodID(clazz, "<init>", "(J)V"), ptr);
}
OptionalRef<JNIEnv> fetchJNIEnvFromCallback()
{
JNIEnv* env = nullptr;
if (g_jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) == JNI_EDETACHED) {
#if defined(_JAVASOFT_JNI_H_) // oraclejdk or openjdk
if (g_jvm->AttachCurrentThread(reinterpret_cast<void **>(&env), NULL) != 0) {
#else
if (g_jvm->AttachCurrentThread(reinterpret_cast<JNIEnv **>(&env), NULL) != 0) {
#endif
// give up
return nullptr;
}
}
return env;
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Escargot_init(JNIEnv* env, jclass clazz)
{
thread_local static bool inited = false;
if (!inited) {
if (!g_jvm) {
env->GetJavaVM(&g_jvm);
}
inited = true;
}
}
std::string fetchStringFromJavaOptionalString(JNIEnv *env, jobject optional)
{
auto classOptionalString = env->GetObjectClass(optional);
auto methodIsPresent = env->GetMethodID(classOptionalString, "isPresent", "()Z");
if (env->CallBooleanMethod(optional, methodIsPresent)) {
auto methodGet = env->GetMethodID(classOptionalString, "get", "()Ljava/lang/Object;");
jboolean isSucceed;
jstring value = static_cast<jstring>(env->CallObjectMethod(optional, methodGet));
const char* str = env->GetStringUTFChars(
value, &isSucceed);
auto length = env->GetStringUTFLength(value);
auto ret = std::string(str, length);
env->ReleaseStringUTFChars(value, str);
return ret;
}
return std::string();
}
StringRef* createJSStringFromJava(JNIEnv* env, jstring str)
{
if (!str) {
return StringRef::emptyString();
}
jboolean isSucceed;
const char* cString = env->GetStringUTFChars(str, &isSucceed);
StringRef* code = StringRef::createFromUTF8(cString, env->GetStringUTFLength(str));
env->ReleaseStringUTFChars(str, cString);
return code;
}
std::string createStringFromJava(JNIEnv* env, jstring str)
{
if (!str) {
return std::string();
}
jboolean isSucceed;
const char* cString = env->GetStringUTFChars(str, &isSucceed);
std::string ret = std::string(cString, env->GetStringUTFLength(str));
env->ReleaseStringUTFChars(str, cString);
return ret;
}
jstring createJavaStringFromJS(JNIEnv* env, StringRef* string)
{
std::basic_string<uint16_t> buf;
auto bad = string->stringBufferAccessData();
buf.reserve(bad.length);
for (size_t i = 0; i < bad.length ; i ++) {
buf.push_back(bad.charAt(i));
}
return env->NewString(buf.data(), buf.length());
}
void throwJavaRuntimeException(ExecutionStateRef* state)
{
state->throwException(ErrorObjectRef::create(state, ErrorObjectRef::None, StringRef::createFromASCII("Java runtime exception")));
}
bool hasJavaScriptRuntimeExceptionOnEnv(JNIEnv* env)
{
if (env->ExceptionCheck()) {
jthrowable exception = env->ExceptionOccurred();
env->ExceptionClear();
bool ret = env->IsInstanceOf(exception, env->FindClass("com/samsung/lwe/escargot/internal/JavaScriptRuntimeException"));
env->Throw(exception);
return ret;
}
return false;
}
OptionalRef<ValueRef> extractExceptionFromEnv(JNIEnv* env)
{
if (env->ExceptionCheck()) {
jthrowable exception = env->ExceptionOccurred();
env->ExceptionClear();
bool ret = env->IsInstanceOf(exception, env->FindClass("com/samsung/lwe/escargot/internal/JavaScriptRuntimeException"));
if (ret) {
jclass clz = env->FindClass("com/samsung/lwe/escargot/internal/JavaScriptRuntimeException");
jobject jv = env->CallObjectMethod(exception, env->GetMethodID(clz, "exception", "()Lcom/samsung/lwe/escargot/JavaScriptValue;"));
ValueRef* v = unwrapValueRefFromValue(env, env->GetObjectClass(jv), jv);
return v;
} else {
env->Throw(exception);
}
}
return nullptr;
}
bool hasJavaExcpetion(JNIEnv* env)
{
if (env->ExceptionCheck() && !hasJavaScriptRuntimeExceptionOnEnv(env)) {
return true;
}
return false;
}
jobject storeExceptionOnContextAndReturnsIt(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult)
{
if (hasJavaExcpetion(env)) {
return nullptr;
}
auto exceptionOnEnv = extractExceptionFromEnv(env);
jclass optionalClazz = env->FindClass("java/util/Optional");
// store exception to context
auto fieldId = env->GetFieldID(env->GetObjectClass(contextObject), "m_lastThrownException", "Ljava/util/Optional;");
ValueRef* exception = exceptionOnEnv ? exceptionOnEnv.get() : evaluatorResult.error.value();
auto fieldValue = env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
createJavaObjectFromValue(env, exception));
env->SetObjectField(contextObject, fieldId, fieldValue);
return env->CallStaticObjectMethod(optionalClazz, env->GetStaticMethodID(optionalClazz, "empty",
"()Ljava/util/Optional;"));
}
jobject createOptionalValueFromEvaluatorJavaScriptValueResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult)
{
if (hasJavaExcpetion(env)) {
return nullptr;
}
if (evaluatorResult.isSuccessful()) {
jclass optionalClazz = env->FindClass("java/util/Optional");
return env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
createJavaObjectFromValue(env, evaluatorResult.result));
}
return storeExceptionOnContextAndReturnsIt(env, contextObject, context, evaluatorResult);
}
jobject createOptionalValueFromEvaluatorBooleanResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult)
{
if (hasJavaExcpetion(env)) {
return nullptr;
}
if (evaluatorResult.isSuccessful()) {
jclass optionalClazz = env->FindClass("java/util/Optional");
auto booleanClazz = env->FindClass("java/lang/Boolean");
auto valueOfMethodId = env->GetStaticMethodID(booleanClazz, "valueOf", "(Z)Ljava/lang/Boolean;");
auto javaBoolean = env->CallStaticObjectMethod(booleanClazz, valueOfMethodId, (jboolean)evaluatorResult.result->asBoolean());
return env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
javaBoolean);
}
return storeExceptionOnContextAndReturnsIt(env, contextObject, context, evaluatorResult);
}
jobject createOptionalValueFromEvaluatorIntegerResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult)
{
if (hasJavaExcpetion(env)) {
return nullptr;
}
if (evaluatorResult.isSuccessful()) {
jclass optionalClazz = env->FindClass("java/util/Optional");
auto containerClass = env->FindClass("java/lang/Integer");
auto valueOfMethodId = env->GetStaticMethodID(containerClass, "valueOf", "(I)Ljava/lang/Integer;");
auto javaValue = env->CallStaticObjectMethod(containerClass, valueOfMethodId, (jint)evaluatorResult.result->asInt32());
return env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
javaValue);
}
return storeExceptionOnContextAndReturnsIt(env, contextObject, context, evaluatorResult);
}
jobject createOptionalValueFromEvaluatorDoubleResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult)
{
if (hasJavaExcpetion(env)) {
return nullptr;
}
if (evaluatorResult.isSuccessful()) {
jclass optionalClazz = env->FindClass("java/util/Optional");
auto containerClass = env->FindClass("java/lang/Double");
auto valueOfMethodId = env->GetStaticMethodID(containerClass, "valueOf", "(D)Ljava/lang/Double;");
auto javaValue = env->CallStaticObjectMethod(containerClass, valueOfMethodId, (jdouble)evaluatorResult.result->asNumber());
return env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
javaValue);
}
return storeExceptionOnContextAndReturnsIt(env, contextObject, context, evaluatorResult);
}
ScriptObjectExtraData* ensureScriptObjectExtraData(ObjectRef* ref)
{
ScriptObjectExtraData* data = reinterpret_cast<ScriptObjectExtraData*>(ref->extraData());
if (!data) {
data = new ScriptObjectExtraData;
ref->setExtraData(data);
Memory::gcRegisterFinalizer(ref, [](void* self, void* data) {
ScriptObjectExtraData* extraData = reinterpret_cast<ScriptObjectExtraData*>(reinterpret_cast<ObjectRef*>(self)->extraData());
auto env = fetchJNIEnvFromCallback();
if (env) {
if (extraData->implementSideData) {
env->DeleteGlobalRef(extraData->implementSideData);
extraData->implementSideData = nullptr;
}
if (extraData->userData) {
env->DeleteGlobalRef(extraData->userData);
extraData->userData = nullptr;
}
}
}, nullptr);
}
return data;
}

View file

@ -0,0 +1,185 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef ESCARGOT_ANDROID_ESCARGOTJNI_H
#define ESCARGOT_ANDROID_ESCARGOTJNI_H
#include <jni.h>
#include <EscargotPublic.h>
#include <vector>
#include <set>
#include <cassert>
using namespace Escargot;
#if defined(ANDROID)
#include <android/log.h>
#define LOG_TAG "Escargot"
#define LOGUNK(...) __android_log_print(ANDROID_LOG_UNKNOWN,LOG_TAG,__VA_ARGS__)
#define LOGDEF(...) __android_log_print(ANDROID_LOG_DEFAULT,LOG_TAG,__VA_ARGS__)
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define LOGF(...) __android_log_print(ANDROID_FATAL_ERROR,LOG_TAG,__VA_ARGS__)
#define LOGS(...) __android_log_print(ANDROID_SILENT_ERROR,LOG_TAG,__VA_ARGS__)
#else
#define LOGUNK(...) fprintf(stdout,__VA_ARGS__)
#define LOGDEF(...) fprintf(stdout,__VA_ARGS__)
#define LOGV(...) fprintf(stdout,__VA_ARGS__)
#define LOGD(...) fprintf(stdout,__VA_ARGS__)
#define LOGI(...) fprintf(stdout,__VA_ARGS__)
#define LOGW(...) fprintf(stdout,__VA_ARGS__)
#define LOGE(...) fprintf(stderr,__VA_ARGS__)
#define LOGF(...) fprintf(stderr,__VA_ARGS__)
#define LOGS(...) fprintf(stderr,__VA_ARGS__)
#endif
#define THROW_NPE_RETURN_NULL(param, paramType) \
if (env->ExceptionCheck()) { \
return 0; \
} \
if (!param) { \
env->ThrowNew(env->FindClass("java/lang/NullPointerException"), paramType" cannot be null"); \
return 0; \
}
#define THROW_NPE_RETURN_VOID(param, paramType) \
if (env->ExceptionCheck()) { \
return; \
} \
if (!param) { \
env->ThrowNew(env->FindClass("java/lang/NullPointerException"), paramType" cannot be null"); \
return; \
}
#define THROW_CAST_EXCEPTION_IF_NEEDS(param, value, typeName) \
if (env->ExceptionCheck()) { \
return NULL; \
} \
if (!value->is##typeName()) { \
env->ThrowNew(env->FindClass("java/lang/ClassCastException"), "Can not cast to " #typeName); \
return NULL; \
}
extern JavaVM* g_jvm;
extern size_t g_nonPointerValueLast;
jobject createJavaValueObject(JNIEnv* env, jclass clazz, ValueRef* value);
jobject createJavaValueObject(JNIEnv* env, const char* className, ValueRef* value);
jobject createJavaObject(JNIEnv* env, VMInstanceRef* value);
jobject createJavaObject(JNIEnv* env, ContextRef* value);
ValueRef* unwrapValueRefFromValue(JNIEnv* env, jclass clazz, jobject object);
jobject createJavaObjectFromValue(JNIEnv* env, ValueRef* value);
ValueRef* unwrapValueRefFromValue(JNIEnv* env, jclass clazz, jobject object);
OptionalRef<JNIEnv> fetchJNIEnvFromCallback();
std::string fetchStringFromJavaOptionalString(JNIEnv *env, jobject optional);
StringRef* createJSStringFromJava(JNIEnv* env, jstring str);
std::string createStringFromJava(JNIEnv* env, jstring str);
jstring createJavaStringFromJS(JNIEnv* env, StringRef* string);
void throwJavaRuntimeException(ExecutionStateRef* state);
OptionalRef<ValueRef> extractExceptionFromEnv(JNIEnv* env);
jobject storeExceptionOnContextAndReturnsIt(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult);
jobject createOptionalValueFromEvaluatorJavaScriptValueResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult);
jobject createOptionalValueFromEvaluatorBooleanResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult);
jobject createOptionalValueFromEvaluatorIntegerResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult);
jobject createOptionalValueFromEvaluatorDoubleResult(JNIEnv* env, jobject contextObject, ContextRef* context, Evaluator::EvaluatorResult& evaluatorResult);
struct ScriptObjectExtraData {
jobject userData;
jobject implementSideData;
ScriptObjectExtraData()
: userData(nullptr)
, implementSideData(nullptr)
{
}
void* operator new(size_t t)
{
return Memory::gcMallocAtomic(sizeof(ScriptObjectExtraData));
}
};
ScriptObjectExtraData* ensureScriptObjectExtraData(ObjectRef* ref);
template<typename T>
jobject nativeOptionalValueIntoJavaOptionalValue(JNIEnv* env, OptionalRef<T> ref)
{
if (env->ExceptionCheck()) {
return nullptr;
}
jclass optionalClazz = env->FindClass("java/util/Optional");
if (ref) {
jmethodID ctorMethod = env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;");
return env->CallStaticObjectMethod(optionalClazz, ctorMethod, createJavaObjectFromValue(env, ref.value()));
}
return env->CallStaticObjectMethod(optionalClazz, env->GetStaticMethodID(optionalClazz, "empty",
"()Ljava/util/Optional;"));
}
template<typename NativeType>
PersistentRefHolder<NativeType>* getPersistentPointerFromJava(JNIEnv *env, jclass clazz, jobject object)
{
auto ptr = env->GetLongField(object, env->GetFieldID(clazz, "m_nativePointer", "J"));
PersistentRefHolder<NativeType>* pVMRef = reinterpret_cast<PersistentRefHolder<NativeType>*>(ptr);
return pVMRef;
}
class ExecutionStateRefTracker {
public:
ExecutionStateRefTracker(ExecutionStateRef* newValue)
{
g_lastExecutionStateVector.push_back(newValue);
}
~ExecutionStateRefTracker()
{
g_lastExecutionStateVector.pop_back();
}
private:
friend class ScriptEvaluator;
static thread_local std::vector<ExecutionStateRef*> g_lastExecutionStateVector;
};
class ScriptEvaluator {
public:
template <typename... Args, typename F>
static Evaluator::EvaluatorResult execute(ContextRef* ctx, F&& closure, Args... args)
{
typedef ValueRef* (*Closure)(ExecutionStateRef * state, Args...);
if (ExecutionStateRefTracker::g_lastExecutionStateVector.size()) {
return Evaluator::execute(ExecutionStateRefTracker::g_lastExecutionStateVector.back(), [](ExecutionStateRef * state, Closure closure, Args... args) -> ValueRef* {
ExecutionStateRefTracker tracker(state);
return closure(state, args...);
}, Closure(closure), args...);
} else {
return Evaluator::execute(ctx, [](ExecutionStateRef * state, Closure closure, Args... args) -> ValueRef* {
ExecutionStateRefTracker tracker(state);
return closure(state, args...);
}, Closure(closure), args...);
}
}
};
#endif //ESCARGOT_ANDROID_ESCARGOTJNI_H

View file

@ -0,0 +1,74 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptArrayObject_create(JNIEnv* env, jclass clazz,
jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state) -> ValueRef* {
return ArrayObjectRef::create(state);
});
assert(evaluatorResult.isSuccessful());
return createJavaObjectFromValue(env, evaluatorResult.result->asArrayObject());
}
extern "C"
JNIEXPORT jlong JNICALL
Java_com_samsung_lwe_escargot_JavaScriptArrayObject_length(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ArrayObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asArrayObject();
int64_t length = 0;
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ArrayObjectRef* thisValueRef, int64_t* pLength) -> ValueRef* {
*pLength = static_cast<int64_t>(thisValueRef->length(state));
return ValueRef::createUndefined();
}, thisValueRef, &length);
return length;
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_JavaScriptArrayObject_setLength(JNIEnv* env, jobject thiz,
jobject context, jlong newLength)
{
THROW_NPE_RETURN_VOID(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ArrayObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asArrayObject();
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ArrayObjectRef* thisValueRef, jlong pLength) -> ValueRef* {
if (pLength >= 0) {
thisValueRef->setLength(state, static_cast<uint64_t>(pLength));
} else {
thisValueRef->set(state, AtomicStringRef::create(state->context(), "length")->string(), ValueRef::create(pLength));
}
return ValueRef::createUndefined();
}, thisValueRef, newLength);
}

View file

@ -0,0 +1,80 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_create__I(JNIEnv* env, jclass clazz, jint num)
{
return createJavaValueObject(env, clazz, BigIntRef::create(static_cast<int64_t>(num)));
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_create__J(JNIEnv* env, jclass clazz, jlong num)
{
return createJavaValueObject(env, clazz, BigIntRef::create(static_cast<int64_t>(num)));
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_create__Ljava_lang_String_2I(JNIEnv* env,
jclass clazz,
jstring numString,
jint radix)
{
return createJavaValueObject(env, clazz,
BigIntRef::create(createJSStringFromJava(env, numString), radix));
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_create__Lcom_samsung_lwe_escargot_JavaScriptString_2I(
JNIEnv* env, jclass clazz, jobject numString, jint radix)
{
if (numString) {
return createJavaValueObject(env, clazz,
BigIntRef::create(unwrapValueRefFromValue(env, env->GetObjectClass(
numString), numString)->asString(), radix));
} else {
return createJavaValueObject(env, clazz, BigIntRef::create(static_cast<int64_t>(0)));
}
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_toString(JNIEnv* env, jobject thiz, jint radix)
{
return createJavaObjectFromValue(env, unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asBigInt()->toString(radix));
}
extern "C"
JNIEXPORT jdouble JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_toNumber(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asBigInt()->toNumber();
}
extern "C"
JNIEXPORT jlong JNICALL
Java_com_samsung_lwe_escargot_JavaScriptBigInt_toInt64(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asBigInt()->toInt64();
}

View file

@ -0,0 +1,153 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_Bridge_register(JNIEnv* env, jclass clazz, jobject context,
jstring objectName, jstring propertyName,
jobject adapter)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(adapter, "Adapter");
auto contextPtr = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context),
context);
auto jsObjectName = createJSStringFromJava(env, objectName);
auto jsPropertyName = createJSStringFromJava(env, propertyName);
if (!jsObjectName->length() || !jsPropertyName->length()) {
return 0;
}
adapter = env->NewGlobalRef(adapter);
auto evalResult = ScriptEvaluator::execute(contextPtr->get(),
[](ExecutionStateRef* state, JNIEnv* env, jobject adapter,
StringRef* jsObjectName,
StringRef* jsPropertyName) -> ValueRef* {
auto globalObject = state->context()->globalObject();
ObjectRef* targetObject;
ValueRef* willBeTargetObject = globalObject->getOwnProperty(
state, jsObjectName);
if (willBeTargetObject->isObject()) {
targetObject = willBeTargetObject->asObject();
} else {
targetObject = ObjectRef::create(state);
globalObject->defineDataProperty(state,
jsObjectName,
targetObject,
true, true, true);
}
FunctionObjectRef::NativeFunctionInfo info(
AtomicStringRef::create(state->context(), jsPropertyName),
[](ExecutionStateRef* state,
ValueRef* thisValue, size_t argc,
ValueRef** argv,
bool isConstructorCall) -> ValueRef* {
ExecutionStateRefTracker tracker(state);
FunctionObjectRef* callee = state->resolveCallee().get();
jobject jo = ensureScriptObjectExtraData(
reinterpret_cast<FunctionObjectRef*>(callee))->implementSideData;
auto env = fetchJNIEnvFromCallback();
if (!env) {
// give up
LOGE("could not fetch env from callback");
return ValueRef::createUndefined();
}
if (env->ExceptionCheck()) {
throwJavaRuntimeException(state);
return ValueRef::createUndefined();
}
env->PushLocalFrame(32);
jobject callbackArg;
jclass optionalClazz = env->FindClass(
"java/util/Optional");
if (argc) {
callbackArg = env->CallStaticObjectMethod(
optionalClazz,
env->GetStaticMethodID(
optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
createJavaObjectFromValue(env.get(), argv[0]));
} else {
callbackArg = env->CallStaticObjectMethod(
optionalClazz,
env->GetStaticMethodID(
optionalClazz, "empty",
"()Ljava/util/Optional;"));
}
auto javaReturnValue = env->CallObjectMethod(
jo,
env->GetMethodID(
env->GetObjectClass(jo),
"callback",
"(Lcom/samsung/lwe/escargot/Context;Ljava/util/Optional;)Ljava/util/Optional;"),
createJavaObject(env.get(), callee->context()),
callbackArg);
if (env->ExceptionCheck()) {
env->PopLocalFrame(NULL);
throwJavaRuntimeException(state);
return ValueRef::createUndefined();
}
auto methodIsPresent = env->GetMethodID(
optionalClazz, "isPresent", "()Z");
ValueRef* nativeReturnValue = ValueRef::createUndefined();
if (javaReturnValue && env->CallBooleanMethod(javaReturnValue,
methodIsPresent)) {
auto methodGet = env->GetMethodID(
optionalClazz, "get",
"()Ljava/lang/Object;");
jobject value = env->CallObjectMethod(
javaReturnValue, methodGet);
nativeReturnValue = unwrapValueRefFromValue(
env.get(),
env->GetObjectClass(value),
value);
}
env->PopLocalFrame(NULL);
return nativeReturnValue;
}, 1, true, false);
FunctionObjectRef* callback = FunctionObjectRef::create(
state, info);
targetObject->defineDataProperty(state, jsPropertyName,
callback, true, true,
true);
return callback;
}, env, adapter, jsObjectName, jsPropertyName);
if (evalResult.isSuccessful()) {
FunctionObjectRef* callback = evalResult.result->asFunctionObject();
ensureScriptObjectExtraData(callback)->implementSideData = adapter;
} else {
env->DeleteGlobalRef(adapter);
}
return evalResult.isSuccessful();
}

View file

@ -0,0 +1,61 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_Context_create(JNIEnv* env, jclass clazz, jobject vmInstance)
{
THROW_NPE_RETURN_NULL(vmInstance, "VMInstance");
auto vmPtr = getPersistentPointerFromJava<VMInstanceRef>(env, env->GetObjectClass(vmInstance),
vmInstance);
auto contextRef = ContextRef::create(vmPtr->get());
return createJavaObject(env, contextRef.get());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_Context_getGlobalObject(JNIEnv* env, jobject thiz)
{
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(thiz), thiz);
return createJavaObjectFromValue(env, contextRef->get()->globalObject());
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_Context_throwException(JNIEnv* env, jobject thiz, jobject exception)
{
THROW_NPE_RETURN_NULL(exception, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(thiz), thiz);
if (contextRef->get()->canThrowException()) {
ValueRef* exceptionRef = unwrapValueRefFromValue(env, env->GetObjectClass(exception), exception);
if (exceptionRef->isErrorObject()) {
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* exceptionRef) -> ValueRef* {
exceptionRef->asErrorObject()->updateStackTraceData(state);
return ValueRef::createUndefined();
}, exceptionRef);
}
jclass clz = env->FindClass("com/samsung/lwe/escargot/internal/JavaScriptRuntimeException");
jobject obj = env->NewObject(clz, env->GetMethodID(clz, "<init>", "(Lcom/samsung/lwe/escargot/JavaScriptValue;)V"), exception);
env->Throw(static_cast<jthrowable>(obj));
}
return false;
}

View file

@ -0,0 +1,80 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptErrorObject_create(JNIEnv* env, jclass clazz,
jobject context, jobject kind,
jstring message)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(kind, "ErrorKind");
THROW_NPE_RETURN_NULL(message, "String");
auto nameMethod = env->GetMethodID(env->GetObjectClass(kind), "name", "()Ljava/lang/String;");
auto kindName = (jstring)env->CallObjectMethod(kind, nameMethod);
auto string = createStringFromJava(env, kindName);
ErrorObjectRef::Code code = Escargot::ErrorObjectRef::None;
if (string == "ReferenceError") {
code = Escargot::ErrorObjectRef::ReferenceError;
} else if (string == "TypeError") {
code = Escargot::ErrorObjectRef::TypeError;
} else if (string == "SyntaxError") {
code = Escargot::ErrorObjectRef::SyntaxError;
} else if (string == "RangeError") {
code = Escargot::ErrorObjectRef::RangeError;
} else if (string == "URIError") {
code = Escargot::ErrorObjectRef::URIError;
} else if (string == "EvalError") {
code = Escargot::ErrorObjectRef::EvalError;
} else if (string == "AggregateError") {
code = Escargot::ErrorObjectRef::AggregateError;
}
StringRef* jsMessage = createJSStringFromJava(env, message);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state,
ErrorObjectRef::Code code, StringRef* jsMessage) -> ValueRef* {
return ErrorObjectRef::create(state, code, jsMessage);
}, code, jsMessage);
assert(evaluatorResult.isSuccessful());
return createJavaObjectFromValue(env, evaluatorResult.result->asErrorObject());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptErrorObject_stack(JNIEnv* env, jobject thiz,
jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ErrorObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asErrorObject();
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ErrorObjectRef* thisValueRef) -> ValueRef* {
return thisValueRef->getOwnProperty(state, StringRef::createFromASCII("stack"))->toString(state);
}, thisValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(), evaluatorResult);
}

View file

@ -0,0 +1,118 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
static bool stringEndsWith(const std::string& str, const std::string& suffix)
{
return str.size() >= suffix.size() && 0 == str.compare(str.size() - suffix.size(), suffix.size(), suffix);
}
static Evaluator::EvaluatorResult evalScript(ContextRef* context, StringRef* source, StringRef* srcName, bool shouldPrintScriptResult, bool shouldExecutePendingJobsAtEnd, bool isModule)
{
if (stringEndsWith(srcName->toStdUTF8String(), "mjs")) {
isModule = isModule || true;
}
auto scriptInitializeResult = context->scriptParser()->initializeScript(source, srcName, isModule);
if (!scriptInitializeResult.script) {
LOGD("Script parsing error: ");
switch (scriptInitializeResult.parseErrorCode) {
case Escargot::ErrorObjectRef::Code::SyntaxError:
LOGD("SyntaxError");
break;
case Escargot::ErrorObjectRef::Code::EvalError:
LOGD("EvalError");
break;
case Escargot::ErrorObjectRef::Code::RangeError:
LOGD("RangeError");
break;
case Escargot::ErrorObjectRef::Code::ReferenceError:
LOGD("ReferenceError");
break;
case Escargot::ErrorObjectRef::Code::TypeError:
LOGD("TypeError");
break;
case Escargot::ErrorObjectRef::Code::URIError:
LOGD("URIError");
break;
default:
break;
}
LOGD(": %s\n", scriptInitializeResult.parseErrorMessage->toStdUTF8String().data());
Evaluator::EvaluatorResult evalResult;
evalResult.error = StringRef::createFromASCII("script parsing error");
return evalResult;
}
auto evalResult = ScriptEvaluator::execute(context, [](ExecutionStateRef* state, ScriptRef* script) -> ValueRef* {
return script->execute(state);
},
scriptInitializeResult.script.get());
if (!evalResult.isSuccessful()) {
if (shouldPrintScriptResult) {
LOGD("Uncaught %s:\n", evalResult.resultOrErrorToString(context)->toStdUTF8String().data());
for (size_t i = 0; i < evalResult.stackTrace.size(); i++) {
LOGD("%s (%d:%d)\n", evalResult.stackTrace[i].srcName->toStdUTF8String().data(), (int)evalResult.stackTrace[i].loc.line, (int)evalResult.stackTrace[i].loc.column);
}
}
} else {
if (shouldPrintScriptResult) {
LOGD("%s", evalResult.resultOrErrorToString(context)->toStdUTF8String().data());
}
}
if (shouldExecutePendingJobsAtEnd) {
while (context->vmInstance()->hasPendingJob() || context->vmInstance()->hasPendingJobFromAnotherThread()) {
if (context->vmInstance()->waitEventFromAnotherThread(10)) {
context->vmInstance()->executePendingJobFromAnotherThread();
}
if (context->vmInstance()->hasPendingJob()) {
auto jobResult = context->vmInstance()->executePendingJob();
if (shouldPrintScriptResult) {
if (jobResult.error) {
LOGD("Uncaught %s:(in promise job)\n", jobResult.resultOrErrorToString(context)->toStdUTF8String().data());
} else {
LOGD("%s(in promise job)\n", jobResult.resultOrErrorToString(context)->toStdUTF8String().data());
}
}
}
}
}
return evalResult;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_Evaluator_evalScript(JNIEnv* env, jclass clazz, jobject context,
jstring source, jstring sourceFileName,
jboolean shouldPrintScriptResult,
jboolean shouldExecutePendingJobsAtEnd)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto ptr = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
Evaluator::EvaluatorResult result = evalScript(ptr->get(), createJSStringFromJava(env, source),
createJSStringFromJava(env, sourceFileName), shouldPrintScriptResult,
shouldExecutePendingJobsAtEnd, false);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, ptr->get(), result);
}

View file

@ -0,0 +1,113 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptFunctionObject_context(JNIEnv* env, jobject thiz)
{
FunctionObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asFunctionObject();
return createJavaObject(env, thisValueRef->context());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptJavaCallbackFunctionObject_create(JNIEnv* env, jclass clazz,
jobject context,
jstring functionName,
jint argumentCount,
jboolean isConstructor,
jobject callback)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(callback, "Callback");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context),
context);
FunctionObjectRef::NativeFunctionInfo info(
AtomicStringRef::create(contextRef->get(), createJSStringFromJava(env, functionName)),
[](ExecutionStateRef* state, ValueRef* thisValue, size_t argc, ValueRef** argv, bool isConstructorCall) -> ValueRef* {
auto env = fetchJNIEnvFromCallback();
if (!env) {
LOGE("failed to fetch env from function callback");
return ValueRef::createUndefined();
}
if (env->ExceptionCheck()) {
throwJavaRuntimeException(state);
return ValueRef::createUndefined();
}
ExecutionStateRefTracker tracker(state);
env->PushLocalFrame(32);
jobject callback = ensureScriptObjectExtraData(state->resolveCallee().get())->implementSideData;
auto callbackMethodId = env->GetMethodID(env->GetObjectClass(callback), "callback",
"(Lcom/samsung/lwe/escargot/Context;Lcom/samsung/lwe/escargot/JavaScriptValue;[Lcom/samsung/lwe/escargot/JavaScriptValue;)Ljava/util/Optional;");
jobjectArray javaArgv = env->NewObjectArray(argc, env->FindClass("com/samsung/lwe/escargot/JavaScriptValue"), nullptr);
for (size_t i = 0; i < argc; i ++) {
auto ref = createJavaObjectFromValue(env.get(), argv[i]);
env->SetObjectArrayElement(javaArgv, i, ref);
env->DeleteLocalRef(ref);
}
jobject returnValue = env->CallObjectMethod(
callback,
callbackMethodId,
createJavaObject(env.get(), state->resolveCallee()->context()),
createJavaObjectFromValue(env.get(), thisValue),
javaArgv
);
if (env->ExceptionCheck()) {
env->PopLocalFrame(NULL);
throwJavaRuntimeException(state);
return ValueRef::createUndefined();
}
ValueRef* nativeReturnValue = ValueRef::createUndefined();
if (returnValue) {
auto classOptional = env->GetObjectClass(returnValue);
auto methodIsPresent = env->GetMethodID(classOptional, "isPresent", "()Z");
if (env->CallBooleanMethod(returnValue, methodIsPresent)) {
auto methodGet = env->GetMethodID(classOptional, "get", "()Ljava/lang/Object;");
jobject callbackReturnValue = env->CallObjectMethod(returnValue, methodGet);
nativeReturnValue = unwrapValueRefFromValue(env.get(), env->GetObjectClass(callbackReturnValue), callbackReturnValue);
}
}
env->PopLocalFrame(NULL);
return nativeReturnValue;
},
argumentCount,
isConstructor);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(),
[](ExecutionStateRef* state, FunctionObjectRef::NativeFunctionInfo info) -> ValueRef* {
return FunctionObjectRef::create(state, info);
}, info);
assert(evaluatorResult.isSuccessful());
callback = env->NewGlobalRef(callback);
FunctionObjectRef* fn = evaluatorResult.result->asFunctionObject();
ensureScriptObjectExtraData(fn)->implementSideData = callback;
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptJavaCallbackFunctionObject", fn);
}

View file

@ -0,0 +1,137 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_jsonStringify(JNIEnv* env, jobject thiz,
jobject context, jobject input)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(input, "JavaScriptValue");
auto globalObjectRef = getPersistentPointerFromJava<GlobalObjectRef>(env, env->GetObjectClass(context), thiz);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* inputValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(input), input);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* inputValueRef) -> ValueRef* {
return globalObject->jsonStringify()->call(state, globalObject->json(), 1, &inputValueRef);
}, globalObjectRef->get(), inputValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_jsonParse(JNIEnv* env, jobject thiz,
jobject context, jobject input)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(input, "JavaScriptValue");
auto globalObjectRef = getPersistentPointerFromJava<GlobalObjectRef>(env, env->GetObjectClass(context), thiz);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* inputValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(input), input);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* inputValueRef) -> ValueRef* {
return globalObject->jsonParse()->call(state, globalObject->json(), 1, &inputValueRef);
}, globalObjectRef->get(), inputValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
static jobject callPromiseBuiltinFunction(JNIEnv* env, jobject thiz, jobject context, jobject iterable,
ValueRef* (*closure)(ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef))
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(iterable, "JavaScriptValue");
auto globalObjectRef = getPersistentPointerFromJava<GlobalObjectRef>(env, env->GetObjectClass(context), thiz);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* iterableValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(iterable), iterable);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), closure, globalObjectRef->get(), iterableValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_promiseAll(JNIEnv* env, jobject thiz,
jobject context, jobject iterable)
{
return callPromiseBuiltinFunction(env, thiz, context, iterable, [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef) -> ValueRef* {
return globalObject->promiseAll()->call(state, globalObject->promise(), 1, &iterableValueRef);
});
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_promiseAllSettled(JNIEnv* env, jobject thiz,
jobject context,
jobject iterable)
{
return callPromiseBuiltinFunction(env, thiz, context, iterable, [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef) -> ValueRef* {
return globalObject->promiseAllSettled()->call(state, globalObject->promise(), 1, &iterableValueRef);
});
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_promiseAny(JNIEnv* env, jobject thiz,
jobject context, jobject iterable)
{
return callPromiseBuiltinFunction(env, thiz, context, iterable, [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef) -> ValueRef* {
return globalObject->promiseAny()->call(state, globalObject->promise(), 1, &iterableValueRef);
});
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_promiseRace(JNIEnv* env, jobject thiz,
jobject context, jobject iterable)
{
return callPromiseBuiltinFunction(env, thiz, context, iterable, [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef) -> ValueRef* {
return globalObject->promiseRace()->call(state, globalObject->promise(), 1, &iterableValueRef);
});
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_promiseReject(JNIEnv* env, jobject thiz,
jobject context,
jobject iterable)
{
return callPromiseBuiltinFunction(env, thiz, context, iterable, [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef) -> ValueRef* {
return globalObject->promiseReject()->call(state, globalObject->promise(), 1, &iterableValueRef);
});
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptGlobalObject_promiseResolve(JNIEnv* env, jobject thiz,
jobject context,
jobject iterable)
{
return callPromiseBuiltinFunction(env, thiz, context, iterable, [](ExecutionStateRef* state, GlobalObjectRef* globalObject, ValueRef* iterableValueRef) -> ValueRef* {
return globalObject->promiseResolve()->call(state, globalObject->promise(), 1,
&iterableValueRef);
});
}

View file

@ -0,0 +1,319 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
static void gcCallback(void* data)
{
auto env = fetchJNIEnvFromCallback();
if (!env) {
LOGE("failed to fetch env from gc event callback");
return;
}
if (!env->ExceptionCheck()) {
env->PushLocalFrame(32);
jclass clazz = env->FindClass("com/samsung/lwe/escargot/NativePointerHolder");
jmethodID mId = env->GetStaticMethodID(clazz, "cleanUp", "()V");
env->CallStaticVoidMethod(clazz, mId);
env->PopLocalFrame(NULL);
}
}
static OptionalRef<StringRef> builtinHelperFileRead(OptionalRef<ExecutionStateRef> state, const char* fileName, const char* builtinName)
{
FILE* fp = fopen(fileName, "r");
if (fp) {
StringRef* src = StringRef::emptyString();
std::string utf8Str;
std::basic_string<unsigned char, std::char_traits<unsigned char>> str;
char buf[512];
bool hasNonLatin1Content = false;
size_t readLen;
while ((readLen = fread(buf, 1, sizeof buf, fp))) {
if (!hasNonLatin1Content) {
for (size_t i = 0; i < readLen; i++) {
unsigned char ch = buf[i];
if (ch & 0x80) {
// check non-latin1 character
hasNonLatin1Content = true;
fseek(fp, 0, SEEK_SET);
break;
}
str += ch;
}
} else {
utf8Str.append(buf, readLen);
}
}
fclose(fp);
if (StringRef::isCompressibleStringEnabled()) {
if (state) {
if (hasNonLatin1Content) {
src = StringRef::createFromUTF8ToCompressibleString(state->context()->vmInstance(), utf8Str.data(), utf8Str.length(), false);
} else {
src = StringRef::createFromLatin1ToCompressibleString(state->context()->vmInstance(), str.data(), str.length());
}
} else {
if (hasNonLatin1Content) {
src = StringRef::createFromUTF8(utf8Str.data(), utf8Str.length(), false);
} else {
src = StringRef::createFromLatin1(str.data(), str.length());
}
}
} else {
if (hasNonLatin1Content) {
src = StringRef::createFromUTF8(utf8Str.data(), utf8Str.length(), false);
} else {
src = StringRef::createFromLatin1(str.data(), str.length());
}
}
return src;
} else {
if (state) {
const size_t maxNameLength = 980;
if ((strnlen(builtinName, maxNameLength) + strnlen(fileName, maxNameLength)) < maxNameLength) {
char msg[1024];
snprintf(msg, sizeof(msg), "GlobalObject.%s: cannot open file %s", builtinName, fileName);
state->throwException(URIErrorObjectRef::create(state.get(), StringRef::createFromUTF8(msg, strnlen(msg, sizeof msg))));
} else {
state->throwException(URIErrorObjectRef::create(state.get(), StringRef::createFromASCII("invalid file name")));
}
} else {
LOGE("%s", fileName);
}
return nullptr;
}
}
class ShellPlatform : public PlatformRef {
public:
bool m_canBlock;
ShellPlatform()
: m_canBlock(true)
{
}
void setCanBlock(bool b)
{
m_canBlock = b;
}
virtual void markJSJobEnqueued(ContextRef* relatedContext) override
{
// ignore. we always check pending job after eval script
}
virtual void markJSJobFromAnotherThreadExists(ContextRef* relatedContext) override
{
// ignore. we always check pending job after eval script
}
virtual LoadModuleResult onLoadModule(ContextRef* relatedContext, ScriptRef* whereRequestFrom, StringRef* moduleSrc, ModuleType type) override
{
std::string referrerPath = whereRequestFrom->src()->toStdUTF8String();
auto& loadedModules = *reinterpret_cast<std::vector<std::tuple<std::string, ContextRef*, PersistentRefHolder<ScriptRef>>>*>(threadLocalCustomData());
for (size_t i = 0; i < loadedModules.size(); i++) {
if (std::get<2>(loadedModules[i]) == whereRequestFrom) {
referrerPath = std::get<0>(loadedModules[i]);
break;
}
}
std::string absPath = absolutePath(referrerPath, moduleSrc->toStdUTF8String());
if (absPath.length() == 0) {
std::string s = "Error reading : " + moduleSrc->toStdUTF8String();
return LoadModuleResult(ErrorObjectRef::Code::None, StringRef::createFromUTF8(s.data(), s.length()));
}
for (size_t i = 0; i < loadedModules.size(); i++) {
if (std::get<0>(loadedModules[i]) == absPath && std::get<1>(loadedModules[i]) == relatedContext) {
return LoadModuleResult(std::get<2>(loadedModules[i]));
}
}
OptionalRef<StringRef> source = builtinHelperFileRead(nullptr, absPath.data(), "");
if (!source) {
std::string s = "Error reading : " + absPath;
return LoadModuleResult(ErrorObjectRef::Code::None, StringRef::createFromUTF8(s.data(), s.length()));
}
ScriptParserRef::InitializeScriptResult parseResult;
StringRef* srcName = StringRef::createFromUTF8(absPath.data(), absPath.size());
if (type == ModuleJSON) {
parseResult = relatedContext->scriptParser()->initializeJSONModule(source.value(), srcName);
} else {
parseResult = relatedContext->scriptParser()->initializeScript(source.value(), srcName, true);
}
if (!parseResult.isSuccessful()) {
return LoadModuleResult(parseResult.parseErrorCode, parseResult.parseErrorMessage);
}
return LoadModuleResult(parseResult.script.get());
}
virtual void didLoadModule(ContextRef* relatedContext, OptionalRef<ScriptRef> referrer, ScriptRef* loadedModule) override
{
std::string path;
if (referrer && loadedModule->src()->length() && loadedModule->src()->charAt(0) != '/') {
path = absolutePath(referrer->src()->toStdUTF8String(), loadedModule->src()->toStdUTF8String());
} else {
path = absolutePath(loadedModule->src()->toStdUTF8String());
}
auto& loadedModules = *reinterpret_cast<std::vector<std::tuple<std::string, ContextRef*, PersistentRefHolder<ScriptRef>>>*>(threadLocalCustomData());
loadedModules.push_back(std::make_tuple(path, relatedContext, PersistentRefHolder<ScriptRef>(loadedModule)));
}
virtual void hostImportModuleDynamically(ContextRef* relatedContext, ScriptRef* referrer, StringRef* src, ModuleType type, PromiseObjectRef* promise) override
{
LoadModuleResult loadedModuleResult = onLoadModule(relatedContext, referrer, src, type);
notifyHostImportModuleDynamicallyResult(relatedContext, referrer, src, promise, loadedModuleResult);
}
virtual bool canBlockExecution(ContextRef* relatedContext) override
{
return m_canBlock;
}
virtual void* allocateThreadLocalCustomData() override
{
return new std::vector<std::tuple<std::string /* abs path */, ContextRef*, PersistentRefHolder<ScriptRef>>>();
}
virtual void deallocateThreadLocalCustomData() override
{
delete reinterpret_cast<std::vector<std::tuple<std::string, ContextRef*, PersistentRefHolder<ScriptRef>>>*>(threadLocalCustomData());
}
private:
std::string dirnameOf(const std::string& fname)
{
size_t pos = fname.find_last_of("/");
if (std::string::npos == pos) {
pos = fname.find_last_of("\\/");
}
return (std::string::npos == pos)
? ""
: fname.substr(0, pos);
}
std::string absolutePath(const std::string& referrerPath, const std::string& src)
{
std::string utf8MayRelativePath = dirnameOf(referrerPath) + "/" + src;
auto absPath = realpath(utf8MayRelativePath.data(), nullptr);
if (!absPath) {
return std::string();
}
std::string utf8AbsolutePath = absPath;
free(absPath);
return utf8AbsolutePath;
}
std::string absolutePath(const std::string& src)
{
auto absPath = realpath(src.data(), nullptr);
if (!absPath) {
return std::string();
}
std::string utf8AbsolutePath = absPath;
free(absPath);
return utf8AbsolutePath;
}
};
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Globals_initializeGlobals(JNIEnv* env, jclass clazz)
{
if (!Globals::isInitialized()) {
Globals::initialize(new ShellPlatform());
Memory::addGCEventListener(Memory::MARK_START, gcCallback, nullptr);
}
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Globals_finalizeGlobals(JNIEnv* env, jclass clazz)
{
if (Globals::isInitialized()) {
// java object cleanup
gcCallback(nullptr);
Memory::removeGCEventListener(Memory::MARK_START, gcCallback, nullptr);
Globals::finalize();
}
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Globals_initializeThread(JNIEnv* env, jclass clazz)
{
if (!Globals::isInitialized()) {
Globals::initializeThread();
}
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Globals_finalizeThread(JNIEnv* env, jclass clazz)
{
if (Globals::isInitialized()) {
Globals::finalizeThread();
}
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_Globals_isInitialized(JNIEnv* env, jclass clazz)
{
return Globals::isInitialized();
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_samsung_lwe_escargot_Globals_version(JNIEnv* env, jclass clazz)
{
std::string version = Globals::version();
std::basic_string<uint16_t> u16Version;
for (auto c: version) {
u16Version.push_back(c);
}
return env->NewString(u16Version.data(), u16Version.length());
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_samsung_lwe_escargot_Globals_buildDate(JNIEnv* env, jclass clazz)
{
std::string version = Globals::buildDate();
std::basic_string<uint16_t> u16Version;
for (auto c: version) {
u16Version.push_back(c);
}
return env->NewString(u16Version.data(), u16Version.length());
}

View file

@ -0,0 +1,48 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Memory_gc(JNIEnv* env, jclass clazz)
{
Memory::gc();
}
extern "C"
JNIEXPORT jlong JNICALL
Java_com_samsung_lwe_escargot_Memory_heapSize(JNIEnv* env, jclass clazz)
{
return Memory::heapSize();
}
extern "C"
JNIEXPORT jlong JNICALL
Java_com_samsung_lwe_escargot_Memory_totalSize(JNIEnv* env, jclass clazz)
{
return Memory::totalSize();
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_Memory_setGCFrequency(JNIEnv* env, jclass clazz, jint value)
{
Memory::setGCFrequency(value);
}

View file

@ -0,0 +1,32 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_NativePointerHolder_releaseNativePointerMemory(JNIEnv* env,
jclass clazz, jlong pointer)
{
uint64_t ptrInNumber = (uint64_t)(pointer);
if (ptrInNumber > g_nonPointerValueLast && !(pointer & 1)) {
PersistentRefHolder<void>* pRef = reinterpret_cast<PersistentRefHolder<void>*>(pointer);
delete pRef;
}
}

View file

@ -0,0 +1,173 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_create(JNIEnv* env, jclass clazz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state) -> ValueRef* {
return ObjectRef::create(state);
});
assert(evaluatorResult.isSuccessful());
return createJavaObjectFromValue(env, evaluatorResult.result->asObject());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_get(JNIEnv* env, jobject thiz, jobject context,
jobject propertyName)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(propertyName, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asObject();
ValueRef* propertyNameValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(propertyName), propertyName);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ObjectRef* thisValueRef, ValueRef* propertyNameValueRef) -> ValueRef* {
return thisValueRef->get(state, propertyNameValueRef);
}, thisValueRef, propertyNameValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_set(JNIEnv* env, jobject thiz, jobject context,
jobject propertyName, jobject value)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(propertyName, "JavaScriptValue");
THROW_NPE_RETURN_NULL(value, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asObject();
ValueRef* propertyNameValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(propertyName), propertyName);
ValueRef* valueRef = unwrapValueRefFromValue(env, env->GetObjectClass(value), value);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ObjectRef* thisValueRef, ValueRef* propertyNameValueRef, ValueRef* valueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->set(state, propertyNameValueRef, valueRef));
}, thisValueRef, propertyNameValueRef, valueRef);
return createOptionalValueFromEvaluatorBooleanResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_defineDataProperty(JNIEnv* env, jobject thiz,
jobject context,
jobject propertyName,
jobject value,
jboolean isWritable,
jboolean isEnumerable,
jboolean isConfigurable)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(propertyName, "JavaScriptValue");
THROW_NPE_RETURN_NULL(value, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asObject();
ValueRef* propertyNameValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(propertyName), propertyName);
ValueRef* valueRef = unwrapValueRefFromValue(env, env->GetObjectClass(value), value);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ObjectRef* thisValueRef, ValueRef* propertyNameValueRef, ValueRef* valueRef,
jboolean isWritable,
jboolean isEnumerable,
jboolean isConfigurable) -> ValueRef* {
return ValueRef::create(thisValueRef->defineDataProperty(state, propertyNameValueRef, valueRef, isWritable, isEnumerable, isConfigurable));
}, thisValueRef, propertyNameValueRef, valueRef, isWritable, isEnumerable, isConfigurable);
return createOptionalValueFromEvaluatorBooleanResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_getOwnProperty(JNIEnv* env, jobject thiz,
jobject context,
jobject propertyName)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(propertyName, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asObject();
ValueRef* propertyNameValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(propertyName), propertyName);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ObjectRef* thisValueRef, ValueRef* propertyNameValueRef) -> ValueRef* {
return thisValueRef->getOwnProperty(state, propertyNameValueRef);
}, thisValueRef, propertyNameValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_setExtraData(JNIEnv* env, jobject thiz,
jobject object)
{
ObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asObject();
jobject extraData = nullptr;
if (object) {
auto classOptional = env->GetObjectClass(object);
auto methodIsPresent = env->GetMethodID(classOptional, "isPresent", "()Z");
if (env->CallBooleanMethod(object, methodIsPresent)) {
auto methodGet = env->GetMethodID(classOptional, "get", "()Ljava/lang/Object;");
jboolean isSucceed;
extraData = env->CallObjectMethod(object, methodGet);
extraData = env->NewGlobalRef(extraData);
}
}
ensureScriptObjectExtraData(thisValueRef)->userData = extraData;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptObject_extraData(JNIEnv* env, jobject thiz)
{
ObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asObject();
jobject extraData = nullptr;
if (thisValueRef->extraData()) {
extraData = ensureScriptObjectExtraData(thisValueRef)->userData;
}
jclass optionalClazz = env->FindClass("java/util/Optional");
if (extraData) {
return env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "of",
"(Ljava/lang/Object;)Ljava/util/Optional;"),
extraData);
} else {
return env->CallStaticObjectMethod(optionalClazz,
env->GetStaticMethodID(optionalClazz, "empty",
"()Ljava/util/Optional;"));
}
}

View file

@ -0,0 +1,172 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_create(JNIEnv* env, jclass clazz,
jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state) -> ValueRef* {
return PromiseObjectRef::create(state);
});
assert(evaluatorResult.isSuccessful());
return createJavaObjectFromValue(env, evaluatorResult.result->asPromiseObject());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_state(JNIEnv* env, jobject thiz)
{
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
jclass enumClass = env->FindClass(
"com/samsung/lwe/escargot/JavaScriptPromiseObject$PromiseState");
jfieldID enumFieldID;
PromiseObjectRef::PromiseState state = thisValueRef->state();
if (state == PromiseObjectRef::Pending) {
enumFieldID = env->GetStaticFieldID(enumClass, "Pending",
"Lcom/samsung/lwe/escargot/JavaScriptPromiseObject$PromiseState;");
} else if (state == PromiseObjectRef::FulFilled) {
enumFieldID = env->GetStaticFieldID(enumClass, "FulFilled",
"Lcom/samsung/lwe/escargot/JavaScriptPromiseObject$PromiseState;");
} else {
enumFieldID = env->GetStaticFieldID(enumClass, "Rejected",
"Lcom/samsung/lwe/escargot/JavaScriptPromiseObject$PromiseState;");
}
return env->GetStaticObjectField(enumClass, enumFieldID);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_promiseResult(JNIEnv* env, jobject thiz)
{
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
return createJavaObjectFromValue(env, thisValueRef->promiseResult());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_then__Lcom_samsung_lwe_escargot_Context_2Lcom_samsung_lwe_escargot_JavaScriptValue_2(
JNIEnv* env, jobject thiz, jobject context, jobject handler)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(handler, "JavaScriptValue");
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
ValueRef* handlerRef = unwrapValueRefFromValue(env, env->GetObjectClass(handler), handler);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, PromiseObjectRef* promiseObject, ValueRef* handlerRef) -> ValueRef* {
return promiseObject->then(state, handlerRef);
}, thisValueRef, handlerRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_then__Lcom_samsung_lwe_escargot_Context_2Lcom_samsung_lwe_escargot_JavaScriptValue_2Lcom_samsung_lwe_escargot_JavaScriptValue_2(
JNIEnv* env, jobject thiz, jobject context, jobject onFulfilled, jobject onRejected)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(onFulfilled, "JavaScriptValue");
THROW_NPE_RETURN_NULL(onRejected, "JavaScriptValue");
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
ValueRef* onFulfilledRef = unwrapValueRefFromValue(env, env->GetObjectClass(onFulfilled), onFulfilled);
ValueRef* onRejectedRef = unwrapValueRefFromValue(env, env->GetObjectClass(onRejected), onRejected);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, PromiseObjectRef* promiseObject, ValueRef* onFulfilledRef, ValueRef* onRejectedRef) -> ValueRef* {
return promiseObject->then(state, onFulfilledRef, onRejectedRef);
}, thisValueRef, onFulfilledRef, onRejectedRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_catchOperation(JNIEnv* env, jobject thiz,
jobject context,
jobject handler)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(handler, "JavaScriptValue");
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
ValueRef* handlerRef = unwrapValueRefFromValue(env, env->GetObjectClass(handler), handler);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, PromiseObjectRef* promiseObject, ValueRef* handlerRef) -> ValueRef* {
return promiseObject->catchOperation(state, handlerRef);
}, thisValueRef, handlerRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_fulfill(JNIEnv* env, jobject thiz,
jobject context, jobject value)
{
THROW_NPE_RETURN_VOID(context, "Context");
THROW_NPE_RETURN_VOID(value, "JavaScriptValue");
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
ValueRef* valueRef = unwrapValueRefFromValue(env, env->GetObjectClass(value), value);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, PromiseObjectRef* promiseObject, ValueRef* valueRef) -> ValueRef* {
promiseObject->fulfill(state, valueRef);
return ValueRef::createUndefined();
}, thisValueRef, valueRef);
assert(evaluatorResult.isSuccessful());
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_reject(JNIEnv* env, jobject thiz,
jobject context, jobject reason)
{
THROW_NPE_RETURN_VOID(context, "Context");
THROW_NPE_RETURN_VOID(reason, "JavaScriptValue");
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
ValueRef* reasonRef = unwrapValueRefFromValue(env, env->GetObjectClass(reason), reason);
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, PromiseObjectRef* promiseObject, ValueRef* reasonRef) -> ValueRef* {
promiseObject->reject(state, reasonRef);
return ValueRef::createUndefined();
}, thisValueRef, reasonRef);
assert(evaluatorResult.isSuccessful());
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptPromiseObject_hasHandler(JNIEnv* env, jobject thiz)
{
PromiseObjectRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asPromiseObject();
return thisValueRef->hasResolveHandlers() || thisValueRef->hasRejectHandlers();
}

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptString_create(JNIEnv* env, jclass clazz, jstring value)
{
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptString", createJSStringFromJava(env, value));
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_samsung_lwe_escargot_JavaScriptString_toJavaString(JNIEnv* env, jobject thiz)
{
StringRef* string = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asString();
return createJavaStringFromJS(env, string);
}

View file

@ -0,0 +1,79 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptSymbol_create(JNIEnv* env, jclass clazz, jobject value)
{
OptionalRef<StringRef> descString;
if (value) {
auto classOptionalJavaScriptString = env->GetObjectClass(value);
auto methodIsPresent = env->GetMethodID(classOptionalJavaScriptString, "isPresent", "()Z");
if (env->CallBooleanMethod(value, methodIsPresent)) {
auto methodGet = env->GetMethodID(classOptionalJavaScriptString, "get", "()Ljava/lang/Object;");
jboolean isSucceed;
jobject javaObjectValue = env->CallObjectMethod(value, methodGet);
descString = unwrapValueRefFromValue(env, env->GetObjectClass(javaObjectValue), javaObjectValue)->asString();
}
}
return createJavaValueObject(env, "com/samsung/lwe/escargot/JavaScriptSymbol", SymbolRef::create(descString));
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptSymbol_fromGlobalSymbolRegistry(JNIEnv* env, jclass clazz,
jobject vm,
jobject stringKey)
{
THROW_NPE_RETURN_NULL(vm, "VMInstance");
THROW_NPE_RETURN_NULL(stringKey, "JavaScriptString");
auto ptr = getPersistentPointerFromJava<VMInstanceRef>(env, env->GetObjectClass(vm), vm);
auto key = unwrapValueRefFromValue(env, env->GetObjectClass(stringKey), stringKey);
auto symbol = SymbolRef::fromGlobalSymbolRegistry(ptr->get(), key->asString());
return createJavaObjectFromValue(env, symbol);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptSymbol_descriptionString(JNIEnv* env, jobject thiz)
{
auto desc = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asSymbol()->descriptionString();
return createJavaObjectFromValue(env, desc);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptSymbol_descriptionValue(JNIEnv* env, jobject thiz)
{
auto desc = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asSymbol()->descriptionValue();
return createJavaObjectFromValue(env, desc);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptSymbol_symbolDescriptiveString(JNIEnv* env, jobject thiz)
{
auto desc = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->asSymbol()->symbolDescriptiveString();
return createJavaObjectFromValue(env, desc);
}

View file

@ -0,0 +1,56 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_VMInstance_create(JNIEnv *env, jclass clazz, jobject locale,
jobject timezone)
{
THROW_NPE_RETURN_NULL(locale, "Optional<String>");
THROW_NPE_RETURN_NULL(timezone, "Optional<String>");
std::string localeString = fetchStringFromJavaOptionalString(env, locale);
std::string timezoneString = fetchStringFromJavaOptionalString(env, timezone);
auto vmRef = VMInstanceRef::create(localeString.length() ? localeString.data() : nullptr,
timezoneString.length() ? timezoneString.data() : nullptr);
return createJavaObject(env, vmRef.get());
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_VMInstance_hasPendingJob(JNIEnv* env, jobject thiz)
{
auto vmPtr = getPersistentPointerFromJava<VMInstanceRef>(env, env->GetObjectClass(thiz),
thiz);
return vmPtr->get()->hasPendingJob();
}
extern "C"
JNIEXPORT void JNICALL
Java_com_samsung_lwe_escargot_VMInstance_executePendingJob(JNIEnv* env, jobject thiz)
{
auto vmPtr = getPersistentPointerFromJava<VMInstanceRef>(env, env->GetObjectClass(thiz),
thiz);
if (vmPtr->get()->hasPendingJob()) {
vmPtr->get()->executePendingJob();
}
}

View file

@ -0,0 +1,500 @@
/*
* Copyright (c) 2023-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "EscargotJNI.h"
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_createUndefined(JNIEnv* env, jclass clazz)
{
return createJavaValueObject(env, clazz, ValueRef::createUndefined());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_createNull(JNIEnv* env, jclass clazz)
{
return createJavaValueObject(env, clazz, ValueRef::createNull());
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_create__I(JNIEnv* env, jclass clazz, jint value)
{
return createJavaValueObject(env, clazz, ValueRef::create(value));
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_create__D(JNIEnv* env, jclass clazz, jdouble value)
{
return createJavaValueObject(env, clazz, ValueRef::create(value));
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_create__Z(JNIEnv* env, jclass clazz, jboolean value)
{
return createJavaValueObject(env, clazz, ValueRef::create(static_cast<bool>(value)));
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isUndefined(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isUndefined();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isNull(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isNull();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isUndefinedOrNull(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isUndefinedOrNull();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isNumber(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isNumber();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isInt32(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isInt32();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isBoolean(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isBoolean();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isTrue(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isTrue();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isFalse(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isFalse();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isString(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isString();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isSymbol(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isSymbol();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isBigInt(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isBigInt();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isCallable(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isCallable();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isObject(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isObject();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isArrayObject(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isArrayObject();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isFunctionObject(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isFunctionObject();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isPromiseObject(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isPromiseObject();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_isErrorObject(JNIEnv* env, jobject thiz)
{
return unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz)->isErrorObject();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asBoolean(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, Boolean);
return ref->asBoolean();
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asInt32(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, Int32);
return ref->asInt32();
}
extern "C"
JNIEXPORT jdouble JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asNumber(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, Number);
return ref->asNumber();
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptString(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, String);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptSymbol(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, Symbol);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptBigInt(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, BigInt);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptObject(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, Object);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptArrayObject(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, ArrayObject);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptFunctionObject(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, FunctionObject);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptPromiseObject(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, PromiseObject);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_asScriptErrorObject(JNIEnv* env, jobject thiz)
{
ValueRef* ref = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
THROW_CAST_EXCEPTION_IF_NEEDS(env, ref, ErrorObject);
return thiz;
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_toString(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef) -> ValueRef* {
return thisValueRef->toString(state);
}, thisValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_toNumber(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->toNumber(state));
}, thisValueRef);
return createOptionalValueFromEvaluatorDoubleResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_toInteger(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->toInteger(state));
}, thisValueRef);
return createOptionalValueFromEvaluatorDoubleResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_toInt32(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->toInt32(state));
}, thisValueRef);
return createOptionalValueFromEvaluatorIntegerResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_toBoolean(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->toBoolean(state));
}, thisValueRef);
return createOptionalValueFromEvaluatorBooleanResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_toObject(JNIEnv* env, jobject thiz, jobject context)
{
THROW_NPE_RETURN_NULL(context, "Context");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef) -> ValueRef* {
return thisValueRef->toObject(state);
}, thisValueRef);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_abstractEqualsTo(JNIEnv* env, jobject thiz,
jobject context, jobject other)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(other, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
ValueRef* otherValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(other), other);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef, ValueRef* otherValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->abstractEqualsTo(state, otherValueRef));
}, thisValueRef, otherValueRef);
return createOptionalValueFromEvaluatorBooleanResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_equalsTo(JNIEnv* env, jobject thiz, jobject context,
jobject other)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(other, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
ValueRef* otherValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(other), other);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef, ValueRef* otherValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->equalsTo(state, otherValueRef));
}, thisValueRef, otherValueRef);
return createOptionalValueFromEvaluatorBooleanResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_instanceOf(JNIEnv* env, jobject thiz, jobject context,
jobject other)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(other, "JavaScriptValue");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
ValueRef* otherValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(other), other);
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(), [](ExecutionStateRef* state, ValueRef* thisValueRef, ValueRef* otherValueRef) -> ValueRef* {
return ValueRef::create(thisValueRef->instanceOf(state, otherValueRef));
}, thisValueRef, otherValueRef);
return createOptionalValueFromEvaluatorBooleanResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_call(JNIEnv* env, jobject thiz, jobject context,
jobject receiver, jobjectArray argv)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(receiver, "JavaScriptValue");
THROW_NPE_RETURN_NULL(argv, "JavaScriptValue[]");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
ValueRef* receiverValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(receiver), receiver);
auto argvLength = env->GetArrayLength(argv);
ValueRef** argVector = reinterpret_cast<ValueRef**>(Memory::gcMalloc(argvLength * sizeof(ValueRef*)));
for (jsize i = 0; i < argvLength; i++) {
jobject e = env->GetObjectArrayElement(argv, i);
argVector[i] = unwrapValueRefFromValue(env, env->GetObjectClass(e), e);
env->DeleteLocalRef(e);
}
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(),
[](ExecutionStateRef* state, ValueRef* thisValueRef, ValueRef* receiverValueRef, ValueRef** argVector, int argvLength) -> ValueRef* {
return thisValueRef->call(state, receiverValueRef, argvLength, argVector);
}, thisValueRef, receiverValueRef, argVector, argvLength);
Memory::gcFree(argVector);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}
extern "C"
JNIEXPORT jobject JNICALL
Java_com_samsung_lwe_escargot_JavaScriptValue_construct(JNIEnv* env, jobject thiz, jobject context,
jobjectArray argv)
{
THROW_NPE_RETURN_NULL(context, "Context");
THROW_NPE_RETURN_NULL(argv, "JavaScriptValue[]");
auto contextRef = getPersistentPointerFromJava<ContextRef>(env, env->GetObjectClass(context), context);
ValueRef* thisValueRef = unwrapValueRefFromValue(env, env->GetObjectClass(thiz), thiz);
auto argvLength = env->GetArrayLength(argv);
ValueRef** argVector = reinterpret_cast<ValueRef**>(Memory::gcMalloc(argvLength * sizeof(ValueRef*)));
for (jsize i = 0; i < argvLength; i++) {
jobject e = env->GetObjectArrayElement(argv, i);
argVector[i] = unwrapValueRefFromValue(env, env->GetObjectClass(e), e);
env->DeleteLocalRef(e);
}
auto evaluatorResult = ScriptEvaluator::execute(contextRef->get(),
[](ExecutionStateRef* state, ValueRef* thisValueRef, ValueRef** argVector, int argvLength) -> ValueRef* {
return thisValueRef->construct(state, argvLength, argVector);
}, thisValueRef, argVector, argvLength);
Memory::gcFree(argVector);
return createOptionalValueFromEvaluatorJavaScriptValueResult(env, context, contextRef->get(),
evaluatorResult);
}

View file

@ -0,0 +1,29 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
final public class Bridge {
static { Escargot.init(); }
private Bridge() {
}
public abstract static class Adapter {
/**
* @param context Context from callee
* @param data the data parameter contains value when call this function from JavaScript
* @return if want to return data to JavaScript callback, you can return value from this callback.
*/
public abstract Optional<JavaScriptValue> callback(Context context, Optional<JavaScriptValue> data);
}
/**
* if success, you can access `GlobalObject`.`objectName`.`propertyName`(...) in JavaScript
*
* @param context
* @param objectName
* @param propertyName
* @param adapter
* @return returns true if success
*/
static public native boolean register(Context context, String objectName, String propertyName, Adapter adapter);
}

View file

@ -0,0 +1,25 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class Context extends NativePointerHolder {
protected Context(long nativePointer)
{
super(nativePointer, true);
}
public native static Context create(VMInstance vmInstance);
public boolean exceptionWasThrown()
{
return m_lastThrownException.isPresent();
}
public Optional<JavaScriptValue> lastThrownException()
{
Optional<JavaScriptValue> lastThrownException = m_lastThrownException;
m_lastThrownException = Optional.empty();
return lastThrownException;
}
public native JavaScriptGlobalObject getGlobalObject();
public native boolean throwException(JavaScriptValue exception);
protected Optional<JavaScriptValue> m_lastThrownException = Optional.empty();
}

View file

@ -0,0 +1,50 @@
package com.samsung.lwe.escargot;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
public class Escargot {
static {
try {
System.loadLibrary("escargot-jni");
} catch(UnsatisfiedLinkError e) {
// try to load library from jar resource
Optional<String> r = copyStreamAsTempFile(Escargot.class.getResourceAsStream("/libescargot-jni.so"),
"libescargot-jni-", ".so", true);
if (r.isPresent()) {
System.load(r.get());
} else {
throw e;
}
}
}
static public Optional<String> copyStreamAsTempFile(InputStream is, String prefix, String suffix, boolean isExecutable)
{
try {
File f = File.createTempFile(prefix, suffix);
f.deleteOnExit();
f.setExecutable(isExecutable);
FileOutputStream fos = new FileOutputStream(f);
int read;
byte[] bytes = new byte[1024];
while ((read = is.read(bytes)) != -1) {
fos.write(bytes, 0, read);
}
fos.flush();
is.close();
fos.close();
return Optional.of(f.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
return Optional.empty();
}
static native public void init();
}

View file

@ -0,0 +1,46 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
final public class Evaluator {
static { Escargot.init(); }
private Evaluator() {
}
/**
*
* @param context
* @param source
* @param sourceFileName
* @return return result if eval was successful
*/
static public Optional<JavaScriptValue> evalScript(Context context, String source, String sourceFileName)
{
return evalScript(context, source, sourceFileName, false);
}
/**
* @param context
* @param source
* @param sourceFileName
* @param shouldPrintScriptResult
* @return return result if eval was successful
*/
static public Optional<JavaScriptValue> evalScript(Context context, String source, String sourceFileName,
boolean shouldPrintScriptResult)
{
return evalScript(context, source, sourceFileName, shouldPrintScriptResult, true);
}
/**
* @param context
* @param source
* @param sourceFileName
* @param shouldPrintScriptResult
* @param shouldExecutePendingJobsAtEnd
* @return return result if eval was successful
*/
static native public Optional<JavaScriptValue> evalScript(Context context, String source, String sourceFileName,
boolean shouldPrintScriptResult, boolean shouldExecutePendingJobsAtEnd);
}

View file

@ -0,0 +1,18 @@
package com.samsung.lwe.escargot;
final public class Globals {
private Globals() {
}
static { Escargot.init(); }
static public native void initializeGlobals();
static public native void finalizeGlobals();
static public native void initializeThread();
static public native void finalizeThread();
static public native boolean isInitialized();
static public native String version();
static public native String buildDate();
}

View file

@ -0,0 +1,31 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptArrayObject extends JavaScriptObject {
protected JavaScriptArrayObject(long nativePointer)
{
super(nativePointer);
}
static public native JavaScriptArrayObject create(Context context);
/**
*
* @param context
* @param from
* @return
*/
static public Optional<JavaScriptArrayObject> create(Context context, JavaScriptValue[] from)
{
JavaScriptArrayObject ret = JavaScriptArrayObject.create(context);
ret.setLength(context, from.length);
for (int i = 0; i < from.length; i ++) {
Optional<Boolean> b = ret.set(context, JavaScriptValue.create(i), from[i]);
if (!b.isPresent() || !b.get())
return Optional.empty();
}
return Optional.of(ret);
}
public native long length(Context context);
public native void setLength(Context context, long newLength);
}

View file

@ -0,0 +1,39 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptBigInt extends JavaScriptValue {
protected JavaScriptBigInt(long nativePointer)
{
super(nativePointer, true);
}
static public native JavaScriptBigInt create(int num);
static public native JavaScriptBigInt create(long num);
/**
*
* @param numString
* @param radix
* @return
*/
static public native JavaScriptBigInt create(String numString, int radix);
/**
*
* @param numString
* @param radix
* @return
*/
static public native JavaScriptBigInt create(JavaScriptString numString, int radix);
/**
*
* @param radix
* @return
*/
public native JavaScriptString toString(int radix);
public native double toNumber();
public native long toInt64();
}

View file

@ -0,0 +1,23 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptErrorObject extends JavaScriptObject {
protected JavaScriptErrorObject(long nativePointer)
{
super(nativePointer);
}
public enum ErrorKind {
None,
ReferenceError,
TypeError,
SyntaxError,
RangeError,
URIError,
EvalError,
AggregateError
}
static public native JavaScriptErrorObject create(Context context, ErrorKind kind, String message);
public native Optional<JavaScriptString> stack(Context context);
}

View file

@ -0,0 +1,9 @@
package com.samsung.lwe.escargot;
public class JavaScriptFunctionObject extends JavaScriptObject {
protected JavaScriptFunctionObject(long nativePointer)
{
super(nativePointer);
}
public native Context context();
}

View file

@ -0,0 +1,73 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptGlobalObject extends JavaScriptObject {
protected JavaScriptGlobalObject(long nativePointer)
{
super(nativePointer);
}
/**
*
* @param context
* @param input
* @return
*/
public native Optional<JavaScriptString> jsonStringify(Context context, JavaScriptValue input);
/**
*
* @param context
* @param input
* @return
*/
public native Optional<JavaScriptValue> jsonParse(Context context, JavaScriptValue input);
/**
*
* @param context
* @param iterable
* @return
*/
public native Optional<JavaScriptValue> promiseAll(Context context, JavaScriptValue iterable);
/**
*
* @param context
* @param iterable
* @return
*/
public native Optional<JavaScriptValue> promiseAllSettled(Context context, JavaScriptValue iterable);
/**
*
* @param context
* @param iterable
* @return
*/
public native Optional<JavaScriptValue> promiseAny(Context context, JavaScriptValue iterable);
/**
*
* @param context
* @param iterable
* @return
*/
public native Optional<JavaScriptValue> promiseRace(Context context, JavaScriptValue iterable);
/**
*
* @param context
* @param iterable
* @return
*/
public native Optional<JavaScriptValue> promiseReject(Context context, JavaScriptValue iterable);
/**
*
* @param context
* @param iterable
* @return
*/
public native Optional<JavaScriptValue> promiseResolve(Context context, JavaScriptValue iterable);
}

View file

@ -0,0 +1,32 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptJavaCallbackFunctionObject extends JavaScriptFunctionObject {
protected JavaScriptJavaCallbackFunctionObject(long nativePointer)
{
super(nativePointer);
}
public abstract static class Callback {
/**
*
* @param context
* @param receiverValue
* @param arguments
* @return
*/
public abstract Optional<JavaScriptValue> callback(Context context, JavaScriptValue receiverValue, JavaScriptValue arguments[]);
}
/**
*
* @param context
* @param functionName
* @param argumentCount
* @param isConstructor
* @param callback
* @return
*/
static public native JavaScriptJavaCallbackFunctionObject create(Context context, String functionName, int argumentCount, boolean isConstructor, Callback callback);
}

View file

@ -0,0 +1,70 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptObject extends JavaScriptValue {
protected JavaScriptObject(long nativePointer)
{
super(nativePointer, true);
}
static public native JavaScriptObject create(Context context);
/**
* return thisObject[propertyName];
* @param context
* @param propertyName
* @return JavaScriptValue or Optional.empty if there was a exception while executing get function
*/
public native Optional<JavaScriptValue> get(Context context, JavaScriptValue propertyName);
/**
* thisObject[propertyName] = value;
* @param context
* @param propertyName
* @param value
* @return Boolean or Optional.empty if there was a exception while executing set function
*/
public native Optional<Boolean> set(Context context, JavaScriptValue propertyName, JavaScriptValue value);
/**
* Object.definePropety(
* thisObject,
* propertyName,
* {
* value: value
* writable: isWritable
* enumerable: isEnumerable
* configurable: isConfigurable
* })
* @param context
* @param propertyName
* @param value
* @param isWritable
* @param isEnumerable
* @param isConfigurable
* @return Boolean or Optional.empty if there was a exception while executing set function
*/
public native Optional<Boolean> defineDataProperty(Context context, JavaScriptValue propertyName, JavaScriptValue value,
boolean isWritable, boolean isEnumerable, boolean isConfigurable);
/**
* return thisObject[propertyName]; // but only search thisObject. this function does not get value on prototype chain
* there is no simple equivalent js function or source
* @param context
* @param propertyName
* @return JavaScriptValue or Optional.empty if there was a exception while executing getOwnProperty function
*/
public native Optional<JavaScriptValue> getOwnProperty(Context context, JavaScriptValue propertyName);
/**
* store Java Object in JavaScriptObject
* @param object
*/
public native void setExtraData(Optional<Object> object);
/**
* returns stored Java object in JavaScriptObject
* this function returns `Optional with Object` or `empty Optional`
* @return
*/
public native Optional<Object> extraData();
}

View file

@ -0,0 +1,60 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptPromiseObject extends JavaScriptObject {
protected JavaScriptPromiseObject(long nativePointer)
{
super(nativePointer);
}
static public native JavaScriptPromiseObject create(Context context);
enum PromiseState {
Pending,
FulFilled,
Rejected
};
public native PromiseState state();
public native JavaScriptValue promiseResult();
/**
*
* @param context
* @param handler
* @return
*/
public native Optional<JavaScriptObject> then(Context context, JavaScriptValue handler);
/**
*
* @param context
* @param onFulfilled
* @param onRejected
* @return
*/
public native Optional<JavaScriptObject> then(Context context, JavaScriptValue onFulfilled, JavaScriptValue onRejected);
/**
*
* @param context
* @param handler
* @return
*/
public native Optional<JavaScriptObject> catchOperation(Context context, JavaScriptValue handler);
/**
*
* @param context
* @param value
*/
public native void fulfill(Context context, JavaScriptValue value);
/**
*
* @param context
* @param reason
*/
public native void reject(Context context, JavaScriptValue reason);
public native boolean hasHandler();
}

View file

@ -0,0 +1,10 @@
package com.samsung.lwe.escargot;
public class JavaScriptString extends JavaScriptValue {
protected JavaScriptString(long nativePointer)
{
super(nativePointer, true);
}
native static public JavaScriptString create(String value);
native public String toJavaString();
}

View file

@ -0,0 +1,23 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptSymbol extends JavaScriptValue {
protected JavaScriptSymbol(long nativePointer)
{
super(nativePointer, true);
}
native static public JavaScriptSymbol create(Optional<JavaScriptString> value);
native public JavaScriptString descriptionString();
native public JavaScriptValue descriptionValue();
native public JavaScriptString symbolDescriptiveString();
/**
*
* @param vm
* @param stringKey
* @return
*/
native public static JavaScriptSymbol fromGlobalSymbolRegistry(VMInstance vm, JavaScriptString stringKey);
}

View file

@ -0,0 +1,98 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class JavaScriptValue extends NativePointerHolder {
protected JavaScriptValue(long nativePointer)
{
super(nativePointer, true);
}
protected JavaScriptValue(long nativePointer, boolean isHeapValue)
{
super(nativePointer, isHeapValue);
}
native static public JavaScriptValue createUndefined();
native static public JavaScriptValue createNull();
native static public JavaScriptValue create(boolean value);
native static public JavaScriptValue create(int value);
native static public JavaScriptValue create(double value);
native public boolean isUndefined();
native public boolean isNull();
native public boolean isUndefinedOrNull();
native public boolean isBoolean();
native public boolean isTrue();
native public boolean isFalse();
native public boolean isNumber();
native public boolean isInt32();
native public boolean isString();
native public boolean isSymbol();
native public boolean isBigInt();
native public boolean isCallable();
native public boolean isObject();
native public boolean isArrayObject();
native public boolean isFunctionObject();
native public boolean isPromiseObject();
native public boolean isErrorObject();
native public boolean asBoolean();
native public int asInt32();
native public double asNumber();
native public JavaScriptString asScriptString();
native public JavaScriptSymbol asScriptSymbol();
native public JavaScriptBigInt asScriptBigInt();
native public JavaScriptObject asScriptObject();
native public JavaScriptArrayObject asScriptArrayObject();
native public JavaScriptFunctionObject asScriptFunctionObject();
native public JavaScriptPromiseObject asScriptPromiseObject();
native public JavaScriptErrorObject asScriptErrorObject();
native public Optional<JavaScriptString> toString(Context context);
native public Optional<Boolean> toBoolean(Context context);
native public Optional<Double> toNumber(Context context);
native public Optional<Double> toInteger(Context context);
native public Optional<Integer> toInt32(Context context);
native public Optional<JavaScriptObject> toObject(Context context);
/**
* this == other
* @param context
* @param other
* @return
*/
native public Optional<Boolean> abstractEqualsTo(Context context, JavaScriptValue other);
/**
* this === other
* @param context
* @param other
* @return
*/
native public Optional<Boolean> equalsTo(Context context, JavaScriptValue other);
/**
*
* @param context
* @param other
* @return
*/
native public Optional<Boolean> instanceOf(Context context, JavaScriptValue other);
/**
*
* @param context
* @param receiver
* @param argv
* @return
*/
native public Optional<JavaScriptValue> call(Context context, JavaScriptValue receiver, JavaScriptValue[] argv);
/**
* same with new expression in js
* @param context
* @param argv
* @return
*/
native public Optional<JavaScriptValue> construct(Context context, JavaScriptValue[] argv);
}

View file

@ -0,0 +1,29 @@
package com.samsung.lwe.escargot;
final public class Memory {
static { Escargot.init(); }
private Memory() {
}
static public native void gc();
/**
* Return the number of bytes in the heap. Excludes bdwgc private data structures. Excludes the unmapped memory
* @return
*/
static public native long heapSize();
/**
* Return the total number of bytes allocated in this process
* @return
*/
static public native long totalSize();
/**
* NOTE bdwgc(c/c++ gc library escargot use) allocate at least N/GC_free_space_divisor bytes between collections
* (Allocated memory by GC x 2) / (Frequency parameter value)
* Increasing this value may use less space but there is more collection event
* @param value
*/
static public native void setGCFrequency(int value);
}

View file

@ -0,0 +1,73 @@
package com.samsung.lwe.escargot;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
public abstract class NativePointerHolder {
static ThreadLocal<ReferenceQueue<Object>> s_referenceQueue = ThreadLocal.withInitial(() -> new ReferenceQueue<>());
static ThreadLocal<Set<NativePointerHolderPhantomReference>> s_referenceSet = ThreadLocal.withInitial(() -> new HashSet<>());
static { Escargot.init(); }
public static class NativePointerHolderPhantomReference extends PhantomReference<Object> {
public NativePointerHolderPhantomReference(NativePointerHolder nativePointerHolder, ReferenceQueue<Object> queue)
{
super(nativePointerHolder, queue);
m_nativePointer = nativePointerHolder.m_nativePointer;
}
public void release()
{
releaseNativePointerMemory(m_nativePointer);
}
long m_nativePointer;
}
NativePointerHolder(long nativePointer, boolean isHeapValue)
{
m_nativePointer = nativePointer;
if (isHeapValue) {
s_referenceSet.get().add(new NativePointerHolderPhantomReference(this, s_referenceQueue.get()));
}
}
public static void cleanUp()
{
Method refersToMethod = null;
Method[] methods = NativePointerHolderPhantomReference.class
.getSuperclass().getSuperclass() // <- points Reference<T>
.getDeclaredMethods();
for (int i = 0; i < methods.length; i ++) {
if (methods[i].getName().equals("refersTo")) {
refersToMethod = methods[i];
break;
}
}
for (NativePointerHolderPhantomReference reference : s_referenceSet.get()) {
if (refersToMethod != null) {
try {
refersToMethod.invoke(reference, (java.lang.Object)null);
continue;
} catch (Exception e) {
refersToMethod = null;
e.printStackTrace();
}
}
reference.isEnqueued();
}
Reference<?> ref;
while ((ref = s_referenceQueue.get().poll()) != null) {
s_referenceSet.get().remove(((NativePointerHolderPhantomReference)ref));
((NativePointerHolderPhantomReference)ref).release();
ref.clear();
}
}
static private native void releaseNativePointerMemory(long pointer);
protected long m_nativePointer;
}

View file

@ -0,0 +1,22 @@
package com.samsung.lwe.escargot;
import java.util.Optional;
public class VMInstance extends NativePointerHolder {
protected VMInstance(long nativePointer)
{
super(nativePointer, true);
}
// you can to provide timezone as TZ database name like "US/Pacific".
// if you don't provide, we try to detect system timezone.
public native static VMInstance create(Optional<String> locale, Optional<String> timezone);
public native boolean hasPendingJob();
public native void executePendingJob();
public void executeEveryPendingJobIfExists()
{
while (hasPendingJob()) {
executePendingJob();
}
}
}

View file

@ -0,0 +1,16 @@
package com.samsung.lwe.escargot.internal;
import com.samsung.lwe.escargot.JavaScriptValue;
public class JavaScriptRuntimeException extends RuntimeException {
public JavaScriptRuntimeException(JavaScriptValue exception)
{
this.m_exception = exception;
}
public JavaScriptValue exception() {
return m_exception;
}
private JavaScriptValue m_exception;
}

View file

@ -0,0 +1,239 @@
package com.samsung.lwe.escargot.util;
import com.samsung.lwe.escargot.Context;
import com.samsung.lwe.escargot.JavaScriptPromiseObject;
import com.samsung.lwe.escargot.JavaScriptValue;
import com.samsung.lwe.escargot.VMInstance;
import java.util.ArrayList;
public class MultiThreadExecutor {
public static interface WorkerThreadEndNotifier {
/**
* called by worker thread before thread exiting
* @param instance
*/
public abstract void notify(MultiThreadExecutor executor, ExecutorInstance instance);
}
VMInstance m_vmInstance;
Thread m_javaScriptThread;
ArrayList<ExecutorInstance> m_activeInstances = new ArrayList<>();
ArrayList<ExecutorInstance> m_endedInstances = new ArrayList<>();
WorkerThreadEndNotifier m_workerThreadEndNotifier;
/**
* init with current thread as JavaScript Thread
* and manual threadEndNotifier
* @param vmInstance
*/
public MultiThreadExecutor(VMInstance vmInstance)
{
this(vmInstance, (executor, instance) -> {
}, Thread.currentThread());
}
/**
* init with manual threadEndNotifier
* @param vmInstance
* @param javaScriptThread
*/
public MultiThreadExecutor(VMInstance vmInstance, Thread javaScriptThread)
{
this(vmInstance, (executor, instance) -> {
}, javaScriptThread);
}
/**
* init with current thread as JavaScript Thread
* and manual threadEndNotifier
* @param vmInstance
* @param threadEndNotifier
*/
public MultiThreadExecutor(VMInstance vmInstance, WorkerThreadEndNotifier threadEndNotifier)
{
this(vmInstance, threadEndNotifier, Thread.currentThread());
}
/**
* @param vmInstance
* @param threadEndNotifier
* @param javaScriptThread
*/
public MultiThreadExecutor(VMInstance vmInstance, WorkerThreadEndNotifier threadEndNotifier, Thread javaScriptThread)
{
if (vmInstance == null || threadEndNotifier == null || javaScriptThread == null) {
throw new NullPointerException();
}
m_javaScriptThread = javaScriptThread;
m_vmInstance = vmInstance;
m_workerThreadEndNotifier = threadEndNotifier;
}
public static abstract class ResultBuilder {
public abstract JavaScriptValue build(Context scriptContext, ResultBuilderContext builderContext);
}
public static class ResultBuilderContext {
private boolean m_wasSuccessful;
private Object m_data;
public ResultBuilderContext(boolean wasSuccessful, Object data) {
m_wasSuccessful = wasSuccessful;
m_data = data;
}
public Object data() {
return m_data;
}
public boolean wasSuccessful() {
return m_wasSuccessful;
}
}
public static abstract class Executor {
public abstract ResultBuilderContext run();
}
public static class ExecutorInstance {
private Context m_context;
private JavaScriptPromiseObject m_promise;
private Thread m_thread;
private ResultBuilderContext m_builderContext;
private ResultBuilder m_resultBuilder;
private ExecutorInstance(Context context, JavaScriptPromiseObject promise,
ResultBuilder resultBuilder)
{
this.m_context = context;
this.m_promise = promise;
this.m_resultBuilder = resultBuilder;
}
public Context context() {
return m_context;
}
public JavaScriptPromiseObject promise() {
return m_promise;
}
public Thread thread() {
return m_thread;
}
public ResultBuilderContext builderContext() {
return m_builderContext;
}
public ResultBuilder resultBuilder() {
return m_resultBuilder;
}
}
/**
*
* @param context
* @param executor
* @param resultBuilder
* @return
*/
public ExecutorInstance startWorker(Context context, Executor executor, ResultBuilder resultBuilder)
{
if (Thread.currentThread() != m_javaScriptThread) {
throw new RuntimeException("You should call this function on JavaScriptThread");
}
if (context == null || executor == null || resultBuilder == null) {
throw new NullPointerException();
}
JavaScriptPromiseObject promise = JavaScriptPromiseObject.create(context);
ExecutorInstance instance = new ExecutorInstance(context, promise, resultBuilder);
class ExecutorRunnable implements Runnable {
@Override
public void run() {
instance.m_builderContext = executor.run();
if (instance.m_builderContext == null) {
throw new NullPointerException();
}
synchronized (m_endedInstances) {
m_endedInstances.add(instance);
}
synchronized (m_activeInstances) {
m_activeInstances.remove(instance);
}
m_workerThreadEndNotifier.notify(MultiThreadExecutor.this, instance);
}
}
Thread thread = new Thread(new ExecutorRunnable());
instance.m_thread = thread;
synchronized (m_activeInstances) {
m_activeInstances.add(instance);
}
thread.start();
return instance;
}
public boolean hasPendingEvent()
{
synchronized (m_endedInstances) {
return !m_endedInstances.isEmpty();
}
}
public boolean hasPendingWorker()
{
synchronized (m_activeInstances) {
return !m_activeInstances.isEmpty();
}
}
public boolean hasPendingEventOrWorker()
{
return hasPendingWorker() || hasPendingEvent();
}
/**
* must call this function from main thread(JS thread)
*/
public void pumpEventsFromThreadIfNeeds(boolean executePendingJavaScriptJobs)
{
if (Thread.currentThread() != m_javaScriptThread) {
throw new RuntimeException("You should call this function on JavaScriptThread");
}
Object[] instances;
synchronized (m_endedInstances) {
instances = m_endedInstances.toArray();
m_endedInstances.clear();
}
for (int i = 0; i < instances.length; i ++) {
ExecutorInstance e = (ExecutorInstance)instances[i];
JavaScriptValue value = e.resultBuilder().build(e.context(), e.builderContext());
if (e.builderContext().wasSuccessful()) {
e.promise().fulfill(e.context(), value);
} else {
e.promise().reject(e.context(), value);
}
}
if (executePendingJavaScriptJobs) {
m_vmInstance.executeEveryPendingJobIfExists();
}
}
/**
* must call this function from main thread(JS thread)
*/
public void pumpEventsFromThreadIfNeeds()
{
pumpEventsFromThreadIfNeeds(true);
}
}

View file

@ -0,0 +1,41 @@
package androidx.test.ext.junit.runners;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunNotifier;
import java.lang.reflect.Method;
public class AndroidJUnit4 extends Runner {
private Class testClass;
public AndroidJUnit4(Class testClass) {
super();
this.testClass = testClass;
}
@Override
public Description getDescription() {
return Description
.createTestDescription(testClass, "AndroidJUnit4(mock) description");
}
@Override
public void run(RunNotifier notifier) {
System.out.println("running the tests from AndroidJUnit4(mock): " + testClass);
try {
Object testObject = testClass.newInstance();
for (Method method : testClass.getMethods()) {
if (method.isAnnotationPresent(Test.class)) {
notifier.fireTestStarted(Description
.createTestDescription(testClass, method.getName()));
method.invoke(testObject);
notifier.fireTestFinished(Description
.createTestDescription(testClass, method.getName()));
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

Some files were not shown because too many files have changed in this diff Show more