ObjFW  History of src/runtime/class.m of 8d930f2067244ad0

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

History of file src/runtime/class.m at check-in 8d930f2067244ad0

2025-06-22
19:32
Deleted: Point to the new repository check-in: [ec62287f25] user: js branch: trunk, size: 0
2025-05-24
14:03
Restore compatibility with old objfwrt.library Unfortunately MorphOS shipped a pre-release version of the ObjFW runtime that had no stable API and ABI yet. However, it is still possible to be compatible to this old version with just a few minor changes. file: [f7f299096c] check-in: [62d3318e8f] user: js branch: trunk, size: 24724
2025-04-25
13:08
Remove _ struct prefix to make GCC happy again GCC has many conflicting builtins that also behave weirdly. file: [97f553f80e] check-in: [8694b35933] user: js branch: trunk, size: 24504
12:16
runtime: Prefix private functions & structs with _ file: [ebb7b9de55] check-in: [b5f1035b46] user: js branch: trunk, size: 24525
2025-04-22
13:58
class_registerAlias_np(): Fix return type Clang assumes this to return void. file: [63101e5af3] check-in: [0940359d1d] user: js branch: trunk, size: 24366
2025-04-13
15:06
runtime: Optimize retain/(auto)release with ARC file: [598bd7e570] check-in: [5e956ca69f] user: js branch: trunk, size: 24426
2025-03-21
01:53
runtime: Call +[load] on categories file: [da2bed7a69] check-in: [e054a52753] user: js branch: trunk, size: 22694
2025-01-01
12:58
Update copyright file: [aa6a7feca3] check-in: [9d802a786d] user: js branch: trunk, size: 22621
2024-04-03
02:16
Change license to LGPLv3 only file: [f20174e5c5] check-in: [7413a728a7] user: js branch: trunk, size: 22621
2024-02-24
19:43
runtime: Fix objc_getClassList not unlocking mutex file: [eb7440eeb7] check-in: [7a33596a17] user: js branch: 1.0, size: 22364
19:42
runtime: Fix objc_getClassList not unlocking mutex file: [6da45bb3d8] check-in: [39e23d6363] user: js branch: trunk, size: 22413
2024-02-03
14:41
runtime: Add support for associated objects file: [628f2b08c1] check-in: [18ae339de1] user: js branch: trunk, size: 22360
2024-01-02
17:17
Update copyright file: [99bd522eda] check-in: [26ddd2e4e4] user: js branch: trunk, size: 22311
2023-07-15
14:26
runtime: Fix a comment file: [c32cd0bfe5] check-in: [1106d5ad1d] user: js branch: trunk, size: 22311
2023-06-19
19:22
Minor style fixes file: [13704fc982] check-in: [da7db4d68c] user: js branch: trunk, size: 22319
2023-05-03
22:22
Fix compilation with older Clang versions file: [b47c784fc5] check-in: [5591bf6a0b] user: js branch: trunk, size: 22315
2023-01-06
09:04
Update copyright file: [5551b3027e] check-in: [8939cbdb52] user: js branch: trunk, size: 22277
2022-11-06
21:19
Work around an ICE in Clang 3.7.0 on Windows/x86 Apparently the optimizer crashes on some recursive functions. file: [4cb79aa414] check-in: [5c0117205d] user: js branch: trunk, size: 22277
2022-09-19
19:10
Fix missing void in function declarations file: [bcbf47b312] check-in: [41c2b305ce] user: js branch: trunk, size: 22115
2022-02-12
07:46
Update copyright file: [8d4b7cca0f] check-in: [1a86b8175b] user: js branch: trunk, size: 22111
2021-05-02
14:28
Don't use OFEnsure() in runtime file: [8556b52111] check-in: [0c7760bd05] user: js branch: trunk, size: 22111
11:43
runtime: objc_unregisterClass: Get global lock file: [70c18ee4cd] check-in: [ae80dcd8e0] user: js branch: trunk, size: 21950
11:34
runtime: Name things more consistently file: [a72b4d25e1] check-in: [2b75f9e6a0] user: js branch: trunk, size: 21894
2021-04-18
15:55
Rename all functions in macros.h file: [93b6de8609] check-in: [7392685ffc] user: js branch: new-naming-convention, size: 21943
2021-01-02
22:04
Update copyright file: [8c93de1488] check-in: [374e1a1bfa] user: js branch: trunk, size: 21945
2020-12-21
22:22
runtime: Fix double initialization file: [c47f6af2b8] check-in: [68eef83aae] user: js branch: trunk, size: 22034
2020-12-20
03:06
Let OF_ENSURE use OBJC_ERROR in runtime file: [0b3dadf0dd] check-in: [8f271bed22] user: js branch: trunk, size: 21823
2020-09-29
21:36
Merge support for tagged pointers file: [0dc727f4b5] check-in: [b4039f9a85] user: js branch: trunk, size: 21821
2020-09-26
19:04
runtime: Document all public functions file: [25a8ac61a2] check-in: [85ff529ac5] user: js branch: trunk, size: 21734
2020-06-29
20:30
Add support for tagged pointers in object_getClass This already makes tagged pointers work in the non-assembly lookup. file: [02bad041ab] check-in: [8707dd73c4] user: js branch: tagged-pointers, size: 21822
2020-01-02
01:51
Update copyright file: [959b2ef399] check-in: [c7f0229795] user: js branch: trunk, size: 21735
2019-12-13
00:00
runtime: Add class_getInstanceMethod() file: [415251c564] check-in: [9e23a50de7] user: js branch: trunk, size: 21732
2019-11-24
23:57
runtime: Always set class->isa->isa correctly file: [9e1fe8b99e] check-in: [3cc333fb2f] user: js branch: trunk, size: 21768
22:23
runtime: Remove duplicate structs for ABI file: [f4d6489e81] check-in: [c6d2de4312] user: js branch: trunk, size: 21442
15:22
runtime: Make ivars opaque and provide an API file: [d1f09c48dd] check-in: [688eef7561] user: js branch: trunk, size: 21745
2019-06-25
20:09
runtime: Don't use static selectors Static selectors are initialized by a global constructor that might run too late: If a class has a +[load] that triggers an +[initialize], this could result in trying to call +[initialize] with the selector in class.m still being uninitialized. When this happens, it results in a weird looking crash in an entirely unrelated method. This is because when uninitialized, the selector name has not been replaced with a selector UID yet, meaning the pointer to the selector name is treated as the selector UID. As the dispatch only considers the low 16 bits of the selector UID for performance reasons, it will just take the low 16 bits of the pointer to the selector name as the UID without any complaints. This can then result in calling a random method on that class which then crashes. file: [132bb904b5] check-in: [3b3729a316] user: js branch: trunk, size: 21746
2019-06-17
00:38
Remove underscores from library & framework names This is more compatible with the various conventions used on various systems. file: [15508d0871] check-in: [79fe29dbf4] user: js branch: trunk, size: 21132
2019-04-14
13:35
runtime: Match Apple's +[initialize] behavior This now calls +[initialize] several times on the same class if it is unimplemented in one or more of the classes in the chain, to match the behavior of the Apple runtime. While the behavior before was safer, it can lead to testing against the ObjFW runtime and everything working, but then failing when trying to use it with the Apple runtime. file: [889cba075c] check-in: [ede088a30d] user: js branch: trunk, size: 21133
2019-02-07
21:55
More style improvements file: [6851361cb3] check-in: [239fbb269e] user: js branch: trunk, size: 21062
21:31
More style improvements file: [f8bb9979ba] check-in: [754bf24742] user: js branch: trunk, size: 21074
00:46
Make style consistent between ObjFW and ObjFW_RT ObjFW_RT used to be a separate project that followed the BSD style, as it was written in pure C, while ObjFW's style is based on the BSD style with changes to make it a better fit for Objective-C. This commit changes ObjFW_RT to use the same style as ObjFW. file: [66376a6ccb] check-in: [ef6d69931e] user: js branch: trunk, size: 20544
2019-01-17
21:59
class_registerAlias_np(): Acquire the global mutex A plugin which calls it might be loaded while already being multi-threaded. file: [241b0f4d77] check-in: [1ac944d7c1] user: js branch: trunk, size: 19581
2019-01-03
19:13
Update copyright file: [0a53af1b21] check-in: [0509d7a844] user: js branch: trunk, size: 19487
2018-05-13
02:09
runtime: Port Amiga library to MorphOS file: [3cdd278d3a] check-in: [95e1ba8d63] user: js branch: trunk, size: 19481
2018-05-06
21:39
runtime: Make Amiga library work with -fbaserel This currently uses __saveds on all exported functions for simplicity. As an optimization, __saveds can be removed from some functions later after careful verification that no code path starting from that function accesses any data. file: [973ed6f5e5] check-in: [482698c5be] user: js branch: trunk, size: 20233
2018-05-05
18:06
runtime: Let objc_get*Class return Class file: [6fa07e9231] check-in: [b3f32186dd] user: js branch: trunk, size: 20093
2018-04-30
14:51
runtime: Never use assert() This results in stdio being linked in when building an Amiga library. file: [b4196ed858] check-in: [2ae3bc33e1] user: js branch: trunk, size: 20084
2018-04-29
20:27
runtime: Add glue functions for Amiga library file: [dc95510919] check-in: [4c72b5544f] user: js branch: trunk, size: 20229
19:26
runtime: Specify m68k registers for most functions file: [8d78186ef9] check-in: [2d8aa8b1e6] user: js branch: trunk, size: 20099
2018-04-22
16:13
runtime: Define BOOL to be the same as bool As we define the ABI, we can just replace BOOL with bool everywhere, including in ObjFW itself. For the Apple platforms where BOOL and bool are different, this is not a problem as BOOL and bool are passed and returned the same way in the ABI. This still defines BOOL to bool for compatibility, except on AmigaOS and Wii, which both have its own BOOL type. file: [8659e5eda9] check-in: [fe2cbe0021] user: js branch: trunk, size: 19487
2018-04-08
23:39
runtime: Small fix for unregister_class() Only restore superclass to the name of the superclass if the class has actually been set up. file: [16946c32d6] check-in: [8651ed04a0] user: js branch: trunk, size: 19487
2018-01-21
22:16
Allow building the runtime as a .framework This also renames ObjFW-RT to ObjFW_RT, as hyphens should not be in framework names. file: [2ddf79d34d] check-in: [0f42b0eafd] user: js branch: trunk, size: 19447
2018-01-03
19:49
Update copyright notice file: [355653e066] check-in: [7e5c81e186] user: js branch: trunk, size: 19447
2017-10-01
09:54
Nullability fixes for ObjFW runtime file: [671f7fc3c1] check-in: [5882409fd0] user: js branch: trunk, size: 19431
2017-07-09
15:29
runtime: Rename include to ObjFW-RT.h file: [d9200138d3] check-in: [5bb771755d] user: js branch: trunk, size: 19424
2017-06-07
21:38
runtime: Move all globals into a single struct This is required to create a .library on MorphOS. file: [de3e6ed813] check-in: [79011c5f56] user: js branch: trunk, size: 19492
2017-06-05
01:07
runtime: get_method(): Look in categories first file: [aedf6b0f5f] check-in: [e55ca11653] user: js branch: trunk, size: 19431
2017-05-14
02:15
runtime: Add nullability annotations file: [ac59d0cf50] check-in: [8c7e612885] user: js branch: trunk, size: 19431
2017-05-07
20:10
Small code style change Casts are now written like types in variable declarations. file: [bb8140f5e4] check-in: [4af49a13c3] user: js branch: trunk, size: 19431
2017-01-09
17:36
Update copyright Forgot to add 2017, even though I already did quite some changes in 2017. file: [a5e62b6d57] check-in: [44f45c2e35] user: js branch: trunk, size: 19418
2016-07-05
19:31
runtime/class.m: Add explicit size_t -> long cast file: [9db3a46267] check-in: [c71706db46] user: js branch: trunk, size: 19412
2016-07-03
11:24
runtime: Add class_addMethod() Also moves out some stuff to functions to be reusable by class_addMethod(). file: [c8cb26401f] check-in: [d4cae4c963] user: js branch: trunk, size: 19328
2016-07-02
22:26
runtime: Add objc_{allocate,register}ClassPair file: [8bf9db28f4] check-in: [5088c339bf] user: js branch: trunk, size: 19505
2016-02-21
15:37
Make use of C99-style for loops file: [5e1eae7608] check-in: [e0b9167693] user: js branch: trunk, size: 18102
2016-01-05
22:00
(u)int_fast*_t -> (u)int*_t (U)INT_FAST*_MAX is broken on Android, which makes (u)int_fast*_t dangerous to use while it does not provide any real speed benefit. file: [ecd4869918] check-in: [d3158d091f] user: js branch: trunk, size: 18120
2016-01-03
00:41
Update copyright While at it, also update the mail address. file: [2f6309b70c] check-in: [2a27cf3000] user: js branch: trunk, size: 18140
2015-01-03
20:57
Update copyright file: [76d3cf3cc0] check-in: [cfd374b906] user: js branch: trunk, size: 18136
2014-06-25
17:55
Small Android fixes * It seems <limits.h> is required for SIZE_MAX. * Use "exec ./tests" inside adb shell. It seems that either new versions of ADB or Android don't return otherwise. file: [775c018011] check-in: [05a247fbe4] user: js branch: trunk, size: 18130
2014-05-15
15:32
Multiple dtable / sparse array improvements * dtable.m is now the old sparse array, using IMP as type for values and thus not violating the C standard anymore (functions may not be stored in void*) * New sparsearray.m which can work with any size, based on the sparse array from the fast path of class.m * Fast path of class.m now uses the new sparsearray.m file: [79ebd88d66] check-in: [1ebb9eb7b3] user: js branch: trunk, size: 18110
15:17
Don't declare objc_classname_to_class inline It is too big already for inlining to make any sense. file: [ae710a7cad] check-in: [e23441b121] user: js branch: trunk, size: 19237
03:39
objc_exit(): Fix the first class not being free'd Also cleans up runtime/hashtable.m a little. file: [e257cf48b1] check-in: [428520105b] user: js branch: trunk, size: 19276
2014-05-14
20:28
Always use __foo__ instead of foo for attributes file: [0d2c7753b9] check-in: [e35b10115e] user: js branch: trunk, size: 19097
2014-04-14
00:45
Coding style No functional change intended. file: [cf051d40ec] check-in: [9da9b2b64c] user: js branch: trunk, size: 19093
2014-04-08
16:38
runtime/hashtable.m: Move some code around file: [fb4bbc3736] check-in: [f447af977a] user: js branch: trunk, size: 19079
2014-04-06
14:40
runtime/hashtable.m: Add support for deletion file: [0fb0e5fd5b] check-in: [c2d9134d88] user: js branch: trunk, size: 19047
2014-03-30
00:30
ObjFW-RT: Call +[unload] on class unregister file: [6289471667] check-in: [1ecef2d7f6] user: js branch: trunk, size: 18930
2014-03-23
00:15
Remove -Wno-deprecated-objc-pointer-introspection file: [91fb9724fc] check-in: [f3154a74aa] user: js branch: trunk, size: 18100
2014-03-22
17:56
Generalize runtime/hashtable.m file: [cb99b9ea3b] check-in: [8d930f2067] user: js branch: trunk, size: 18100
2014-02-23
17:54
Add __attribute__((gnu_inline)) for GCC < 4.3 file: [e32de8ba86] check-in: [7a1e2de2d4] user: js branch: trunk, size: 18066
2014-02-13
16:29
runtime/class.m: Better handling of Nil parameters This matches the behaviour of the Apple runtime. file: [dff5c1b4fe] check-in: [52c0e9f94e] user: js branch: trunk, size: 18038
2014-01-13
13:28
Remove class_isKindOfClass(). This was never used and is not part of the Apple runtime either. file: [3f90a22e50] check-in: [7c0fa1fa85] user: js branch: trunk, size: 17709
2014-01-05
22:31
Change behaviour of class_getMethodImplementation. It behaves like in the Apple runtime now. file: [e18e9ca229] check-in: [3cd9d0ad69] user: js branch: trunk, size: 17886
2014-01-04
00:24
Update copyright. file: [753600fe38] check-in: [3b97fc3cd9] user: js branch: trunk, size: 17158
2013-12-20
00:14
runtime: More consistency in the API. file: [a168991e4e] check-in: [2dec88a9d5] user: js branch: trunk, size: 17152
2013-12-19
22:21
runtime: Add objc_{get,copy}ClassList(). file: [0bf2860357] check-in: [035fa09270] user: js branch: trunk, size: 17143
20:15
runtime: New API for internal unregister methods. file: [3ec80df1e8] check-in: [b4231b1df9] user: js branch: trunk, size: 15926
2013-12-06
00:52
Add a fast path for objc_classname_to_class(). This should improve the performance for the GCC ABI, as objc_classname_to_class() is used for all sorts of class lookups, e.g. objc_lookup_class(). As this performance improvement needs RAM, it is only used after 128 calls into objc_classname_to_class(), so that if the ObjFW ABI is used and the user does not call into objc_getClass() or similar in a loop, no memory is wasted. Runtime internal usage of objc_classname_to_class() does not use the fast path and does not count as a call into objc_classname_to_class(). The reason for this is that if the runtime calls objc_classname_to_class(), it already has the lock and thus the performance gain would be small, but it would waste memory. file: [e9b6e354b6] check-in: [84a724dd4b] user: js branch: trunk, size: 15844
2013-11-22
23:24
runtime: Add support for non-fragile ivars. file: [0500525bf9] check-in: [3780f1462e] user: js branch: trunk, size: 13227
2013-06-17
08:54
Replace a few asserts with OF_ENSURE / OBJC_ERROR. file: [179d6825a3] check-in: [dc17a614e8] user: js branch: trunk, size: 12580
2013-03-18
13:17
Make GCC happy again. file: [6e9f617165] check-in: [074f577275] user: js branch: trunk, size: 12601
2013-03-14
20:20
Tag class pointers for @compatibility_aliases. This makes it possible to find aliases in the classes hashtable and not call objc_free_class() on them. file: [5994e9e90d] check-in: [69d9f76520] user: js branch: trunk, size: 12594
2013-03-09
09:24
Fix objc_exit() and add it to tests. file: [9014452587] check-in: [7baf58021d] user: js branch: trunk, size: 12530
2013-03-08
23:00
Take advantage of realloc(NULL, n) being defined. file: [c828b98623] check-in: [e8d6ca16e7] user: js branch: trunk, size: 12358
2013-03-04
17:20
Replace BOOL with bool. The only places where BOOL is left are those where they are required by the ABI. file: [d8be8e78d1] check-in: [c5ef582958] user: js branch: trunk, size: 12447
2013-02-17
10:14
Remove -Wno-deprecated-objc-isa-usage. Inside object_{get,set}Class, a cast is used to get rid of the warning now and all other direct isa references were removed. file: [640206d718] check-in: [2347371351] user: js branch: trunk, size: 12439
2013-01-09
22:24
Update copyright. file: [0cc7cd7988] check-in: [813c00ccf0] user: js branch: trunk, size: 12310
2012-12-06
01:19
Don't inline runtime functions. file: [9dc5ac3596] check-in: [7fe9b2e320] user: js branch: trunk, size: 12304
2012-11-30
16:09
Make runtime API more similar to Apple's. This makes it easier to use runtime functions in portable code. file: [72c72347b1] check-in: [120caad331] user: js branch: trunk, size: 11993
15:41
Remove inline that lead to a missing symbol. file: [2c7fbf6833] check-in: [99766b222c] user: js branch: 0.7, size: 11674
15:40
Remove inline that lead to a missing symbol. file: [fb20a2022a] check-in: [3b58706d32] user: js branch: trunk, size: 11768
2012-11-14
08:00
Fix objc_get_type_encoding(). file: [d1989ac845] check-in: [28f58d5a6e] user: js branch: trunk, size: 11775
2012-09-06
19:13
Add objc_{construct,destruct}Instance(). file: [d471bf4a2f] check-in: [20c584252c] user: js branch: trunk, size: 12946
2012-08-05
16:52
Fix a possible race condition in initialize_class. file: [cde4d41e21] check-in: [8f02ff02dc] user: js branch: trunk, size: 11681
2012-07-17
01:09
Rename ERROR() to OBJC_ERROR(). ERROR seems to be defined on MinGW32 and it's likely that it's also used on other systems, thus it's better to prefix it with OBJC_. file: [0f8bf1f4e6] check-in: [345eb93240] user: js branch: trunk, size: 11633
2012-07-15
00:45
Fix a bug in free_class. file: [2ee4c27804] check-in: [1633ea5d2a] user: js branch: trunk, size: 11603
2012-05-10
18:21
objc_hashtable_alloc() -> objc_hashtable_new(). For consistency. file: [db289f8cb1] check-in: [963db3089f] user: js branch: runtime, size: 11574
2012-05-09
13:55
Initialize classes on the first dispatch. This is no longer done in objc_msg_lookup() and thus allows direct class references. file: [16b932ec92] check-in: [dcf845546a] user: js branch: runtime, size: 11576
2012-04-22
15:56
Add class_registerAlias_np(). It's required by Clang for @compatibility_alias, even with the fragile ABI. This might be a bug in Clang, as _np means non-portable and Clang should not just emit references to such symbols. file: [886ace82f1] check-in: [8525f9600e] user: js branch: runtime, size: 11088
2012-04-21
13:47
Ensure all selectors are registered before load. file: [a7f5437671] check-in: [d5236bb40e] user: js branch: runtime, size: 10935
13:05
Properly copy methods from superclass first. file: [7aa459dc9f] check-in: [8c368f8f38] user: js branch: runtime, size: 10912
13:04
Avoid useless looking for +[load] method. file: [aa051ec745] check-in: [c03268e4c6] user: js branch: runtime, size: 10934
12:52
Move objc_classname_to_class. file: [59d640393e] check-in: [7bbd6e43fe] user: js branch: runtime, size: 10889
10:56
Remove useless thread-checking. file: [a1cee08383] check-in: [555445ce0a] user: js branch: runtime, size: 10889
2012-04-20
13:54
Fix load queue. file: [5cd9de1e6b] check-in: [70807340fb] user: js branch: runtime, size: 10970
13:52
Correctly setup and initialize classes. file: [4ee747388f] check-in: [69f63f872a] user: js branch: runtime, size: 10971
2012-04-18
18:41
Correctly call load. file: [93558a0a33] check-in: [d13674c4c9] user: js branch: runtime, size: 10621
18:00
Split OBJC_CLASS_INFO_INITIALIZED. We now have OBJC_CLASS_INFO_{SETUP,LOADED,INITIALIZED}. file: [106999ef41] check-in: [5a719c9b1f] user: js branch: runtime, size: 9487
17:29
Add cast to make Clang happy. file: [4b0eeefabc] check-in: [3ae7423995] user: js branch: runtime, size: 9190
17:26
Remove unnecessary interface. file: [82ae92bc57] check-in: [1bf4571d60] user: js branch: runtime, size: 9185
2012-04-08
15:03
Return Nil for incomplete classes. It's better to handle the class like it does not even exist in case it is not completely loaded. Throwing an error there introcudes trouble with static instances which try to get the class before initializing the static instances, so objc_lookup_class() should never throw an error. file: [227edc0aad] check-in: [0e35ae63a5] user: js branch: runtime, size: 9246
14:25
Properly call initialize. file: [04350ea410] check-in: [36d5f460a5] user: js branch: runtime, size: 9298
2012-03-23
15:42
rootclass->isa->superclass is rootclass. file: [1eef7dbe27] check-in: [aa179b6d0a] user: js branch: runtime, size: 8987
14:54
Add class_getMethodImplementation(). file: [16e53b23a5] check-in: [46105d56c7] user: js branch: runtime, size: 9117
11:08
Fix class_replaceMethod(). file: [c6f580ab0e] check-in: [db2fccd01f] user: js branch: runtime, size: 9231
10:46
Fix objc_get_type_encoding(). file: [53297dd85d] check-in: [4cf75724eb] user: js branch: runtime, size: 9241
10:45
Add a cast to make Clang happy. file: [b053085faa] check-in: [2179411c60] user: js branch: runtime, size: 9243
2012-03-06
16:24
objc_replace_{class,instance}_method() -> class_replaceMethod(). file: [79e5f03637] check-in: [2e39765aa2] user: js branch: runtime, size: 9226
2012-03-04
23:48
Better dissection of what should be public and private. file: [44fd744eb1] check-in: [31e7b3d756] user: js branch: runtime, size: 10504
20:37
Sometimes it's hard to make GCC and Clang happy at the same time... file: [283e2434aa] check-in: [2373a7777d] user: js branch: runtime, size: 10624
20:24
Make Clang with -Wshorten-64-to-32 happy. file: [6ae6224b73] check-in: [40fbc318bb] user: js branch: runtime, size: 10600
20:20
Added: Import and integrate ObjFW-RT. file: [df2c4cfdda] check-in: [129f90b580] user: js branch: runtime, size: 10582