Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
894cc517
wa
项目概览
wa-lang
/
wa
10 个月 前同步成功
通知
68
Star
655
Fork
45
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
wa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
894cc517
编写于
4月 04, 2023
作者:
chai2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
assert 语义调整为 testing 环境的运行时函数
上级
d3b0bd33
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
31 addition
and
12 deletion
+31
-12
internal/types/builtins.go
internal/types/builtins.go
+31
-12
未找到文件。
internal/types/builtins.go
浏览文件 @
894cc517
...
...
@@ -7,6 +7,8 @@
package
types
import
(
"strings"
"wa-lang.org/wa/internal/ast"
"wa-lang.org/wa/internal/constant"
"wa-lang.org/wa/internal/token"
...
...
@@ -609,23 +611,40 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
// result is constant - no need to record signature
case
_Assert
:
// assert(pred) causes a typechecker error if pred is false.
// The result of assert is the value of pred if there is no error.
// Note: assert is only available in self-test mode.
if
x
.
mode
!=
constant_
||
!
isBoolean
(
x
.
typ
)
{
check
.
invalidArg
(
x
.
pos
(),
"%s is not a boolean constant"
,
x
)
// assert 语义变化:
// 变成 testing 环境使用的运行时函数
// 必须是在测试代码中有效
filename
:=
check
.
fset
.
Position
(
x
.
pos
())
.
Filename
if
!
strings
.
Contains
(
filename
,
"_test."
)
&&
!
strings
.
HasPrefix
(
filename
,
"test_"
)
{
check
.
errorf
(
x
.
pos
(),
"assert only for testing"
)
return
}
if
x
.
val
.
Kind
()
!=
constant
.
Bool
{
check
.
errorf
(
x
.
pos
(),
"internal error: value of %s should be a boolean constant"
,
x
)
// 放松检查, bool 变量放到运行时处理
if
!
isBoolean
(
x
.
typ
)
{
check
.
invalidArg
(
x
.
pos
(),
"%s is not a boolean type"
,
x
)
return
}
if
!
constant
.
BoolVal
(
x
.
val
)
{
check
.
errorf
(
call
.
Pos
(),
"%v failed"
,
call
)
// compile-time assertion failure - safe to continue
}
// result is constant - no need to record signature
if
false
{
// assert(pred) causes a typechecker error if pred is false.
// The result of assert is the value of pred if there is no error.
// Note: assert is only available in self-test mode.
if
x
.
mode
!=
constant_
||
!
isBoolean
(
x
.
typ
)
{
check
.
invalidArg
(
x
.
pos
(),
"%s is not a boolean constant"
,
x
)
return
}
if
x
.
val
.
Kind
()
!=
constant
.
Bool
{
check
.
errorf
(
x
.
pos
(),
"internal error: value of %s should be a boolean constant"
,
x
)
return
}
if
!
constant
.
BoolVal
(
x
.
val
)
{
check
.
errorf
(
call
.
Pos
(),
"%v failed"
,
call
)
// compile-time assertion failure - safe to continue
}
// result is constant - no need to record signature
}
case
_Trace
:
// trace(x, y, z, ...) dumps the positions, expressions, and
// values of its arguments. The result of trace is the value
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录