Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
d4e6fc89
wa
项目概览
wa-lang
/
wa
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
d4e6fc89
编写于
7月 24, 2022
作者:
3
3dgen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加cconstans包
上级
69671b1d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
229 addition
and
0 deletion
+229
-0
internal/backends/compiler_c/cir/cconstant/cconstant.go
internal/backends/compiler_c/cir/cconstant/cconstant.go
+229
-0
未找到文件。
internal/backends/compiler_c/cir/cconstant/cconstant.go
0 → 100644
浏览文件 @
d4e6fc89
//
package
cconstant
import
(
"fmt"
"math/big"
"strings"
"github.com/wa-lang/wa/internal/3rdparty/errors"
"github.com/wa-lang/wa/internal/backends/compiler_c/cir/ctypes"
)
type
Constant
interface
{
// IsConstant() Constant特有方法
isConstant
()
}
/**************************************
Zero: 0值常数
**************************************/
type
Zero
struct
{
}
func
NewZero
()
*
Zero
{
return
&
Zero
{}
}
func
(
z
*
Zero
)
CIRString
()
string
{
return
"0"
}
func
(
z
*
Zero
)
Type
()
ctypes
.
Type
{
return
ctypes
.
Void
}
func
(
z
*
Zero
)
IsExpr
()
{}
/**************************************
Bool
**************************************/
type
Bool
struct
{
X
bool
}
func
NewBool
(
x
bool
)
*
Bool
{
return
&
Bool
{
X
:
x
}
}
func
(
b
*
Bool
)
CIRString
()
string
{
if
b
.
X
{
return
"true"
}
return
"false"
}
func
(
b
*
Bool
)
Type
()
ctypes
.
Type
{
return
ctypes
.
Bool
}
func
(
b
*
Bool
)
IsExpr
()
{}
/**************************************
Int: 整型常数
**************************************/
type
Int
struct
{
// 整数类型
typ
*
ctypes
.
IntType
// 常数值
x
*
big
.
Int
}
// NewInt() 根据指定的类型和常数值创建整型常数
func
NewInt
(
t
*
ctypes
.
IntType
,
v
int64
)
*
Int
{
return
&
Int
{
typ
:
t
,
x
:
big
.
NewInt
(
v
)}
}
// NewIntFromString() 从字符串中创建指定类型的整型常数
// 字符串可为以下形式之一:
// * boolean literal
// true | false
// * integer literal
// [-]?[0-9]+
// * hexadecimal integer literal
// [us]0x[0-9A-Fa-f]+
func
NewIntFromString
(
t
*
ctypes
.
IntType
,
s
string
)
(
*
Int
,
error
)
{
// 布尔型
switch
s
{
case
"true"
:
if
!
t
.
Equal
(
ctypes
.
Int8
)
{
return
nil
,
errors
.
Errorf
(
"类型错误。布尔型应为types.Int8,而非输入的:%T"
,
t
)
}
return
NewInt
(
ctypes
.
Int8
,
0
),
nil
case
"false"
:
if
!
t
.
Equal
(
ctypes
.
Int8
)
{
return
nil
,
errors
.
Errorf
(
"类型错误。布尔型应为types.Int8,而非输入的:%T"
,
t
)
}
return
NewInt
(
ctypes
.
Int8
,
1
),
nil
}
// Hexadecimal integer literal.
switch
{
// unsigned hexadecimal integer literal
case
strings
.
HasPrefix
(
s
,
"u0x"
)
:
s
=
s
[
len
(
"u0x"
)
:
]
const
base
=
16
v
,
_
:=
(
&
big
.
Int
{})
.
SetString
(
s
,
base
)
if
v
==
nil
{
return
nil
,
errors
.
Errorf
(
"无法解析整型数: %q"
,
s
)
}
return
&
Int
{
typ
:
t
,
x
:
v
},
nil
// signed hexadecimal integer literal
case
strings
.
HasPrefix
(
s
,
"s0x"
)
:
// Parse signed hexadecimal integer literal in two's complement notation.
// First parse as unsigned hex, then check if sign bit is set.
s
=
s
[
len
(
"s0x"
)
:
]
const
base
=
16
v
,
_
:=
(
&
big
.
Int
{})
.
SetString
(
s
,
base
)
if
v
==
nil
{
return
nil
,
errors
.
Errorf
(
"无法解析整型数: %q"
,
s
)
}
bitSize
:=
t
.
Kind
.
GetBitSize
()
// Check if signed.
if
v
.
Bit
(
bitSize
-
1
)
==
1
{
// Compute actual negative value from two's complement.
//
// If x is 0xFFFF with type i16, then the actual negative value is
// `x - 0x10000`, in other words `x - 2^n`.
n
:=
int64
(
bitSize
)
// n^2
maxPlus1
:=
new
(
big
.
Int
)
.
Exp
(
big
.
NewInt
(
2
),
big
.
NewInt
(
n
),
nil
)
v
=
new
(
big
.
Int
)
.
Sub
(
v
,
maxPlus1
)
}
return
&
Int
{
typ
:
t
,
x
:
v
},
nil
}
// Integer literal.
v
,
_
:=
(
&
big
.
Int
{})
.
SetString
(
s
,
10
)
if
v
==
nil
{
return
nil
,
errors
.
Errorf
(
"无法解析整型数: %q"
,
s
)
}
return
&
Int
{
typ
:
t
,
x
:
v
},
nil
}
// String returns the LLVM syntax representation of the constant as a type-value
// pair.
func
(
c
*
Int
)
CIRString
()
string
{
return
c
.
Ident
()
}
// Type returns the type of the constant.
func
(
c
*
Int
)
Type
()
ctypes
.
Type
{
return
c
.
typ
}
// Ident returns the identifier associated with the constant.
func
(
c
*
Int
)
Ident
()
string
{
return
c
.
x
.
String
()
}
func
(
c
*
Int
)
isConstant
()
{}
func
(
c
*
Int
)
IsExpr
()
{}
/**************************************
Float:
**************************************/
type
Float
struct
{
// 常数值
x
float32
}
//
func
NewFloat
(
v
float32
)
*
Float
{
return
&
Float
{
x
:
v
}
}
func
(
f
*
Float
)
CIRString
()
string
{
return
fmt
.
Sprint
(
f
.
x
)
}
func
(
f
*
Float
)
Type
()
ctypes
.
Type
{
return
ctypes
.
Double
}
func
(
d
*
Float
)
IsExpr
()
{}
/**************************************
Double:
**************************************/
type
Double
struct
{
// 常数值
x
float64
}
//
func
NewDouble
(
v
float64
)
*
Double
{
return
&
Double
{
x
:
v
}
}
func
(
d
*
Double
)
CIRString
()
string
{
return
fmt
.
Sprint
(
d
.
x
)
}
func
(
d
*
Double
)
Type
()
ctypes
.
Type
{
return
ctypes
.
Double
}
func
(
d
*
Double
)
IsExpr
()
{}
/**************************************
Double:
**************************************/
type
String
struct
{
// 常数值
x
string
}
//
func
NewString
(
v
string
)
*
String
{
return
&
String
{
x
:
v
}
}
func
(
s
*
String
)
CIRString
()
string
{
return
"
\"
"
+
s
.
x
+
"
\"
"
}
func
(
s
*
String
)
Type
()
ctypes
.
Type
{
return
&
ctypes
.
StringType
{}
}
func
(
s
*
String
)
IsExpr
()
{}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录