Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
42c4f92d
提交
42c4f92d
authored
7月 12, 2012
作者:
Thomas Mueller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Documentation / cleanup
上级
e4842f9d
隐藏空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
529 行增加
和
149 行删除
+529
-149
ClassObj.java
h2/src/tools/org/h2/java/ClassObj.java
+31
-1
Expr.java
h2/src/tools/org/h2/java/Expr.java
+168
-78
JavaParser.java
h2/src/tools/org/h2/java/JavaParser.java
+47
-25
Statement.java
h2/src/tools/org/h2/java/Statement.java
+206
-31
Test.java
h2/src/tools/org/h2/java/Test.java
+3
-2
TestApp.java
h2/src/tools/org/h2/java/TestApp.java
+27
-2
PrintStream.java
h2/src/tools/org/h2/java/io/PrintStream.java
+1
-1
Integer.java
h2/src/tools/org/h2/java/lang/Integer.java
+7
-1
Long.java
h2/src/tools/org/h2/java/lang/Long.java
+7
-1
String.java
h2/src/tools/org/h2/java/lang/String.java
+28
-3
System.java
h2/src/tools/org/h2/java/lang/System.java
+4
-4
没有找到文件。
h2/src/tools/org/h2/java/ClassObj.java
浏览文件 @
42c4f92d
...
...
@@ -372,6 +372,11 @@ class Type {
return
asString
();
}
/**
* Get the C++ code.
*
* @return the C++ code
*/
public
String
asString
()
{
StringBuilder
buff
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
arrayLevel
;
i
++)
{
...
...
@@ -392,10 +397,14 @@ class Type {
}
}
for
(
int
i
=
0
;
i
<
arrayLevel
;
i
++)
{
buff
.
append
(
" >"
);
if
(
refCount
)
{
buff
.
append
(
" >"
);
}
else
{
if
(!
classObj
.
isPrimitive
)
{
buff
.
append
(
"*"
);
}
}
buff
.
append
(
" >"
);
}
if
(!
refCount
)
{
if
(
isObject
())
{
...
...
@@ -417,5 +426,26 @@ class Type {
return
false
;
}
/**
* Get the default value, for primitive types (0 usually).
*
* @param context the context
* @return the expression
*/
public
Expr
getDefaultValue
(
JavaParser
context
)
{
if
(
classObj
.
isPrimitive
)
{
LiteralExpr
literal
=
new
LiteralExpr
(
context
,
classObj
.
className
);
literal
.
literal
=
"0"
;
CastExpr
cast
=
new
CastExpr
();
cast
.
type
=
this
;
cast
.
expr
=
literal
;
cast
.
type
=
this
;
return
cast
;
}
LiteralExpr
literal
=
new
LiteralExpr
(
context
,
classObj
.
className
);
literal
.
literal
=
"null"
;
return
literal
;
}
}
h2/src/tools/org/h2/java/Expr.java
浏览文件 @
42c4f92d
...
...
@@ -14,9 +14,15 @@ import java.util.Iterator;
*/
public
interface
Expr
{
/**
* Get the C++ code.
*
* @return the C++ code
*/
String
asString
();
Type
getType
();
Expr
cast
(
Type
type
);
void
setType
(
Type
type
);
}
...
...
@@ -34,13 +40,18 @@ abstract class ExprBase implements Expr {
*/
class
CallExpr
extends
ExprBase
{
/**
* The parameters.
*/
final
ArrayList
<
Expr
>
args
=
new
ArrayList
<
Expr
>();
private
final
JavaParser
context
;
private
final
String
className
;
private
final
String
name
;
private
Expr
expr
;
private
ClassObj
classObj
;
private
MethodObj
method
;
private
Type
type
;
CallExpr
(
JavaParser
context
,
Expr
expr
,
String
className
,
String
name
)
{
this
.
context
=
context
;
...
...
@@ -93,7 +104,8 @@ class CallExpr extends ExprBase {
}
FieldObj
f
=
paramIt
.
next
();
i
++;
buff
.
append
(
a
.
cast
(
f
.
type
).
asString
());
a
.
setType
(
f
.
type
);
buff
.
append
(
a
.
asString
());
}
buff
.
append
(
")"
);
}
...
...
@@ -105,8 +117,8 @@ class CallExpr extends ExprBase {
return
method
.
returnType
;
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -116,20 +128,37 @@ class CallExpr extends ExprBase {
*/
class
AssignExpr
extends
ExprBase
{
/**
* The target variable or field.
*/
Expr
left
;
/**
* The operation (=, +=,...).
*/
String
op
;
/**
* The expression.
*/
Expr
right
;
/**
* The type.
*/
Type
type
;
public
String
asString
()
{
return
left
.
asString
()
+
" "
+
op
+
" "
+
right
.
cast
(
left
.
getType
()).
asString
();
right
.
setType
(
left
.
getType
());
return
left
.
asString
()
+
" "
+
op
+
" "
+
right
.
asString
();
}
public
Type
getType
()
{
return
left
.
getType
();
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -139,8 +168,20 @@ class AssignExpr extends ExprBase {
*/
class
ConditionalExpr
extends
ExprBase
{
/**
* The condition.
*/
Expr
condition
;
Expr
ifTrue
,
ifFalse
;
/**
* The 'true' expression.
*/
Expr
ifTrue
;
/**
* The 'false' expression.
*/
Expr
ifFalse
;
public
String
asString
()
{
return
condition
.
asString
()
+
" ? "
+
ifTrue
.
asString
()
+
" : "
+
ifFalse
.
asString
();
...
...
@@ -150,12 +191,9 @@ class ConditionalExpr extends ExprBase {
return
ifTrue
.
getType
();
}
public
Expr
cast
(
Type
type
)
{
ConditionalExpr
e2
=
new
ConditionalExpr
();
e2
.
condition
=
condition
;
e2
.
ifTrue
=
ifTrue
.
cast
(
type
);
e2
.
ifFalse
=
ifFalse
.
cast
(
type
);
return
e2
;
public
void
setType
(
Type
type
)
{
ifTrue
.
setType
(
type
);
ifFalse
.
setType
(
type
);
}
}
...
...
@@ -165,7 +203,11 @@ class ConditionalExpr extends ExprBase {
*/
class
LiteralExpr
extends
ExprBase
{
/**
* The literal expression.
*/
String
literal
;
private
final
JavaParser
context
;
private
final
String
className
;
private
Type
type
;
...
...
@@ -177,7 +219,11 @@ class LiteralExpr extends ExprBase {
public
String
asString
()
{
if
(
"null"
.
equals
(
literal
))
{
return
type
.
asString
()
+
"()"
;
Type
t
=
getType
();
if
(
t
.
isObject
())
{
return
"("
+
getType
().
asString
()
+
") 0"
;
}
return
t
.
asString
()
+
"()"
;
}
return
literal
;
}
...
...
@@ -190,12 +236,8 @@ class LiteralExpr extends ExprBase {
return
type
;
}
public
Expr
cast
(
Type
type
)
{
if
(
"null"
.
equals
(
literal
))
{
// TODO should be immutable
this
.
type
=
type
;
}
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -205,10 +247,23 @@ class LiteralExpr extends ExprBase {
*/
class
OpExpr
extends
ExprBase
{
/**
* The left hand side.
*/
Expr
left
;
/**
* The operation.
*/
String
op
;
/**
* The right hand side.
*/
Expr
right
;
private
final
JavaParser
context
;
private
Type
type
;
OpExpr
(
JavaParser
context
)
{
this
.
context
=
context
;
...
...
@@ -227,7 +282,7 @@ class OpExpr extends ExprBase {
if
(
left
.
getType
().
isObject
()
||
right
.
getType
().
isObject
())
{
// TODO convert primitive to to String, call toString
StringBuilder
buff
=
new
StringBuilder
();
if
(
JavaParser
.
REF_COUNT
)
{
if
(
type
.
refCount
)
{
buff
.
append
(
"ptr<java_lang_StringBuilder>(new java_lang_StringBuilder("
);
}
else
{
buff
.
append
(
"(new java_lang_StringBuilder("
);
...
...
@@ -288,8 +343,8 @@ class OpExpr extends ExprBase {
return
lt
;
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -299,31 +354,55 @@ class OpExpr extends ExprBase {
*/
class
NewExpr
extends
ExprBase
{
/**
* The class.
*/
ClassObj
classObj
;
ArrayList
<
Expr
>
arrayInitExpr
=
new
ArrayList
<
Expr
>();
ArrayList
<
Expr
>
args
=
new
ArrayList
<
Expr
>();
final
JavaParser
context
;
NewExpr
(
JavaParser
context
)
{
this
.
context
=
context
;
}
/**
* The constructor parameters (for objects).
*/
final
ArrayList
<
Expr
>
args
=
new
ArrayList
<
Expr
>();
/**
* The array bounds (for arrays).
*/
final
ArrayList
<
Expr
>
arrayInitExpr
=
new
ArrayList
<
Expr
>();
/**
* The type.
*/
Type
type
;
public
String
asString
()
{
boolean
refCount
=
type
.
refCount
;
StringBuilder
buff
=
new
StringBuilder
();
if
(
arrayInitExpr
.
size
()
>
0
)
{
if
(
JavaParser
.
REF_COUNT
)
{
buff
.
append
(
"ptr< array< "
+
classObj
.
toString
()
+
" > >"
);
if
(
refCount
)
{
if
(
classObj
.
isPrimitive
)
{
buff
.
append
(
"ptr< array< "
+
classObj
+
" > >"
);
}
else
{
buff
.
append
(
"ptr< array< ptr< "
+
classObj
+
" > > >"
);
}
}
if
(
classObj
.
isPrimitive
)
{
buff
.
append
(
"(new array< "
+
classObj
+
" >(1 "
);
}
else
{
if
(
refCount
)
{
buff
.
append
(
"(new array< ptr< "
+
classObj
+
" > >(1 "
);
}
else
{
buff
.
append
(
"(new array< "
+
classObj
+
"* >(1 "
);
}
}
buff
.
append
(
"(new array< "
+
classObj
+
" >(1 "
);
for
(
Expr
e
:
arrayInitExpr
)
{
buff
.
append
(
"* "
).
append
(
e
.
asString
());
}
buff
.
append
(
"))"
);
}
else
{
if
(
JavaParser
.
REF_COUNT
)
{
buff
.
append
(
"ptr< "
+
classObj
.
toString
()
+
" >"
);
if
(
refCount
)
{
buff
.
append
(
"ptr< "
+
classObj
+
" >"
);
}
buff
.
append
(
"(new "
+
JavaParser
.
toC
(
classObj
.
toString
())
);
buff
.
append
(
"(new "
+
classObj
);
buff
.
append
(
"("
);
int
i
=
0
;
for
(
Expr
a
:
args
)
{
...
...
@@ -344,8 +423,8 @@ class NewExpr extends ExprBase {
return
t
;
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -438,8 +517,7 @@ class StringExpr extends ExprBase {
return
buff
.
toString
();
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
}
}
...
...
@@ -449,9 +527,22 @@ class StringExpr extends ExprBase {
*/
class
VariableExpr
extends
ExprBase
{
/**
* The variable name.
*/
String
name
;
/**
* The base expression (the first element in a.b variables).
*/
Expr
base
;
/**
* The field.
*/
FieldObj
field
;
String
name
;
private
Type
type
;
private
final
JavaParser
context
;
VariableExpr
(
JavaParser
context
)
{
...
...
@@ -499,35 +590,8 @@ class VariableExpr extends ExprBase {
return
field
.
type
;
}
public
Expr
cast
(
Type
type
)
{
return
this
;
}
}
/**
* A array access expression.
*/
class
ArrayExpr
extends
ExprBase
{
Expr
expr
;
ArrayList
<
Expr
>
indexes
=
new
ArrayList
<
Expr
>();
public
String
asString
()
{
StringBuilder
buff
=
new
StringBuilder
();
buff
.
append
(
expr
.
toString
());
for
(
Expr
e
:
indexes
)
{
buff
.
append
(
'['
).
append
(
e
.
toString
()).
append
(
']'
);
}
return
buff
.
toString
();
}
public
Type
getType
()
{
return
expr
.
getType
();
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -537,8 +601,15 @@ class ArrayExpr extends ExprBase {
*/
class
ArrayInitExpr
extends
ExprBase
{
/**
* The expression list.
*/
final
ArrayList
<
Expr
>
list
=
new
ArrayList
<
Expr
>();
/**
* The type.
*/
Type
type
;
ArrayList
<
Expr
>
list
=
new
ArrayList
<
Expr
>();
public
Type
getType
()
{
return
type
;
...
...
@@ -557,8 +628,8 @@ class ArrayInitExpr extends ExprBase {
return
buff
.
toString
();
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -568,9 +639,16 @@ class ArrayInitExpr extends ExprBase {
*/
class
CastExpr
extends
ExprBase
{
Type
type
;
/**
* The expression.
*/
Expr
expr
;
/**
* The cast type.
*/
Type
type
;
public
Type
getType
()
{
return
type
;
}
...
...
@@ -579,8 +657,8 @@ class CastExpr extends ExprBase {
return
"("
+
type
.
asString
()
+
") "
+
expr
.
asString
();
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
...
...
@@ -590,9 +668,21 @@ class CastExpr extends ExprBase {
*/
class
ArrayAccessExpr
extends
ExprBase
{
/**
* The base expression.
*/
Expr
base
;
/**
* The index.
*/
Expr
index
;
/**
* The type.
*/
Type
type
;
public
Type
getType
()
{
Type
t
=
new
Type
();
t
.
classObj
=
base
.
getType
().
classObj
;
...
...
@@ -604,8 +694,8 @@ class ArrayAccessExpr extends ExprBase {
return
base
.
asString
()
+
"->at("
+
index
.
asString
()
+
")"
;
}
public
Expr
cast
(
Type
type
)
{
return
this
;
public
void
setType
(
Type
type
)
{
this
.
type
=
type
;
}
}
h2/src/tools/org/h2/java/JavaParser.java
浏览文件 @
42c4f92d
...
...
@@ -22,7 +22,15 @@ import org.h2.util.New;
*/
public
class
JavaParser
{
public
static
final
boolean
REF_COUNT
=
true
;
/**
* Whether ref-counting is used.
*/
public
static
final
boolean
REF_COUNT
=
false
;
/**
* Whether ref-counting is used for constants.
*/
public
static
final
boolean
REF_COUNT_STATIC
=
false
;
private
static
final
HashMap
<
String
,
ClassObj
>
BUILT_IN_CLASSES
=
New
.
hashMap
();
...
...
@@ -245,6 +253,12 @@ public class JavaParser {
return
c
;
}
/**
* Get the class for a built-in type.
*
* @param type the type
* @return the class or null if not found
*/
static
ClassObj
getBuiltInClass
(
String
type
)
{
return
BUILT_IN_CLASSES
.
get
(
type
);
}
...
...
@@ -386,6 +400,8 @@ public class JavaParser {
}
else
{
field
.
value
=
readExpr
();
}
}
else
{
field
.
value
=
field
.
type
.
getDefaultValue
(
this
);
}
read
(
";"
);
if
(
isStatic
)
{
...
...
@@ -495,8 +511,8 @@ public class JavaParser {
while
(
source
.
charAt
(
current
.
index
)
!=
'\n'
)
{
current
.
index
++;
}
St
atementNative
stat
=
new
StatementNative
();
stat
.
code
=
source
.
substring
(
start
,
current
.
index
).
trim
(
);
St
ring
s
=
source
.
substring
(
start
,
current
.
index
).
trim
();
StatementNative
stat
=
new
StatementNative
(
s
);
read
();
return
isC
?
stat
:
null
;
}
else
if
(
readIf
(
"/*"
))
{
...
...
@@ -505,8 +521,8 @@ public class JavaParser {
while
(
source
.
charAt
(
current
.
index
)
!=
'*'
||
source
.
charAt
(
current
.
index
+
1
)
!=
'/'
)
{
current
.
index
++;
}
St
atementNative
stat
=
new
StatementNative
();
stat
.
code
=
source
.
substring
(
start
,
current
.
index
).
trim
(
);
St
ring
s
=
source
.
substring
(
start
,
current
.
index
).
trim
();
StatementNative
stat
=
new
StatementNative
(
s
);
current
.
index
+=
2
;
read
();
return
isC
?
stat
:
null
;
...
...
@@ -554,16 +570,16 @@ public class JavaParser {
read
(
";"
);
return
new
ContinueStatement
();
}
else
if
(
readIf
(
"switch"
))
{
SwitchStatement
switchStat
=
new
SwitchStatement
();
read
(
"("
);
switchStat
.
expr
=
readExpr
(
);
SwitchStatement
switchStat
=
new
SwitchStatement
(
readExpr
()
);
read
(
")"
);
read
(
"{"
);
while
(
true
)
{
if
(
readIf
(
"default"
))
{
read
(
":"
);
StatementBlock
block
=
new
StatementBlock
();
switchStat
.
defaultBlock
=
block
;
switchStat
.
setDefaultBlock
(
block
)
;
while
(
true
)
{
block
.
instructions
.
add
(
readStatement
());
if
(
current
.
token
.
equals
(
"case"
)
||
current
.
token
.
equals
(
"default"
)
||
current
.
token
.
equals
(
"}"
))
{
...
...
@@ -571,7 +587,7 @@ public class JavaParser {
}
}
}
else
if
(
readIf
(
"case"
))
{
switchStat
.
cases
.
add
(
readExpr
()
);
Expr
expr
=
readExpr
(
);
read
(
":"
);
StatementBlock
block
=
new
StatementBlock
();
while
(
true
)
{
...
...
@@ -580,7 +596,7 @@ public class JavaParser {
break
;
}
}
switchStat
.
blocks
.
add
(
block
);
switchStat
.
addCase
(
expr
,
block
);
}
else
if
(
readIf
(
"}"
))
{
break
;
}
...
...
@@ -654,8 +670,7 @@ public class JavaParser {
f
.
type
=
dec
.
type
;
f
.
name
=
varName
;
localVars
.
put
(
varName
,
f
);
dec
.
variables
.
add
(
varName
);
dec
.
values
.
add
(
value
);
dec
.
addVariable
(
varName
,
value
);
if
(
readIf
(
";"
))
{
break
;
}
...
...
@@ -666,8 +681,7 @@ public class JavaParser {
current
=
start
;
// ExprStatement
}
ExprStatement
stat
=
new
ExprStatement
();
stat
.
expr
=
readExpr
();
ExprStatement
stat
=
new
ExprStatement
(
readExpr
());
read
(
";"
);
return
stat
;
}
...
...
@@ -992,7 +1006,7 @@ public class JavaParser {
if
(
ch
>=
'a'
&&
ch
<=
'z'
)
{
// don't use Character.toUpperCase
// to avoid locale problems
// (the uppercase of
i isn't always I
)
// (the uppercase of
'i' is not always 'I'
)
buff
.
append
((
char
)
(
ch
+
'A'
-
'a'
));
}
else
if
(
ch
>=
'A'
&&
ch
<=
'Z'
)
{
buff
.
append
(
ch
);
...
...
@@ -1026,7 +1040,7 @@ public class JavaParser {
private
Expr
readExpr5
()
{
if
(
readIf
(
"new"
))
{
NewExpr
expr
=
new
NewExpr
(
this
);
NewExpr
expr
=
new
NewExpr
();
String
typeName
=
readTypeOrIdentifier
();
expr
.
classObj
=
getClass
(
typeName
);
if
(
readIf
(
"("
))
{
...
...
@@ -1550,7 +1564,12 @@ public class JavaParser {
*/
void
writeHeader
(
PrintWriter
out
)
{
for
(
Statement
s
:
nativeHeaders
)
{
out
.
println
(
s
);
out
.
println
(
s
.
asString
());
}
if
(
JavaParser
.
REF_COUNT_STATIC
)
{
out
.
println
(
"#define STRING(s) STRING_REF(s)"
);
}
else
{
out
.
println
(
"#define STRING(s) STRING_PTR(s)"
);
}
out
.
println
();
for
(
ClassObj
c
:
classes
.
values
())
{
...
...
@@ -1603,9 +1622,6 @@ public class JavaParser {
for
(
FieldObj
f
:
c
.
instanceFields
.
values
())
{
out
.
print
(
" "
);
out
.
print
(
f
.
type
.
asString
()
+
" "
+
f
.
name
);
if
(
f
.
value
!=
null
)
{
out
.
print
(
" = "
+
f
.
value
);
}
out
.
println
(
";"
);
}
out
.
println
(
"public:"
);
...
...
@@ -1640,7 +1656,7 @@ public class JavaParser {
Collections
.
sort
(
constantNames
);
for
(
String
c
:
constantNames
)
{
String
s
=
stringConstantToStringMap
.
get
(
c
);
if
(
JavaParser
.
REF_COUNT
)
{
if
(
JavaParser
.
REF_COUNT
_STATIC
)
{
out
.
println
(
"ptr<java_lang_String> "
+
c
+
" = STRING(L\""
+
s
+
"\");"
);
}
else
{
out
.
println
(
"java_lang_String* "
+
c
+
" = STRING(L\""
+
s
+
"\");"
);
...
...
@@ -1655,9 +1671,9 @@ public class JavaParser {
*/
void
writeSource
(
PrintWriter
out
)
{
for
(
ClassObj
c
:
classes
.
values
())
{
out
.
println
(
"/* "
+
c
.
className
+
"
.cpp
*/"
);
out
.
println
(
"/* "
+
c
.
className
+
" */"
);
for
(
Statement
s
:
c
.
nativeCode
)
{
out
.
println
(
s
);
out
.
println
(
s
.
asString
()
);
}
for
(
FieldObj
f
:
c
.
staticFields
.
values
())
{
StringBuilder
buff
=
new
StringBuilder
();
...
...
@@ -1694,10 +1710,16 @@ public class JavaParser {
}
out
.
println
(
") {"
);
if
(
m
.
isConstructor
)
{
// TODO
for
(
FieldObj
f
:
c
.
instanceFields
.
values
())
{
out
.
print
(
" "
);
out
.
print
(
"this->"
+
f
.
name
);
out
.
print
(
" = "
+
f
.
value
.
asString
());
out
.
println
(
";"
);
}
}
if
(
m
.
block
!=
null
)
{
out
.
print
(
m
.
block
.
toString
());
m
.
block
.
setMethod
(
m
);
out
.
print
(
m
.
block
.
asString
());
}
out
.
println
(
"}"
);
out
.
println
();
...
...
h2/src/tools/org/h2/java/Statement.java
浏览文件 @
42c4f92d
...
...
@@ -13,9 +13,15 @@ import java.util.ArrayList;
*/
public
interface
Statement
{
void
setMethod
(
MethodObj
method
);
boolean
isEnd
();
// toString
/**
* Get the C++ code.
*
* @return the C++ code
*/
String
asString
();
}
...
...
@@ -35,16 +41,27 @@ abstract class StatementBase implements Statement {
*/
class
ReturnStatement
extends
StatementBase
{
/**
* The return expression.
*/
Expr
expr
;
public
String
toString
()
{
private
MethodObj
method
;
public
void
setMethod
(
MethodObj
method
)
{
this
.
method
=
method
;
}
public
String
asString
()
{
if
(
expr
==
null
)
{
return
"return;"
;
}
Type
returnType
=
method
.
returnType
;
expr
.
setType
(
returnType
);
if
(!
expr
.
getType
().
isObject
())
{
return
"return "
+
expr
.
asString
()
+
";"
;
}
if
(
JavaParser
.
REF_COUNT
)
{
if
(
returnType
.
refCount
)
{
return
"return "
+
expr
.
getType
().
asString
()
+
"("
+
expr
.
asString
()
+
");"
;
}
return
"return "
+
expr
.
asString
()
+
";"
;
...
...
@@ -57,10 +74,21 @@ class ReturnStatement extends StatementBase {
*/
class
DoWhileStatement
extends
StatementBase
{
/**
* The condition.
*/
Expr
condition
;
/**
* The execution block.
*/
Statement
block
;
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
block
.
setMethod
(
method
);
}
public
String
asString
()
{
return
"do {\n"
+
block
+
"} while ("
+
condition
.
asString
()
+
");"
;
}
...
...
@@ -71,7 +99,11 @@ class DoWhileStatement extends StatementBase {
*/
class
ContinueStatement
extends
StatementBase
{
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
// ignore
}
public
String
asString
()
{
return
"continue;"
;
}
...
...
@@ -82,7 +114,11 @@ class ContinueStatement extends StatementBase {
*/
class
BreakStatement
extends
StatementBase
{
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
// ignore
}
public
String
asString
()
{
return
"break;"
;
}
...
...
@@ -93,7 +129,11 @@ class BreakStatement extends StatementBase {
*/
class
EmptyStatement
extends
StatementBase
{
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
// ignore
}
public
String
asString
()
{
return
";"
;
}
...
...
@@ -104,12 +144,23 @@ class EmptyStatement extends StatementBase {
*/
class
SwitchStatement
extends
StatementBase
{
Expr
expr
;
StatementBlock
defaultBlock
;
ArrayList
<
Expr
>
cases
=
new
ArrayList
<
Expr
>();
ArrayList
<
StatementBlock
>
blocks
=
new
ArrayList
<
StatementBlock
>();
private
StatementBlock
defaultBlock
;
private
final
ArrayList
<
Expr
>
cases
=
new
ArrayList
<
Expr
>();
private
final
ArrayList
<
StatementBlock
>
blocks
=
new
ArrayList
<
StatementBlock
>();
private
final
Expr
expr
;
public
SwitchStatement
(
Expr
expr
)
{
this
.
expr
=
expr
;
}
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
defaultBlock
.
setMethod
(
method
);
for
(
StatementBlock
b
:
blocks
)
{
b
.
setMethod
(
method
);
}
}
public
String
asString
()
{
StringBuilder
buff
=
new
StringBuilder
();
buff
.
append
(
"switch ("
).
append
(
expr
.
asString
()).
append
(
") {\n"
);
for
(
int
i
=
0
;
i
<
cases
.
size
();
i
++)
{
...
...
@@ -124,6 +175,21 @@ class SwitchStatement extends StatementBase {
return
buff
.
toString
();
}
public
void
setDefaultBlock
(
StatementBlock
block
)
{
this
.
defaultBlock
=
block
;
}
/**
* Add a case.
*
* @param expr the case expression
* @param block the execution block
*/
public
void
addCase
(
Expr
expr
,
StatementBlock
block
)
{
cases
.
add
(
expr
);
blocks
.
add
(
block
);
}
}
/**
...
...
@@ -131,9 +197,17 @@ class SwitchStatement extends StatementBase {
*/
class
ExprStatement
extends
StatementBase
{
Expr
expr
;
private
final
Expr
expr
;
public
ExprStatement
(
Expr
expr
)
{
this
.
expr
=
expr
;
}
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
// ignore
}
public
String
asString
()
{
return
expr
.
asString
()
+
";"
;
}
...
...
@@ -144,10 +218,21 @@ class ExprStatement extends StatementBase {
*/
class
WhileStatement
extends
StatementBase
{
/**
* The condition.
*/
Expr
condition
;
/**
* The execution block.
*/
Statement
block
;
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
block
.
setMethod
(
method
);
}
public
String
asString
()
{
String
w
=
"while ("
+
condition
.
asString
()
+
")"
;
String
s
=
block
.
toString
();
return
w
+
"\n"
+
s
;
...
...
@@ -160,15 +245,33 @@ class WhileStatement extends StatementBase {
*/
class
IfStatement
extends
StatementBase
{
/**
* The condition.
*/
Expr
condition
;
/**
* The execution block.
*/
Statement
block
;
/**
* The else block.
*/
Statement
elseBlock
;
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
block
.
setMethod
(
method
);
if
(
elseBlock
!=
null
)
{
elseBlock
.
setMethod
(
method
);
}
}
public
String
asString
()
{
String
w
=
"if ("
+
condition
.
asString
()
+
") {\n"
;
String
s
=
block
.
to
String
();
String
s
=
block
.
as
String
();
if
(
elseBlock
!=
null
)
{
s
+=
"} else {\n"
+
elseBlock
.
to
String
();
s
+=
"} else {\n"
+
elseBlock
.
as
String
();
}
return
w
+
s
+
"}"
;
}
...
...
@@ -180,24 +283,59 @@ class IfStatement extends StatementBase {
*/
class
ForStatement
extends
StatementBase
{
/**
* The init block.
*/
Statement
init
;
/**
* The condition.
*/
Expr
condition
;
/**
* The main loop block.
*/
Statement
block
;
/**
* The update list.
*/
ArrayList
<
Expr
>
updates
=
new
ArrayList
<
Expr
>();
/**
* The type of the iterable.
*/
Type
iterableType
;
/**
* The iterable variable name.
*/
String
iterableVariable
;
/**
* The iterable expression.
*/
Expr
iterable
;
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
block
.
setMethod
(
method
);
}
public
String
asString
()
{
StringBuffer
buff
=
new
StringBuffer
();
buff
.
append
(
"for ("
);
if
(
iterableType
!=
null
)
{
Type
it
=
iterable
.
getType
();
if
(
it
!=
null
&&
it
.
arrayLevel
>
0
)
{
String
idx
=
"i_"
+
iterableVariable
;
buff
.
append
(
"int "
+
idx
+
" = 0; "
+
idx
+
" < "
+
iterable
.
asString
()
+
"->length(); "
+
idx
+
"++"
);
buff
.
append
(
"int "
+
idx
+
" = 0; "
+
idx
+
" < "
+
iterable
.
asString
()
+
"->length(); "
+
idx
+
"++"
);
buff
.
append
(
") {\n"
);
buff
.
append
(
JavaParser
.
indent
(
iterableType
+
" "
+
iterableVariable
+
" = "
+
iterable
.
asString
()
+
"->at("
+
idx
+
");\n"
));
buff
.
append
(
JavaParser
.
indent
(
iterableType
+
" "
+
iterableVariable
+
" = "
+
iterable
.
asString
()
+
"->at("
+
idx
+
");\n"
));
buff
.
append
(
block
.
toString
()).
append
(
"}"
);
}
else
{
// TODO iterate over a collection
...
...
@@ -208,7 +346,7 @@ class ForStatement extends StatementBase {
buff
.
append
(
block
.
toString
()).
append
(
"}"
);
}
}
else
{
buff
.
append
(
init
.
to
String
());
buff
.
append
(
init
.
as
String
());
buff
.
append
(
" "
).
append
(
condition
.
asString
()).
append
(
"; "
);
for
(
int
i
=
0
;
i
<
updates
.
size
();
i
++)
{
if
(
i
>
0
)
{
...
...
@@ -217,7 +355,7 @@ class ForStatement extends StatementBase {
buff
.
append
(
updates
.
get
(
i
).
asString
());
}
buff
.
append
(
") {\n"
);
buff
.
append
(
block
.
to
String
()).
append
(
"}"
);
buff
.
append
(
block
.
as
String
()).
append
(
"}"
);
}
return
buff
.
toString
();
}
...
...
@@ -229,15 +367,24 @@ class ForStatement extends StatementBase {
*/
class
StatementBlock
extends
StatementBase
{
ArrayList
<
Statement
>
instructions
=
new
ArrayList
<
Statement
>();
/**
* The list of instructions.
*/
final
ArrayList
<
Statement
>
instructions
=
new
ArrayList
<
Statement
>();
public
String
toString
()
{
public
void
setMethod
(
MethodObj
method
)
{
for
(
Statement
s
:
instructions
)
{
s
.
setMethod
(
method
);
}
}
public
String
asString
()
{
StringBuilder
buff
=
new
StringBuilder
();
for
(
Statement
s
:
instructions
)
{
if
(
s
.
isEnd
())
{
break
;
}
buff
.
append
(
JavaParser
.
indent
(
s
.
to
String
()));
buff
.
append
(
JavaParser
.
indent
(
s
.
as
String
()));
}
return
buff
.
toString
();
}
...
...
@@ -249,11 +396,19 @@ class StatementBlock extends StatementBase {
*/
class
VarDecStatement
extends
StatementBase
{
/**
* The type.
*/
Type
type
;
ArrayList
<
String
>
variables
=
new
ArrayList
<
String
>();
ArrayList
<
Expr
>
values
=
new
ArrayList
<
Expr
>();
public
String
toString
()
{
private
ArrayList
<
String
>
variables
=
new
ArrayList
<
String
>();
private
ArrayList
<
Expr
>
values
=
new
ArrayList
<
Expr
>();
public
void
setMethod
(
MethodObj
method
)
{
// ignore
}
public
String
asString
()
{
StringBuilder
buff
=
new
StringBuilder
();
buff
.
append
(
type
.
asString
()).
append
(
' '
);
StringBuilder
assign
=
new
StringBuilder
();
...
...
@@ -268,6 +423,7 @@ class VarDecStatement extends StatementBase {
if
(!
value
.
getType
().
isObject
())
{
buff
.
append
(
" = "
).
append
(
value
.
asString
());
}
else
{
value
.
setType
(
type
);
assign
.
append
(
varName
).
append
(
" = "
).
append
(
value
.
asString
()).
append
(
";\n"
);
}
}
...
...
@@ -280,6 +436,17 @@ class VarDecStatement extends StatementBase {
return
buff
.
toString
();
}
/**
* Add a variable.
*
* @param name the variable name
* @param value the init value
*/
public
void
addVariable
(
String
name
,
Expr
value
)
{
variables
.
add
(
name
);
values
.
add
(
value
);
}
}
/**
...
...
@@ -287,9 +454,17 @@ class VarDecStatement extends StatementBase {
*/
class
StatementNative
extends
StatementBase
{
String
code
;
private
final
String
code
;
StatementNative
(
String
code
)
{
this
.
code
=
code
;
}
public
void
setMethod
(
MethodObj
method
)
{
// ignore
}
public
String
to
String
()
{
public
String
as
String
()
{
return
code
;
}
...
...
h2/src/tools/org/h2/java/Test.java
浏览文件 @
42c4f92d
...
...
@@ -30,11 +30,12 @@ public class Test extends TestBase {
// chmod +x test
// ./test
// TODO initialize fields
// include files:
// /usr/include/c++/4.2.1/tr1/stdio.h
// /usr/include/stdio.h
// TODO initialize fields
// inttypes.h
// not supported yet:
// exceptions
...
...
h2/src/tools/org/h2/java/TestApp.java
浏览文件 @
42c4f92d
...
...
@@ -26,8 +26,33 @@ int main(int argc, char** argv) {
* @param args the command line arguments
*/
public
static
void
main
(
String
...
args
)
{
for
(
int
i
=
0
;
i
<
10
;
i
++)
{
System
.
out
.
println
(
"Hello "
+
i
);
String
[]
list
=
new
String
[
1000
];
for
(
int
i
=
0
;
i
<
1000
;
i
++)
{
list
[
i
]
=
"Hello "
+
i
;
}
// time:29244000 mac g++ -O3 without array bound checks
// time:30673000 mac java
// time:32449000 mac g++ -O3
// time:69692000 mac g++ -O3 ref counted
// time:1200000000 raspberry g++ -O3
// time:1720000000 raspberry g++ -O3 ref counted
// time:1980469000 raspberry java IcedTea6 1.8.13 Cacao VM
// time:12962645810 raspberry java IcedTea6 1.8.13 Zero VM
// java -XXaltjvm=cacao
for
(
int
k
=
0
;
k
<
4
;
k
++)
{
long
t
=
System
.
nanoTime
();
long
h
=
0
;
for
(
int
j
=
0
;
j
<
10000
;
j
++)
{
for
(
int
i
=
0
;
i
<
1000
;
i
++)
{
String
s
=
list
[
i
];
h
=
(
h
*
7
)
^
s
.
hashCode
();
}
}
System
.
out
.
println
(
"hash: "
+
h
);
t
=
System
.
nanoTime
()
-
t
;
System
.
out
.
println
(
"time:"
+
t
);
}
}
...
...
h2/src/tools/org/h2/java/io/PrintStream.java
浏览文件 @
42c4f92d
...
...
@@ -18,7 +18,7 @@ public class PrintStream {
*/
public
void
println
(
String
s
)
{
// c: int x = s->chars->length();
// c: printf("%.*S\n", x, s->chars->get
Data
());
// c: printf("%.*S\n", x, s->chars->get
Pointer
());
}
}
h2/src/tools/org/h2/java/lang/Integer.java
浏览文件 @
42c4f92d
...
...
@@ -11,8 +11,14 @@ package org.h2.java.lang;
*/
public
class
Integer
{
/**
* The smallest possible value.
*/
public
static
final
int
MIN_VALUE
=
1
<<
31
;
/**
* The largest possible value.
*/
public
static
final
int
MAX_VALUE
=
(
int
)
((
1L
<<
31
)
-
1
);
/**
...
...
@@ -23,7 +29,7 @@ public class Integer {
*/
public
static
String
toString
(
int
x
)
{
// c: wchar_t ch[20];
// c: swprintf(ch, 20, L"%
d"
, x);
// c: swprintf(ch, 20, L"%
" PRId32
, x);
// c: return STRING(ch);
// c: return;
if
(
x
==
MIN_VALUE
)
{
...
...
h2/src/tools/org/h2/java/lang/Long.java
浏览文件 @
42c4f92d
...
...
@@ -12,8 +12,14 @@ package org.h2.java.lang;
*/
public
class
Long
{
/**
* The smallest possible value.
*/
public
static
final
long
MIN_VALUE
=
1L
<<
63
;
/**
* The largest possible value.
*/
public
static
final
long
MAX_VALUE
=
(
1L
<<
63
)
-
1
;
/**
...
...
@@ -24,7 +30,7 @@ public class Long {
*/
public
static
String
toString
(
long
x
)
{
// c: wchar_t ch[30];
// c: swprintf(ch, 30, L"%
ld"
, x);
// c: swprintf(ch, 30, L"%
" PRId64
, x);
// c: return STRING(ch);
// c: return;
if
(
x
==
MIN_VALUE
)
{
...
...
h2/src/tools/org/h2/java/lang/String.java
浏览文件 @
42c4f92d
...
...
@@ -14,8 +14,11 @@ import org.h2.java.Local;
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <stdint.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#define jvoid void
#define jboolean int8_t
...
...
@@ -31,9 +34,12 @@ import org.h2.java.Local;
#define false 0
#define null 0
#define STRING(s) ptr<java_lang_String>(new java_lang_String(ptr< array<jchar> >(new array<jchar>(s, (jint) wcslen(s)))));
#define STRING_REF(s) ptr<java_lang_String> \
(new java_lang_String(ptr< array<jchar> > \
(new array<jchar>(s, (jint) wcslen(s)))));
// #define STRING(s) new java_lang_String(new array<jchar>(s, (jint) wcslen(s)));
#define STRING_PTR(s) new java_lang_String \
(new array<jchar>(s, (jint) wcslen(s)));
class RefBase {
protected:
...
...
@@ -86,6 +92,9 @@ public:
T& operator*() {
return *pointer;
}
T* getPointer() {
return pointer;
}
T* operator->() {
return pointer;
}
...
...
@@ -112,7 +121,7 @@ public:
~array() {
delete[] data;
}
T* get
Data
() {
T* get
Pointer
() {
return data;
}
jint length() {
...
...
@@ -180,15 +189,31 @@ public class String {
return
chars
.
length
;
}
/**
* The toString method.
*
* @return the string
*/
public
String
toStringMethod
()
{
return
this
;
}
/**
* Get the java.lang.String.
*
* @return the string
*/
@Ignore
public
java
.
lang
.
String
asString
()
{
return
new
java
.
lang
.
String
(
chars
);
}
/**
* Wrap a java.lang.String.
*
* @param x the string
* @return the object
*/
@Ignore
public
static
String
wrap
(
java
.
lang
.
String
x
)
{
return
new
String
(
x
.
toCharArray
());
...
...
h2/src/tools/org/h2/java/lang/System.java
浏览文件 @
42c4f92d
...
...
@@ -30,8 +30,8 @@ public class System {
*/
public
static
void
arraycopy
(
char
[]
src
,
int
srcPos
,
char
[]
dest
,
int
destPos
,
int
length
)
{
/* c:
memmove(((jchar*)dest->get
Data
()) + destPos,
((jchar*)src->get
Data
()) + srcPos, sizeof(jchar) * length);
memmove(((jchar*)dest->get
Pointer
()) + destPos,
((jchar*)src->get
Pointer
()) + srcPos, sizeof(jchar) * length);
*/
// c: return;
java
.
lang
.
System
.
arraycopy
(
src
,
srcPos
,
dest
,
destPos
,
length
);
...
...
@@ -49,8 +49,8 @@ public class System {
*/
public
static
void
arraycopy
(
byte
[]
src
,
int
srcPos
,
byte
[]
dest
,
int
destPos
,
int
length
)
{
/* c:
memmove(((jbyte*)dest->get
Data
()) + destPos,
((jbyte*)src->get
Data
()) + srcPos, sizeof(jbyte) * length);
memmove(((jbyte*)dest->get
Pointer
()) + destPos,
((jbyte*)src->get
Pointer
()) + srcPos, sizeof(jbyte) * length);
*/
// c: return;
java
.
lang
.
System
.
arraycopy
(
src
,
srcPos
,
dest
,
destPos
,
length
);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论