rm typeof

This commit is contained in:
2026-02-06 21:26:45 -06:00
parent 6571262af0
commit ea185dbffd
2 changed files with 40 additions and 30 deletions

View File

@@ -554,8 +554,6 @@ typedef enum MachOpcode {
MACH_NEWARRAY, /* R(A) = new array, B = element count in R(A+1)..R(A+B) */
MACH_CLOSURE, /* R(A) = closure(functions[Bx]) (ABx) */
/* Special */
MACH_TYPEOF, /* R(A) = typeof R(B) */
MACH_THROW, /* disrupt — trigger disruption */
MACH_NOP,
@@ -612,8 +610,7 @@ static const char *mach_opcode_names[MACH_OP_COUNT] = {
[MACH_NEWOBJECT] = "newobject",
[MACH_NEWARRAY] = "newarray",
[MACH_CLOSURE] = "closure",
[MACH_TYPEOF] = "typeof",
[MACH_THROW] = "disrupt",
[MACH_THROW] = "throw",
[MACH_NOP] = "nop",
};
@@ -31131,16 +31128,6 @@ static int mach_compile_expr(MachCompState *cs, cJSON *node, int dest) {
mach_free_reg_to(cs, save);
return dest;
}
if (strcmp(kind, "typeof") == 0) {
if (dest < 0) dest = mach_reserve_reg(cs);
cJSON *operand = cJSON_GetObjectItem(node, "expression");
if (!operand) operand = cJSON_GetObjectItem(node, "right");
int save = cs->freereg;
int r = mach_compile_expr(cs, operand, -1);
mach_emit(cs, MACH_ABC(MACH_TYPEOF, dest, r, 0));
mach_free_reg_to(cs, save);
return dest;
}
/* Assignment */
if (strcmp(kind, "=") == 0) {
@@ -32219,21 +32206,6 @@ static JSValue JS_CallRegisterVM(JSContext *ctx, JSCodeRegister *code,
break;
}
case MACH_TYPEOF: {
JSValue v = frame->slots[b];
const char *type_str;
if (JS_IsNull(v)) type_str = "object";
else if (JS_IsBool(v)) type_str = "boolean";
else if (JS_IsInt(v) || JS_IsNumber(v)) type_str = "number";
else if (JS_VALUE_IS_TEXT(v)) type_str = "string";
else if (JS_IsFunction(v)) type_str = "function";
else type_str = "object";
JSValue ts = JS_NewString(ctx, type_str);
frame = (JSFrameRegister *)JS_VALUE_GET_PTR(frame_ref.val);
frame->slots[a] = ts;
break;
}
case MACH_GETFIELD: {
JSValue obj = frame->slots[b];
JSValue key = code->cpool[c];
@@ -35103,7 +35075,6 @@ static void dump_register_code(JSContext *ctx, JSCodeRegister *code, int indent)
case MACH_DEC:
case MACH_LNOT:
case MACH_BNOT:
case MACH_TYPEOF:
printf("r%d, r%d", a, b);
break;

39
tests/demo.ce Normal file
View File

@@ -0,0 +1,39 @@
function safe_add(a, b) {
return a + b
} disruption {
print("disruption caught in safe_add")
}
function inner() {
disrupt
}
function outer() {
inner()
} disruption {
print("disruption caught in outer — from inner()")
}
// Test 1: explicit disrupt with handler
function test_explicit() {
disrupt
} disruption {
print("test 1: explicit disrupt handled")
}
test_explicit()
// Test 2: type error disrupt (number + function)
safe_add(1, print)
// Test 3: unwinding — inner disrupts, outer catches
outer()
// Test 4: disrupt from inside disruption clause
function test_nested() {
disrupt
} disruption {
print("test 4: first disruption")
}
test_nested()
print("done")