Skip to content

Commit da387fd

Browse files
gh-195: Make freezing ops use STR.
Closes #195.
1 parent 10d467f commit da387fd

12 files changed

Lines changed: 44 additions & 41 deletions

docs/SPECIFICATION.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -709,9 +709,9 @@
709709

710710
- `STR SIGNATURE(SYMBOL name)` = MUST return a textual signature for `name`. If `name` denotes a user-defined function, the result MUST use the canonical function-signature form of this specification. For any other visible binding, the result MUST be `TYPE name`.
711711

712-
- `BOOL FREEZE(SYMBOL name)`, `BOOL THAW(SYMBOL name)`, and `BOOL PERMAFREEZE(SYMBOL name)` = MUST modify the mutability state of the binding designated by `name`. `FREEZE` MUST prevent reassignment and deletion until thawed. `PERMAFREEZE` MUST permanently prevent reassignment, deletion, and later thawing. `THAW` MUST clear a non-permanent freeze, MUST raise a runtime error when applied to a permanently frozen binding, and MUST otherwise succeed as a no-op when applied to a binding that is not currently frozen. `FREEZE`, `THAW`, and `PERMAFREEZE` MUST each return `FALSE` on success and MUST raise a runtime error if `name` is undefined.
712+
-- `BOOL FREEZE(STR name)`, `BOOL THAW(STR name)`, and `BOOL PERMAFREEZE(SYMBOL name)` = MUST modify the mutability state of the binding designated by `name`. `FREEZE` MUST prevent reassignment and deletion until thawed. `PERMAFREEZE` MUST permanently prevent reassignment, deletion, and later thawing. `THAW` MUST clear a non-permanent freeze, MUST raise a runtime error when applied to a permanently frozen binding, and MUST otherwise succeed as a no-op when applied to a binding that is not currently frozen. `FREEZE`, `THAW`, and `PERMAFREEZE` MUST each return `FALSE` on success and MUST raise a runtime error if `name` is undefined.
713713

714-
- `BOOL FROZEN(SYMBOL name)` and `BOOL PERMAFROZEN(SYMBOL name)` = MUST report the freeze state of `name`. `FROZEN` MUST return `TRUE` for any frozen or permanently frozen binding and `FALSE` otherwise. `PERMAFROZEN` MUST return `TRUE` only for permanently frozen bindings and `FALSE` otherwise. If `name` is undefined, both operators MUST return `FALSE`.
714+
-- `BOOL FROZEN(STR name)` and `BOOL PERMAFROZEN(SYMBOL name)` = MUST report the freeze state of `name`. `FROZEN` MUST return `TRUE` for any frozen or permanently frozen binding and `FALSE` otherwise. `PERMAFROZEN` MUST return `TRUE` only for permanently frozen bindings and `FALSE` otherwise. If `name` is undefined, both operators MUST return `FALSE`.
715715

716716
---
717717

src/builtins.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8530,11 +8530,12 @@ static Value builtin_del(Interpreter *interp, Value *args, int argc, Expr **arg_
85308530
}
85318531

85328532
static Value builtin_freeze(Interpreter *interp, Value *args, int argc, Expr **arg_nodes, Env *env, int line, int col) {
8533-
(void)args;
8534-
if (argc != 1 || arg_nodes[0]->type != EXPR_IDENT) {
8535-
RUNTIME_ERROR(interp, "FREEZE expects an identifier", line, col);
8533+
(void)arg_nodes;
8534+
if (argc != 1) {
8535+
RUNTIME_ERROR(interp, "FREEZE expects 1 argument", line, col);
85368536
}
8537-
const char *name = arg_nodes[0]->as.ident;
8537+
EXPECT_STR(args[0], "FREEZE", interp, line, col);
8538+
const char *name = args[0].as.s ? args[0].as.s : "";
85388539
int r = env_freeze(env, name);
85398540
if (r != 0) {
85408541
char buf[128];
@@ -8545,11 +8546,12 @@ static Value builtin_freeze(Interpreter *interp, Value *args, int argc, Expr **a
85458546
}
85468547

85478548
static Value builtin_thaw(Interpreter *interp, Value *args, int argc, Expr **arg_nodes, Env *env, int line, int col) {
8548-
(void)args;
8549-
if (argc != 1 || arg_nodes[0]->type != EXPR_IDENT) {
8550-
RUNTIME_ERROR(interp, "THAW expects an identifier", line, col);
8549+
(void)arg_nodes;
8550+
if (argc != 1) {
8551+
RUNTIME_ERROR(interp, "THAW expects 1 argument", line, col);
85518552
}
8552-
const char *name = arg_nodes[0]->as.ident;
8553+
EXPECT_STR(args[0], "THAW", interp, line, col);
8554+
const char *name = args[0].as.s ? args[0].as.s : "";
85538555
int r = env_thaw(env, name);
85548556
if (r == -1) {
85558557
char buf[128];
@@ -8649,11 +8651,12 @@ static Value builtin_export(Interpreter *interp, Value *args, int argc, Expr **a
86498651
}
86508652

86518653
static Value builtin_frozen(Interpreter *interp, Value *args, int argc, Expr **arg_nodes, Env *env, int line, int col) {
8652-
(void)args;
8653-
if (argc != 1 || arg_nodes[0]->type != EXPR_IDENT) {
8654-
RUNTIME_ERROR(interp, "FROZEN expects an identifier", line, col);
8654+
(void)arg_nodes;
8655+
if (argc != 1) {
8656+
RUNTIME_ERROR(interp, "FROZEN expects 1 argument", line, col);
86558657
}
8656-
const char *name = arg_nodes[0]->as.ident;
8658+
EXPECT_STR(args[0], "FROZEN", interp, line, col);
8659+
const char *name = args[0].as.s ? args[0].as.s : "";
86578660
int st = env_frozen_state(env, name);
86588661
return value_bool(st != 0);
86598662
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
INT t = 0d1
2-
FREEZE(t)
2+
FREEZE("t")
33

44
INT p = @t

tests/cases/passing/async-error-not-caught.pre

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ BOOL caught = FALSE
22

33
TRY{
44
THR worker = ASYNC{
5-
FREEZE(not_declared)
5+
FREEZE("not_declared")
66
}
77
} CATCH {
88
caught = TRUE
@@ -15,7 +15,7 @@ REFUTE(caught)
1515
BOOL caught_await = FALSE
1616

1717
THR worker2 = ASYNC{
18-
FREEZE(not_declared)
18+
FREEZE("not_declared")
1919
}
2020

2121
TRY{

tests/cases/passing/del-frozen.pre

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
BOOL frozen_symbol = TRUE
2-
REFUTE(FREEZE(frozen_symbol))
2+
REFUTE(FREEZE("frozen_symbol"))
33

44
BOOL frozen_delete_failed = FALSE
55
TRY{
@@ -10,7 +10,7 @@ TRY{
1010
ASSERT(frozen_delete_failed)
1111
ASSERT(EXIST("frozen_symbol"))
1212

13-
REFUTE(THAW(frozen_symbol))
13+
REFUTE(THAW("frozen_symbol"))
1414
REFUTE(DEL("frozen_symbol"))
1515
REFUTE(EXIST("frozen_symbol"))
1616

tests/cases/passing/freeze.pre

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
BOOL frozen_value = TRUE
22

3-
REFUTE(FREEZE(frozen_value))
4-
ASSERT(FROZEN(frozen_value))
3+
REFUTE(FREEZE("frozen_value"))
4+
ASSERT(FROZEN("frozen_value"))
55
REFUTE(PERMAFROZEN(frozen_value))
66

77
BOOL freeze_undefined_failed = FALSE
88
TRY{
9-
FREEZE(not_declared)
9+
FREEZE("not_declared")
1010
} CATCH {
1111
freeze_undefined_failed = TRUE
1212
}
@@ -30,7 +30,7 @@ TRY{
3030
ASSERT(deletion_failed)
3131
ASSERT(EXIST("frozen_value"))
3232

33-
REFUTE(THAW(frozen_value))
34-
REFUTE(FROZEN(frozen_value))
33+
REFUTE(THAW("frozen_value"))
34+
REFUTE(FROZEN("frozen_value"))
3535
frozen_value = FALSE
3636
ASSERT(EQ(frozen_value, FALSE))

tests/cases/passing/frozen.pre

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
BOOL normal_value = TRUE
2-
REFUTE(FROZEN(normal_value))
2+
REFUTE(FROZEN("normal_value"))
33

4-
REFUTE(FREEZE(normal_value))
5-
ASSERT(FROZEN(normal_value))
6-
REFUTE(THAW(normal_value))
7-
REFUTE(FROZEN(normal_value))
4+
REFUTE(FREEZE("normal_value"))
5+
ASSERT(FROZEN("normal_value"))
6+
REFUTE(THAW("normal_value"))
7+
REFUTE(FROZEN("normal_value"))
88

99
REFUTE(PERMAFREEZE(normal_value))
10-
ASSERT(FROZEN(normal_value))
10+
ASSERT(FROZEN("normal_value"))
1111
ASSERT(PERMAFROZEN(normal_value))

tests/cases/passing/permafreeze.pre

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
BOOL locked_value = TRUE
22

33
REFUTE(PERMAFREEZE(locked_value))
4-
ASSERT(FROZEN(locked_value))
4+
ASSERT(FROZEN("locked_value"))
55
ASSERT(PERMAFROZEN(locked_value))
66

77
BOOL permafreeze_undefined_failed = FALSE
@@ -32,7 +32,7 @@ ASSERT(EXIST("locked_value"))
3232

3333
BOOL thaw_failed = FALSE
3434
TRY{
35-
THAW(locked_value)
35+
THAW("locked_value")
3636
} CATCH {
3737
thaw_failed = TRUE
3838
}

tests/cases/passing/permafrozen.pre

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ REFUTE(PERMAFROZEN(normal_value))
33

44
REFUTE(PERMAFREEZE(normal_value))
55
ASSERT(PERMAFROZEN(normal_value))
6-
ASSERT(FROZEN(normal_value))
6+
ASSERT(FROZEN("normal_value"))

tests/cases/passing/thaw.pre

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
BOOL thaw_value = TRUE
22

3-
REFUTE(THAW(thaw_value))
3+
REFUTE(THAW("thaw_value"))
44
ASSERT(thaw_value)
55

6-
REFUTE(FREEZE(thaw_value))
7-
ASSERT(FROZEN(thaw_value))
8-
REFUTE(THAW(thaw_value))
9-
REFUTE(FROZEN(thaw_value))
6+
REFUTE(FREEZE("thaw_value"))
7+
ASSERT(FROZEN("thaw_value"))
8+
REFUTE(THAW("thaw_value"))
9+
REFUTE(FROZEN("thaw_value"))
1010

1111
thaw_value = FALSE
1212
ASSERT(EQ(thaw_value, FALSE))
1313

1414
BOOL thaw_undefined_failed = FALSE
1515
TRY{
16-
THAW(not_declared)
16+
THAW("not_declared")
1717
} CATCH {
1818
thaw_undefined_failed = TRUE
1919
}

0 commit comments

Comments
 (0)