Skip to content

Commit 3777d8a

Browse files
authored
refactoring (#71)
* extract builtins * update * refactor * refactor
1 parent 12b9d46 commit 3777d8a

12 files changed

Lines changed: 682 additions & 763 deletions

package-lock.json

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
},
1818
"homepage": "https://github.com/larshp/zmjs#readme",
1919
"dependencies": {
20-
"@abaplint/cli": "^2.118.10",
21-
"@abaplint/runtime": "^2.13.11",
22-
"@abaplint/transpiler-cli": "^2.13.11"
20+
"@abaplint/cli": "^2.119.57",
21+
"@abaplint/runtime": "^2.13.37",
22+
"@abaplint/transpiler-cli": "^2.13.37"
2323
}
2424
}
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
CLASS zcl_mjs_arr_methods DEFINITION PUBLIC.
2+
PUBLIC SECTION.
3+
CLASS-METHODS call_method
4+
IMPORTING
5+
is_obj TYPE zif_mjs=>ty_value
6+
iv_method TYPE string
7+
it_args TYPE zif_mjs=>tt_value_slots
8+
io_env TYPE REF TO zcl_mjs_env
9+
RETURNING
10+
VALUE(rs_val) TYPE zif_mjs=>ty_value
11+
RAISING
12+
zcx_mjs_runtime.
13+
PRIVATE SECTION.
14+
CLASS-METHODS build_cb_args
15+
IMPORTING
16+
is_elem TYPE zif_mjs=>ty_value
17+
iv_idx TYPE i
18+
is_arr TYPE zif_mjs=>ty_value
19+
RETURNING
20+
VALUE(rt_args) TYPE zif_mjs=>tt_value_slots.
21+
ENDCLASS.
22+
23+
CLASS zcl_mjs_arr_methods IMPLEMENTATION.
24+
25+
METHOD build_cb_args.
26+
" Callback signature: (element, index, array)
27+
APPEND is_elem TO rt_args.
28+
APPEND zcl_mjs_val=>number_val( CONV f( iv_idx ) ) TO rt_args.
29+
APPEND is_arr TO rt_args.
30+
ENDMETHOD.
31+
32+
METHOD call_method.
33+
DATA ls_cb TYPE zif_mjs=>ty_value.
34+
DATA lv_idx TYPE i.
35+
36+
CASE iv_method.
37+
WHEN `push`.
38+
LOOP AT it_args INTO DATA(ls_push_arg).
39+
is_obj-arr->push( zcl_mjs_val=>box_value( ls_push_arg ) ).
40+
ENDLOOP.
41+
rs_val = zcl_mjs_val=>number_val( CONV f( is_obj-arr->length( ) ) ).
42+
43+
WHEN `map`.
44+
IF lines( it_args ) > 0.
45+
READ TABLE it_args INDEX 1 INTO ls_cb.
46+
IF ls_cb-type = zif_mjs=>c_type_function AND ls_cb-fn IS BOUND.
47+
DATA lo_map_arr TYPE REF TO zcl_mjs_array.
48+
CREATE OBJECT lo_map_arr.
49+
lv_idx = 0.
50+
LOOP AT is_obj-arr->items INTO DATA(lr_map_item).
51+
DATA(ls_map_result) = zcl_mjs=>call_function(
52+
ir_fn = ls_cb-fn
53+
it_args = build_cb_args( is_elem = zcl_mjs_val=>unbox_value( lr_map_item ) iv_idx = lv_idx is_arr = is_obj )
54+
io_env = io_env ).
55+
lo_map_arr->push( zcl_mjs_val=>box_value( ls_map_result ) ).
56+
lv_idx = lv_idx + 1.
57+
ENDLOOP.
58+
rs_val-type = zif_mjs=>c_type_array.
59+
rs_val-arr = lo_map_arr.
60+
ENDIF.
61+
ELSE.
62+
rs_val = zcl_mjs_val=>array_val( VALUE #( ) ).
63+
ENDIF.
64+
65+
WHEN `find`.
66+
rs_val = zcl_mjs_val=>undefined_val( ).
67+
IF lines( it_args ) > 0.
68+
READ TABLE it_args INDEX 1 INTO ls_cb.
69+
IF ls_cb-type = zif_mjs=>c_type_function AND ls_cb-fn IS BOUND.
70+
lv_idx = 0.
71+
LOOP AT is_obj-arr->items INTO DATA(lr_find_item).
72+
DATA(ls_find_elem) = zcl_mjs_val=>unbox_value( lr_find_item ).
73+
DATA(ls_find_result) = zcl_mjs=>call_function(
74+
ir_fn = ls_cb-fn
75+
it_args = build_cb_args( is_elem = ls_find_elem iv_idx = lv_idx is_arr = is_obj )
76+
io_env = io_env ).
77+
IF zcl_mjs_val=>is_true( ls_find_result ) = abap_true.
78+
rs_val = ls_find_elem.
79+
RETURN.
80+
ENDIF.
81+
lv_idx = lv_idx + 1.
82+
ENDLOOP.
83+
ENDIF.
84+
ENDIF.
85+
86+
WHEN `filter`.
87+
IF lines( it_args ) > 0.
88+
READ TABLE it_args INDEX 1 INTO ls_cb.
89+
IF ls_cb-type = zif_mjs=>c_type_function AND ls_cb-fn IS BOUND.
90+
DATA lo_flt_arr TYPE REF TO zcl_mjs_array.
91+
CREATE OBJECT lo_flt_arr.
92+
lv_idx = 0.
93+
LOOP AT is_obj-arr->items INTO DATA(lr_flt_item).
94+
DATA(ls_flt_result) = zcl_mjs=>call_function(
95+
ir_fn = ls_cb-fn
96+
it_args = build_cb_args( is_elem = zcl_mjs_val=>unbox_value( lr_flt_item ) iv_idx = lv_idx is_arr = is_obj )
97+
io_env = io_env ).
98+
IF zcl_mjs_val=>is_true( ls_flt_result ) = abap_true.
99+
lo_flt_arr->push( lr_flt_item ).
100+
ENDIF.
101+
lv_idx = lv_idx + 1.
102+
ENDLOOP.
103+
rs_val-type = zif_mjs=>c_type_array.
104+
rs_val-arr = lo_flt_arr.
105+
ENDIF.
106+
ELSE.
107+
rs_val = zcl_mjs_val=>array_val( VALUE #( ) ).
108+
ENDIF.
109+
110+
WHEN `splice`.
111+
DATA(lv_spl_len) = is_obj-arr->length( ).
112+
DATA lv_spl_start TYPE i VALUE 0.
113+
IF lines( it_args ) >= 1.
114+
lv_spl_start = zcl_mjs_val=>to_number( it_args[ 1 ] ).
115+
IF lv_spl_start < 0.
116+
lv_spl_start = lv_spl_start + lv_spl_len.
117+
IF lv_spl_start < 0.
118+
lv_spl_start = 0.
119+
ENDIF.
120+
ELSEIF lv_spl_start > lv_spl_len.
121+
lv_spl_start = lv_spl_len.
122+
ENDIF.
123+
ENDIF.
124+
DATA(lv_delete_count) = lv_spl_len - lv_spl_start.
125+
IF lines( it_args ) >= 2.
126+
lv_delete_count = zcl_mjs_val=>to_number( it_args[ 2 ] ).
127+
IF lv_delete_count < 0.
128+
lv_delete_count = 0.
129+
ENDIF.
130+
IF lv_delete_count > lv_spl_len - lv_spl_start.
131+
lv_delete_count = lv_spl_len - lv_spl_start.
132+
ENDIF.
133+
ENDIF.
134+
135+
DATA lt_removed TYPE zif_mjs=>tt_nodes.
136+
DATA(lv_i) = 0.
137+
WHILE lv_i < lv_delete_count.
138+
APPEND is_obj-arr->items[ lv_spl_start + 1 ] TO lt_removed.
139+
DELETE is_obj-arr->items INDEX lv_spl_start + 1.
140+
lv_i = lv_i + 1.
141+
ENDWHILE.
142+
143+
IF lines( it_args ) > 2.
144+
DATA(lv_ins_idx) = lv_spl_start + 1.
145+
LOOP AT it_args INTO DATA(ls_spl_a) FROM 3.
146+
INSERT zcl_mjs_val=>box_value( ls_spl_a ) INTO is_obj-arr->items INDEX lv_ins_idx.
147+
lv_ins_idx = lv_ins_idx + 1.
148+
ENDLOOP.
149+
ENDIF.
150+
rs_val = zcl_mjs_val=>array_val( lt_removed ).
151+
152+
WHEN `sort`.
153+
" rudimentary lexicographical sort for tests (JS default)
154+
TYPES: BEGIN OF ty_sort,
155+
val TYPE string,
156+
ref TYPE REF TO data,
157+
END OF ty_sort.
158+
DATA lt_sort TYPE STANDARD TABLE OF ty_sort WITH DEFAULT KEY.
159+
LOOP AT is_obj-arr->items INTO DATA(lr_si).
160+
APPEND VALUE #( val = zcl_mjs_val=>to_string( zcl_mjs_val=>unbox_value( lr_si ) ) ref = lr_si ) TO lt_sort.
161+
ENDLOOP.
162+
SORT lt_sort BY val ASCENDING.
163+
CLEAR is_obj-arr->items.
164+
LOOP AT lt_sort INTO DATA(ls_sort).
165+
APPEND ls_sort-ref TO is_obj-arr->items.
166+
ENDLOOP.
167+
rs_val = is_obj.
168+
169+
WHEN OTHERS.
170+
RAISE EXCEPTION TYPE zcx_mjs_runtime
171+
EXPORTING
172+
iv_error = |TypeError: { iv_method } is not a function|.
173+
ENDCASE.
174+
ENDMETHOD.
175+
176+
ENDCLASS.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_MJS_ARR_METHODS</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>Mini JavaScript Engine - Array methods</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
</asx:values>
15+
</asx:abap>
16+
</abapGit>

src/types/zcl_mjs_json.clas.abap

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ CLASS zcl_mjs_json IMPLEMENTATION.
99

1010
METHOD stringify.
1111
CASE is_val-type.
12-
WHEN 0. " undefined → omit marker (caller handles)
12+
WHEN zif_mjs=>c_type_undefined. " omit marker (caller handles)
1313
rv_json = ``.
1414
RETURN.
15-
WHEN 5. " null
15+
WHEN zif_mjs=>c_type_null.
1616
rv_json = `null`.
17-
WHEN 1. " number
17+
WHEN zif_mjs=>c_type_number.
1818
IF is_val-str = `NaN` OR is_val-str = `Infinity` OR is_val-str = `-Infinity`.
1919
rv_json = `null`.
2020
ELSE.
2121
rv_json = zcl_mjs_val=>to_string( is_val ).
2222
ENDIF.
23-
WHEN 3. " boolean
23+
WHEN zif_mjs=>c_type_bool.
2424
rv_json = COND #( WHEN is_val-num <> 0 THEN `true` ELSE `false` ).
25-
WHEN 2. " string — quote and escape
25+
WHEN zif_mjs=>c_type_string. " quote and escape
2626
DATA lv_src TYPE string.
2727
DATA lv_out TYPE string.
2828
DATA lv_len TYPE i.
@@ -61,7 +61,7 @@ CLASS zcl_mjs_json IMPLEMENTATION.
6161
lv_idx = lv_idx + 1.
6262
ENDWHILE.
6363
rv_json = lv_out && `"`.
64-
WHEN 6. " object
64+
WHEN zif_mjs=>c_type_object.
6565
IF is_val-obj IS NOT BOUND.
6666
rv_json = `{}`.
6767
RETURN.
@@ -72,7 +72,7 @@ CLASS zcl_mjs_json IMPLEMENTATION.
7272
LOOP AT is_val-obj->props ASSIGNING FIELD-SYMBOL(<prop>).
7373
DATA(ls_pval) = zcl_mjs_val=>unbox_value( <prop>-val ).
7474
" skip undefined and function values
75-
IF ls_pval-type = 0 OR ls_pval-type = 4.
75+
IF ls_pval-type = zif_mjs=>c_type_undefined OR ls_pval-type = zif_mjs=>c_type_function.
7676
CONTINUE.
7777
ENDIF.
7878
IF lv_obj_first = abap_false.
@@ -82,7 +82,7 @@ CLASS zcl_mjs_json IMPLEMENTATION.
8282
lv_obj_first = abap_false.
8383
ENDLOOP.
8484
rv_json = lv_obj_out && `}`.
85-
WHEN 7. " array
85+
WHEN zif_mjs=>c_type_array.
8686
IF is_val-arr IS NOT BOUND.
8787
rv_json = `[]`.
8888
RETURN.
@@ -99,7 +99,7 @@ CLASS zcl_mjs_json IMPLEMENTATION.
9999
DATA lv_elem_json TYPE string.
100100
IF lr_elem IS BOUND.
101101
DATA(ls_elem) = zcl_mjs_val=>unbox_value( lr_elem ).
102-
IF ls_elem-type = 0 OR ls_elem-type = 4.
102+
IF ls_elem-type = zif_mjs=>c_type_undefined OR ls_elem-type = zif_mjs=>c_type_function.
103103
lv_elem_json = `null`. " undefined/function in array → null
104104
ELSE.
105105
lv_elem_json = stringify( ls_elem ).

src/types/zcl_mjs_string.clas.abap

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ CLASS zcl_mjs_string IMPLEMENTATION.
248248
READ TABLE it_args INDEX 1 INTO ls_rep1.
249249
READ TABLE it_args INDEX 2 INTO ls_rep2.
250250
DATA(lv_rep_to) = zcl_mjs_val=>to_string( ls_rep2 ).
251-
IF ls_rep1-type = 8.
251+
IF ls_rep1-type = zif_mjs=>c_type_regex.
252252
" RegExp first argument — use FIND loop to avoid REPLACE ALL IGNORING CASE runtime issues
253253
DATA lv_rxint TYPE i.
254254
DATA lv_rxglob TYPE abap_bool.
@@ -438,14 +438,14 @@ CLASS zcl_mjs_string IMPLEMENTATION.
438438
lo_spl_arr->push( zcl_mjs_val=>box_value( zcl_mjs_val=>string_val( lv_spl_item ) ) ).
439439
lv_spl_count = lv_spl_count + 1.
440440
ENDLOOP.
441-
rs_val-type = 7.
441+
rs_val-type = zif_mjs=>c_type_array.
442442
rs_val-arr = lo_spl_arr.
443443
ELSE.
444444
" default: one-element array with full string
445445
DATA lo_spl_def TYPE REF TO zcl_mjs_array.
446446
CREATE OBJECT lo_spl_def.
447447
lo_spl_def->push( zcl_mjs_val=>box_value( is_obj ) ).
448-
rs_val-type = 7.
448+
rs_val-type = zif_mjs=>c_type_array.
449449
rs_val-arr = lo_spl_def.
450450
ENDIF.
451451
WHEN OTHERS.

0 commit comments

Comments
 (0)