aboutsummaryrefslogtreecommitdiff
path: root/internal/compile/compile.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/compile/compile.go')
-rw-r--r--internal/compile/compile.go64
1 files changed, 21 insertions, 43 deletions
diff --git a/internal/compile/compile.go b/internal/compile/compile.go
index 01d33a1..6d86b4b 100644
--- a/internal/compile/compile.go
+++ b/internal/compile/compile.go
@@ -26,9 +26,9 @@ import (
"bytes"
"fmt"
"log"
- "math/big"
"os"
"path/filepath"
+ "strconv"
"github.com/google/skylark/resolve"
"github.com/google/skylark/syntax"
@@ -37,7 +37,7 @@ import (
const debug = false // TODO(adonovan): use a bitmap of options; and regexp to match files
// Increment this to force recompilation of saved bytecode files.
-const Version = 1
+const Version = 2
type Opcode uint8
@@ -106,10 +106,7 @@ const (
ITERJMP // - ITERJMP<addr> elem (and fall through) [acts on topmost iterator]
// or: - ITERJMP<addr> - (and jump)
- INT // - INT<constant> value
- FLOAT // - FLOAT<constant> value
- BIGINT // - BIGINT<constant> value
- STRING // - STRING<constant> value
+ CONSTANT // - CONSTANT<constant> value
MAKETUPLE // x1 ... xn MAKETUPLE<n> tuple
MAKELIST // x1 ... xn MAKELIST<n> list
MAKEFUNC // args kwargs MAKEFUNC<func> fn
@@ -141,17 +138,16 @@ var opcodeNames = [...]string{
AMP: "amp",
APPEND: "append",
ATTR: "attr",
- BIGINT: "bigint",
CALL: "call",
CALL_KW: "call_kw ",
CALL_VAR: "call_var",
CALL_VAR_KW: "call_var_kw",
CJMP: "cjmp",
- DUP: "dup",
+ CONSTANT: "constant",
DUP2: "dup2",
+ DUP: "dup",
EQL: "eql",
FALSE: "false",
- FLOAT: "float",
FREE: "free",
GE: "ge",
GLOBAL: "global",
@@ -159,7 +155,6 @@ var opcodeNames = [...]string{
IN: "in",
INDEX: "index",
INPLACE_ADD: "inplace_add",
- INT: "int",
ITERJMP: "iterjmp",
ITERPOP: "iterpop",
ITERPUSH: "iterpush",
@@ -193,7 +188,6 @@ var opcodeNames = [...]string{
SLASHSLASH: "slashslash",
SLICE: "slice",
STAR: "star",
- STRING: "string",
TRUE: "true",
UMINUS: "uminus",
UNIVERSAL: "universal",
@@ -209,17 +203,16 @@ var stackEffect = [...]int8{
AMP: -1,
APPEND: -2,
ATTR: 0,
- BIGINT: +1,
CALL: variableStackEffect,
CALL_KW: variableStackEffect,
CALL_VAR: variableStackEffect,
CALL_VAR_KW: variableStackEffect,
CJMP: -1,
- DUP: +1,
+ CONSTANT: +1,
DUP2: +2,
+ DUP: +1,
EQL: -1,
FALSE: +1,
- FLOAT: +1,
FREE: +1,
GE: -1,
GLOBAL: +1,
@@ -227,10 +220,9 @@ var stackEffect = [...]int8{
IN: -1,
INDEX: -1,
INPLACE_ADD: -1,
- INT: +1,
ITERJMP: variableStackEffect,
- ITERPUSH: -1,
ITERPOP: 0,
+ ITERPUSH: -1,
JMP: 0,
LE: -1,
LOAD: -1,
@@ -246,10 +238,10 @@ var stackEffect = [...]int8{
NOP: 0,
NOT: 0,
PERCENT: -1,
- PREDECLARED: +1,
PIPE: -1,
PLUS: -1,
POP: -1,
+ PREDECLARED: +1,
RETURN: -1,
SETDICT: -3,
SETDICTUNIQ: -3,
@@ -261,10 +253,9 @@ var stackEffect = [...]int8{
SLASHSLASH: -1,
SLICE: -3,
STAR: -1,
- STRING: +1,
TRUE: +1,
- UNPACK: variableStackEffect,
UNIVERSAL: +1,
+ UNPACK: variableStackEffect,
}
func (op Opcode) String() string {
@@ -281,7 +272,7 @@ func (op Opcode) String() string {
type Program struct {
Loads []Ident // name (really, string) and position of each load stmt
Names []string // names of attributes and predeclared variables
- Constants []interface{} // = string | int64 | float64
+ Constants []interface{} // = string | int64 | float64 | *big.Int
Functions []*Funcode
Globals []Ident // for error messages and tracing
Toplevel *Funcode // module initialization function
@@ -741,10 +732,13 @@ func PrintOp(fn *Funcode, pc uint32, op Opcode, arg uint32) {
var comment string
switch op {
- case INT, FLOAT, BIGINT:
- comment = fmt.Sprint(fn.Prog.Constants[arg])
- case STRING:
- comment = fmt.Sprintf("%q", fn.Prog.Constants[arg])
+ case CONSTANT:
+ switch x := fn.Prog.Constants[arg].(type) {
+ case string:
+ comment = strconv.Quote(x)
+ default:
+ comment = fmt.Sprint(x)
+ }
case MAKEFUNC:
comment = fn.Prog.Functions[arg].Name
case SETLOCAL, LOCAL:
@@ -856,12 +850,7 @@ func (pcomp *pcomp) functionIndex(fn *Funcode) uint32 {
// string emits code to push the specified string.
func (fcomp *fcomp) string(s string) {
- fcomp.emit1(STRING, fcomp.pcomp.constantIndex(s))
-}
-
-// int64 emits code to push the specified integer.
-func (fcomp *fcomp) int64(i int64) {
- fcomp.emit1(INT, fcomp.pcomp.constantIndex(i))
+ fcomp.emit1(CONSTANT, fcomp.pcomp.constantIndex(s))
}
// setPos sets the current source position.
@@ -1137,19 +1126,8 @@ func (fcomp *fcomp) expr(e syntax.Expr) {
fcomp.lookup(e)
case *syntax.Literal:
- switch e.Token {
- case syntax.INT:
- switch e.Value.(type) {
- case int64:
- fcomp.int64(e.Value.(int64))
- case *big.Int:
- fcomp.emit1(BIGINT, fcomp.pcomp.constantIndex(e.Value.(*big.Int).String()))
- }
- case syntax.FLOAT:
- fcomp.emit1(FLOAT, fcomp.pcomp.constantIndex(e.Value.(float64)))
- case syntax.STRING:
- fcomp.string(e.Value.(string))
- }
+ // e.Value is int64, float64, *bigInt, or string.
+ fcomp.emit1(CONSTANT, fcomp.pcomp.constantIndex(e.Value))
case *syntax.ListExpr:
for _, x := range e.List {