Compare commits

..

8 Commits

33 changed files with 1917 additions and 1251 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ hawk_LDFLAGS = $(LDFLAGS_COMMON)
## of different behavior depending on the libtool tag.
##
hawk_LDADD = $(LIBADD_COMMON) $(LIBM)
hawk_DEPENDENCIES = $(srcdir)/hawk.pot $(srcdir)/hawk-ko.po $(srcdir)/hawk-zh_CN.po
hawk_DEPENDENCIES = $(srcdir)/hawk.pot $(srcdir)/hawk-ko.po $(srcdir)/hawk-zh_CN.po $(LIBADD_COMMON)
$(srcdir)/hawk.pot: $(hawk_SOURCES)
+1 -1
View File
@@ -407,7 +407,7 @@ hawk_CPPFLAGS = $(CPPFLAGS_COMMON)
hawk_CFLAGS = $(CFLAGS_COMMON)
hawk_LDFLAGS = $(LDFLAGS_COMMON)
hawk_LDADD = $(LIBADD_COMMON) $(LIBM)
hawk_DEPENDENCIES = $(srcdir)/hawk.pot $(srcdir)/hawk-ko.po $(srcdir)/hawk-zh_CN.po
hawk_DEPENDENCIES = $(srcdir)/hawk.pot $(srcdir)/hawk-ko.po $(srcdir)/hawk-zh_CN.po $(LIBADD_COMMON)
@ENABLE_HAWKGO_TRUE@hawkgo_SOURCES = \
@ENABLE_HAWKGO_TRUE@ ../hawk.go \
@ENABLE_HAWKGO_TRUE@ ../hawk-inst.go \
+56 -56
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: hawk 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-15 01:55+0900\n"
"POT-Creation-Date: 2026-04-25 12:33+0900\n"
"PO-Revision-Date: 2026-03-28 16:29+0800\n"
"Last-Translator: <author@hawk>\n"
"Language-Team: Korean <translation-team-ko@hawk>\n"
@@ -17,232 +17,232 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../../bin/hawk.c:376
#: ../../bin/hawk.c:378
msgid "enable concatenation by blanks"
msgstr "공백에 의한 연결을 활성화"
#: ../../bin/hawk.c:377
#: ../../bin/hawk.c:379
msgid "use CRLF for a newline"
msgstr "줄바꿈에 CRLF를 사용"
#: ../../bin/hawk.c:378
#: ../../bin/hawk.c:380
msgid "defer resolving module symbols(mod::symbol) to runtime"
msgstr "모듈 심볼(mod::symbol) 해석을 실행 시간으로 연기"
#: ../../bin/hawk.c:379
#: ../../bin/hawk.c:381
msgid "allow a map to be assigned or returned"
msgstr "맵의 대입 또는 반환을 허용"
#: ../../bin/hawk.c:380
#: ../../bin/hawk.c:382
msgid "allow undeclared variables"
msgstr "지역 변수가 너무 많음"
#: ../../bin/hawk.c:381
#: ../../bin/hawk.c:383
msgid "allow raw multiline string and regular expression literals"
msgstr "문자열 또는 정규식이 닫히지 않음"
#: ../../bin/hawk.c:382
#: ../../bin/hawk.c:384
msgid "perform numeric comparsion on numeric strings"
msgstr "숫자 문자열에 대해 숫자 비교를 수행"
#: ../../bin/hawk.c:383
#: ../../bin/hawk.c:385
msgid "enable a newline to terminate a statement"
msgstr "줄바꿈으로 문장을 끝낼 수 있게 함"
#: ../../bin/hawk.c:384
#: ../../bin/hawk.c:386
msgid "enable nextofile & OFILENAME"
msgstr "nextofile 및 OFILENAME을 활성화"
#: ../../bin/hawk.c:385
#: ../../bin/hawk.c:387
msgid "detect a numeric string and convert it to a number"
msgstr "숫자형의 문자열을 감지하여 숫자로 변환"
#: ../../bin/hawk.c:386
#: ../../bin/hawk.c:388
msgid "enable pattern-action loop"
msgstr "패턴-동작 루프를 활성화"
#: ../../bin/hawk.c:387
#: ../../bin/hawk.c:389
msgid "enable pedantic mode"
msgstr "엄격 모드를 활성화"
#: ../../bin/hawk.c:388
#: ../../bin/hawk.c:390
msgid "set CLOEXEC before executing an external program for piping"
msgstr "파이프용 외부 프로그램 실행 전에 CLOEXEC를 설정"
#: ../../bin/hawk.c:389
#: ../../bin/hawk.c:391
msgid "enable {n,m} in a regular expression"
msgstr "정규식 일치에서 {n,m}을 표현을 활성화"
#: ../../bin/hawk.c:390
#: ../../bin/hawk.c:392
msgid "enable builtin I/O including getline & print"
msgstr "getline 및 print를 포함한 내장 I/O를 활성화"
#: ../../bin/hawk.c:391
#: ../../bin/hawk.c:393
msgid "allow a dual-directional pipe"
msgstr "양방향 파이프를 허용"
#: ../../bin/hawk.c:392
#: ../../bin/hawk.c:394
msgid "enable the strict naming rule"
msgstr "엄격한 이름 규칙을 활성화"
#: ../../bin/hawk.c:393
#: ../../bin/hawk.c:395
msgid "strip spaces in splitting a record"
msgstr "레코드 분리 시 공백을 제거"
#: ../../bin/hawk.c:394
#: ../../bin/hawk.c:396
msgid "strip spaces in string-to-number conversion"
msgstr "문자열을 숫자로 변환할 때 공백을 제거"
#: ../../bin/hawk.c:395
#: ../../bin/hawk.c:397
msgid "make more fault-tolerant"
msgstr "오류 허용성을 높임"
#: ../../bin/hawk.c:396
#: ../../bin/hawk.c:398
msgid "enable the extended call syntax"
msgstr "확장 호출 문법을 활성화"
#: ../../bin/hawk.c:407 ../../bin/main.c:410
#: ../../bin/hawk.c:409 ../../bin/main.c:410
msgid "USAGE"
msgstr "사용법"
#: ../../bin/hawk.c:407
#: ../../bin/hawk.c:409
msgid "[options] -f sourcefile [ -- ] [datafile]*"
msgstr "[옵션] -f 소스파일 [ -- ] [자료파일]*"
#: ../../bin/hawk.c:408
#: ../../bin/hawk.c:410
msgid " "
msgstr " "
#: ../../bin/hawk.c:408
#: ../../bin/hawk.c:410
msgid "[options] [ -- ] sourcestring [datafile]*"
msgstr "[옵션] [ -- ] 소스문자열 [자료파일]*"
#: ../../bin/hawk.c:409 ../../bin/main.c:411
#: ../../bin/hawk.c:411 ../../bin/main.c:411
msgid "Options as follows:"
msgstr "옵션은 다음과 같습니다:"
#: ../../bin/hawk.c:410
#: ../../bin/hawk.c:412
msgid " -h/--help print this message"
msgstr " -h/--help 이 메시지를 출력"
#: ../../bin/hawk.c:411
#: ../../bin/hawk.c:413
msgid " -D show extra information"
msgstr " -D 추가 정보를 표시"
#: ../../bin/hawk.c:412
#: ../../bin/hawk.c:414
msgid " -c/--call name call a function instead of entering"
msgstr " -c/--call 이름 패턴-동작 루프 대신 함수를 호출"
#: ../../bin/hawk.c:413
#: ../../bin/hawk.c:415
msgid ""
" the pattern-action loop. [datafile]* is"
msgstr " [자료파일]* 을 함수 인자로 전달"
#: ../../bin/hawk.c:414
#: ../../bin/hawk.c:416
msgid " passed to the function as parameters"
msgstr " 합니다."
#: ../../bin/hawk.c:415
#: ../../bin/hawk.c:417
msgid " -f/--file file set the source script file"
msgstr " -f/--file 파일 소스 스크립트 파일을 지정"
#: ../../bin/hawk.c:416
#: ../../bin/hawk.c:418
msgid ""
" -d/--deparsed-file file set the deparsed script file to produce"
msgstr ""
" -d/--deparsed-file 파일 디파싱한 스크립트를 저장할 파일을 지정"
#: ../../bin/hawk.c:417
#: ../../bin/hawk.c:419
msgid " -t/--console-output file set the console output file"
msgstr " -t/--console-output 파일 콘솔 출력 파일을 지정"
#: ../../bin/hawk.c:418
#: ../../bin/hawk.c:420
msgid " multiple -t options are allowed"
msgstr " -t 옵션은 여러 번 지정할 수 있음"
#: ../../bin/hawk.c:419
#: ../../bin/hawk.c:421
msgid " -F/--field-separator string set a field separator(FS)"
msgstr " -F/--field-separator 문자열 필드 구분자(FS)를 지정"
#: ../../bin/hawk.c:420
#: ../../bin/hawk.c:422
msgid " -v/--assign var=value add a global variable with a value"
msgstr " -v/--assign 변수=값 값을 가진 전역 변수를 추가"
#: ../../bin/hawk.c:421
#: ../../bin/hawk.c:423
msgid " -m/--memory-limit number limit the memory usage (bytes)"
msgstr " -m/--memory-limit 숫자 메모리 사용량을 제한(바이트)"
#: ../../bin/hawk.c:422
#: ../../bin/hawk.c:424
msgid " -w expand datafile wildcards"
msgstr " -w 자료 파일 와일드카드를 확장"
#: ../../bin/hawk.c:425
#: ../../bin/hawk.c:427
msgid " --script-encoding string specify script file encoding name"
msgstr " --script-encoding 문자열 스크립트 파일 인코딩 이름을 지정"
#: ../../bin/hawk.c:426
#: ../../bin/hawk.c:428
#, fuzzy
msgid " --conin-encoding string specify console input encoding name"
msgstr " --console-encoding 문자열 콘솔 인코딩 이름을 지정"
#: ../../bin/hawk.c:427
#: ../../bin/hawk.c:429
#, fuzzy
msgid " --conout-encoding string specify console output encoding name"
msgstr " --console-encoding 문자열 콘솔 인코딩 이름을 지정"
#: ../../bin/hawk.c:430
#: ../../bin/hawk.c:432
msgid ""
" -I/--includedirs string specify directories to look for include "
"files in"
msgstr " -I/--includedirs 문자열 include 파일을 찾을 디렉토리를 지정"
#: ../../bin/hawk.c:431
#: ../../bin/hawk.c:433
msgid ""
" --modlibdirs string specify directories to look for module "
"files in"
msgstr " --modlibdirs 문자열 모듈 파일을 찾을 디렉토리를 지정"
#: ../../bin/hawk.c:432
#: ../../bin/hawk.c:434
msgid " --modern run in the modern mode(default)"
msgstr " --modern 현대화 모드로 실행(기본값)"
#: ../../bin/hawk.c:433
#: ../../bin/hawk.c:435
msgid " --classic run in the classic mode"
msgstr " --classic 고전 모드로 실행"
#: ../../bin/hawk.c:443
#: ../../bin/hawk.c:445
msgid "Special mode switching options(must be specified first to take effect):"
msgstr "모드 전환 옵션(처음에 지정해야 적용됨):"
#: ../../bin/hawk.c:444 ../../bin/main.c:414
#: ../../bin/hawk.c:446 ../../bin/main.c:414
msgid " --awk/--hawk switch to the awk mode(default)"
msgstr " --awk/--hawk awk 모드로 전환(기본값)"
#: ../../bin/hawk.c:445 ../../bin/main.c:415
#: ../../bin/hawk.c:447 ../../bin/main.c:415
msgid " --cut switch to the cut mode"
msgstr " --cut cut 모드로 전환"
#: ../../bin/hawk.c:446 ../../bin/main.c:416
#: ../../bin/hawk.c:448 ../../bin/main.c:416
msgid " --sed switch to the sed mode"
msgstr " --sed sed 모드로 전환"
#: ../../bin/hawk.c:804 ../../bin/hawk.c:821
#: ../../bin/hawk.c:806 ../../bin/hawk.c:823
msgid "ERROR"
msgstr "오류"
#: ../../bin/hawk.c:805 ../../bin/hawk.c:822
#: ../../bin/hawk.c:807 ../../bin/hawk.c:824
msgid "Line"
msgstr "줄"
#: ../../bin/hawk.c:806 ../../bin/hawk.c:823
#: ../../bin/hawk.c:808 ../../bin/hawk.c:825
msgid "Column"
msgstr "열"
#: ../../bin/hawk.c:807 ../../bin/hawk.c:824
#: ../../bin/hawk.c:809 ../../bin/hawk.c:826
msgid "Code"
msgstr "코드"
#: ../../bin/hawk.c:808 ../../bin/hawk.c:825
#: ../../bin/hawk.c:810 ../../bin/hawk.c:827
msgid "File "
msgstr "파일 "
+56 -56
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: hawk 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-15 01:55+0900\n"
"POT-Creation-Date: 2026-04-25 12:33+0900\n"
"PO-Revision-Date: 2026-03-28 17:00+0800\n"
"Last-Translator: <author@hawk>\n"
"Language-Team: Chinese (Simplified) <translation-team-zh_CN@hawk>\n"
@@ -17,231 +17,231 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../../bin/hawk.c:376
#: ../../bin/hawk.c:378
msgid "enable concatenation by blanks"
msgstr "启用空白拼接"
#: ../../bin/hawk.c:377
#: ../../bin/hawk.c:379
msgid "use CRLF for a newline"
msgstr "换行使用 CRLF"
#: ../../bin/hawk.c:378
#: ../../bin/hawk.c:380
msgid "defer resolving module symbols(mod::symbol) to runtime"
msgstr "将模块符号(mod::symbol)解析延迟到运行时"
#: ../../bin/hawk.c:379
#: ../../bin/hawk.c:381
msgid "allow a map to be assigned or returned"
msgstr "允许对映射进行赋值或返回"
#: ../../bin/hawk.c:380
#: ../../bin/hawk.c:382
msgid "allow undeclared variables"
msgstr "局部变量过多"
#: ../../bin/hawk.c:381
#: ../../bin/hawk.c:383
msgid "allow raw multiline string and regular expression literals"
msgstr "字符串或正则表达式未结束"
#: ../../bin/hawk.c:382
#: ../../bin/hawk.c:384
msgid "perform numeric comparsion on numeric strings"
msgstr "对数字字符串执行数值比较"
#: ../../bin/hawk.c:383
#: ../../bin/hawk.c:385
msgid "enable a newline to terminate a statement"
msgstr "启用以换行结束语句"
#: ../../bin/hawk.c:384
#: ../../bin/hawk.c:386
msgid "enable nextofile & OFILENAME"
msgstr "启用 nextofile 和 OFILENAME"
#: ../../bin/hawk.c:385
#: ../../bin/hawk.c:387
msgid "detect a numeric string and convert it to a number"
msgstr "检测数字字符串并将其转换为数字"
#: ../../bin/hawk.c:386
#: ../../bin/hawk.c:388
msgid "enable pattern-action loop"
msgstr "启用模式-动作循环"
#: ../../bin/hawk.c:387
#: ../../bin/hawk.c:389
msgid "enable pedantic mode"
msgstr "启用严格模式"
#: ../../bin/hawk.c:388
#: ../../bin/hawk.c:390
msgid "set CLOEXEC before executing an external program for piping"
msgstr "在执行用于管道的外部程序前设置 CLOEXEC"
#: ../../bin/hawk.c:389
#: ../../bin/hawk.c:391
msgid "enable {n,m} in a regular expression"
msgstr "在正则表达式中启用 {n,m}"
#: ../../bin/hawk.c:390
#: ../../bin/hawk.c:392
msgid "enable builtin I/O including getline & print"
msgstr "启用内建 I/O,包括 getline 和 print"
#: ../../bin/hawk.c:391
#: ../../bin/hawk.c:393
msgid "allow a dual-directional pipe"
msgstr "允许双向管道"
#: ../../bin/hawk.c:392
#: ../../bin/hawk.c:394
msgid "enable the strict naming rule"
msgstr "启用严格命名规则"
#: ../../bin/hawk.c:393
#: ../../bin/hawk.c:395
msgid "strip spaces in splitting a record"
msgstr "在分割记录时去除空格"
#: ../../bin/hawk.c:394
#: ../../bin/hawk.c:396
msgid "strip spaces in string-to-number conversion"
msgstr "在字符串转数字时去除空格"
#: ../../bin/hawk.c:395
#: ../../bin/hawk.c:397
msgid "make more fault-tolerant"
msgstr "提高容错性"
#: ../../bin/hawk.c:396
#: ../../bin/hawk.c:398
msgid "enable the extended call syntax"
msgstr "启用扩展调用语法"
#: ../../bin/hawk.c:407 ../../bin/main.c:410
#: ../../bin/hawk.c:409 ../../bin/main.c:410
msgid "USAGE"
msgstr "用法"
#: ../../bin/hawk.c:407
#: ../../bin/hawk.c:409
msgid "[options] -f sourcefile [ -- ] [datafile]*"
msgstr "[选项] -f 源文件 [ -- ] [数据文件]*"
#: ../../bin/hawk.c:408
#: ../../bin/hawk.c:410
msgid " "
msgstr " "
#: ../../bin/hawk.c:408
#: ../../bin/hawk.c:410
msgid "[options] [ -- ] sourcestring [datafile]*"
msgstr "[选项] [ -- ] 源字符串 [数据文件]*"
#: ../../bin/hawk.c:409 ../../bin/main.c:411
#: ../../bin/hawk.c:411 ../../bin/main.c:411
msgid "Options as follows:"
msgstr "选项如下:"
#: ../../bin/hawk.c:410
#: ../../bin/hawk.c:412
msgid " -h/--help print this message"
msgstr " -h/--help 打印此信息"
#: ../../bin/hawk.c:411
#: ../../bin/hawk.c:413
msgid " -D show extra information"
msgstr " -D 显示更多信息"
#: ../../bin/hawk.c:412
#: ../../bin/hawk.c:414
msgid " -c/--call name call a function instead of entering"
msgstr " -c/--call 名称 调用函数而不是进入模式-动作循环"
#: ../../bin/hawk.c:413
#: ../../bin/hawk.c:415
msgid ""
" the pattern-action loop. [datafile]* is"
msgstr " 模式-动作循环。[数据文件]*"
#: ../../bin/hawk.c:414
#: ../../bin/hawk.c:416
msgid " passed to the function as parameters"
msgstr " 将作为参数传递给函数"
#: ../../bin/hawk.c:415
#: ../../bin/hawk.c:417
msgid " -f/--file file set the source script file"
msgstr " -f/--file 文件 设置脚本源文件"
#: ../../bin/hawk.c:416
#: ../../bin/hawk.c:418
msgid ""
" -d/--deparsed-file file set the deparsed script file to produce"
msgstr " -d/--deparsed-file 文件 指定反解析脚本输出文件"
#: ../../bin/hawk.c:417
#: ../../bin/hawk.c:419
msgid " -t/--console-output file set the console output file"
msgstr " -t/--console-output 文件 设置控制台输出文件"
#: ../../bin/hawk.c:418
#: ../../bin/hawk.c:420
msgid " multiple -t options are allowed"
msgstr " 可以指定多个 -t 选项"
#: ../../bin/hawk.c:419
#: ../../bin/hawk.c:421
msgid " -F/--field-separator string set a field separator(FS)"
msgstr " -F/--field-separator 字符串 设置字段分隔符(FS)"
#: ../../bin/hawk.c:420
#: ../../bin/hawk.c:422
msgid " -v/--assign var=value add a global variable with a value"
msgstr " -v/--assign 变量=值 添加具有值的全局变量"
#: ../../bin/hawk.c:421
#: ../../bin/hawk.c:423
msgid " -m/--memory-limit number limit the memory usage (bytes)"
msgstr " -m/--memory-limit 数值 限制内存用量(字节)"
#: ../../bin/hawk.c:422
#: ../../bin/hawk.c:424
msgid " -w expand datafile wildcards"
msgstr " -w 扩展数据文件通配符"
#: ../../bin/hawk.c:425
#: ../../bin/hawk.c:427
msgid " --script-encoding string specify script file encoding name"
msgstr " --script-encoding 字符串 指定脚本文件编码名"
#: ../../bin/hawk.c:426
#: ../../bin/hawk.c:428
#, fuzzy
msgid " --conin-encoding string specify console input encoding name"
msgstr " --console-encoding 字符串 指定控制台编码名"
#: ../../bin/hawk.c:427
#: ../../bin/hawk.c:429
#, fuzzy
msgid " --conout-encoding string specify console output encoding name"
msgstr " --console-encoding 字符串 指定控制台编码名"
#: ../../bin/hawk.c:430
#: ../../bin/hawk.c:432
msgid ""
" -I/--includedirs string specify directories to look for include "
"files in"
msgstr " -I/--includedirs 字符串 指定查找 include 文件的目录"
#: ../../bin/hawk.c:431
#: ../../bin/hawk.c:433
msgid ""
" --modlibdirs string specify directories to look for module "
"files in"
msgstr " --modlibdirs 字符串 指定查找模块文件的目录"
#: ../../bin/hawk.c:432
#: ../../bin/hawk.c:434
msgid " --modern run in the modern mode(default)"
msgstr " --modern 以现代模式运行(默认)"
#: ../../bin/hawk.c:433
#: ../../bin/hawk.c:435
msgid " --classic run in the classic mode"
msgstr " --classic 以经典模式运行"
#: ../../bin/hawk.c:443
#: ../../bin/hawk.c:445
msgid "Special mode switching options(must be specified first to take effect):"
msgstr "特殊模式切换选项(必须先指定才能生效):"
#: ../../bin/hawk.c:444 ../../bin/main.c:414
#: ../../bin/hawk.c:446 ../../bin/main.c:414
msgid " --awk/--hawk switch to the awk mode(default)"
msgstr " --awk/--hawk 切换到 awk 模式(默认)"
#: ../../bin/hawk.c:445 ../../bin/main.c:415
#: ../../bin/hawk.c:447 ../../bin/main.c:415
msgid " --cut switch to the cut mode"
msgstr " --cut 切换到 cut 模式"
#: ../../bin/hawk.c:446 ../../bin/main.c:416
#: ../../bin/hawk.c:448 ../../bin/main.c:416
msgid " --sed switch to the sed mode"
msgstr " --sed 切换到 sed 模式"
#: ../../bin/hawk.c:804 ../../bin/hawk.c:821
#: ../../bin/hawk.c:806 ../../bin/hawk.c:823
msgid "ERROR"
msgstr "错误"
#: ../../bin/hawk.c:805 ../../bin/hawk.c:822
#: ../../bin/hawk.c:807 ../../bin/hawk.c:824
msgid "Line"
msgstr "行"
#: ../../bin/hawk.c:806 ../../bin/hawk.c:823
#: ../../bin/hawk.c:808 ../../bin/hawk.c:825
msgid "Column"
msgstr "列"
#: ../../bin/hawk.c:807 ../../bin/hawk.c:824
#: ../../bin/hawk.c:809 ../../bin/hawk.c:826
msgid "Code"
msgstr "代码"
#: ../../bin/hawk.c:808 ../../bin/hawk.c:825
#: ../../bin/hawk.c:810 ../../bin/hawk.c:827
msgid "File "
msgstr "文件 "
+12 -10
View File
@@ -179,22 +179,21 @@ static void unset_intr_run (void)
#endif
}
static hawk_htb_walk_t print_awk_value (hawk_htb_t* map, hawk_htb_pair_t* pair, void* arg)
static void print_awk_value (hawk_rtx_t* rtx, const hawk_oocs_t* name, hawk_val_t* val)
{
hawk_rtx_t* rtx = (hawk_rtx_t*)arg;
hawk_t* hawk = hawk_rtx_gethawk(rtx);
hawk_ooch_t* str;
hawk_oow_t len;
hawk_errinf_t oerrinf;
hawk_rtx_geterrinf (rtx, &oerrinf);
hawk_rtx_geterrinf(rtx, &oerrinf);
str = hawk_rtx_getvaloocstr(rtx, HAWK_HTB_VPTR(pair), &len);
str = hawk_rtx_getvaloocstr(rtx, val, &len);
if (HAWK_UNLIKELY(!str))
{
if (hawk_rtx_geterrnum(rtx) == HAWK_EVALTOSTR)
{
hawk_logbfmt(hawk, HAWK_LOG_STDERR, "%.*js = [not printable]\n", HAWK_HTB_KLEN(pair), HAWK_HTB_KPTR(pair));
hawk_logbfmt(hawk, HAWK_LOG_STDERR, "%.*js = [not printable]\n", name->len, name->ptr);
hawk_rtx_seterrinf(rtx, &oerrinf);
}
else
@@ -204,11 +203,9 @@ static hawk_htb_walk_t print_awk_value (hawk_htb_t* map, hawk_htb_pair_t* pair,
}
else
{
hawk_logbfmt(hawk, HAWK_LOG_STDERR, "%.*js = %.*js\n", HAWK_HTB_KLEN(pair), HAWK_HTB_KPTR(pair), len, str);
hawk_rtx_freevaloocstr(rtx, HAWK_HTB_VPTR(pair), str);
hawk_logbfmt(hawk, HAWK_LOG_STDERR, "%.*js = %.*js\n", name->len, name->ptr, len, str);
hawk_rtx_freevaloocstr(rtx, val, str);
}
return HAWK_HTB_WALK_FORWARD;
}
static int add_gvs_to_hawk (hawk_t* hawk, arg_t* arg)
@@ -301,6 +298,8 @@ static void dprint_return (hawk_rtx_t* rtx, hawk_val_t* ret)
hawk_t* hawk = hawk_rtx_gethawk(rtx);
hawk_oow_t len;
hawk_ooch_t* str;
hawk_rtx_nv_itr_t itr;
hawk_val_t* nv;
if (hawk_rtx_isnilval(rtx, ret))
{
@@ -321,7 +320,10 @@ static void dprint_return (hawk_rtx_t* rtx, hawk_val_t* ret)
}
hawk_logbfmt(hawk, HAWK_LOG_STDERR, "[NAMED VARIABLES]\n");
hawk_htb_walk(hawk_rtx_getnvmap(rtx), print_awk_value, rtx);
for (nv = hawk_rtx_getfirstnv(rtx, &itr); nv; nv = hawk_rtx_getnextnv(rtx, &itr))
{
print_awk_value(rtx, &itr.name, nv);
}
hawk_logbfmt(hawk, HAWK_LOG_STDERR, "[END OF NAMED VARIABLES]\n");
}
+56 -56
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-15 01:55+0900\n"
"POT-Creation-Date: 2026-04-25 12:33+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,229 +17,229 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../bin/hawk.c:376
#: ../../bin/hawk.c:378
msgid "enable concatenation by blanks"
msgstr ""
#: ../../bin/hawk.c:377
#: ../../bin/hawk.c:379
msgid "use CRLF for a newline"
msgstr ""
#: ../../bin/hawk.c:378
#: ../../bin/hawk.c:380
msgid "defer resolving module symbols(mod::symbol) to runtime"
msgstr ""
#: ../../bin/hawk.c:379
#: ../../bin/hawk.c:381
msgid "allow a map to be assigned or returned"
msgstr ""
#: ../../bin/hawk.c:380
#: ../../bin/hawk.c:382
msgid "allow undeclared variables"
msgstr ""
#: ../../bin/hawk.c:381
#: ../../bin/hawk.c:383
msgid "allow raw multiline string and regular expression literals"
msgstr ""
#: ../../bin/hawk.c:382
#: ../../bin/hawk.c:384
msgid "perform numeric comparsion on numeric strings"
msgstr ""
#: ../../bin/hawk.c:383
#: ../../bin/hawk.c:385
msgid "enable a newline to terminate a statement"
msgstr ""
#: ../../bin/hawk.c:384
#: ../../bin/hawk.c:386
msgid "enable nextofile & OFILENAME"
msgstr ""
#: ../../bin/hawk.c:385
#: ../../bin/hawk.c:387
msgid "detect a numeric string and convert it to a number"
msgstr ""
#: ../../bin/hawk.c:386
#: ../../bin/hawk.c:388
msgid "enable pattern-action loop"
msgstr ""
#: ../../bin/hawk.c:387
#: ../../bin/hawk.c:389
msgid "enable pedantic mode"
msgstr ""
#: ../../bin/hawk.c:388
#: ../../bin/hawk.c:390
msgid "set CLOEXEC before executing an external program for piping"
msgstr ""
#: ../../bin/hawk.c:389
#: ../../bin/hawk.c:391
msgid "enable {n,m} in a regular expression"
msgstr ""
#: ../../bin/hawk.c:390
#: ../../bin/hawk.c:392
msgid "enable builtin I/O including getline & print"
msgstr ""
#: ../../bin/hawk.c:391
#: ../../bin/hawk.c:393
msgid "allow a dual-directional pipe"
msgstr ""
#: ../../bin/hawk.c:392
#: ../../bin/hawk.c:394
msgid "enable the strict naming rule"
msgstr ""
#: ../../bin/hawk.c:393
#: ../../bin/hawk.c:395
msgid "strip spaces in splitting a record"
msgstr ""
#: ../../bin/hawk.c:394
#: ../../bin/hawk.c:396
msgid "strip spaces in string-to-number conversion"
msgstr ""
#: ../../bin/hawk.c:395
#: ../../bin/hawk.c:397
msgid "make more fault-tolerant"
msgstr ""
#: ../../bin/hawk.c:396
#: ../../bin/hawk.c:398
msgid "enable the extended call syntax"
msgstr ""
#: ../../bin/hawk.c:407 ../../bin/main.c:410
#: ../../bin/hawk.c:409 ../../bin/main.c:410
msgid "USAGE"
msgstr ""
#: ../../bin/hawk.c:407
#: ../../bin/hawk.c:409
msgid "[options] -f sourcefile [ -- ] [datafile]*"
msgstr ""
#: ../../bin/hawk.c:408
#: ../../bin/hawk.c:410
msgid " "
msgstr ""
#: ../../bin/hawk.c:408
#: ../../bin/hawk.c:410
msgid "[options] [ -- ] sourcestring [datafile]*"
msgstr ""
#: ../../bin/hawk.c:409 ../../bin/main.c:411
#: ../../bin/hawk.c:411 ../../bin/main.c:411
msgid "Options as follows:"
msgstr ""
#: ../../bin/hawk.c:410
#: ../../bin/hawk.c:412
msgid " -h/--help print this message"
msgstr ""
#: ../../bin/hawk.c:411
#: ../../bin/hawk.c:413
msgid " -D show extra information"
msgstr ""
#: ../../bin/hawk.c:412
#: ../../bin/hawk.c:414
msgid " -c/--call name call a function instead of entering"
msgstr ""
#: ../../bin/hawk.c:413
#: ../../bin/hawk.c:415
msgid ""
" the pattern-action loop. [datafile]* is"
msgstr ""
#: ../../bin/hawk.c:414
#: ../../bin/hawk.c:416
msgid " passed to the function as parameters"
msgstr ""
#: ../../bin/hawk.c:415
#: ../../bin/hawk.c:417
msgid " -f/--file file set the source script file"
msgstr ""
#: ../../bin/hawk.c:416
#: ../../bin/hawk.c:418
msgid ""
" -d/--deparsed-file file set the deparsed script file to produce"
msgstr ""
#: ../../bin/hawk.c:417
#: ../../bin/hawk.c:419
msgid " -t/--console-output file set the console output file"
msgstr ""
#: ../../bin/hawk.c:418
#: ../../bin/hawk.c:420
msgid " multiple -t options are allowed"
msgstr ""
#: ../../bin/hawk.c:419
#: ../../bin/hawk.c:421
msgid " -F/--field-separator string set a field separator(FS)"
msgstr ""
#: ../../bin/hawk.c:420
#: ../../bin/hawk.c:422
msgid " -v/--assign var=value add a global variable with a value"
msgstr ""
#: ../../bin/hawk.c:421
#: ../../bin/hawk.c:423
msgid " -m/--memory-limit number limit the memory usage (bytes)"
msgstr ""
#: ../../bin/hawk.c:422
#: ../../bin/hawk.c:424
msgid " -w expand datafile wildcards"
msgstr ""
#: ../../bin/hawk.c:425
#: ../../bin/hawk.c:427
msgid " --script-encoding string specify script file encoding name"
msgstr ""
#: ../../bin/hawk.c:426
#: ../../bin/hawk.c:428
msgid " --conin-encoding string specify console input encoding name"
msgstr ""
#: ../../bin/hawk.c:427
#: ../../bin/hawk.c:429
msgid " --conout-encoding string specify console output encoding name"
msgstr ""
#: ../../bin/hawk.c:430
#: ../../bin/hawk.c:432
msgid ""
" -I/--includedirs string specify directories to look for include "
"files in"
msgstr ""
#: ../../bin/hawk.c:431
#: ../../bin/hawk.c:433
msgid ""
" --modlibdirs string specify directories to look for module "
"files in"
msgstr ""
#: ../../bin/hawk.c:432
#: ../../bin/hawk.c:434
msgid " --modern run in the modern mode(default)"
msgstr ""
#: ../../bin/hawk.c:433
#: ../../bin/hawk.c:435
msgid " --classic run in the classic mode"
msgstr ""
#: ../../bin/hawk.c:443
#: ../../bin/hawk.c:445
msgid "Special mode switching options(must be specified first to take effect):"
msgstr ""
#: ../../bin/hawk.c:444 ../../bin/main.c:414
#: ../../bin/hawk.c:446 ../../bin/main.c:414
msgid " --awk/--hawk switch to the awk mode(default)"
msgstr ""
#: ../../bin/hawk.c:445 ../../bin/main.c:415
#: ../../bin/hawk.c:447 ../../bin/main.c:415
msgid " --cut switch to the cut mode"
msgstr ""
#: ../../bin/hawk.c:446 ../../bin/main.c:416
#: ../../bin/hawk.c:448 ../../bin/main.c:416
msgid " --sed switch to the sed mode"
msgstr ""
#: ../../bin/hawk.c:804 ../../bin/hawk.c:821
#: ../../bin/hawk.c:806 ../../bin/hawk.c:823
msgid "ERROR"
msgstr ""
#: ../../bin/hawk.c:805 ../../bin/hawk.c:822
#: ../../bin/hawk.c:807 ../../bin/hawk.c:824
msgid "Line"
msgstr ""
#: ../../bin/hawk.c:806 ../../bin/hawk.c:823
#: ../../bin/hawk.c:808 ../../bin/hawk.c:825
msgid "Column"
msgstr ""
#: ../../bin/hawk.c:807 ../../bin/hawk.c:824
#: ../../bin/hawk.c:809 ../../bin/hawk.c:826
msgid "Code"
msgstr ""
#: ../../bin/hawk.c:808 ../../bin/hawk.c:825
#: ../../bin/hawk.c:810 ../../bin/hawk.c:827
msgid "File "
msgstr ""
+86 -38
View File
@@ -4,40 +4,43 @@ import "hawk"
import "flag"
import "fmt"
import "io"
//import "net/http"
//import _ "net/http/pprof"
import "os"
import "os/signal"
import "runtime"
import "runtime/debug"
import "sort"
import "strconv"
import "strings"
import "sync"
import "syscall"
//import "time"
type Assign struct {
idx int
idx int
value string
}
type Config struct {
assigns map[string]Assign
call string
fs string
modlibdirs string
assigns map[string]Assign
call string
fs string
modlibdirs string
show_extra_info bool
concurrent bool
suffix string
concurrent bool
suffix string
srcstr string
srcfiles []string
data_in_files []string
srcstr string
srcfiles []string
data_in_files []string
data_out_files []string
}
type RtxEvent struct {
rtx *hawk.Rtx
rtx *hawk.Rtx
added bool
}
@@ -46,6 +49,52 @@ func exit_with_error(msg string, err error) {
os.Exit(1)
}
func dprint_hawk_value(name string, val *hawk.Val) {
var s string
var err error
s, err = val.ToStr()
if err != nil {
fmt.Fprintf(os.Stderr, "%s = [not printable]\n", name)
return
}
fmt.Fprintf(os.Stderr, "%s = %s\n", name, s)
}
func dprint_return(rtx *hawk.Rtx, retv *hawk.Val) {
var named_vars map[string]*hawk.Val
var names []string
var name string
if retv == nil || retv.Type() == hawk.VAL_NIL {
fmt.Fprintf(os.Stderr, "[RETURN] - ***nil***\n")
} else {
var s string
var err error
s, err = retv.ToStr()
if err != nil {
fmt.Fprintf(os.Stderr, "[RETURN] - [not printable]\n")
} else {
fmt.Fprintf(os.Stderr, "[RETURN] - [%s]\n", s)
}
}
fmt.Fprintf(os.Stderr, "[NAMED VARIABLES]\n")
named_vars = make(map[string]*hawk.Val)
rtx.GetNamedVars(named_vars)
names = make([]string, 0, len(named_vars))
for name = range named_vars {
names = append(names, name)
}
sort.Strings(names)
for _, name = range names {
dprint_hawk_value(name, named_vars[name])
}
fmt.Fprintf(os.Stderr, "[END OF NAMED VARIABLES]\n")
}
func parse_args_to_config(cfg *Config) bool {
//var flgs *flag.FlagSet
var flgs *FlagSet
@@ -59,7 +108,9 @@ func parse_args_to_config(cfg *Config) bool {
var kv []string
var vv string
kv = strings.SplitN(v, "=", 2)
if len(kv) >= 2 { vv = kv[1] }
if len(kv) >= 2 {
vv = kv[1]
}
cfg.assigns[kv[0]] = Assign{idx: -1, value: vv}
return nil
})
@@ -108,7 +159,9 @@ func parse_args_to_config(cfg *Config) bool {
//if flgs.NArg() == 0 { goto wrong_usage}
cfg.data_in_files = flgs.Args()
if len(cfg.srcfiles) <= 0 {
if len(cfg.data_in_files) == 0 { goto wrong_usage }
if len(cfg.data_in_files) == 0 {
goto wrong_usage
}
cfg.srcstr = cfg.data_in_files[0]
cfg.data_in_files = cfg.data_in_files[1:]
}
@@ -135,6 +188,7 @@ wrong_usage:
fmt.Fprintf(os.Stderr, "USAGE: %s [options] sourcestring [datafile]*\n", os.Args[0])
fmt.Fprintf(os.Stderr, " %s [options] -f sourcefile [datafile]*\n", os.Args[0])
fmt.Fprintf(os.Stderr, "Options are:\n")
fmt.Fprintf(os.Stderr, " -D, --show-extra-info show extra information\n")
fmt.Fprintf(os.Stderr, " -F, --field-separator string specify the field seperator\n")
fmt.Fprintf(os.Stderr, " -v, --assign name=value set global variable value\n")
fmt.Fprintf(os.Stderr, " -c, --call string call a named function instead of running the\n")
@@ -149,7 +203,7 @@ wrong_usage:
return false
}
func run_script(h *hawk.Hawk, fs_idx int, data_idx int, cfg* Config, rtx_chan chan RtxEvent, sig_chan chan os.Signal) error {
func run_script(h *hawk.Hawk, fs_idx int, data_idx int, cfg *Config, rtx_chan chan RtxEvent, sig_chan chan os.Signal) error {
var rtx *hawk.Rtx
var err error
@@ -158,23 +212,25 @@ func run_script(h *hawk.Hawk, fs_idx int, data_idx int, cfg* Config, rtx_chan ch
} else {
var out_idx_end int = data_idx
if cfg.data_out_files[data_idx] != "" { out_idx_end++ }
if cfg.data_out_files[data_idx] != "" {
out_idx_end++
}
rtx, err = h.NewRtx(
fmt.Sprintf("%s.%d", os.Args[0], data_idx),
cfg.data_in_files[data_idx: data_idx + 1],
cfg.data_out_files[data_idx: out_idx_end],
cfg.data_in_files[data_idx:data_idx+1],
cfg.data_out_files[data_idx:out_idx_end],
)
}
if err != nil {
err = fmt.Errorf("failed to make rtx - %s", err.Error())
goto oops
} else {
} else {
var k string
var v Assign
var retv *hawk.Val
for k, v = range cfg.assigns {
if v.idx >= 0 {
if v.idx >= 0 {
var vv *hawk.Val
vv, err = rtx.NewNumOrStrVal(v.value, 1)
if err != nil {
@@ -259,19 +315,7 @@ func run_script(h *hawk.Hawk, fs_idx int, data_idx int, cfg* Config, rtx_chan ch
}
if cfg.show_extra_info {
var named_vars map[string]*hawk.Val
var vn string
var vv *hawk.Val
fmt.Printf("[RETURN] - [%v]\n", retv.String())
fmt.Printf("NAMED VARIABLES]\n")
named_vars = make(map[string]*hawk.Val)
rtx.GetNamedVars(named_vars)
for vn, vv = range named_vars {
fmt.Printf("%s = %s\n", vn, vv.String())
}
fmt.Printf("END OF NAMED VARIABLES]\n")
dprint_return(rtx, retv)
}
}
@@ -318,7 +362,7 @@ chan_loop:
delete(rtx_bag, ev.rtx)
}
case sig = <- sig_chan:
case sig = <-sig_chan:
var signo syscall.Signal
var ok bool
signo, ok = sig.(syscall.Signal)
@@ -346,7 +390,9 @@ func main() {
debug.SetGCPercent(100) // enable normal GC
if parse_args_to_config(&cfg) == false { os.Exit(99) }
if parse_args_to_config(&cfg) == false {
os.Exit(99)
}
h, err = hawk.New()
if err != nil {
@@ -396,7 +442,7 @@ func main() {
goto oops
}
if (len(cfg.srcfiles) > 0) {
if len(cfg.srcfiles) > 0 {
err = h.ParseFiles(cfg.srcfiles)
} else {
err = h.ParseText(cfg.srcstr)
@@ -437,7 +483,7 @@ func main() {
}
}
rtx_chan <- RtxEvent{ rtx: nil, added: false } // to terminate the signal handler
rtx_chan <- RtxEvent{rtx: nil, added: false} // to terminate the signal handler
sig_wg.Wait()
h.Close()
@@ -448,11 +494,13 @@ func main() {
return
oops:
// if rtx != nil { rtx.Close() }
// if rtx != nil { rtx.Close() }
if rtx_chan != nil {
rtx_chan <- RtxEvent{rtx: nil, added: false}
sig_wg.Wait()
}
if h != nil { h.Close() }
if h != nil {
h.Close()
}
os.Exit(255)
}
+12 -9
View File
@@ -827,17 +827,20 @@ func (rtx *Rtx) SetFuncRetWithStr(v string) error {
}
func (rtx *Rtx) GetNamedVars(vars map[string]*Val) {
var tab *C.hawk_htb_t
var itr C.hawk_htb_itr_t
var pair *C.hawk_htb_pair_t
var itr C.hawk_rtx_nv_itr_t
var val *C.hawk_val_t
var k string
var err error
tab = C.hawk_rtx_getnvmap(rtx.c)
pair = C.hawk_htb_getfirstpair(tab, &itr)
for pair != nil {
k = string(uchars_to_rune_slice((*C.hawk_uch_t)(pair.key.ptr), uintptr(pair.key.len)))
vars[k], _ = rtx.make_val(func() *C.hawk_val_t { return (*C.hawk_val_t)(pair.val.ptr) })
pair = C.hawk_htb_getnextpair(tab, &itr)
C.hawk_init_rtx_nv_itr(&itr)
val = C.hawk_rtx_getfirstnv(rtx.c, &itr)
for val != nil {
k = string(uchars_to_rune_slice((*C.hawk_uch_t)(itr.name.ptr), uintptr(itr.name.len)))
vars[k], err = rtx.make_val(func() *C.hawk_val_t { return val })
if err != nil {
return
}
val = C.hawk_rtx_getnextnv(rtx.c, &itr)
}
}
+62 -62
View File
@@ -424,7 +424,7 @@ skip_close:
if (a1) hawk_rtx_freevaloocstr(rtx, a1, opt);
hawk_rtx_freevaloocstr(rtx, a0, name);
v = hawk_rtx_makeintval(rtx, (hawk_int_t)n);
v = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)n);
if (!v) return -1;
hawk_rtx_setretval(rtx, v);
@@ -547,7 +547,7 @@ static int fnc_fflush (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_rtx_freevaloocstr(rtx, a0, str0);
}
v = hawk_rtx_makeintval(rtx, (hawk_int_t)n);
v = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)n);
if (!v) return -1;
hawk_rtx_setretval(rtx, v);
@@ -578,7 +578,7 @@ static int index_or_rindex (hawk_rtx_t* rtx, int rindex)
int n;
a2 = hawk_rtx_getarg(rtx, 2);
n = hawk_rtx_valtoint(rtx, a2, &boundary);
n = hawk_rtx_valtoint_inline(rtx, a2, &boundary);
if (n <= -1) return -1;
}
@@ -693,7 +693,7 @@ static int index_or_rindex (hawk_rtx_t* rtx, int rindex)
break;
}
a0 = hawk_rtx_makeintval(rtx, idx);
a0 = hawk_rtx_makeintval_inline(rtx, idx);
if (HAWK_UNLIKELY(!a0)) return -1;
hawk_rtx_setretval(rtx, a0);
@@ -773,7 +773,7 @@ int hawk_fnc_length (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int mode)
}
}
v = hawk_rtx_makeintval(rtx, len);
v = hawk_rtx_makeintval_inline(rtx, len);
if (HAWK_UNLIKELY(!v)) return -1;
hawk_rtx_setretval(rtx, v);
@@ -799,12 +799,12 @@ int hawk_fnc_substr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a1 = hawk_rtx_getarg(rtx, 1);
a2 = (nargs >= 3)? hawk_rtx_getarg(rtx, 2): HAWK_NULL;
n = hawk_rtx_valtoint(rtx, a1, &lindex);
n = hawk_rtx_valtoint_inline(rtx, a1, &lindex);
if (n <= -1) return -1;
if (a2)
{
n = hawk_rtx_valtoint(rtx, a2, &lcount);
n = hawk_rtx_valtoint_inline(rtx, a2, &lcount);
if (n <= -1) return -1;
if (lcount < 0) lcount = 0;
}
@@ -975,9 +975,9 @@ static int fnc_split (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int use_array)
t1 = use_array? hawk_rtx_makearrval(rtx, 16): hawk_rtx_makemapval(rtx);
if (HAWK_UNLIKELY(!t1)) goto oops;
hawk_rtx_refupval(rtx, t1);
hawk_rtx_refupval_inline(rtx, t1);
x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 1), t1);
hawk_rtx_refdownval(rtx, t1);
hawk_rtx_refdownval_inline(rtx, t1);
if (HAWK_UNLIKELY(x <= -1)) goto oops;
/* fill the map with actual values */
@@ -1028,8 +1028,8 @@ static int fnc_split (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int use_array)
{
if (!hawk_rtx_setarrvalfld(rtx, t1, ++nflds, t2))
{
hawk_rtx_refupval(rtx, t2);
hawk_rtx_refdownval(rtx, t2);
hawk_rtx_refupval_inline(rtx, t2);
hawk_rtx_refdownval_inline(rtx, t2);
goto oops;
}
}
@@ -1044,8 +1044,8 @@ static int fnc_split (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int use_array)
if (!hawk_rtx_setmapvalfld(rtx, t1, key_buf, key_len, t2))
{
hawk_rtx_refupval(rtx, t2);
hawk_rtx_refdownval(rtx, t2);
hawk_rtx_refupval_inline(rtx, t2);
hawk_rtx_refdownval_inline(rtx, t2);
goto oops;
}
}
@@ -1076,7 +1076,7 @@ static int fnc_split (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int use_array)
hawk_rtx_freerex(rtx, fs_rex_free, HAWK_NULL);
}
t1 = hawk_rtx_makeintval(rtx, nflds);
t1 = hawk_rtx_makeintval_inline(rtx, nflds);
if (HAWK_UNLIKELY(!t1)) return -1;
hawk_rtx_setretval(rtx, t1);
@@ -1660,14 +1660,14 @@ static int __substitute (hawk_rtx_t* rtx, hawk_oow_t max_count)
hawk_rtx_makestrvalwithoocs(rtx, HAWK_OOECS_OOCS(&rtx->fnc.oout));
if (HAWK_UNLIKELY(!v)) goto oops;
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
n = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 2), v);
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
}
if (HAWK_UNLIKELY(n <= -1)) goto oops;
}
v = hawk_rtx_makeintval(rtx, sub_count);
v = hawk_rtx_makeintval_inline(rtx, sub_count);
if (HAWK_UNLIKELY(!v)) return -1;
hawk_rtx_setretval(rtx, v);
@@ -2032,7 +2032,7 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
{
hawk_val_t* a2;
a2 = hawk_rtx_getarg(rtx, 2); /* when start index is support, this is the thrid argument */
if (hawk_rtx_valtoint(rtx, a2, &start) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a2, &start) <= -1) return -1;
}
HAWK_MEMSET (&submat, 0, HAWK_SIZEOF(submat));
@@ -2083,15 +2083,15 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
idx = (n == 0)? 0: ((hawk_int_t)(mat.o.ptr - str0.o) + 1);
}
x0 = hawk_rtx_makeintval(rtx, idx);
x0 = hawk_rtx_makeintval_inline(rtx, idx);
if (!x0) goto oops;
hawk_rtx_refupval(rtx, x0);
hawk_rtx_refupval_inline(rtx, x0);
/* RLENGTH: -1 on no match */
HAWK_ASSERT (&mat.o.len == &mat.b.len);
x1 = hawk_rtx_makeintval(rtx, ((n == 0)? (hawk_int_t)-1: (hawk_int_t)mat.o.len)); /* just use mat.o.len regardless of a0_type */
x1 = hawk_rtx_makeintval_inline(rtx, ((n == 0)? (hawk_int_t)-1: (hawk_int_t)mat.o.len)); /* just use mat.o.len regardless of a0_type */
if (!x1) goto oops;
hawk_rtx_refupval(rtx, x1);
hawk_rtx_refupval_inline(rtx, x1);
if (nargs >= (3 + support_start_index))
{
@@ -2105,7 +2105,7 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
x2 = hawk_rtx_makemapval(rtx);
if (HAWK_UNLIKELY(!x2)) goto oops;
hawk_rtx_refupval(rtx, x2);
hawk_rtx_refupval_inline(rtx, x2);
/* add the full match value to the array at index "0" */
if (hawk_ooecs_fmt(&rtx->fnc.oout, HAWK_T("%d"), 0) == (hawk_oow_t)-1) goto oops;
@@ -2115,8 +2115,8 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
if (HAWK_UNLIKELY(!tv)) goto oops;
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
{
hawk_rtx_refupval(rtx, tv);
hawk_rtx_refdownval(rtx, tv);
hawk_rtx_refupval_inline(rtx, tv);
hawk_rtx_refdownval_inline(rtx, tv);
goto oops;
}
@@ -2125,12 +2125,12 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
xlen = HAWK_OOECS_LEN(&rtx->fnc.oout);
if (hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("start"), 5) == (hawk_oow_t)-1) goto oops;
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? mat.b.ptr - str0.b + 1: mat.o.ptr - str0.o + 1));
tv = hawk_rtx_makeintval_inline(rtx, ((a0_type == HAWK_VAL_MBS)? mat.b.ptr - str0.b + 1: mat.o.ptr - str0.o + 1));
if (HAWK_UNLIKELY(!tv)) goto oops;
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
{
hawk_rtx_refupval(rtx, tv);
hawk_rtx_refdownval(rtx, tv);
hawk_rtx_refupval_inline(rtx, tv);
hawk_rtx_refdownval_inline(rtx, tv);
goto oops;
}
@@ -2138,12 +2138,12 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
if (hawk_ooecs_setlen(&rtx->fnc.oout, xlen) == (hawk_oow_t)-1 ||
hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("length"), 6) == (hawk_oow_t)-1) goto oops;
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? mat.b.len: mat.o.len));
tv = hawk_rtx_makeintval_inline(rtx, ((a0_type == HAWK_VAL_MBS)? mat.b.len: mat.o.len));
if (HAWK_UNLIKELY(!tv)) goto oops;
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
{
hawk_rtx_refupval(rtx, tv);
hawk_rtx_refdownval(rtx, tv);
hawk_rtx_refupval_inline(rtx, tv);
hawk_rtx_refdownval_inline(rtx, tv);
goto oops;
}
@@ -2163,8 +2163,8 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
if (HAWK_UNLIKELY(!tv)) goto oops;
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
{
hawk_rtx_refupval(rtx, tv);
hawk_rtx_refdownval(rtx, tv);
hawk_rtx_refupval_inline(rtx, tv);
hawk_rtx_refdownval_inline(rtx, tv);
goto oops;
}
@@ -2172,24 +2172,24 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
xlen = HAWK_OOECS_LEN(&rtx->fnc.oout);
if (hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("start"), 5) == (hawk_oow_t)-1) goto oops;
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].ptr - str0.b + 1: submat.o[i].ptr - str0.o + 1));
tv = hawk_rtx_makeintval_inline(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].ptr - str0.b + 1: submat.o[i].ptr - str0.o + 1));
if (HAWK_UNLIKELY(!tv)) goto oops;
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
{
hawk_rtx_refupval(rtx, tv);
hawk_rtx_refdownval(rtx, tv);
hawk_rtx_refupval_inline(rtx, tv);
hawk_rtx_refdownval_inline(rtx, tv);
goto oops;
}
if (hawk_ooecs_setlen(&rtx->fnc.oout, xlen) == (hawk_oow_t)-1 ||
hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("length"), 6) == (hawk_oow_t)-1) goto oops;
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].len: submat.o[i].len));
tv = hawk_rtx_makeintval_inline(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].len: submat.o[i].len));
if (HAWK_UNLIKELY(!tv)) goto oops;
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
{
hawk_rtx_refupval(rtx, tv);
hawk_rtx_refdownval(rtx, tv);
hawk_rtx_refupval_inline(rtx, tv);
hawk_rtx_refdownval_inline(rtx, tv);
goto oops;
}
}
@@ -2207,15 +2207,15 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
hawk_rtx_setretval(rtx, x0);
if (x2) hawk_rtx_refdownval(rtx, x2);
hawk_rtx_refdownval(rtx, x1);
hawk_rtx_refdownval(rtx, x0);
if (x2) hawk_rtx_refdownval_inline(rtx, x2);
hawk_rtx_refdownval_inline(rtx, x1);
hawk_rtx_refdownval_inline(rtx, x0);
return 0;
oops:
if (x2) hawk_rtx_refdownval(rtx, x2);
if (x1) hawk_rtx_refdownval(rtx, x1);
if (x0) hawk_rtx_refdownval(rtx, x0);
if (x2) hawk_rtx_refdownval_inline(rtx, x2);
if (x1) hawk_rtx_refdownval_inline(rtx, x1);
if (x0) hawk_rtx_refdownval_inline(rtx, x0);
return -1;
}
@@ -2329,10 +2329,10 @@ int hawk_fnc_int (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
n = hawk_rtx_valtoint(rtx, a0, &lv);
n = hawk_rtx_valtoint_inline(rtx, a0, &lv);
if (n <= -1) return -1;
r = hawk_rtx_makeintval(rtx, lv);
r = hawk_rtx_makeintval_inline(rtx, lv);
if (!r) return -1;
hawk_rtx_setretval(rtx, r);
@@ -2363,7 +2363,7 @@ static HAWK_INLINE int asort_compare_ud (const void* x1, const void* x2, void* c
args[1] = *(hawk_val_t**)x2;
r = hawk_rtx_callfun(cud->rtx, cud->fun, args, 2);
if (HAWK_UNLIKELY(!r)) return -1;
if (hawk_rtx_valtoint(cud->rtx, r, &rv) <= -1) return -1;
if (hawk_rtx_valtoint_inline(cud->rtx, r, &rv) <= -1) return -1;
*cv = rv;
return 0;
}
@@ -2464,12 +2464,12 @@ val_map:
while (i > 0)
{
--i;
hawk_rtx_refdownval(rtx, va[i]);
hawk_rtx_refdownval_inline(rtx, va[i]);
}
hawk_rtx_freemem(rtx, va);
return -1;
}
hawk_rtx_refupval(rtx, va[i]);
hawk_rtx_refupval_inline(rtx, va[i]);
i++;
}
while (hawk_rtx_getnextmapvalitr(rtx, a0_val, &itr));
@@ -2479,7 +2479,7 @@ val_map:
do
{
va[i] = (hawk_val_t*)HAWK_VAL_MAP_ITR_VAL(&itr);
hawk_rtx_refupval(rtx, va[i]);
hawk_rtx_refupval_inline(rtx, va[i]);
i++;
}
while (hawk_rtx_getnextmapvalitr(rtx, a0_val, &itr));
@@ -2499,7 +2499,7 @@ val_map:
if (x <= -1 || !(rrv = hawk_rtx_makemapval(rtx)))
{
for (i = 0; i < msz; i++) hawk_rtx_refdownval(rtx, va[i]);
for (i = 0; i < msz; i++) hawk_rtx_refdownval_inline(rtx, va[i]);
hawk_rtx_freemem(rtx, va);
return -1;
}
@@ -2524,7 +2524,7 @@ val_map:
/* decrement the reference count of the values not added to the map */
do
{
hawk_rtx_refdownval(rtx, va[i]);
hawk_rtx_refdownval_inline(rtx, va[i]);
i++;
}
while (i < msz);
@@ -2533,7 +2533,7 @@ val_map:
return -1;
}
hawk_rtx_refdownval(rtx, va[i]); /* deref it as it has been added to the map */
hawk_rtx_refdownval_inline(rtx, va[i]); /* deref it as it has been added to the map */
}
rv = msz;
@@ -2565,8 +2565,8 @@ val_arr:
{
if (HAWK_ARR_SLOT(arr, j))
{
va[i] = sort_keys? hawk_rtx_makeintval(rtx, j): HAWK_ARR_DPTR(arr, j);
hawk_rtx_refupval(rtx, va[i]);
va[i] = sort_keys? hawk_rtx_makeintval_inline(rtx, j): HAWK_ARR_DPTR(arr, j);
hawk_rtx_refupval_inline(rtx, va[i]);
i++;
}
}
@@ -2585,7 +2585,7 @@ val_arr:
if (x <= -1 || !(rrv = hawk_rtx_makearrval(rtx, -1)))
{
for (i = 0; i < msz; i++) hawk_rtx_refdownval(rtx, va[i]);
for (i = 0; i < msz; i++) hawk_rtx_refdownval_inline(rtx, va[i]);
hawk_rtx_freemem(rtx, va);
return -1;
}
@@ -2597,7 +2597,7 @@ val_arr:
/* decrement the reference count of the values not added to the map */
do
{
hawk_rtx_refdownval(rtx, va[i]);
hawk_rtx_refdownval_inline(rtx, va[i]);
i++;
}
while (i < msz);
@@ -2606,7 +2606,7 @@ val_arr:
return -1;
}
hawk_rtx_refdownval(rtx, va[i]); /* deref it as it has been added to the map */
hawk_rtx_refdownval_inline(rtx, va[i]); /* deref it as it has been added to the map */
}
rv = msz;
@@ -2615,7 +2615,7 @@ val_arr:
}
done:
r = hawk_rtx_makeintval(rtx, rv);
r = hawk_rtx_makeintval_inline(rtx, rv);
if (HAWK_UNLIKELY(!r)) return -1;
if (rrv)
@@ -2623,9 +2623,9 @@ done:
int x;
/* rrv can be NULL when a jump has been made for an empty source
* at the beginning of this fucntion */
hawk_rtx_refupval(rtx, rrv);
hawk_rtx_refupval_inline(rtx, rrv);
x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, (nargs >= 2)), rrv);
hawk_rtx_refdownval(rtx, rrv);
hawk_rtx_refdownval_inline(rtx, rrv);
if (x <= -1)
{
hawk_rtx_freeval(rtx, r, 0);
+18 -1
View File
@@ -120,13 +120,30 @@
# undef HAWK_HAVE_INLINE
#endif
#if defined(__has_attribute) && __has_attribute(always_inline)
# define HAWK_INLINE_ALWAYS __inline__ __attribute__((always_inline))
# define HAWK_HAVE_INLINE_ALWAYS
#endif
#if !defined(HAWK_HAVE_INLINE_ALWAYS)
# if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0))
# define HAWK_INLINE_ALWAYS __inline__ __attribute__((__always_inline__))
# define HAWK_HAVE_INLINE_ALWAYS
# elif defined(_MSC_VER) || defined(__CC_ARM) || defined(__ARMCC__)
# define HAWK_INLINE_ALWAYS __forceinline
# define HAWK_HAVE_INLINE_ALWAYS
# else
/* fallback to normal inline */
# define HAWK_INLINE_ALWAYS HAWK_INLINE
# endif
#endif
#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4))
# define HAWK_UNUSED __attribute__((__unused__))
#else
# define HAWK_UNUSED
#endif
/* =========================================================================
* STATIC ASSERTION
* =========================================================================*/
+28 -8
View File
@@ -25,6 +25,7 @@
#ifndef _HAWK_PRV_H_
#define _HAWK_PRV_H_
#include <hawk-cmn.h>
#include <hawk-arr.h>
#include <hawk-chr.h>
#include <hawk-ecs.h>
@@ -38,18 +39,13 @@ typedef struct hawk_chain_t hawk_chain_t;
typedef struct hawk_tree_t hawk_tree_t;
#include <hawk.h>
#include "tree-prv.h"
#include "fnc-prv.h"
#include "parse-prv.h"
#include "run-prv.h"
#include "rio-prv.h"
#include "val-prv.h"
#include "err-prv.h"
#include "misc-prv.h"
/* ------------------------------------------------------------------------ */
#define HAWK_ENABLE_GC
#define HAWK_ENABLE_STR_CACHE
#define HAWK_ENABLE_MBS_CACHE
/* [NOTE] the function value support implemented is very limited.
* it supports very primitive way to call a function via a variable.
* only user-defined functions are supported. neither builtin functions
@@ -75,6 +71,18 @@ typedef struct hawk_tree_t hawk_tree_t;
/* ------------------------------------------------------------------------ */
/* private headers. some files are affected by feature macros above */
#include "tree-prv.h"
#include "fnc-prv.h"
#include "parse-prv.h"
#include "run-prv.h"
#include "rio-prv.h"
#include "val-prv.h"
#include "err-prv.h"
#include "misc-prv.h"
/* ------------------------------------------------------------------------ */
/* gc configuration */
#define HAWK_GC_NUM_GENS (3)
@@ -307,6 +315,9 @@ struct hawk_t
/* named variables */
hawk_htb_t* named;
/* parser-known named variables in slot order */
hawk_arr_t* nameds;
/* global variables */
hawk_arr_t* gbls;
@@ -430,6 +441,9 @@ struct hawk_rtx_t
HAWK_RTX_HDR;
hawk_htb_t* named;
hawk_val_t** named_slots;
hawk_oow_t named_slot_count;
hawk_oow_t named_slot_capa;
void** stack;
hawk_oow_t stack_top;
@@ -553,6 +567,10 @@ struct hawk_rtx_t
hawk_ooecs_t fmt;
hawk_ooecs_t out;
/* some buffers used by val_flt_to_str() */
hawk_ooecs_t fltfmt;
hawk_ooecs_t fltout;
struct
{
hawk_ooch_t* ptr;
@@ -634,6 +652,7 @@ struct hawk_mod_data_t
#define HAWK_RTX_STACK_LCL(rtx,n) HAWK_RTX_STACK_AT(rtx,3+(hawk_oow_t)HAWK_RTX_STACK_NARGS(rtx)+1+(n))
#define HAWK_RTX_STACK_RETVAL(rtx) HAWK_RTX_STACK_AT(rtx,2)
#define HAWK_RTX_STACK_GBL(rtx,n) ((rtx)->stack[(n)])
#define HAWK_RTX_STACK_NAMED(rtx,n) ((rtx)->named_slots[(n)])
#define HAWK_RTX_STACK_RETVAL_GBL(rtx) ((rtx)->stack[(rtx)->hawk->tree.ngbls+2])
#define HAWK_RTX_STACK_AVAIL(rtx) ((rtx)->stack_limit - (rtx)->stack_top)
@@ -701,6 +720,7 @@ int hawk_init (hawk_t* hawk, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr, const hawk_pr
void hawk_fini (hawk_t* hawk);
hawk_rbt_walk_t hawk_modtab_unload_module (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair, void* ctx);
int hawk_rtx_setnamedval (hawk_rtx_t* rtx, hawk_oow_t id, hawk_val_t* val);
#if defined(__cplusplus)
}
+41 -7
View File
@@ -33,6 +33,7 @@
#include <hawk-htb.h> /* for rtx->named */
#define HAWK_MAP_IS_RBT
/*#define HAWK_MAP_IS_HTB*/
#include <hawk-map.h>
#include <hawk-arr.h>
#include <stdarg.h>
@@ -1695,6 +1696,21 @@ typedef struct hawk_parsestd_t hawk_parsestd_t;
/* ----------------------------------------------------------------------- */
struct hawk_rtx_nv_itr_t
{
/* you can access this */
hawk_oocs_t name;
/* private fields */
hawk_htb_itr_t parse_itr;
hawk_htb_itr_t runtime_itr;
hawk_oow_t slot_id;
int source;
};
typedef struct hawk_rtx_nv_itr_t hawk_rtx_nv_itr_t;
/* ----------------------------------------------------------------------- */
#if defined(__cplusplus)
extern "C" {
#endif
@@ -2893,7 +2909,7 @@ HAWK_EXPORT hawk_val_t* hawk_rtx_getarg (
/**
* The hawk_rtx_getsubsep() function returns the
* pointer to the internal value of SUBSEP. It's a specialized
* version of hawk_rtx_getgbl (rtx, HAWK_GBL_SUBSEP).
* version of hawk_rtx_getgbl(rtx, HAWK_GBL_SUBSEP).
*/
HAWK_EXPORT const hawk_oocs_t* hawk_rtx_getsubsep (
hawk_rtx_t* rtx /**< runtime context */
@@ -2910,7 +2926,7 @@ HAWK_EXPORT const hawk_oocs_t* hawk_rtx_getsubsep (
*/
HAWK_EXPORT hawk_val_t* hawk_rtx_getgbl (
hawk_rtx_t* rtx, /**< runtime context */
int id /**< global variable ID */
int id /**< global variable ID */
);
/**
@@ -2994,13 +3010,31 @@ HAWK_EXPORT int hawk_rtx_setscriptnamewithbchars (
# define hawk_rtx_setscriptnamewithoochars hawk_rtx_setscriptnamewithbchars
#endif
/**
* The hawk_rtx_getnvmap() gets the map of named variables
*/
HAWK_EXPORT hawk_htb_t* hawk_rtx_getnvmap (
hawk_rtx_t* rtx /**< runtime context */
HAWK_EXPORT void hawk_init_rtx_nv_itr (
hawk_rtx_nv_itr_t* itr
);
HAWK_EXPORT hawk_val_t* hawk_rtx_getfirstnv (
hawk_rtx_t* rtx,
hawk_rtx_nv_itr_t* itr
);
HAWK_EXPORT hawk_val_t* hawk_rtx_getnextnv (
hawk_rtx_t* rtx,
hawk_rtx_nv_itr_t* itr
);
HAWK_EXPORT hawk_val_t* hawk_rtx_findnvbyucstr (
hawk_rtx_t* rtx,
const hawk_uch_t* name
);
HAWK_EXPORT hawk_val_t* hawk_rtx_findnvbybcstr (
hawk_rtx_t* rtx,
const hawk_bch_t* name
);
/**
* The hawk_rtx_geterrnum() function gets the number of the last error
* occurred during runtime.
+18 -18
View File
@@ -91,7 +91,7 @@ static hawk_oow_t push_args_from_stack (hawk_rtx_t* rtx, const hawk_loc_t* call_
}
HAWK_RTX_STACK_PUSH(rtx, v);
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
}
return pasf->end_index - pasf->start_index + 1;
@@ -228,7 +228,7 @@ static int fnc_function_exists (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_rtx_freevaloocstr(rtx, a0, name.ptr);
}
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rx));
return 0;
}
/* -------------------------------------------------------------------------- */
@@ -252,7 +252,7 @@ static int fnc_cmgr_exists (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_rtx_freevaloocstr(rtx, a0, str);
}
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rx));
return 0;
}
@@ -270,12 +270,12 @@ static int fnc_gc (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t gen = -1;
#if defined(HAWK_ENABLE_GC)
if (hawk_rtx_getnargs(rtx) >= 1 && hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = -1;
if (hawk_rtx_getnargs(rtx) >= 1 && hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = -1;
gen = hawk_rtx_gc(rtx, gen);
#endif
HAWK_ASSERT(HAWK_IN_INT_RANGE(gen));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, gen));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, gen));
return 0;
}
@@ -284,14 +284,14 @@ static int fnc_gc_get_pressure (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t gen;
hawk_int_t pressure;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = 0;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = 0;
if (gen < 0) gen = 0;
else if (gen >= HAWK_COUNTOF(rtx->gc.g)) gen = HAWK_COUNTOF(rtx->gc.g) - 1;
pressure = rtx->gc.pressure[gen];
HAWK_ASSERT(HAWK_IN_INT_RANGE(pressure));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, pressure));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, pressure));
return 0;
}
@@ -300,14 +300,14 @@ static int fnc_gc_get_threshold (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t gen;
hawk_int_t threshold;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = 0;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = 0;
if (gen < 0) gen = 0;
else if (gen >= HAWK_COUNTOF(rtx->gc.g)) gen = HAWK_COUNTOF(rtx->gc.g) - 1;
threshold = rtx->gc.threshold[gen];
HAWK_ASSERT(HAWK_IN_INT_RANGE(threshold));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, threshold));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, threshold));
return 0;
}
@@ -316,11 +316,11 @@ static int fnc_gc_set_threshold (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t gen;
hawk_int_t threshold;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = 0;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &gen) <= -1) gen = 0;
if (gen < 0) gen = 0;
else if (gen >= HAWK_COUNTOF(rtx->gc.g)) gen = HAWK_COUNTOF(rtx->gc.g) - 1;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &threshold) <= -1) threshold = -1;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 1), &threshold) <= -1) threshold = -1;
if (threshold >= 0)
{
@@ -333,7 +333,7 @@ static int fnc_gc_set_threshold (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
}
HAWK_ASSERT(HAWK_IN_INT_RANGE(threshold));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, threshold));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, threshold));
return 0;
}
@@ -341,7 +341,7 @@ static int fnc_gcrefs (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
hawk_val_t* a0;
a0 = hawk_rtx_getarg(rtx, 0);
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, HAWK_VTR_IS_POINTER(a0)? a0->v_refs: 0));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, HAWK_VTR_IS_POINTER(a0)? a0->v_refs: 0));
return 0;
}
@@ -439,7 +439,7 @@ static int fnc_isnil (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
r = hawk_rtx_makeintval(rtx, HAWK_RTX_GETVALTYPE(rtx, a0) == HAWK_VAL_NIL);
r = hawk_rtx_makeintval_inline(rtx, HAWK_RTX_GETVALTYPE(rtx, a0) == HAWK_VAL_NIL);
if (HAWK_UNLIKELY(!r)) return -1;
hawk_rtx_setretval(rtx, r);
@@ -453,7 +453,7 @@ static int fnc_ismap (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
r = hawk_rtx_makeintval(rtx, HAWK_RTX_GETVALTYPE(rtx, a0) == HAWK_VAL_MAP);
r = hawk_rtx_makeintval_inline(rtx, HAWK_RTX_GETVALTYPE(rtx, a0) == HAWK_VAL_MAP);
if (HAWK_UNLIKELY(!r)) return -1;
hawk_rtx_setretval(rtx, r);
@@ -467,7 +467,7 @@ static int fnc_isarr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
r = hawk_rtx_makeintval(rtx, HAWK_RTX_GETVALTYPE(rtx, a0) == HAWK_VAL_ARR);
r = hawk_rtx_makeintval_inline(rtx, HAWK_RTX_GETVALTYPE(rtx, a0) == HAWK_VAL_ARR);
if (HAWK_UNLIKELY(!r)) return -1;
hawk_rtx_setretval(rtx, r);
@@ -495,7 +495,7 @@ static int fnc_type (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
_type = hawk_rtx_getvaltype(rtx, a0);
r = hawk_rtx_makeintval(rtx, _type);
r = hawk_rtx_makeintval_inline(rtx, _type);
if (HAWK_UNLIKELY(!r)) return -1;
hawk_rtx_setretval(rtx, r);
@@ -528,7 +528,7 @@ static int fnc_hash (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
v = hawk_rtx_hashval(rtx, a0); /* ignore v <= -1 which is an error */
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, v));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, v));
return 0;
}
+2 -2
View File
@@ -603,7 +603,7 @@ static int fnc_srand (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
else
{
a0 = hawk_rtx_getarg(rtx, 0);
n = hawk_rtx_valtoint(rtx, a0, &lv);
n = hawk_rtx_valtoint_inline(rtx, a0, &lv);
if (n <= -1) return -1;
#if defined(HAVE_INITSTATE_R) && defined(HAVE_SRANDOM_R) && defined(HAVE_RANDOM_R)
srandom_r (lv, &modctx->prand);
@@ -614,7 +614,7 @@ static int fnc_srand (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#endif
}
r = hawk_rtx_makeintval(rtx, prev);
r = hawk_rtx_makeintval_inline(rtx, prev);
if (r == HAWK_NULL) return -1;
hawk_rtx_setretval(rtx, r);
+15 -15
View File
@@ -130,7 +130,7 @@ static int fnc_trim (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (hawk_rtx_getnargs(rtx) >= 2)
{
hawk_int_t iv;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &iv) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 1), &iv) <= -1) return -1;
if (iv & TRIM_FLAG_PAC_SPACES) return fnc_normspace(rtx, fi);
}
@@ -212,7 +212,7 @@ static int is_class (hawk_rtx_t* rtx, hawk_ooch_prop_t ctype)
}
}
a0 = hawk_rtx_makeintval(rtx, tmp);
a0 = hawk_rtx_makeintval_inline(rtx, tmp);
if (HAWK_UNLIKELY(!a0)) return -1;
hawk_rtx_setretval(rtx, a0);
@@ -298,7 +298,7 @@ static int fnc_frombcharcode (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t cc;
a0 = hawk_rtx_getarg(rtx, 0);
if (hawk_rtx_valtoint(rtx, a0, &cc) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a0, &cc) <= -1) return -1;
retv = hawk_rtx_makebchrval(rtx, (hawk_bch_t)cc);
if (HAWK_UNLIKELY(!retv)) return -1;
@@ -316,7 +316,7 @@ static int fnc_frombcharcode (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t cc;
a0 = hawk_rtx_getarg(rtx, i);
if (hawk_rtx_valtoint(rtx, a0, &cc) <= -1)
if (hawk_rtx_valtoint_inline(rtx, a0, &cc) <= -1)
{
hawk_rtx_freeval(rtx, retv, 0);
return -1;
@@ -349,7 +349,7 @@ static int fnc_fromcharcode (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t cc;
a0 = hawk_rtx_getarg(rtx, 0);
if (hawk_rtx_valtoint(rtx, a0, &cc) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a0, &cc) <= -1) return -1;
retv = hawk_rtx_makecharval(rtx, (hawk_ooch_t)cc);
if (HAWK_UNLIKELY(!retv)) return -1;
@@ -367,7 +367,7 @@ static int fnc_fromcharcode (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t cc;
a0 = hawk_rtx_getarg(rtx, i);
if (hawk_rtx_valtoint(rtx, a0, &cc) <= -1)
if (hawk_rtx_valtoint_inline(rtx, a0, &cc) <= -1)
{
hawk_rtx_freeval(rtx, retv, 0);
return -1;
@@ -396,7 +396,7 @@ static int fnc_tocharcode (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
/* optional index. must be between 1 and the string length inclusive */
hawk_val_t* a1;
a1 = hawk_rtx_getarg(rtx, 1);
if (hawk_rtx_valtoint(rtx, a1, &pos) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a1, &pos) <= -1) return -1;
pos--; /* 1 based indexing. range check to be done before accessing below */
}
@@ -443,7 +443,7 @@ static int fnc_tocharcode (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (iv >= 0)
{
retv = hawk_rtx_makeintval(rtx, iv);
retv = hawk_rtx_makeintval_inline(rtx, iv);
if (HAWK_UNLIKELY(!retv)) return -1;
hawk_rtx_setretval(rtx, retv);
}
@@ -991,7 +991,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t base;
hawk_bch_t tmp = HAWK_RTX_GETBCHRFROMVAL(rtx, a0);
if (hawk_rtx_valtoint(rtx, a1, &base) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a1, &base) <= -1) return -1;
rx = hawk_bchars_to_num(
HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), base),
&tmp, 1, &lv, &rv
@@ -1007,7 +1007,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_val_t* a1 = hawk_rtx_getarg(rtx, 1);
hawk_int_t base;
if (hawk_rtx_valtoint(rtx, a1, &base) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a1, &base) <= -1) return -1;
rx = hawk_bchars_to_num(
HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), base),
((hawk_val_mbs_t*)a0)->val.ptr,
@@ -1025,7 +1025,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t base;
hawk_ooch_t tmp = HAWK_RTX_GETCHARFROMVAL(rtx, a0);
if (hawk_rtx_valtoint(rtx, a1, &base) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a1, &base) <= -1) return -1;
rx = hawk_oochars_to_num(
HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), base),
&tmp, 1, &lv, &rv
@@ -1040,7 +1040,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_val_t* a1 = hawk_rtx_getarg(rtx, 1);
hawk_int_t base;
if (hawk_rtx_valtoint(rtx, a1, &base) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, a1, &base) <= -1) return -1;
rx = hawk_oochars_to_num(
HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), base),
((hawk_val_str_t*)a0)->val.ptr,
@@ -1062,7 +1062,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (rx == 0)
{
retv = hawk_rtx_makeintval(rtx, lv);
retv = hawk_rtx_makeintval_inline(rtx, lv);
}
else if (rx >= 1)
{
@@ -1070,7 +1070,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
}
else
{
retv = hawk_rtx_makeintval(rtx, 0);
retv = hawk_rtx_makeintval_inline(rtx, 0);
}
if (!retv) return -1;
@@ -1088,7 +1088,7 @@ static int fnc_subchar (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
a0 = hawk_rtx_getarg(rtx, 0);
a1 = hawk_rtx_getarg(rtx, 1);
n = hawk_rtx_valtoint(rtx, a1, &lindex);
n = hawk_rtx_valtoint_inline(rtx, a1, &lindex);
if (n <= -1) return -1;
lindex = lindex - 1;
+204 -204
View File
File diff suppressed because it is too large Load Diff
+31 -4
View File
@@ -771,7 +771,6 @@ hawk_ooch_t* hawk_addsionamewithbchars (hawk_t* hawk, const hawk_bch_t* ptr, haw
ucslen = ucslen + 1;
hawk_convbtouchars(hawk, ptr, &bcslen, (hawk_uch_t*)(link + 1), &ucslen, 0);
((hawk_uch_t*)(link + 1))[ucslen] = '\0';
#endif
link->link = hawk->sio_names;
@@ -2472,6 +2471,26 @@ static hawk_oow_t get_global (hawk_t* hawk, const hawk_oocs_t* name)
return HAWK_ARR_NIL;
}
static hawk_oow_t get_or_add_named (hawk_t* hawk, const hawk_oocs_t* name)
{
hawk_htb_pair_t* pair;
hawk_oow_t idx;
pair = hawk_htb_search(hawk->parse.named, name->ptr, name->len);
if (pair)
{
idx = (hawk_oow_t)HAWK_HTB_VPTR(pair);
return idx;
}
idx = HAWK_HTB_SIZE(hawk->parse.named);
pair = hawk_htb_upsert(hawk->parse.named, name->ptr, name->len, (void*)idx, 0);
if (!pair) return (hawk_oow_t)-1;
return idx;
}
static hawk_oow_t find_global (hawk_t* hawk, const hawk_oocs_t* name)
{
hawk_oow_t i;
@@ -7312,9 +7331,12 @@ static hawk_nde_t* parse_primary_ident_noseg (hawk_t* hawk, const hawk_loc_t* xl
if (HAWK_UNLIKELY(!tmp)) ADJERR_LOC(hawk, xloc);
else
{
hawk_oow_t named_idxa;
/* collect unique instances of a named variable
* for reference */
if (hawk_htb_upsert(hawk->parse.named, name->ptr, name->len, HAWK_NULL, 0) == HAWK_NULL)
named_idxa = get_or_add_named(hawk, name);
if (named_idxa == (hawk_oow_t)-1)
{
ADJERR_LOC(hawk, xloc);
hawk_freemem(hawk, tmp);
@@ -7325,7 +7347,7 @@ static hawk_nde_t* parse_primary_ident_noseg (hawk_t* hawk, const hawk_loc_t* xl
tmp->loc = *xloc;
tmp->id.name.ptr = name->ptr;
tmp->id.name.len = name->len;
tmp->id.idxa = (hawk_oow_t)-1;
tmp->id.idxa = named_idxa;
tmp->idx = HAWK_NULL;
nde = (hawk_nde_t*)tmp;
@@ -7774,7 +7796,12 @@ static hawk_nde_t* make_hashidx_access_node (hawk_t* hawk, const hawk_oocs_t* na
nde->loc = *xloc;
nde->id.name.ptr = name->ptr;
nde->id.name.len = name->len;
nde->id.idxa = (hawk_oow_t)-1;
nde->id.idxa = get_or_add_named(hawk, name);
if (nde->id.idxa == (hawk_oow_t)-1)
{
ADJERR_LOC(hawk, xloc);
goto exit_func;
}
nde->idx = idx;
return (hawk_nde_t*)nde;
+2 -2
View File
@@ -1046,7 +1046,7 @@ void hawk_rbt_walk (hawk_rbt_t* rbt, walker_t walker, void* ctx)
hawk_rbt_itr_t itr;
hawk_rbt_pair_t* pair;
hawk_init_map_itr (&itr, 0);
hawk_init_rbt_itr(&itr, 0);
pair = hawk_rbt_getfirstpair(rbt, &itr);
while (pair)
{
@@ -1060,7 +1060,7 @@ void hawk_rbt_rwalk (hawk_rbt_t* rbt, walker_t walker, void* ctx)
hawk_rbt_itr_t itr;
hawk_rbt_pair_t* pair;
hawk_init_map_itr (&itr, 1);
hawk_init_rbt_itr(&itr, 1);
pair = hawk_rbt_getfirstpair(rbt, &itr);
while (pair)
{
+26 -26
View File
@@ -60,9 +60,9 @@ int hawk_rtx_setrec (hawk_rtx_t* rtx, hawk_oow_t idx, const hawk_oocs_t* str, in
if (HAWK_UNLIKELY(!v)) goto oops;
}
if (HAWK_RTX_GETVALTYPE(rtx, rtx->inrec.d0) != HAWK_VAL_NIL) hawk_rtx_refdownval(rtx, rtx->inrec.d0);
if (HAWK_RTX_GETVALTYPE(rtx, rtx->inrec.d0) != HAWK_VAL_NIL) hawk_rtx_refdownval_inline(rtx, rtx->inrec.d0);
rtx->inrec.d0 = v;
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
return 0;
@@ -313,7 +313,7 @@ static int split_record (hawk_rtx_t* rtx, int prefer_number)
return -1;
}
hawk_rtx_refupval(rtx, rtx->inrec.flds[rtx->inrec.nflds].val);
hawk_rtx_refupval_inline(rtx, rtx->inrec.flds[rtx->inrec.nflds].val);
rtx->inrec.nflds++;
len = HAWK_OOECS_LEN(&rtx->inrec.line) - (p - px);
@@ -322,16 +322,16 @@ static int split_record (hawk_rtx_t* rtx, int prefer_number)
if (fs_free) hawk_rtx_freemem(rtx, fs_free);
/* set the number of fields */
v = hawk_rtx_makeintval(rtx, (hawk_int_t)rtx->inrec.nflds);
v = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)rtx->inrec.nflds);
if (v == HAWK_NULL) return -1;
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
if (hawk_rtx_setgbl(rtx, HAWK_GBL_NF, v) <= -1)
{
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
return -1;
}
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
return 0;
}
@@ -342,7 +342,7 @@ int hawk_rtx_clrrec (hawk_rtx_t* rtx, int skip_inrec_line)
if (HAWK_RTX_GETVALTYPE(rtx, rtx->inrec.d0) != HAWK_VAL_NIL)
{
hawk_rtx_refdownval(rtx, rtx->inrec.d0);
hawk_rtx_refdownval_inline(rtx, rtx->inrec.d0);
rtx->inrec.d0 = hawk_val_nil;
}
@@ -353,7 +353,7 @@ int hawk_rtx_clrrec (hawk_rtx_t* rtx, int skip_inrec_line)
for (i = 0; i < rtx->inrec.nflds; i++)
{
HAWK_ASSERT(rtx->inrec.flds[i].val != HAWK_NULL);
hawk_rtx_refdownval(rtx, rtx->inrec.flds[i].val);
hawk_rtx_refdownval_inline(rtx, rtx->inrec.flds[i].val);
}
rtx->inrec.nflds = 0;
@@ -430,11 +430,11 @@ static int recomp_record_fields (hawk_rtx_t* rtx, hawk_oow_t lv, const hawk_oocs
hawk_rtx_makestrvalwithoochars(rtx, str->ptr, str->len);
if (HAWK_UNLIKELY(!tmp)) return -1;
if (i < nflds) hawk_rtx_refdownval(rtx, rtx->inrec.flds[i].val);
if (i < nflds) hawk_rtx_refdownval_inline(rtx, rtx->inrec.flds[i].val);
else rtx->inrec.nflds++;
rtx->inrec.flds[i].val = tmp;
hawk_rtx_refupval(rtx, tmp);
hawk_rtx_refupval_inline(rtx, tmp);
}
else if (i >= nflds)
{
@@ -443,12 +443,12 @@ static int recomp_record_fields (hawk_rtx_t* rtx, hawk_oow_t lv, const hawk_oocs
if (hawk_ooecs_cat(&rtx->inrec.line, HAWK_T("")) == (hawk_oow_t)-1) return -1;
/* hawk_rtx_refdownval should not be called over
/* hawk_rtx_refdownval_inline should not be called over
* rtx->inrec.flds[i].val as it is not initialized
* to any valid values */
/*hawk_rtx_refdownval(rtx, rtx->inrec.flds[i].val);*/
/*hawk_rtx_refdownval_inline(rtx, rtx->inrec.flds[i].val);*/
rtx->inrec.flds[i].val = hawk_val_zls;
hawk_rtx_refupval(rtx, hawk_val_zls);
hawk_rtx_refupval_inline(rtx, hawk_val_zls);
rtx->inrec.nflds++;
}
else
@@ -471,16 +471,16 @@ static int recomp_record_fields (hawk_rtx_t* rtx, hawk_oow_t lv, const hawk_oocs
if (HAWK_RTX_GETINTFROMVAL(rtx, v) != max)
{
v = hawk_rtx_makeintval(rtx, (hawk_int_t)max);
v = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)max);
if (v == HAWK_NULL) return -1;
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
if (hawk_rtx_setgbl(rtx, HAWK_GBL_NF, v) <= -1)
{
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
return -1;
}
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
}
return 0;
@@ -505,7 +505,7 @@ int hawk_rtx_truncrec (hawk_rtx_t* rtx, hawk_oow_t nflds)
if (nflds > 1)
{
v = HAWK_RTX_STACK_GBL(rtx, HAWK_GBL_OFS);
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
vtype = HAWK_RTX_GETVALTYPE(rtx, v);
if (vtype == HAWK_VAL_NIL)
@@ -532,7 +532,7 @@ int hawk_rtx_truncrec (hawk_rtx_t* rtx, hawk_oow_t nflds)
if (v)
{
if (ofs_free) hawk_rtx_freevaloocstr(rtx, v, ofs_free);
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
v = HAWK_NULL;
}
}
@@ -540,17 +540,17 @@ int hawk_rtx_truncrec (hawk_rtx_t* rtx, hawk_oow_t nflds)
w = (hawk_val_t*)hawk_rtx_makestrvalwithoocs(rtx, HAWK_OOECS_OOCS(&tmp));
if (HAWK_UNLIKELY(!w)) goto oops;
hawk_rtx_refdownval(rtx, rtx->inrec.d0);
hawk_rtx_refdownval_inline(rtx, rtx->inrec.d0);
rtx->inrec.d0 = w;
hawk_rtx_refupval(rtx, rtx->inrec.d0);
hawk_rtx_refupval_inline(rtx, rtx->inrec.d0);
hawk_ooecs_swap (&tmp, &rtx->inrec.line);
hawk_ooecs_fini (&tmp);
hawk_ooecs_swap(&tmp, &rtx->inrec.line);
hawk_ooecs_fini(&tmp);
fini_tmp = 0;
for (i = nflds; i < rtx->inrec.nflds; i++)
{
hawk_rtx_refdownval(rtx, rtx->inrec.flds[i].val);
hawk_rtx_refdownval_inline(rtx, rtx->inrec.flds[i].val);
}
rtx->inrec.nflds = nflds;
@@ -561,7 +561,7 @@ oops:
if (v)
{
if (ofs_free) hawk_rtx_freevaloocstr(rtx, v, ofs_free);
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
}
return -1;
}
+14 -14
View File
@@ -399,21 +399,21 @@ int hawk_rtx_readio (hawk_rtx_t* rtx, hawk_in_type_t in_type, const hawk_ooch_t*
/* get the record separator */
rs = hawk_rtx_getgbl(rtx, HAWK_GBL_RS);
hawk_rtx_refupval(rtx, rs);
hawk_rtx_refupval_inline(rtx, rs);
fs = hawk_rtx_getgbl(rtx, HAWK_GBL_FS);
hawk_rtx_refupval(rtx, fs);
hawk_rtx_refupval_inline(rtx, fs);
if (resolve_rs(rtx, rs, &rrs) <= -1) /* TODO: resolve it upon assignment for optimization? */
{
hawk_rtx_refdownval(rtx, rs);
hawk_rtx_refdownval_inline(rtx, rs);
return -1;
}
if (resolve_rs(rtx, fs, &ffs) <= -1)
{
hawk_rtx_refdownval(rtx, fs);
hawk_rtx_refdownval(rtx, rs);
hawk_rtx_refdownval_inline(rtx, fs);
hawk_rtx_refdownval_inline(rtx, rs);
return -1;
}
@@ -749,8 +749,8 @@ int hawk_rtx_readio (hawk_rtx_t* rtx, hawk_in_type_t in_type, const hawk_ooch_t*
}
if (rrs.ptr && HAWK_RTX_GETVALTYPE(rtx, rs) != HAWK_VAL_STR) hawk_rtx_freemem(rtx, rrs.ptr);
hawk_rtx_refdownval(rtx, fs);
hawk_rtx_refdownval(rtx, rs);
hawk_rtx_refdownval_inline(rtx, fs);
hawk_rtx_refdownval_inline(rtx, rs);
return ret;
}
@@ -789,21 +789,21 @@ int hawk_rtx_readiobytes (hawk_rtx_t* rtx, hawk_in_type_t in_type, const hawk_oo
/* get the record separator */
brs = hawk_rtx_getgbl(rtx, HAWK_GBL_RS);
hawk_rtx_refupval(rtx, brs);
hawk_rtx_refupval_inline(rtx, brs);
bfs = hawk_rtx_getgbl(rtx, HAWK_GBL_FS);
hawk_rtx_refupval(rtx, bfs);
hawk_rtx_refupval_inline(rtx, bfs);
if (resolve_brs(rtx, brs, &rrs) <= -1)
{
hawk_rtx_refdownval(rtx, brs);
hawk_rtx_refdownval_inline(rtx, brs);
return -1;
}
if (resolve_brs(rtx, bfs, &ffs) <= -1)
{
hawk_rtx_refdownval(rtx, bfs);
hawk_rtx_refdownval(rtx, brs);
hawk_rtx_refdownval_inline(rtx, bfs);
hawk_rtx_refdownval_inline(rtx, brs);
return -1;
}
@@ -1131,8 +1131,8 @@ int hawk_rtx_readiobytes (hawk_rtx_t* rtx, hawk_in_type_t in_type, const hawk_oo
}
if (rrs.ptr && HAWK_RTX_GETVALTYPE(rtx, brs) != HAWK_VAL_MBS) hawk_rtx_freemem(rtx, rrs.ptr);
hawk_rtx_refdownval(rtx, bfs);
hawk_rtx_refdownval(rtx, brs);
hawk_rtx_refdownval_inline(rtx, bfs);
hawk_rtx_refdownval_inline(rtx, brs);
return ret;
}
+757 -510
View File
File diff suppressed because it is too large Load Diff
+33 -33
View File
@@ -2341,7 +2341,7 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
v_argc = hawk_rtx_getgbl(rtx, xtn->gbl_argc);
HAWK_ASSERT(v_argc != HAWK_NULL);
if (hawk_rtx_valtoint(rtx, v_argc, &i_argc) <= -1) return -1;
if (hawk_rtx_valtoint_inline(rtx, v_argc, &i_argc) <= -1) return -1;
/* handle special case when ARGV[x] has been altered.
* so from here down, the file name gotten from
@@ -2601,7 +2601,7 @@ static int apply_pending_rio_console_state(hawk_rtx_t* rtx, hawk_rio_arg_t* riod
if (!curpath) curpath = HAWK_T("-"); /* TODO: remember the actual special file name and use it? */
if (hawk_rtx_setfilenamewithoochars(rtx, curpath, hawk_count_oocstr(curpath)) <= -1) return -1;
riod->uflags &= ~IO_UFLAG_CONSOLE_PENDING_NEXT;
hawk_rtx_setgbl(rtx, HAWK_GBL_FNR, hawk_rtx_makeintval(rtx, 0)); /* this won't fail as the int value is 0 */
hawk_rtx_setgbl(rtx, HAWK_GBL_FNR, hawk_rtx_makeintval_inline(rtx, 0)); /* this won't fail as the int value is 0 */
return 0;
}
@@ -2791,30 +2791,30 @@ static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_oo
v_argv = hawk_rtx_makemapval(rtx);
if (v_argv == HAWK_NULL) return -1;
hawk_rtx_refupval(rtx, v_argv);
hawk_rtx_refupval_inline(rtx, v_argv);
/* make ARGV[0] */
v_tmp = hawk_rtx_makestrvalwithoocstr(rtx, id);
if (v_tmp == HAWK_NULL)
{
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
/* increment reference count of v_tmp in advance as if
* it has successfully been assigned into ARGV. */
hawk_rtx_refupval(rtx, v_tmp);
hawk_rtx_refupval_inline(rtx, v_tmp);
key_len = hawk_copy_oocstr(key, HAWK_COUNTOF(key), HAWK_T("0"));
if (hawk_map_upsert(((hawk_val_map_t*)v_argv)->map, key, key_len, v_tmp, 0) == HAWK_NULL)
{
/* if the assignment operation fails, decrements
* the reference of v_tmp to free it */
hawk_rtx_refdownval(rtx, v_tmp);
hawk_rtx_refdownval_inline(rtx, v_tmp);
/* the values previously assigned into the
* map will be freeed when v_argv is freed */
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
@@ -2828,50 +2828,50 @@ static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_oo
v_tmp = hawk_rtx_makenumorstrvalwithoochars(rtx, *p, hawk_count_oocstr(*p), 1);
if (HAWK_UNLIKELY(!v_tmp))
{
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
key_len = hawk_int_to_oocstr(argc, 10, HAWK_NULL, key, HAWK_COUNTOF(key));
HAWK_ASSERT(key_len != (hawk_oow_t)-1);
hawk_rtx_refupval(rtx, v_tmp);
hawk_rtx_refupval_inline(rtx, v_tmp);
if (hawk_map_upsert(((hawk_val_map_t*)v_argv)->map, key, key_len, v_tmp, 0) == HAWK_NULL)
{
hawk_rtx_refdownval(rtx, v_tmp);
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_tmp);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
}
}
else argc = 1;
v_argc = hawk_rtx_makeintval(rtx, (hawk_int_t)argc);
v_argc = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)argc);
if (v_argc == HAWK_NULL)
{
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
hawk_rtx_refupval(rtx, v_argc);
hawk_rtx_refupval_inline(rtx, v_argc);
if (hawk_rtx_setgbl(rtx, argc_id, v_argc) <= -1)
{
hawk_rtx_refdownval(rtx, v_argc);
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argc);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
if (hawk_rtx_setgbl(rtx, argv_id, v_argv) <= -1)
{
hawk_rtx_refdownval(rtx, v_argc);
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argc);
hawk_rtx_refdownval_inline(rtx, v_argv);
return -1;
}
hawk_rtx_refdownval(rtx, v_argc);
hawk_rtx_refdownval(rtx, v_argv);
hawk_rtx_refdownval_inline(rtx, v_argc);
hawk_rtx_refdownval_inline(rtx, v_argv);
return 0;
}
@@ -2894,7 +2894,7 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
v_env = hawk_rtx_makemapval(rtx);
if (v_env == HAWK_NULL) return -1;
hawk_rtx_refupval(rtx, v_env);
hawk_rtx_refupval_inline(rtx, v_env);
if (envarr)
{
@@ -2929,7 +2929,7 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
{
if (kptr) hawk_rtx_freemem(rtx, kptr);
if (vptr) hawk_rtx_freemem(rtx, vptr);
hawk_rtx_refdownval(rtx, v_env);
hawk_rtx_refdownval_inline(rtx, v_env);
return -1;
}
@@ -2946,7 +2946,7 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
{
if (kptr) hawk_rtx_freemem(rtx, kptr);
if (vptr) hawk_rtx_freeme(rtx, vptr):
hawk_rtx_refdownval(rtx, v_env);
hawk_rtx_refdownval_inline(rtx, v_env);
return -1;
}
@@ -2966,19 +2966,19 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
if (vptr) hawk_rtx_freemem(rtx, vptr);
if (kptr) hawk_rtx_freemem(rtx, kptr);
#endif
hawk_rtx_refdownval(rtx, v_env);
hawk_rtx_refdownval_inline(rtx, v_env);
return -1;
}
/* increment reference count of v_tmp in advance as if
* it has successfully been assigned into ARGV. */
hawk_rtx_refupval(rtx, v_tmp);
hawk_rtx_refupval_inline(rtx, v_tmp);
if (hawk_map_upsert(((hawk_val_map_t*)v_env)->map, kptr, klen, v_tmp, 0) == HAWK_NULL)
{
/* if the assignment operation fails, decrements
* the reference of v_tmp to free it */
hawk_rtx_refdownval(rtx, v_tmp);
hawk_rtx_refdownval_inline(rtx, v_tmp);
#if ((defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
(defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
@@ -2990,7 +2990,7 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
/* the values previously assigned into the
* map will be freeed when v_env is freed */
hawk_rtx_refdownval(rtx, v_env);
hawk_rtx_refdownval_inline(rtx, v_env);
return -1;
}
@@ -3007,11 +3007,11 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
if (hawk_rtx_setgbl(rtx, gbl_id, v_env) <= -1)
{
hawk_rtx_refdownval(rtx, v_env);
hawk_rtx_refdownval_inline(rtx, v_env);
return -1;
}
hawk_rtx_refdownval(rtx, v_env);
hawk_rtx_refdownval_inline(rtx, v_env);
return 0;
}
@@ -3453,7 +3453,7 @@ done:
if (ret >= 0)
{
v[0] = hawk_rtx_makeintval(rtx, (hawk_int_t)fret);
v[0] = hawk_rtx_makeintval_inline(rtx, (hawk_int_t)fret);
if (v[0] == HAWK_NULL) return -1;
hawk_rtx_setretval(rtx, v[0]);
}
@@ -3500,7 +3500,7 @@ static int fnc_getioattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if ((tmout = timeout_code (ptr[1])) >= 0)
{
if (ioattr->tmout[tmout].nsec == 0)
rv = hawk_rtx_makeintval(rtx, ioattr->tmout[tmout].sec);
rv = hawk_rtx_makeintval_inline(rtx, ioattr->tmout[tmout].sec);
else
rv = hawk_rtx_makefltval(rtx, (hawk_flt_t)ioattr->tmout[tmout].sec + HAWK_NSEC_TO_SEC((hawk_flt_t)ioattr->tmout[tmout].nsec));
if (rv == HAWK_NULL)
@@ -3538,9 +3538,9 @@ done:
{
if (rv)
{
hawk_rtx_refupval(rtx, rv);
hawk_rtx_refupval_inline(rtx, rv);
ret = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 2), rv);
hawk_rtx_refdownval(rtx, rv);
hawk_rtx_refdownval_inline(rtx, rv);
if (ret >= 0) hawk_rtx_setretval(rtx, HAWK_VAL_ZERO);
}
else
+9
View File
@@ -249,6 +249,15 @@ struct hawk_nde_var_t
} id;
hawk_nde_t* idx; /* HAWK_NULL for non-XXXXIDX */
hawk_uint8_t is_const;
#if defined(HAWK_ENABLE_NAMED_LOOKUP_CACHE)
struct
{
hawk_rtx_t* rtx;
hawk_htb_pair_t* pair;
hawk_oow_t gen;
hawk_uint8_t valid;
} ncache;
#endif
};
#define HAWK_NDE_FNCALL_FNC_DEFERRED_MODFNC (1 << 0)
+3 -1
View File
@@ -687,7 +687,9 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde, int depth)
case HAWK_NDE_NAMED:
{
hawk_nde_var_t* px = (hawk_nde_var_t*)nde;
HAWK_ASSERT (px->id.idxa == (hawk_oow_t)-1);
/*HAWK_ASSERT (px->id.idxa == (hawk_oow_t)-1);
* commented out the above assertion because
* id.idxa field holds an index to the rtx->named_slots. */
HAWK_ASSERT (px->idx == HAWK_NULL);
PUT_SRCSTRN(hawk, px->id.name.ptr, px->id.name.len);
+128
View File
@@ -27,6 +27,11 @@
#define HAWK_VAL_CHUNK_SIZE 100
/* this has been commented out and isn't necessary as the implemenation is
* context(rtx)-centric. I'll leave it here for experiment for those who like
* to turn it on.
#define HAWK_USE_ATOMIC_REFCNT */
typedef struct hawk_val_chunk_t hawk_val_chunk_t;
typedef struct hawk_val_ichunk_t hawk_val_ichunk_t;
typedef struct hawk_val_rchunk_t hawk_val_rchunk_t;
@@ -181,6 +186,19 @@ extern hawk_val_t* hawk_val_zls;
/* represents an empty byte string */
extern hawk_val_t* hawk_val_zlbs;
hawk_val_t* hawk_rtx_makeintval_full (
hawk_rtx_t* rtx,
hawk_int_t v
);
#if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE_ALWAYS hawk_val_t* hawk_rtx_makeintval_inline (hawk_rtx_t* rtx, hawk_int_t v)
{
return HAWK_IN_INT_RANGE(v)? HAWK_INT_TO_VTR(v): hawk_rtx_makeintval_full(rtx, v);
}
#else
#define hawk_rtx_makeintval_inline(rtx, v) (HAWK_IN_INT_RANGE(v)? HAWK_INT_TO_VTR(v): hawk_rtx_makeintval_full(rtx, v))
#endif
void hawk_rtx_freeval (
hawk_rtx_t* rtx,
@@ -193,6 +211,116 @@ void hawk_rtx_freevalchunk (
hawk_val_chunk_t* chunk
);
#if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE_ALWAYS void hawk_rtx_refupval_inline (hawk_rtx_t* rtx, hawk_val_t* val)
{
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val))
{
#if defined(HAWK_USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_ADD)
HAWK_ATOMIC_FETCH_ADD(&val->v_refs, 1, HAWK_ATOMIC_RELAXED);
#else
val->v_refs++;
#endif
}
}
#elif defined(HAWK_USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_ADD)
#define hawk_rtx_refupval_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) { \
HAWK_ATOMIC_FETCH_ADD(&(val)->v_refs, 1, HAWK_ATOMIC_RELAXED); \
} \
} while(0)
#else
#define hawk_rtx_refupval_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) (val)->v_refs++; \
} while(0)
#endif
#if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE_ALWAYS void hawk_rtx_refdownval_inline (hawk_rtx_t* rtx, hawk_val_t* val)
{
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val))
{
HAWK_ASSERT(val->v_refs > 0);
#if defined(HAWK_USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_SUB)
if (HAWK_ATOMIC_FETCH_SUB(&val->v_refs, 1, HAWK_ATOMIC_RELAXED) == 1)
hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE);
#else
val->v_refs--;
if (val->v_refs <= 0) hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE);
#endif
}
}
#elif defined(HAWK_USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_SUB)
#define hawk_rtx_refdownval_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \
HAWK_ASSERT(val->v_refs > 0); \
if (HAWK_ATOMIC_FETCH_SUB(&(val)->v_refs, 1, HAWK_ATOMIC_RELAXED) == 1) \
hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE); \
} \
} while(0)
#else
#define hawk_rtx_refdownval_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \
HAWK_ASSERT(val->v_refs > 0); \
(val)->v_refs--; \
if ((val)->v_refs <= 0) hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE); \
} \
} while(0)
#endif
#if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE_ALWAYS void hawk_rtx_refdownval_nofree_inline (hawk_rtx_t* rtx, hawk_val_t* val)
{
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val))
{
HAWK_ASSERT(val->v_refs > 0);
#if defined(HAWK_USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_SUB)
HAWK_ATOMIC_FETCH_SUB(&val->v_refs, 1, HAWK_ATOMIC_RELAXED);
#else
val->v_refs--;
#endif
}
}
#elif defined(HAWK_USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_SUB)
#define hawk_rtx_refdownval_nofree_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \
HAWK_ASSERT(val->v_refs > 0); \
HAWK_ATOMIC_FETCH_SUB(&(val)->v_refs, 1, HAWK_ATOMIC_RELAXED);
} \
} while(0)
#else
#define hawk_rtx_refdownval_nofree_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \
HAWK_ASSERT(val->v_refs > 0); \
(val)->v_refs--; \
} \
} while(0)
#endif
#if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE int hawk_rtx_valtoint_inline (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l)
{
int n;
hawk_flt_t r;
n = hawk_rtx_valtonum(rtx, v, l, &r);
if (n == 1)
{
*l = (hawk_int_t)r;
n = 0;
}
return n;
}
#else
/* i can't easily inlinde this function without using compiler extentions or changing the return value to a parameter */
#define hawk_rtx_valtoint_inline(rtx, v, l) hawk_rtx_valtoint(rtx, v, l)
#endif
#if defined(__cplusplus)
}
#endif
+104 -110
View File
@@ -26,10 +26,6 @@
#define CHUNKSIZE HAWK_VAL_CHUNK_SIZE
/* this isn't necessary as the implemenation is context(rtx)-centric
* leave it here for experiment.
#define USE_ATOMIC_REFCNT */
static hawk_val_nil_t hawk_nil = {
HAWK_SFN(v_refs) 0,
HAWK_SFN(v_type) HAWK_VAL_NIL,
@@ -583,7 +579,7 @@ hawk_val_t* hawk_rtx_makebchrval (hawk_rtx_t* rtx, hawk_bch_t v)
return HAWK_BCHR_TO_VTR((hawk_bchu_t)v);
}
hawk_val_t* hawk_rtx_makeintval (hawk_rtx_t* rtx, hawk_int_t v)
hawk_val_t* hawk_rtx_makeintval_full (hawk_rtx_t* rtx, hawk_int_t v)
{
hawk_val_int_t* val;
@@ -633,22 +629,27 @@ hawk_val_t* hawk_rtx_makeintval (hawk_rtx_t* rtx, hawk_int_t v)
val->nde = HAWK_NULL;
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("makeintval => %jd [%p] - [%O]\n"), (hawk_intmax_t)v, val, val);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("makeintval => %jd [%p] - [%O]\n"), (hawk_intmax_t)v, val, val);
#endif
return (hawk_val_t*)val;
}
hawk_val_t* hawk_rtx_makeintval (hawk_rtx_t* rtx, hawk_int_t v)
{
return HAWK_IN_INT_RANGE(v)? HAWK_INT_TO_VTR(v): hawk_rtx_makeintval_full(rtx, v);
}
hawk_val_t* hawk_rtx_makefltval (hawk_rtx_t* rtx, hawk_flt_t v)
{
hawk_val_flt_t* val;
if (rtx->vmgr.rfree == HAWK_NULL)
if (!rtx->vmgr.rfree)
{
hawk_val_rchunk_t* c;
hawk_oow_t i;
c = hawk_rtx_allocmem(rtx, HAWK_SIZEOF(hawk_val_rchunk_t));
if (!c) return HAWK_NULL;
if (HAWK_UNLIKELY(!c)) return HAWK_NULL;
c->next = rtx->vmgr.rchunk;
rtx->vmgr.rchunk = (hawk_val_chunk_t*)c;
@@ -672,7 +673,7 @@ hawk_val_t* hawk_rtx_makefltval (hawk_rtx_t* rtx, hawk_flt_t v)
val->nde = HAWK_NULL;
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("makefltval => %Lf [%p] - [%O]\n"), (double)v, val, val);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("makefltval => %Lf [%p] - [%O]\n"), (double)v, val, val);
#endif
return (hawk_val_t*)val;
}
@@ -713,12 +714,12 @@ init:
val->v_gc = 0;
val->val.len = len1 + len2;
val->val.ptr = (hawk_ooch_t*)(val + 1);
if (HAWK_LIKELY(str1)) hawk_copy_oochars_to_oocstr_unlimited (&val->val.ptr[0], str1, len1);
if (str2) hawk_copy_oochars_to_oocstr_unlimited (&val->val.ptr[len1], str2, len2);
if (HAWK_LIKELY(str1)) hawk_copy_oochars_to_oocstr_unlimited(&val->val.ptr[0], str1, len1);
if (str2) hawk_copy_oochars_to_oocstr_unlimited(&val->val.ptr[len1], str2, len2);
val->val.ptr[val->val.len] = '\0';
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("make_str_val => %p - [%O]\n"), val, val);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("make_str_val => %p - [%O]\n"), val, val);
#endif
return (hawk_val_t*)val;
}
@@ -829,7 +830,7 @@ hawk_val_t* hawk_rtx_makenumorstrvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_
{
// always on or auto detect
x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
if (x == 0) return hawk_rtx_makeintval(rtx, l);
if (x == 0) return hawk_rtx_makeintval_inline(rtx, l);
else if (x >= 1) return hawk_rtx_makefltval(rtx, r);
}
@@ -850,7 +851,7 @@ hawk_val_t* hawk_rtx_makenumorstrvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_
{
// always on or auto detect
x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
if (x == 0) return hawk_rtx_makeintval(rtx, l);
if (x == 0) return hawk_rtx_makeintval_inline(rtx, l);
else if (x >= 1) return hawk_rtx_makefltval(rtx, r);
}
@@ -963,12 +964,12 @@ init:
val->v_gc = 0;
val->val.len = len1 + len2;
val->val.ptr = (hawk_bch_t*)(val + 1);
if (HAWK_LIKELY(mbs1)) hawk_copy_bchars_to_bcstr_unlimited (&val->val.ptr[0], mbs1, len1);
if (mbs2) hawk_copy_bchars_to_bcstr_unlimited (&val->val.ptr[len1], mbs2, len2);
if (HAWK_LIKELY(mbs1)) hawk_copy_bchars_to_bcstr_unlimited(&val->val.ptr[0], mbs1, len1);
if (mbs2) hawk_copy_bchars_to_bcstr_unlimited(&val->val.ptr[len1], mbs2, len2);
val->val.ptr[val->val.len] = '\0';
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("make_mbs_val => %p - [%O]\n"), val, val);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("make_mbs_val => %p - [%O]\n"), val, val);
#endif
return (hawk_val_t*)val;
}
@@ -1048,7 +1049,7 @@ hawk_val_t* hawk_rtx_makenumormbsvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_
if (mode > 0 || (mode == 0 && HAWK_RTX_IS_NUMSTRDETECT_ON(rtx)))
{
x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
if (x == 0) return hawk_rtx_makeintval(rtx, l);
if (x == 0) return hawk_rtx_makeintval_inline(rtx, l);
else if (x >= 1) return hawk_rtx_makefltval(rtx, r);
}
@@ -1067,7 +1068,7 @@ hawk_val_t* hawk_rtx_makenumormbsvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_
if (mode > 0 || (mode == 0 && HAWK_RTX_IS_NUMSTRDETECT_ON(rtx)))
{
x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
if (x == 0) return hawk_rtx_makeintval(rtx, l);
if (x == 0) return hawk_rtx_makeintval_inline(rtx, l);
else if (x >= 1) return hawk_rtx_makefltval(rtx, r);
}
@@ -1099,7 +1100,7 @@ hawk_val_t* hawk_rtx_makerexval (hawk_rtx_t* rtx, const hawk_oocs_t* str, hawk_t
val->str.len = str->len;
val->str.ptr = (hawk_ooch_t*)(val + 1);
hawk_copy_oochars_to_oocstr_unlimited (val->str.ptr, str->ptr, str->len);
hawk_copy_oochars_to_oocstr_unlimited(val->str.ptr, str->ptr, str->len);
val->code[0] = code[0];
val->code[1] = code[1];
@@ -1115,7 +1116,7 @@ static void free_arrval (hawk_arr_t* arr, void* dptr, hawk_oow_t dlen)
hawk_val_t* v = (hawk_val_t*)dptr;
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown in arr free - [%O]\n"), v);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown in arr free - [%O]\n"), v);
#endif
#if defined(HAWK_ENABLE_GC)
@@ -1128,19 +1129,18 @@ static void free_arrval (hawk_arr_t* arr, void* dptr, hawk_oow_t dlen)
}
#endif
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
}
static void same_arrval (hawk_arr_t* map, void* dptr, hawk_oow_t dlen)
{
hawk_rtx_t* rtx = *(hawk_rtx_t**)hawk_arr_getxtn(map);
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown nofree in arr free - [%O]\n"), dptr);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown nofree in arr free - [%O]\n"), dptr);
#endif
hawk_rtx_refdownval_nofree(rtx, dptr);
hawk_rtx_refdownval_nofree_inline(rtx, dptr);
}
hawk_val_t* hawk_rtx_makearrval (hawk_rtx_t* rtx, hawk_ooi_t init_capa)
{
static hawk_arr_style_t style =
@@ -1218,7 +1218,7 @@ static void free_mapval (hawk_map_t* map, void* dptr, hawk_oow_t dlen)
hawk_val_t* v = (hawk_val_t*)dptr;
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown in map free - [%O]\n"), v);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown in map free - [%O]\n"), v);
#endif
#if defined(HAWK_ENABLE_GC)
@@ -1231,16 +1231,16 @@ static void free_mapval (hawk_map_t* map, void* dptr, hawk_oow_t dlen)
}
#endif
hawk_rtx_refdownval(rtx, v);
hawk_rtx_refdownval_inline(rtx, v);
}
static void same_mapval (hawk_map_t* map, void* dptr, hawk_oow_t dlen)
{
hawk_rtx_t* rtx = *(hawk_rtx_t**)hawk_map_getxtn(map);
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown nofree in map free - [%O]\n"), dptr);
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("refdown nofree in map free - [%O]\n"), dptr);
#endif
hawk_rtx_refdownval_nofree(rtx, dptr);
hawk_rtx_refdownval_nofree_inline(rtx, dptr);
}
hawk_val_t* hawk_rtx_makemapval (hawk_rtx_t* rtx)
@@ -1328,7 +1328,7 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da
map = hawk_rtx_makemapval(rtx);
if (HAWK_UNLIKELY(!map)) return HAWK_NULL;
hawk_rtx_refupval(rtx, map);
hawk_rtx_refupval_inline(rtx, map);
for (i = 0; i < count; i++)
{
@@ -1354,7 +1354,7 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da
{
iv = *(hawk_int_t*)p->vptr;
}
tmp = hawk_rtx_makeintval(rtx, iv);
tmp = hawk_rtx_makeintval_inline(rtx, iv);
break;
}
@@ -1395,13 +1395,13 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da
if (tmp == HAWK_NULL || hawk_rtx_setmapvalfld(rtx, map, p->key.ptr, p->key.len, tmp) == HAWK_NULL)
{
if (tmp) hawk_rtx_freeval(rtx, tmp, HAWK_RTX_FREEVAL_CACHE);
hawk_rtx_refdownval(rtx, map);
hawk_rtx_refdownval_inline(rtx, map);
return HAWK_NULL;
}
}
hawk_rtx_refdownval_nofree(rtx, map);
hawk_rtx_refdownval_nofree_inline(rtx, map);
return map;
}
@@ -1415,7 +1415,7 @@ hawk_val_t* hawk_rtx_setmapvalfld (hawk_rtx_t* rtx, hawk_val_t* map, const hawk_
* and refdown() the value if htb_upsert() fails. that way, the value
* can be destroyed if it was passed with the reference count of 0.
* so we increment the reference count when htb_upsert() is complete */
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
return v;
}
@@ -1473,7 +1473,7 @@ hawk_val_t* hawk_rtx_setarrvalfld (hawk_rtx_t* rtx, hawk_val_t* arr, hawk_ooi_t
* and refdown() the value if htb_upsert() fails. that way, the value
* can be destroyed if it was passed with the reference count of 0.
* so we increment the reference count when htb_upsert() is complete */
hawk_rtx_refupval(rtx, v);
hawk_rtx_refupval_inline(rtx, v);
return v;
}
@@ -1758,65 +1758,17 @@ void hawk_rtx_freeval (hawk_rtx_t* rtx, hawk_val_t* val, int flags)
void hawk_rtx_refupval(hawk_rtx_t* rtx, hawk_val_t* val)
{
if (HAWK_VTR_IS_POINTER(val))
{
if (HAWK_IS_STATICVAL(val)) return;
#if defined(DEBUG_VAL)
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("ref up [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->v_refs, val);
#endif
#if defined(USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_ADD)
HAWK_ATOMIC_FETCH_ADD(&val->v_refs, 1, HAWK_ATOMIC_RELAXED);
#else
val->v_refs++;
#endif
}
hawk_rtx_refupval_inline(rtx, val);
}
void hawk_rtx_refdownval(hawk_rtx_t* rtx, hawk_val_t* val)
{
if (HAWK_VTR_IS_POINTER(val))
{
if (HAWK_IS_STATICVAL(val)) return;
#if defined(DEBUG_VAL)
hawk_logfmt(hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("ref down [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->v_refs, val);
#endif
/* the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs */
HAWK_ASSERT(val->v_refs > 0);
#if defined(USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_SUB)
if (HAWK_ATOMIC_FETCH_SUB(&val->v_refs, 1, HAWK_ATOMIC_RELAXED) == 1)
{
hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE);
}
#else
val->v_refs--;
if (val->v_refs <= 0)
{
hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE);
}
#endif
}
hawk_rtx_refdownval_inline(rtx, val);
}
void hawk_rtx_refdownval_nofree (hawk_rtx_t* rtx, hawk_val_t* val)
{
if (HAWK_VTR_IS_POINTER(val))
{
if (HAWK_IS_STATICVAL(val)) return;
/* the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs */
HAWK_ASSERT(val->v_refs > 0);
#if defined(USE_ATOMIC_REFCNT) && defined(HAWK_ATOMIC_FETCH_SUB)
HAWK_ATOMIC_FETCH_SUB(&val->v_refs, 1, HAWK_ATOMIC_RELAXED);
#else
val->v_refs--;
#endif
}
hawk_rtx_refdownval_nofree_inline(rtx, val);
}
void hawk_rtx_freevalchunk (hawk_rtx_t* rtx, hawk_val_chunk_t* chunk)
@@ -2153,8 +2105,7 @@ static int val_flt_to_str (hawk_rtx_t* rtx, const hawk_val_flt_t* v, hawk_rtx_va
{
hawk_ooch_t* tmp;
hawk_oow_t tmp_len;
hawk_ooecs_t buf, fbu;
int buf_inited = 0, fbu_inited = 0;
hawk_ooecs_t* buf, * fbu;
int type = out->type & ~HAWK_RTX_VALTOSTR_PRINT;
if (out->type & HAWK_RTX_VALTOSTR_PRINT)
@@ -2168,17 +2119,12 @@ static int val_flt_to_str (hawk_rtx_t* rtx, const hawk_val_flt_t* v, hawk_rtx_va
tmp_len = rtx->gbl.convfmt.len;
}
if (hawk_ooecs_init(&buf, hawk_rtx_getgem(rtx), 256) <= -1) return -1;
buf_inited = 1;
buf = &rtx->format.fltout;
fbu = &rtx->format.fltfmt;
hawk_ooecs_clear(buf);
hawk_ooecs_clear(fbu);
if (hawk_ooecs_init(&fbu, hawk_rtx_getgem(rtx), 256) <= -1)
{
hawk_ooecs_fini(&buf);
return -1;
}
fbu_inited = 1;
tmp = hawk_rtx_format(rtx, &buf, &fbu, tmp, tmp_len, (hawk_oow_t)-1, (hawk_nde_t*)v, &tmp_len);
tmp = hawk_rtx_format(rtx, buf, fbu, tmp, tmp_len, (hawk_oow_t)-1, (hawk_nde_t*)v, &tmp_len);
if (HAWK_UNLIKELY(!tmp)) goto oops;
switch (type)
@@ -2200,14 +2146,14 @@ static int val_flt_to_str (hawk_rtx_t* rtx, const hawk_val_flt_t* v, hawk_rtx_va
goto oops;
}
hawk_copy_oochars_to_oocstr_unlimited (out->u.cplcpy.ptr, tmp, tmp_len);
hawk_copy_oochars_to_oocstr_unlimited(out->u.cplcpy.ptr, tmp, tmp_len);
out->u.cplcpy.len = tmp_len;
break;
case HAWK_RTX_VALTOSTR_CPLDUP:
{
hawk_ooecs_yield (&buf, HAWK_NULL, 0);
out->u.cpldup.ptr = tmp;
out->u.cpldup.ptr = hawk_rtx_dupoochars(rtx, tmp, tmp_len);
if (HAWK_UNLIKELY(!out->u.cpldup.ptr)) goto oops;
out->u.cpldup.len = tmp_len;
break;
}
@@ -2236,13 +2182,9 @@ static int val_flt_to_str (hawk_rtx_t* rtx, const hawk_val_flt_t* v, hawk_rtx_va
}
}
hawk_ooecs_fini(&fbu);
hawk_ooecs_fini(&buf);
return 0;
oops:
if (fbu_inited) hawk_ooecs_fini(&fbu);
if (buf_inited) hawk_ooecs_fini(&buf);
return -1;
}
@@ -2926,6 +2868,13 @@ int hawk_rtx_valtonum (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l, hawk
int hawk_rtx_valtoint (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l)
{
#if defined(HAWK_HAVE_INLINE)
return hawk_rtx_valtoint_inline(rtx, v, l);
#else
/* i can't call hawk_rtx_valtoint() in case HAWK_HAVE_INLINE is not defined
* because the macro hawk_rtx_valtoint_inline() is defined to be hawk_rtx_valtoint().
* repeat the same code here */
int n;
hawk_flt_t r;
@@ -2937,6 +2886,7 @@ int hawk_rtx_valtoint (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l)
}
return n;
#endif
}
int hawk_rtx_valtoflt (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_flt_t* r)
@@ -3256,6 +3206,14 @@ hawk_val_t* hawk_rtx_getrefval (hawk_rtx_t* rtx, hawk_val_ref_t* ref)
return HAWK_RTX_STACK_GBL(rtx, idx);
}
case HAWK_VAL_REF_NAMED:
{
hawk_oow_t idx;
idx = (hawk_oow_t)ref->adr;
HAWK_ASSERT(idx < rtx->named_slot_count);
return HAWK_RTX_STACK_NAMED(rtx, idx);
}
default:
{
hawk_val_t** xref = (hawk_val_t**)ref->adr;
@@ -3302,16 +3260,16 @@ int hawk_rtx_setrefval (hawk_rtx_t* rtx, hawk_val_ref_t* ref, hawk_val_t* val)
hawk_oocs_t str;
int x;
hawk_rtx_refupval(rtx, val);
hawk_rtx_refupval_inline(rtx, val);
str.ptr = hawk_rtx_getvaloocstr(rtx, val, &str.len);
if (HAWK_UNLIKELY(!str.ptr))
{
hawk_rtx_refdownval(rtx, val);
hawk_rtx_refdownval_inline(rtx, val);
return -1;
}
x = hawk_rtx_setrec(rtx, (hawk_oow_t)ref->adr, &str, 0);
hawk_rtx_freevaloocstr(rtx, val, str.ptr);
hawk_rtx_refdownval(rtx, val);
hawk_rtx_refdownval_inline(rtx, val);
return x;
}
}
@@ -3321,6 +3279,42 @@ int hawk_rtx_setrefval (hawk_rtx_t* rtx, hawk_val_ref_t* ref, hawk_val_t* val)
/* ref->adr is the index to the global variables, not a real pointer address for HAWK_VAL_REF_GBL */
return hawk_rtx_setgbl(rtx, (int)ref->adr, val);
case HAWK_VAL_REF_NAMED:
{
hawk_val_t* old;
hawk_val_type_t old_vtype;
HAWK_ASSERT((hawk_oow_t)ref->adr < rtx->named_slot_count);
old = HAWK_RTX_STACK_NAMED(rtx, (hawk_oow_t)ref->adr);
old_vtype = HAWK_RTX_GETVALTYPE(rtx, old);
if (vtype == HAWK_VAL_MAP || vtype == HAWK_VAL_ARR)
{
if (old_vtype != HAWK_VAL_NIL && old_vtype != vtype)
{
if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP))
{
hawk_rtx_seterrnum(rtx, HAWK_NULL, HAWK_ESCALARTONONSCA);
return -1;
}
}
}
else
{
if (old_vtype == HAWK_VAL_MAP || old_vtype == HAWK_VAL_ARR)
{
if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP))
{
hawk_rtx_seterrnum(rtx, HAWK_NULL, HAWK_ENONSCATOSCALAR);
return -1;
}
}
}
if (old != val) return hawk_rtx_setnamedval(rtx, (hawk_oow_t)ref->adr, val);
return 0;
}
case HAWK_VAL_REF_NAMEDIDX:
case HAWK_VAL_REF_GBLIDX:
case HAWK_VAL_REF_LCLIDX:
@@ -3372,9 +3366,9 @@ int hawk_rtx_setrefval (hawk_rtx_t* rtx, hawk_val_ref_t* ref, hawk_val_t* val)
if (*rref != val)
{
/* if the new value is not the same as the old value */
hawk_rtx_refdownval(rtx, *rref);
hawk_rtx_refdownval_inline(rtx, *rref);
*rref = val;
hawk_rtx_refupval(rtx, *rref);
hawk_rtx_refupval_inline(rtx, *rref);
}
return 0;
}
+2 -2
View File
@@ -33,9 +33,9 @@ static int fnc_errno (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
uctx_list_t* list;
hawk_val_t* retv;
list = rtx_to_list (rtx, fi);
list = rtx_to_list(rtx, fi);
retv = hawk_rtx_makeintval (rtx, list->errnum);
retv = hawk_rtx_makeintval(rtx, list->errnum);
if (retv == HAWK_NULL) return -1;
hawk_rtx_setretval(rtx, retv);
+3 -3
View File
@@ -154,10 +154,10 @@ The static library files for developing applications with Hawk.
%setup -q
%build
RPM_OPT_FLAGS="$(echo $RPM_OPT_FLAGS | %{__sed} 's/-O2/-O3/')"
RPM_CFLAGS="$(echo $RPM_OPT_FLAGS | %{__sed} 's/-O2/-O3/') -fPIC -fno-strict-aliasing"
##CFLAGS="${RPM_OPT_FLAGS} -fPIC" CXXFLAGS="${RPM_OPT_FLAGS} -fPIC -std=c++11" ./configure \
CFLAGS="${RPM_OPT_FLAGS} -fPIC" CXXFLAGS="${RPM_OPT_FLAGS} -fPIC" ./configure \
##CFLAGS="${RPM_CFLAGS}" CXXFLAGS="${RPM_CFLAGS} -std=c++11" ./configure \
CFLAGS="${RPM_CFLAGS}" CXXFLAGS="${RPM_CFLAGS}" ./configure \
--prefix=%{_prefix} \
--libdir=%{_libdir} \
--sysconfdir=%{_sysconfdir} \
+2 -1
View File
@@ -20,7 +20,7 @@ endif
check_SCRIPTS += h-003.hawk h-004.hawk h-009.hawk h-010.hawk \
h-011.hawk h-012.hawk h-013.hawk h-014.hawk h-015.hawk \
h-016.hawk h-017.hawk h-018.hawk h-019.hawk h-020.hawk \
h-021.hawk h-022.hawk h-023.hawk
h-021.hawk h-022.hawk h-023.hawk h-024.hawk
check_SCRIPTS += regress-filename.sh
@@ -32,6 +32,7 @@ EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \
bibtex-to-html.hawk bibtex-to-html.out \
fs-test.hawk fs-test.in fs-test.out \
JSON.awk.in JSON.awk.out \
h-024-child.hawk h-024.in \
two-way-pipe.hawk two-way-pipe.out
check_PROGRAMS = t-001 t-002 t-003 t-004 t-005 t-006 t-007 t-008 t-009
+2 -1
View File
@@ -652,7 +652,7 @@ LIBADD_COMMON = ../lib/libhawk.la $(LIBM)
check_SCRIPTS = $(am__append_1) h-003.hawk h-004.hawk h-009.hawk \
h-010.hawk h-011.hawk h-012.hawk h-013.hawk h-014.hawk \
h-015.hawk h-016.hawk h-017.hawk h-018.hawk h-019.hawk \
h-020.hawk h-021.hawk h-022.hawk h-023.hawk \
h-020.hawk h-021.hawk h-022.hawk h-023.hawk h-024.hawk \
regress-filename.sh
check_ERRORS = e-001.err
EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \
@@ -660,6 +660,7 @@ EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \
bibtex-to-html.hawk bibtex-to-html.out \
fs-test.hawk fs-test.in fs-test.out \
JSON.awk.in JSON.awk.out \
h-024-child.hawk h-024.in \
two-way-pipe.hawk two-way-pipe.out
t_001_SOURCES = t-001.c tap.h
+82
View File
@@ -0,0 +1,82 @@
BEGIN {
if (CASE == 1)
{
ARGV[1] = "a=20";
}
else if (CASE == 2)
{
a = "hello world";
ARGV[1] = "a=20";
}
else if (CASE == 3)
{
x = "hello world";
ARGV[1] = "a=20";
}
else if (CASE == 4)
{
qa = "hello world";
ARGV[1] = "a=20";
}
else if (CASE == 5)
{
ARGV[1] = "a=20";
}
else if (CASE == 6)
{
a = "hello world";
ARGV[1] = "a=20";
}
else if (CASE == 7)
{
ARGV[1] = "a=20";
ARGV[2] = "bb=30";
}
else if (CASE == 8)
{
ARGV[1] = "a=20";
ARGV[2] = "qqq=99";
}
else if (CASE == 9)
{
ARGV[1] = "ddd=44";
}
else if (CASE == 10)
{
ARGV[1] = "a=20";
ARGV[2] = "bb=30";
ARGV[3] = "ccc=40";
}
else if (CASE == 11)
{
ARGV[1] = "rrr=300";
ARGV[2] = "ttt=500";
}
}
{
if (CASE == 1)
print qqq, a, $1;
else if (CASE == 2)
print qqq, a, $1;
else if (CASE == 3)
print qqq, a, x, $1;
else if (CASE == 4)
print qqq, qa, a, $1;
else if (CASE == 5)
print qqq, rrr, sss, a, $1;
else if (CASE == 6)
print qqq, rrr, a, $1;
else if (CASE == 7)
print qqq, a, bb, $1;
else if (CASE == 8)
print qqq, a, $1;
else if (CASE == 9)
print a, bb, ccc, ddd, $1;
else if (CASE == 10)
print qqq, a, bb, ccc, $1;
else if (CASE == 11)
print qqq, rrr, sss, ttt, $1;
exit;
}
+50
View File
@@ -0,0 +1,50 @@
@pragma entry main
@pragma implicit off
@include "tap.inc";
function slurp(path, line, out, first)
{
out = "";
first = 1;
while ((getline line < path) > 0)
{
if (!first) out = out "\n";
out = out line;
first = 0;
}
close(path);
return out;
}
function run_case(caseno, vopts, userargs, expected, cmd, inf, outf, got)
{
inf = sprintf("%s/%s", TDIR, "h-024.in");
outf = sprintf("/tmp/%s.%d.%d.out", "h-024", sys::getpid(), caseno);
cmd = sprintf("%s -vCASE=%d %s -f %s/%s --modlibdirs=%s %s %s > %s",
ARGV[0], caseno, vopts, TDIR, "h-024-child.hawk", hawk::modlibdirs(), userargs, inf, outf);
system(cmd);
got = slurp(outf);
tap_ensure(got, expected, @SCRIPTNAME, @SCRIPTLINE);
system(sprintf("rm -f %s", outf));
}
function main()
{
run_case(1, "-vqqq=20", "dummy", "20 20 alpha");
run_case(2, "-vqqq=20", "dummy", "20 20 alpha");
run_case(3, "-vqqq=20", "dummy", "20 20 hello world alpha");
run_case(4, "-vqqq=20", "dummy", "20 hello world 20 alpha");
run_case(5, "-vqqq=20 -vrrr=30 -vsss=forty", "dummy", "20 30 forty 20 alpha");
run_case(6, "-vqqq=20 -vrrr=30", "dummy", "20 30 20 alpha");
run_case(7, "-vqqq=20", "dummy1 dummy2", "20 20 30 alpha");
run_case(8, "-vqqq=20", "dummy1 dummy2", "99 20 alpha");
run_case(9, "-va=11 -vbb=22 -vccc=33", "dummy", "11 22 33 44 alpha");
run_case(10, "-vqqq=20 -va=11 -vbb=22", "dummy1 dummy2 dummy3", "20 20 30 40 alpha");
run_case(11, "-vqqq=20 -vrrr=30 -vsss=40", "dummy1 dummy2", "20 300 40 500 alpha");
tap_end();
}
+1
View File
@@ -0,0 +1 @@
alpha beta