From bf3cd5a8aeb194d43ffebb4afc4824f21e9b1a4d Mon Sep 17 00:00:00 2001 From: lijie <1713699517@qq.com> Date: Thu, 6 Jul 2023 10:57:08 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E4=B8=80=E4=BA=9B=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/utBeamToSrc.erl | 55 +++++++++++++++++++++++++++++++++++++ src/template/utEtsFold.erl | 26 ++++++++++++++++-- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/compile/utBeamToSrc.erl b/src/compile/utBeamToSrc.erl index bb0a6d0..445df25 100644 --- a/src/compile/utBeamToSrc.erl +++ b/src/compile/utBeamToSrc.erl @@ -5,6 +5,8 @@ , genSrcs/2 , notCan/2 , reToDir/2 + , delFile/2 + , isHasUnicode/1 ]). %% 通过beam生成erl文件,生成的beam编译选项必要带debug_info才能反编译生成代码 @@ -46,6 +48,59 @@ genSrcs(BeamDir, SrcDir) -> end, filelib:fold_files(BeamDir, "\\.beam$", true, FunDeal, []). +%% 将反编译出来的源文件 -file 属性删除掉 +delFile(SrcDir, NewDir) -> + FunDeal = + fun(File, ProAcc) -> + ModName = filename:basename(File, ".erl"), + Module = list_to_atom(ModName), + {ok, CodeBin} = file:read_file(File), + SrcBin = doDelFile(CodeBin, <<>>), + file:write_file(lists:concat([NewDir, Module, ".erl"]), SrcBin), + io:format("build beam:~p to erl:~p success.~n", [Module, Module]), + ProAcc + end, + filelib:fold_files(SrcDir, "\\.erl$", true, FunDeal, []). + +doDelFile(CodeBin, SrcBin) -> + case binary:split(CodeBin, <<"-file(">>) of + [Part1] -> + <>; + [Part1, Part2] -> + [_, LeftPart] = binary:split(Part2, <<").">>), + delFile(LeftPart, <>) + end. + +%% 检查源码中是否存在unicode字符 主要是为了检查是否存在中文 +isHasUnicode(SrcDir) -> + FunDeal = + fun(File, ProAcc) -> + ModName = filename:basename(File, ".erl"), + Module = list_to_atom(ModName), + {ok, CodeBin} = file:read_file(File), + IsHas = checkUnicode(CodeBin), + + case IsHas of + true -> + [Module | ProAcc]; + _ -> + ProAcc + end + end, + AllMods = filelib:fold_files(SrcDir, "\\.erl$", true, FunDeal, []), + ModStr = <<<<(atom_to_binary(OneMod))/binary, "\n">> || OneMod <- AllMods>>, + file:write_file("hasUnicodeMod.txt", ModStr). + +checkUnicode(<<>>) -> + false; +checkUnicode(<>) -> + case Word > 256 of + true -> + true; + _ -> + checkUnicode(Left) + end. + %% 将不能反编译的beam文件复制到指定的目录 notCan(BeamDir, SrcDir) -> FunDeal = diff --git a/src/template/utEtsFold.erl b/src/template/utEtsFold.erl index d7aaf03..3cbbfef 100644 --- a/src/template/utEtsFold.erl +++ b/src/template/utEtsFold.erl @@ -4,7 +4,7 @@ -compile([export_all]). --export([rank/5, fold/2]). +-export([rank/5, fold/2, fold/3]). rank(TabId, PageInfo, Page, Limit, TotalCnt) -> %% 遍历所有tab @@ -64,7 +64,6 @@ makeRankData([{CurKey, Uuid} | AllyIds], LastKey, Acc) -> makeRankData(AllyIds, LastKey, Acc) end. - fold(TabId, Limit) -> ets:safe_fixtable(TabId, true), try @@ -92,6 +91,29 @@ matchDoFun(_ValueList) -> %% do something ok. +fold(TabId, Limit, Fun) -> + ets:safe_fixtable(TabId, true), + try + case ets:match_object(TabId, '$1', Limit) of + '$end_of_table' -> + ok; + {ValueList, NextKey} -> + Fun(ValueList), + continueNext(NextKey, Fun) + end + after + ets:safe_fixtable(TabId, false) + end. + +continueNext(NextKey, Fun) -> + case ets:match_object(NextKey) of + '$end_of_table' -> + ok; + {ValueList, NewNextKey} -> + Fun(ValueList), + continueNext(NewNextKey, Fun) + end. + new() -> ets:new(test_replace, [named_table, public]), [ets:insert(test_replace, {One, #{ One => One}}) || One <- lists:seq(1, 100000)],