summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2010-02-18 14:46:28 -0800
committerKen Thompson <ken@golang.org>2010-02-18 14:46:28 -0800
commitd1ab100c0865da99db815224f8d27b02b4c88eee (patch)
tree908268ed335253b5d448fcceea783ed7b49039a0 /src
parentbe0b4e8999f67eedd4972097fe8464b2801987d2 (diff)
downloadgolang-d1ab100c0865da99db815224f8d27b02b4c88eee.tar.gz
more complex - constants
import and export R=rsc CC=golang-dev http://codereview.appspot.com/214050
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/const.c20
-rw-r--r--src/cmd/gc/export.c3
-rw-r--r--src/cmd/gc/go.h1
-rw-r--r--src/cmd/gc/go.y12
-rw-r--r--src/cmd/gc/walk.c6
-rw-r--r--src/pkg/runtime/type.go2
6 files changed, 41 insertions, 3 deletions
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c
index fed3b1476..1727e775a 100644
--- a/src/cmd/gc/const.c
+++ b/src/cmd/gc/const.c
@@ -851,6 +851,26 @@ nodlit(Val v)
return n;
}
+Node*
+nodcplxlit(Val r, Val i)
+{
+ Node *n;
+ Mpcplx *c;
+
+ c = mal(sizeof(*c));
+ n = nod(OLITERAL, N, N);
+ n->type = types[TIDEAL];
+ n->val.u.cval = c;
+ n->val.ctype = CTCPLX;
+
+ if(r.ctype != CTFLT || i.ctype != CTFLT)
+ fatal("nodcplxlit ctype %d/%d", r.ctype, i.ctype);
+
+ mpmovefltflt(&c->real, r.u.fval);
+ mpmovefltflt(&c->imag, i.u.fval);
+ return n;
+}
+
// TODO(rsc): combine with convlit
void
defaultlit(Node **np, Type *t)
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index ec1c135d8..d11ddf2ea 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -133,6 +133,9 @@ dumpexportconst(Sym *s)
case CTFLT:
Bprint(bout, "%F\n", n->val.u.fval);
break;
+ case CTCPLX:
+ Bprint(bout, "(%F+%F)\n", &n->val.u.cval->real, &n->val.u.cval->imag);
+ break;
case CTSTR:
Bprint(bout, "\"%Z\"\n", n->val.u.sval);
break;
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 642b70611..753de0399 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -851,6 +851,7 @@ void linehist(char*, int32, int);
int32 setlineno(Node*);
Node* nod(int, Node*, Node*);
Node* nodlit(Val);
+Node* nodcplxlit(Val, Val);
Type* typ(int);
int algtype(Type*);
void dodump(Node*, int);
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index f2a037710..06696d52f 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -76,7 +76,8 @@
%type <sym> hidden_importsym hidden_pkg_importsym
-%type <node> hidden_constant hidden_dcl hidden_interfacedcl hidden_structdcl hidden_opt_sym
+%type <node> hidden_constant hidden_literal hidden_dcl
+%type <node> hidden_interfacedcl hidden_structdcl hidden_opt_sym
%type <list> hidden_funres
%type <list> ohidden_funres
@@ -1743,7 +1744,7 @@ hidden_funres:
$$ = list1(nod(ODCLFIELD, N, typenod($1)));
}
-hidden_constant:
+hidden_literal:
LLITERAL
{
$$ = nodlit($1);
@@ -1769,6 +1770,13 @@ hidden_constant:
yyerror("bad constant %S", $$->sym);
}
+hidden_constant:
+ hidden_literal
+| '(' hidden_literal '+' hidden_literal ')'
+ {
+ $$ = nodcplxlit($2->val, $4->val);
+ }
+
hidden_importsym:
LLITERAL '.' sym
{
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index a6b420eb6..e528e3f6c 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1724,6 +1724,12 @@ walkprint(Node *nn, NodeList **init, int defer)
t = types[TFLOAT64];
} else
on = syslook("printfloat", 0);
+ } else if(iscomplex[et]) {
+ if(defer) {
+ fmtprint(&fmt, "%%f");
+ t = types[TFLOAT64];
+ } else
+ on = syslook("printcomplex", 0);
} else if(et == TBOOL) {
if(defer)
fmtprint(&fmt, "%%t");
diff --git a/src/pkg/runtime/type.go b/src/pkg/runtime/type.go
index 7227904ac..c37447718 100644
--- a/src/pkg/runtime/type.go
+++ b/src/pkg/runtime/type.go
@@ -102,7 +102,7 @@ type FloatType commonType
// Complex64Type represents a complex64 type.
type Complex64Type commonType
-// Complex128Type represents a complex32 type.
+// Complex128Type represents a complex128 type.
type Complex128Type commonType
// ComplexType represents a complex type.