Commit fd9eaec8 authored by Camil Staps's avatar Camil Staps 🚀

Merge branch 'master' into optimise-wasm-interpreter

parents 1c61a7bf acfdd925
Pipeline #24854 passed with stages
in 12 minutes and 52 seconds
......@@ -9,9 +9,8 @@
*.tcl
*.opt.abc
*.obc
*.bc
*.ubc
*.pbc
*.graph
......
......@@ -10,7 +10,9 @@ stages:
- ln -s "$PWD/src/abcopt" /opt/clean/lib/exe/abcopt
- ln -s "$PWD/src/bcgen" /opt/clean/lib/exe/bcgen
- ln -s "$PWD/src/bclink" /opt/clean/lib/exe/bclink
- ln -s "$PWD/src/bcprelink" /opt/clean/lib/exe/bcprelink
- ln -s "$PWD/src/bcstrip" /opt/clean/lib/exe/bcstrip
- sed -i '/^import code from library/d' lib/ABC/Interpreter/Util.icl
- make -C src
build:
......@@ -41,7 +43,7 @@ build-wasm:
artifacts:
paths:
- src-js/WebPublic.tar.gz
expire_in: 1 week
expire_in: 3 months
benchmark-x64:
extends: .base
......@@ -56,6 +58,7 @@ benchmark-x86:
script:
- cd test
- ./run_tests.sh -3bf
allow_failure: true
benchmark-wasm:
extends: .base
......
......@@ -27,7 +27,4 @@ RUN apt-get install -y -qq --no-install-recommends curl unzip libnspr4 &&\
RUN install_clean_nightly.sh base lib-argenv lib-directory lib-dynamics lib-graphcopy lib-platform lib-stdlib
RUN git clone https://gitlab.science.ru.nl/cstaps/clean-tools /tmp/clean-tools &&\
make -C /tmp/clean-tools/clm -f Makefile.linux64 &&\
mv /tmp/clean-tools/clm/clm /opt/clean/bin &&\
cd /tmp && rm -r clean-tools
RUN sed -i 's%lib/exe/linker%/usr/bin/gcc:--gc-sections%' /opt/clean/etc/IDEEnvs
Version: 1.5
Global
ProjectRoot: .
Target: StdEnv
Exec: {Project}*compiler
ByteCode: {Project}*compiler.bc
CodeGen
CheckStacks: False
CheckIndexes: True
OptimiseABC: True
GenerateByteCode: True
Application
HeapSize: 20971520
StackSize: 512000
ExtraMemory: 8192
IntialHeapSize: 204800
HeapSizeMultiplier: 4096
ShowExecutionTime: False
ShowGC: False
ShowStackSize: False
MarkingCollector: False
DisableRTSFlags: False
StandardRuntimeEnv: True
Profile
Memory: False
MemoryMinimumHeapSize: 0
Time: False
Stack: False
Dynamics: False
GenericFusion: False
DescExL: True
Output
Output: ShowConstructors
Font: Monaco
FontSize: 9
WriteStdErr: False
Link
LinkMethod: Static
GenerateRelocations: False
GenerateSymbolTable: True
GenerateLinkMap: False
LinkResources: False
ResourceSource:
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: False
Paths
Path: {Project}
Path: {Project}*..*..*lib
Path: {Application}*lib*ArgEnv
Path: {Application}*lib*GraphCopy
Path: {Application}*lib*Platform
Precompile:
Postlink:
MainModule
Name: Compiler
Dir: {Project}
Compiler
NeverMemoryProfile: False
NeverTimeProfile: False
StrictnessAnalysis: True
ListTypes: StrictExportTypes
ListAttributes: True
Warnings: True
Verbose: True
ReadableABC: False
ReuseUniqueNodes: True
Fusion: False
CLM:=clm
CLMFLAGS:=\
-I ../../lib\
-IL ArgEnv\
-IL Platform\
-IL GraphCopy\
-nt\
-desc -exl\
-optabc -bytecode\
-no-opt-link -ns\
-h 10m
BIN:=compiler
MAIN:=Compiler
$(BIN): .FORCE
$(CLM) $(CLMFLAGS) $(MAIN) -o $@
clean:
$(RM) -r $(BIN) $(BIN).bc Clean\ System\ Files
.FORCE:
.PHONY: .FORCE clean
......@@ -7,12 +7,11 @@ make -C ../src\
bclink\
library
clm -O -bytecode _system
for dir in *; do
[ -d "$dir" ] || continue
echo -e "\033[0;33mTesting $dir\033[0m"
(cd "$dir"
make
for f in *.prj.default; do cp "$f" "${f/.default/}"; done
cpm make
./"$dir")
done
......@@ -117,11 +117,17 @@ where
}
getInterpreterSymbols :: !Pointer -> [Symbol]
getInterpreterSymbols pgm = takeWhile (\s -> size s.symbol_name <> 0)
[getSymbol i \\ i <- [0..get_symbol_table_size pgm-1]]
getInterpreterSymbols pgm = getSymbols 0 (get_symbol_table_size pgm-1)
where
symbol_table = get_symbol_table pgm
getSymbols :: !Int !Int -> [Symbol]
getSymbols i max
| i > max = []
# sym = getSymbol i
| size sym.symbol_name == 0 = []
= [sym:getSymbols (i+1) max]
getSymbol :: !Int -> Symbol
getSymbol i
#! offset = symbol_table + i * IF_INT_64_OR_32 16 8 /* size of struct host_symbol */
......@@ -439,7 +445,9 @@ serialize_for_prelinked_interpretation graph pie
= replace_desc_numbers_by_descs 0 graph syms 0 pie.pie_code_start
where
predef_or_lookup_symbol :: !Int !DescInfo !{#String} !{#Symbol} -> Int
predef_or_lookup_symbol code_start di mods syms = case di.di_name of
predef_or_lookup_symbol code_start di mods syms
# module_name = mods.[(di.di_prefix_arity_and_mod>>8)-1]
| module_name == "_system" = case di.di_name of
"_ARRAY_" -> code_start-1*8+2
"_STRING_" -> code_start-2*8+2
"BOOL" -> code_start-3*8+2
......@@ -447,7 +455,9 @@ where
"REAL" -> code_start-5*8+2
"INT" -> code_start-6*8+2
"dINT" -> code_start-6*8+2
"_ind" -> code_start-7*8+2
_ -> lookup_symbol_value di mods syms
| otherwise = lookup_symbol_value di mods syms
// This is like the function with the same name in GraphCopy's
// graph_copy_with_names, but it assigns even negative descriptor numbers
......@@ -533,6 +543,7 @@ where
| d==array_desc-4*8+2 = (1,True) // CHAR
| d==array_desc-5*8+2 = (IF_INT_64_OR_32 1 2,True) // REAL
| d==array_desc-6*8+2 = (1,True) // INT/dINT
| d==array_desc-7*8+2 = (0,True) // _ind
| otherwise = abort "internal error in serialize_for_prelinked_interpretation\n"
# arity = get_D_node_arity d
| arity<256 = (0,True)
......
......@@ -792,6 +792,8 @@
(br $predefined-constructor)
)
)
(br_if ;; e__system__nind
$loop (i32.eq (local.get $desc) (i32.const -54)))
(br $no-predefined-constructor)
)
......
......@@ -277,6 +277,11 @@ const char *instruction_type (BC_WORD i) {
case Cjmp_eval: return "";
case Cjmp_eval_upd: return "";
case Cjmp_false: return "l";
case Cjmp_i: return "n";
case Cjmp_i0: return "";
case Cjmp_i1: return "";
case Cjmp_i2: return "";
case Cjmp_i3: return "";
case Cjmp_true: return "l";
case Cjsr: return "l";
case Cjsr_eval: return "n";
......@@ -284,6 +289,11 @@ const char *instruction_type (BC_WORD i) {
case Cjsr_eval1: return "";
case Cjsr_eval2: return "";
case Cjsr_eval3: return "";
case Cjsr_i: return "n";
case Cjsr_i0: return "";
case Cjsr_i1: return "";
case Cjsr_i2: return "";
case Cjsr_i3: return "";
case ClnR: return "";
case Cload_i: return "i";
case Cload_module_name: return "";
......@@ -774,6 +784,7 @@ const char *instruction_type (BC_WORD i) {
case CA_data_IIl: return "IIl";
case CA_data_IlI: return "IlI";
case CA_data_IlIla: return "IlIla";
case CA_data_lIlI: return "lIlI";
case CA_data_la: return "la";
case CA_data_a: return "a";
......
......@@ -263,6 +263,11 @@ enum {
INSTRUCTION(jmp_eval)
INSTRUCTION(jmp_eval_upd)
INSTRUCTION(jmp_false)
INSTRUCTION(jmp_i)
INSTRUCTION(jmp_i0)
INSTRUCTION(jmp_i1)
INSTRUCTION(jmp_i2)
INSTRUCTION(jmp_i3)
INSTRUCTION(jmp_true)
INSTRUCTION(jsr)
INSTRUCTION(jsr_eval)
......@@ -270,6 +275,11 @@ enum {
INSTRUCTION(jsr_eval1)
INSTRUCTION(jsr_eval2)
INSTRUCTION(jsr_eval3)
INSTRUCTION(jsr_i)
INSTRUCTION(jsr_i0)
INSTRUCTION(jsr_i1)
INSTRUCTION(jsr_i2)
INSTRUCTION(jsr_i3)
INSTRUCTION(lnR)
INSTRUCTION(load_i)
INSTRUCTION(load_module_name)
......@@ -764,6 +774,7 @@ enum {
INSTRUCTION(A_data_IIl)
INSTRUCTION(A_data_IlI)
INSTRUCTION(A_data_IlIla)
INSTRUCTION(A_data_lIlI)
INSTRUCTION(A_data_la)
INSTRUCTION(A_data_a)
......
......@@ -148,10 +148,12 @@ void load_instruction_table(void) {
put_instruction_name("jmp_eval", parse_instruction, code_jmp_eval );
put_instruction_name("jmp_eval_upd", parse_instruction, code_jmp_eval_upd );
put_instruction_name("jmp_false", parse_instruction_a, code_jmp_false );
put_instruction_name("jmp_i", parse_instruction_n, code_jmp_i );
put_instruction_name("jmp_true", parse_instruction_a, code_jmp_true );
put_instruction_name("jsr", parse_instruction_a, code_jsr );
put_instruction_name("jsr_eval", parse_instruction_n, code_jsr_eval );
put_instruction_name("jsr_ap", parse_instruction_n, code_jsr_ap );
put_instruction_name("jsr_eval", parse_instruction_n, code_jsr_eval );
put_instruction_name("jsr_i", parse_instruction_n, code_jsr_i );
put_instruction_name("lnR", parse_instruction, code_lnR );
put_instruction_name("load_i", parse_instruction_i, code_load_i );
put_instruction_name("load_module_name", parse_instruction, code_load_module_name );
......
......@@ -2424,6 +2424,18 @@ void code_jmp_false(char label_name[]) {
add_instruction_label(Cjmp_false,label_name);
}
void code_jmp_i(int n_apply_args) {
last_d=0;
switch (n_apply_args) {
case 0: add_instruction(Cjmp_i0); break;
case 1: add_instruction(Cjmp_i1); break;
case 2: add_instruction(Cjmp_i2); break;
case 3: add_instruction(Cjmp_i3); break;
default: add_instruction_w(Cjmp_i,n_apply_args);
}
}
void code_jmp_true(char label_name[]) {
add_instruction_label(Cjmp_true,label_name);
}
......@@ -2514,6 +2526,21 @@ void code_jsr_eval(int a_offset) {
}
}
void code_jsr_i(int n_apply_args) {
if (last_d) {
last_jsr_with_d=1;
last_d=0;
}
switch (n_apply_args) {
case 0: add_instruction(Cjsr_i0); break;
case 1: add_instruction(Cjsr_i1); break;
case 2: add_instruction(Cjsr_i2); break;
case 3: add_instruction(Cjsr_i3); break;
default: add_instruction_w(Cjsr_i,n_apply_args);
}
}
void code_lnR(void) {
add_instruction(ClnR);
}
......@@ -4149,7 +4176,20 @@ void code_a(int n_apply_args,char *ea_label_name) {
}
void code_ai(int n_apply_args,char *ea_label_name,char *instance_member_code_name) {
code_a(n_apply_args,ea_label_name);
if (n_apply_args==0) {
add_instruction_label(CA_data_lIlI,instance_member_code_name);
add_instruction_label(Cjmp,ea_label_name);
add_instruction(Chalt);
} else if (n_apply_args<=32) {
add_instruction_label(CA_data_lIlI,instance_member_code_name);
add_instruction_label(Cadd_empty_node3+(n_apply_args-3),ea_label_name);
add_instruction(Chalt);
} else {
if (ea_label_name!=NULL)
fprintf(stderr, "Error: .ai %d %s %s\n",n_apply_args,ea_label_name,instance_member_code_name);
else
fprintf(stderr, "Error: .ai %d %s\n",n_apply_args,instance_member_code_name);
}
}
void code_algtype(int n_constructors) {
......@@ -4481,15 +4521,11 @@ void code_n(int32_t number_of_arguments, char *descriptor_name, char *ea_label_n
if (number_of_arguments>=0 && number_of_arguments<=32) {
add_instruction_label(Ceval_upd0+number_of_arguments,ea_label_name);
add_instruction(Chalt);
} else if (number_of_arguments==-1) {
} else if (number_of_arguments<0) { /* selectors and indirections */
add_instruction_label(Cjmp,ea_label_name);
add_instruction(Chalt);
} else {
/* to do eval_upd_n */
if (ea_label_name!=NULL)
fprintf(stderr, "Warning: .n %d %s is not implemented\n",number_of_arguments,ea_label_name);
else
fprintf(stderr, "Warning: .n %d is not implemented\n",number_of_arguments);
fprintf(stderr, "Warning: .n %d %s is not implemented\n",number_of_arguments,ea_label_name);
add_instruction(Chalt);
add_label(ea_label_name);
add_instruction(Chalt);
......@@ -4541,19 +4577,27 @@ void code_nu(int a_size,int b_size,char *descriptor_name,char *ea_label_name) {
}
void code_o(int oa,int ob,uint32_t vector[]) {
if (last_jsr_with_d) {
if (pgrm.code[pgrm.code_size-2].value!=Cjsr) {
int i;
while (last_jsr_with_d) {
int i=pgrm.code[pgrm.code_size-2].value;
if (i==Cjsr || i==Cjsr_i)
break;
i=pgrm.code[pgrm.code_size-3].value;
if (i!=Cpop_a_jsr && i!=Cpop_b_jsr && i!=Cpush_a_jsr && i!=Cpush_b_jsr
&& pgrm.code[pgrm.code_size-4].value!=Cbuildh0_put_a_jsr)
{
fprintf(stderr, "Error: .o directive used incorrectly near jsr\n");
exit(1);
}
}
i=pgrm.code[pgrm.code_size-1].value;
if ((Cjsr_ap1<=i && i<=Cjsr_ap32) ||
(Cjsr_i0<=i && i<=Cjsr_i3))
break;
i=pgrm.code[pgrm.code_size-3].value;
if (i==Cpop_a_jsr || i==Cpop_b_jsr || i==Cpush_a_jsr || i==Cpush_b_jsr)
break;
if (pgrm.code[pgrm.code_size-4].value==Cbuildh0_put_a_jsr)
break;
fprintf(stderr, "Error: .o directive used incorrectly near jsr\n");
exit(1);
}
last_jsr_with_d=0;
}
#endif
......
......@@ -140,10 +140,12 @@ void code_jmp_ap(int n_apply_args);
void code_jmp_eval(void);
void code_jmp_eval_upd(void);
void code_jmp_false(char label_name[]);
void code_jmp_i(int n_apply_args);
void code_jmp_true(char label_name[]);
void code_jsr(char label_name[]);
void code_jsr_ap(int n_apply_args);
void code_jsr_eval(int a_offset);
void code_jsr_i(int n_apply_args);
void code_lnR(void);
void code_load_i(CleanInt value);
void code_load_module_name(void);
......
......@@ -190,7 +190,7 @@ int print_label_name(char *s, size_t size, char *label) {
break;
default:
add_char('_');
add_char(*(label-1));
add_char(*label);
}
label++;
} else {
......
......@@ -322,9 +322,13 @@ void wprint_node(WINDOW *win, BC_WORD *node, int with_arguments) {
wprintw(win, "CHAR '%c'", node[1]);
else if ((node[0]&-4)==(BC_WORD)&REAL)
wprintw(win, "REAL %f", *(BC_REAL*)&node[1]);
else if ((node[0]&-4)==(BC_WORD)&__interpreter_cycle_in_spine)
else if ((node[0]&-4)==(BC_WORD)&__interpreter_cycle_in_spine[1])
wprintw(win, "_cycle_in_spine");
else {
else if ((node[0]&-4)==(BC_WORD)&__interpreter_indirection[5]) {
char _tmp[256];
print_label(_tmp, 256, 0, (BC_WORD*) node[1], program, hp, heap_size);
wprintw(win, "_ind %s", _tmp);
} else {
char _tmp[256];
print_label(_tmp, 256, 0, (BC_WORD*) node[0], program, hp, heap_size);
wprintw(win, "%s", _tmp);
......@@ -510,11 +514,6 @@ void debugger_show_node_as_tree_(WINDOW *win, BC_WORD *node, int indent, uint64_
return;
}
if (node[0] == (BC_WORD) &__interpreter_cycle_in_spine) {
wprintw(win, " _cycle_in_spine");
return;
}
if (is_last)
indent_mask ^= 1;
......@@ -552,7 +551,13 @@ void debugger_show_node_as_tree_(WINDOW *win, BC_WORD *node, int indent, uint64_
wprintw(win, " __ARRAY__");
else if (node[0] == (BC_WORD) ARRAY+2+IF_INT_64_OR_32(16,8))
wprintw(win, " ARRAY");
else {
else if (node[0] == (BC_WORD) &__interpreter_cycle_in_spine[1])
wprintw(win, "_cycle_in_spine");
else if (node[0] == (BC_WORD) &__interpreter_indirection[5]) {
char _tmp[256];
print_label(_tmp, 256, 0, (BC_WORD*) node[1], program, hp, heap_size);
wprintw(win, "_ind %s", _tmp);
} else {
char _tmp[256];
if (a_arity + b_arity > 0)
waddch(win, ACS_DIAMOND);
......
......@@ -86,6 +86,7 @@ void init_parser(struct parser *state
preseed_symbol_matcher(state, "REAL", (void*) &REAL);
preseed_symbol_matcher(state, "__ARRAY__", (void*) &__ARRAY__);
preseed_symbol_matcher(state, "__STRING__", (void*) &__STRING__);
preseed_symbol_matcher(state, "e__system__nind", (void*) &__interpreter_indirection[5]);
#endif
#ifdef LINKER
......
......@@ -27,4 +27,4 @@ typedef int64_t CleanInt;
#define BCGEN_INSTRUCTION_TABLE_SIZE 512
#define ABC_MAGIC_NUMBER 0x2a434241
#define ABC_VERSION 6
#define ABC_VERSION 7
Version: 1.5
Global
ProjectRoot: .
Target: StdEnv
Exec: {Project}*CodeSharing
ByteCode: {Project}*CodeSharing.bc
CodeGen
CheckStacks: False
CheckIndexes: True
OptimiseABC: False
GenerateByteCode: False
Application
HeapSize: 2097152
StackSize: 512000
ExtraMemory: 8192
IntialHeapSize: 204800
HeapSizeMultiplier: 4096
ShowExecutionTime: False
ShowGC: False
ShowStackSize: False
MarkingCollector: False
DisableRTSFlags: False
StandardRuntimeEnv: True
Profile
Memory: False
MemoryMinimumHeapSize: 0
Time: False
Stack: False
Dynamics: False
GenericFusion: False
DescExL: False
Output
Output: ShowConstructors
Font: Monaco
FontSize: 9
WriteStdErr: False
Link
LinkMethod: Static
GenerateRelocations: False
GenerateSymbolTable: True
GenerateLinkMap: False
LinkResources: False
ResourceSource:
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: False
Paths
Path: {Project}
Path: {Project}*..*lib
Path: {Application}*lib*GraphCopy
Path: {Application}*lib*Platform
Precompile:
Postlink:
MainModule
Name: CodeSharing
Dir: {Project}
Compiler
NeverMemoryProfile: False
NeverTimeProfile: False
StrictnessAnalysis: True
ListTypes: StrictExportTypes
ListAttributes: True
Warnings: True
Verbose: True
ReadableABC: False
ReuseUniqueNodes: True
Fusion: False
......@@ -2,8 +2,8 @@ Version: 1.4
Global
ProjectRoot: .
Target: StdEnv
Exec: {Project}\GraphTest.exe
ByteCode: {Project}\GraphTest.bc
Exec: {Project}*GraphTest
ByteCode: {Project}*GraphTest.bc
CodeGen
CheckStacks: False
CheckIndexes: True
......@@ -43,11 +43,14 @@ Global
ResourceSource:
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: False
Paths
Path: {Project}
Path: {Project}*..*src
Path: {Application}*Libraries*GraphCopy
Path: {Application}*Libraries*Platform
Path: {Project}*..*lib
Path: {Application}*lib*GraphCopy
Path: {Application}*lib*Platform
Precompile:
Postlink:
MainModule
......
CLM:=clm
override CLMFLAGS+=-I ../lib -IL ArgEnv -IL Platform -IL GraphCopy -ns
ifneq ($(OS),Mac)
override CLMFLAGS+=-no-opt-link
endif
CPM:=cpm
TESTS:=CodeSharing GraphTest
RUNTESTS:=$(addprefix test-,$(TESTS))
all: $(TESTS)
CodeSharing: library .FORCE
$(CLM) $(CLMFLAGS) $@ -o $@
$(TESTS): %: %.prj library .FORCE
$(CPM) $<
GraphTest: library .FORCE
$(CLM) -O -bytecode _system
$(CLM) $(CLMFLAGS) -exl -desc -bytecode -optabc -h 10m $@ -o $@
%.prj: %.prj.default
cp $< $@
test: $(RUNTESTS)
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Path: {Application}*lib*Platform
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
False
halt at 4
280002 244286 524288
280000 244288 524288
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Path: {Application}*lib*Platform
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: False
KeepByteCodeSymbols: True
PrelinkByteCode: True
Paths
Path: {Project}
Precompile:
......
......@@ -44,6 +44,8 @@ Global
GenerateDLL: False
ExportedNames:
StripByteCode: True