• cesanta elk安装及测试


    背景

    本文适合有c语言基础的朋友,且了解make编译。elk是cesanta开源社区mongoose同类产品中的javascript库。目前支持的特性如下:

    • Operations: all standard JS operations except:
      • !===. Use strict comparison !=====
      • No computed member access a[b]
    • Typeof: typeof('a') === 'string'
    • While: while (...) { ... }
    • Conditional: if (...) ... else ...
    • Ternary operator a ? b : c
    • Simple types: let a, b, c = 12.3, d = 'a', e = null, f = true, g = false;
    • Functions: let f = function(x, y) { return x + y; };
    • Objects: let obj = {f: function(x) { return x * 2}}; obj.f(3);
    • Every statement must end with a semicolon ;
    • Strings are binary data chunks, not Unicode strings: 'Київ'.length === 8

    不支持的特性如下:

    • No var, no const. Use let (strict mode only)
    • No doswitchfor. Use while
    • No => functions. Use let f = function(...) {...};
    • No arrays, closures, prototypes, thisnewdelete
    • No standard library: no DateRegexpFunctionStringNumber

    笔者在freebsd 11编译测试过程如下,仅供参考

    project@freebsd:~ % git clone https://github.com/cesanta/elk.git
    Cloning into 'elk'...
    remote: Enumerating objects: 778, done.
    remote: Counting objects: 100% (50/50), done.
    remote: Compressing objects: 100% (33/33), done.
    remote: Total 778 (delta 17), reused 17 (delta 17), pack-reused 728
    Receiving objects: 100% (778/778), 4.27 MiB | 2.29 MiB/s, done.
    Resolving deltas: 100% (364/364), done.

    测试

    cd elk/test
    #查看Makefile
     vim Makefile
    CFLAGS ?= -W -Wall -Werror -Wno-deprecated -I.. -g -fsanitize=address,undefined -coverage -lm $(EXTRA)
    CWD ?= $(realpath $(CURDIR))
    ROOT ?= $(realpath $(CURDIR)/..)
    DOCKER = docker run $(DA) --rm -e WINEDEBUG=-all -v $(ROOT):$(ROOT) -w $(CWD)
    DESTDIR ?= .
    
    define clean
      rm -rf  *.o *.dSYM ut* elk fuzzer* *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb slow-unit* _CL_* infer-out data.txt crash-* a.out tmp
    endef
    
    # %(call build,ENVIRONMENT,COMPILE,FLAGS,OUTPUT,RUN)
    define build
      $(call clean)
      $1 $2 unit_test.c $3
      $1 $4
    endef
    
    all: test test++ vc2017 linux mingw elk
    
    test:
            $(call build,,$(CC),$(CFLAGS) -o ut,$(RUN) ./ut)
    
    test++:
            $(call build,,$(CXX),$(CFLAGS) -Wno-deprecated -o ut,./ut)
    
    vc2017:
            $(call build,$(DOCKER) mdashnet/vc2017 wine64,cl,/nologo /W3 /O2 /I. $(EXTRA) /Feut.exe,ut.exe)
    
    linux:
            $(call build,$(DOCKER) mdashnet/cc2,$(CC), $(CFLAGS) -o ut,./ut)
    
    mingw:
            $(call build,$(DOCKER) mdashnet/mingw,i686-w64-mingw32-gcc,-W -Wall $(EXTRA) -o ut,wine ut)
    
    arduino:
            curl -s http://downloads.arduino.cc/arduino-1.8.13-linux64.tar.xz -o /tmp/a.tgz
            tar -xf /tmp/a.tgz
            mv arduino-* $@
    
    uno: arduino
            rm -rf tmp; mkdir tmp; cp ../examples/BlinkyJS/BlinkyJS.ino tmp/tmp.ino
            cp ../elk.c ../elk.h tmp/
            $(DOCKER) mdashnet/cc2 ./arduino/arduino --verify --board arduino:avr:nano tmp/tmp.ino
    
    elk:
            $(CC) ../elk.c ../examples/cmdline/main.c -I.. -W -Wall -O2 -lm -o $(DESTDIR)/$@
    
    
    coverage: test
            gcov -l -n *.gcno | sed '/^$$/d' | sed 'N;s/\n/ /'
            @gcov test.gcno >/dev/null
    
    upload-coverage: coverage
            curl -s https://codecov.io/bash | /bin/bash
    
    clean:
            $(call clean)

    测试

    gmake elk
    project@freebsd:~/elk/test % ./elk -e "print('Hello World from ELk')"
    Hello World from ELkundefined
    project@freebsd:~/elk/test % gmake test
    rm -rf  *.o *.dSYM ut* elk fuzzer* *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb slow-unit* _CL_* infer-out data.txt crash-* a.out tmp
    cc unit_test.c -W -Wall -Werror -Wno-deprecated -I.. -g -fsanitize=address,undefined -coverage -lm  -o ut
    ./ut
    FUNC: 14 [(n){return n<2?1:n*f(n-1);}]
    FUNC: 14 [(){let n=0; while (n++ < 100){prnt(str(0,n)+'\n');} return n;}]
    FUNC: 8 [(){}]
    FUNC: 14 [(){}]
    FUNC: 8 [(a,b){}]
    FUNC: 12 [(a){return 17;}]
    FUNC: 9 [(){}]
    FUNC: 9 [(){}]
    FUNC: 9 [(){1}]
    FUNC: 9 [(){1;}]
    FUNC: 9 [(){return 1;}]
    FUNC: 9 [(){return 1;}]
    FUNC: 9 [(){return 1;}]
    FUNC: 9 [(){return 1;2;}]
    FUNC: 9 [(){return 1;2;return 3;}]
    FUNC: 9 [(a,b){return a + b;}]
    FUNC: 9 [(a,b){return a + b;}]
    FUNC: 9 [(a,b){return a + b;}]
    FUNC: 9 [(a,b){return a + b;}]
    FUNC: 12 [(a,b){return a + b;}]
    FUNC: 20 [(){a++;}]
    FUNC: 14 [(){ a++; }]
    FUNC: 14 [(x){a=x;}]
    FUNC: 14 [(x){a=x;}]
    FUNC: 13 [(x){let z=x;a=typeof z}]
    FUNC: 9 [(x){return x;}]
    FUNC: 9 [(x){return {a:x};null;}]
    FUNC: 9 [(x){let m= {a:7}; return m;}]
    FUNC: 9 [(x){let m=7;return m;}]
    FUNC: 9 [(x){let m='hi';return m;}]
    FUNC: 9 [(x){let m={a:2};return m;}]
    FUNC: 9 [(x){let m={a:x};return m;}]
    FUNC: 16 [(x,y){return x*y;}]
    FUNC: 10 [(){return 1;}]
    FUNC: 11 [(x){return x+1;}]
    FUNC: 14 [(x){return x;}]
    FUNC: 8 [(x){return x;}]
    FUNC: 14 [(x){return x*x;}]
    FUNC: 8 [(x){return x*x;}]
    FUNC: 16 [(){return 1;}]
    FUNC: 14 [(x){return os.sum1(x,1);}]
    FUNC: 8 [(x){return os.sum1(x,1);}]
    FUNC: 14 [(x){return os.sum1(x,os.sum1(1,2));}]
    FUNC: 8 [(x){return os.sum1(x,os.sum1(1,2));}]
    FUNC: 10 [(x){return eval(null,x,x.length);}]
    FUNC: 15 [(x){  let g = 'axds', h= 'sadlkasd', foo = {f:x};  a = foo.f; }]
    FUNC: 8 [(x){  let g = 'axds', h= 'sadlkasd', foo = {f:x};  a = foo.f; }]
    SUCCESS. All tests passed in 1078.12 ms
  • 相关阅读:
    HA: Chakravyuh Vulnhub Walkthrough
    HA Rudra: Vulnhub Walkthrough
    关于Fastjson 1.2.24 反序列化导致任意命令执行漏洞
    关于MySQL注入漏洞到获取webshell
    Windows宏病毒利用
    常规高危端口
    HA Joker Vulnhub Walkthrough
    面试题:对Vue的响应式数据/双向数据绑定原理的理解
    面试题: 对MVVN的理解
    面试题:localStorage、sessionStorage、Cookie的区别详解
  • 原文地址:https://www.cnblogs.com/passedbylove/p/16295275.html
Copyright © 2020-2023  润新知