Skip to content

Commit

Permalink
refactor: is instance operator
Browse files Browse the repository at this point in the history
  • Loading branch information
zyrouge committed Dec 10, 2024
1 parent a6fc775 commit d7fd64b
Show file tree
Hide file tree
Showing 39 changed files with 418 additions and 225 deletions.
2 changes: 1 addition & 1 deletion packages/beize_compiler/example/project/dev.beize
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ main := -> async {
};

main().await;
print();
print(Function is null);
3 changes: 3 additions & 0 deletions packages/beize_compiler/lib/compiler/parser/parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,9 @@ abstract class BeizeParser {
case BeizeTokens.caret:
compiler.emitOpCode(BeizeOpCodes.opBitwiseXor);

case BeizeTokens.isKw:
compiler.emitOpCode(BeizeOpCodes.opIs);

default:
throw UnreachableException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ enum BeizePrecedence {
unary, // ! ~ + -
call, // () . [] ?.
grouping, // (...)
kekw,
}

extension BeizePrecedenceUtils on BeizePrecedence {
Expand Down
4 changes: 4 additions & 0 deletions packages/beize_compiler/lib/compiler/parser/rules.dart
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ class BeizeParseRule {
precedence: BeizePrecedence.comparison,
infix: BeizeParser.parseBinaryExpression,
),
BeizeTokens.isKw: BeizeParseRule(
precedence: BeizePrecedence.comparison,
infix: BeizeParser.parseBinaryExpression,
),
BeizeTokens.plus: BeizeParseRule(
precedence: BeizePrecedence.sum,
prefix: BeizeParser.parseUnaryExpression,
Expand Down
1 change: 1 addition & 0 deletions packages/beize_compiler/lib/scanner/rules/identifier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ abstract class BeizeIdentifierScanner {
BeizeTokens.asyncKw,
BeizeTokens.awaitKw,
BeizeTokens.onlyKw,
BeizeTokens.isKw,
};

static final Map<String, BeizeTokens> keywordsMap = keywords.asNameMap().map(
Expand Down
2 changes: 2 additions & 0 deletions packages/beize_compiler/lib/token/tokens.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ enum BeizeTokens {
asyncKw, // async
awaitKw, // await
onlyKw, // only
isKw, // is
}

const Map<BeizeTokens, String> _tokensCodeMap = <BeizeTokens, String>{
Expand Down Expand Up @@ -161,6 +162,7 @@ const Map<BeizeTokens, String> _tokensCodeMap = <BeizeTokens, String>{
BeizeTokens.asyncKw: 'async',
BeizeTokens.awaitKw: 'await',
BeizeTokens.onlyKw: 'only',
BeizeTokens.isKw: 'is',
};

extension OutreTokensUtils on BeizeTokens {
Expand Down
1 change: 1 addition & 0 deletions packages/beize_shared/lib/bytecode/op_codes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ enum BeizeOpCodes {
opBitwiseOr,
opBitwiseXor,
opBitwiseNot,
opIs,
opDeclare,
opAssign,
opLookup,
Expand Down
2 changes: 1 addition & 1 deletion packages/beize_vm/lib/values/boolean/boolean.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class BeizeBooleanValue extends BeizeNativeObjectValue {
final BeizeValueKind kind = BeizeValueKind.boolean;

@override
BeizeBooleanValue kClone() => BeizeBooleanValue(value);
BeizeBooleanValue kClone() => BeizeBooleanValue(value)..kCopyFrom(this);

@override
String kToString() => value.toString();
Expand Down
3 changes: 3 additions & 0 deletions packages/beize_vm/lib/values/boolean/boolean_class.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import '../exports.dart';

class BeizeBooleanClassValue extends BeizeNativeClassValue {
@override
bool kInstance(final BeizeObjectValue value) => value is BeizeBooleanValue;

@override
BeizeBooleanValue kInstantiate(final BeizeCallableCall call) {
final BeizeValue value = call.argumentAt(0);
Expand Down
2 changes: 2 additions & 0 deletions packages/beize_vm/lib/values/class/class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import '../exports.dart';

abstract class BeizeClassValue extends BeizeNativeObjectValue
implements BeizeCallableValue {
bool kInstance(final BeizeObjectValue value);

BeizeObjectValue kInstantiate(final BeizeCallableCall call);

@override
Expand Down
21 changes: 18 additions & 3 deletions packages/beize_vm/lib/values/class/class_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,32 @@ import '../exports.dart';
// what the fuck is this naming
class BeizeClassClassValue extends BeizeNativeClassValue {
BeizeClassClassValue() {
set(
BeizeStringValue('of'),
setField(
'of',
BeizeNativeFunctionValue.sync(
(final BeizeCallableCall call) {
final BeizeObjectValue value = call.argumentAt(0);
return value.kClassInternal(call.frame.vm) ?? value.kClass;
return BeizeClassValueUtils.getClass(call.frame.vm, value);
},
),
);
setField(
'isInstance',
BeizeNativeFunctionValue.sync(
(final BeizeCallableCall call) {
final BeizeClassValue clazz = call.argumentAt(0);
final BeizeValue value = call.argumentAt(1);
return BeizeClassValueUtils.isClassInstance(clazz, value)
? call.frame.vm.globals.trueValue
: call.frame.vm.globals.falseValue;
},
),
);
}

@override
bool kInstance(final BeizeObjectValue value) => value is BeizeClassValue;

@override
BeizeClassValue kInstantiate(final BeizeCallableCall call) {
final BeizeClassValue value = call.argumentAt(0);
Expand Down
1 change: 1 addition & 0 deletions packages/beize_vm/lib/values/class/exports.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export 'class.dart';
export 'class_class.dart';
export 'native_class.dart';
export 'utils.dart';
export 'vm_class.dart';
18 changes: 18 additions & 0 deletions packages/beize_vm/lib/values/class/utils.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import '../../vm/exports.dart';
import '../exports.dart';

class BeizeClassValueUtils {
static BeizeClassValue getClass(
final BeizeVM vm,
final BeizeObjectValue value,
) =>
value.kClassInternal(vm) ?? value.kClass;

static bool isClassInstance(
final BeizeValue clazz,
final BeizeValue value,
) =>
clazz is BeizeClassValue &&
value is BeizeObjectValue &&
clazz.kInstance(value);
}
5 changes: 4 additions & 1 deletion packages/beize_vm/lib/values/class/vm_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@ class BeizeVMClassValue extends BeizeClassValue {
@override
final BeizeValueKind kind = BeizeValueKind.clazz;

@override
bool kInstance(final BeizeObjectValue value) => value is BeizeClassValue;

@override
BeizeObjectValue kInstantiate(final BeizeCallableCall call) {
throw UnimplementedError();
}

@override
BeizeVMClassValue kClone() => BeizeVMClassValue(constant);
BeizeVMClassValue kClone() => BeizeVMClassValue(constant)..kCopyFrom(this);

@override
String kToString() => '<class>';
Expand Down
2 changes: 1 addition & 1 deletion packages/beize_vm/lib/values/exception/exception.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class BeizeExceptionValue extends BeizeNativeObjectValue {

@override
BeizeExceptionValue kClone() =>
BeizeExceptionValue(message, stackTrace, dartStackTrace);
BeizeExceptionValue(message, stackTrace, dartStackTrace)..kCopyFrom(this);

@override
String kToString() => 'Exception: $message\nStack Trace:\n$stackTrace';
Expand Down
3 changes: 3 additions & 0 deletions packages/beize_vm/lib/values/exception/exception_class.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import '../exports.dart';

class BeizeExceptionClassValue extends BeizeNativeClassValue {
@override
bool kInstance(final BeizeObjectValue value) => value is BeizeExceptionValue;

@override
BeizeExceptionValue kInstantiate(final BeizeCallableCall call) {
final BeizeStringValue message = call.argumentAt(0);
Expand Down
7 changes: 3 additions & 4 deletions packages/beize_vm/lib/values/function/function.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,9 @@ class BeizeFunctionValue extends BeizeNativeObjectValue
}

@override
BeizeFunctionValue kClone() => BeizeFunctionValue(
constant: constant,
namespace: namespace,
);
BeizeFunctionValue kClone() =>
BeizeFunctionValue(constant: constant, namespace: namespace)
..kCopyFrom(this);

@override
String kToString() => '<function>';
Expand Down
9 changes: 6 additions & 3 deletions packages/beize_vm/lib/values/function/function_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import '../exports.dart';

class BeizeFunctionClassValue extends BeizeNativeClassValue {
BeizeFunctionClassValue() {
set(
BeizeStringValue('call'),
setField(
'call',
BeizeNativeFunctionValue(
(final BeizeCallableCall call) {
final BeizeCallableValue function = call.argumentAt(0);
Expand All @@ -14,10 +14,13 @@ class BeizeFunctionClassValue extends BeizeNativeClassValue {
);
}

@override
bool kInstance(final BeizeObjectValue value) => value is BeizeCallableValue;

@override
BeizeCallableValue kInstantiate(final BeizeCallableCall call) {
final BeizeCallableValue value = call.argumentAt(0);
return value;
return value.kClone() as BeizeCallableValue;
}

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@ class BeizeNativeAsyncFunctionValue extends BeizeNativeFunctionValue {

@override
BeizeNativeAsyncFunctionValue kClone() =>
BeizeNativeAsyncFunctionValue(function);

@override
BeizeClassValue get kClass => throw UnimplementedError();
BeizeNativeAsyncFunctionValue(function)..kCopyFrom(this);

@override
bool get isTruthy => true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@ class BeizeNativeExecuteFunctionValue extends BeizeNativeFunctionValue {

@override
BeizeNativeFunctionValue kClone() =>
BeizeNativeExecuteFunctionValue(function);

@override
BeizeClassValue get kClass => throw UnimplementedError();
BeizeNativeExecuteFunctionValue(function)..kCopyFrom(this);

@override
bool get isTruthy => true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ abstract class BeizeNativeFunctionValue extends BeizeNativeObjectValue
@override
String kToString() => '<native function>';

@override
BeizeClassValue get kClass => throw UnimplementedError();

@override
BeizeClassValue kClassInternal(final BeizeVM vm) => vm.globals.functionClass;
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,7 @@ class BeizeNativeSyncFunctionValue extends BeizeNativeFunctionValue {

@override
BeizeNativeSyncFunctionValue kClone() =>
BeizeNativeSyncFunctionValue(function);

@override
BeizeClassValue get kClass => throw UnimplementedError();
BeizeNativeSyncFunctionValue(function)..kCopyFrom(this);

@override
bool get isTruthy => true;
Expand Down
2 changes: 1 addition & 1 deletion packages/beize_vm/lib/values/list/list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ class BeizeListValue extends BeizeNativeObjectValue {
final BeizeValueKind kind = BeizeValueKind.list;

@override
BeizeListValue kClone() => BeizeListValue(elements.toList());
BeizeListValue kClone() => BeizeListValue(elements.toList())..kCopyFrom(this);

@override
String kToString() =>
Expand Down
11 changes: 7 additions & 4 deletions packages/beize_vm/lib/values/list/list_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import '../exports.dart';

class BeizeListClassValue extends BeizeNativeClassValue {
BeizeListClassValue() {
set(
BeizeStringValue('generate'),
setField(
'generate',
BeizeNativeFunctionValue.sync(
(final BeizeCallableCall call) {
final int length = call.argumentAt<BeizeNumberValue>(0).intValue;
Expand All @@ -23,8 +23,8 @@ class BeizeListClassValue extends BeizeNativeClassValue {
},
),
);
set(
BeizeStringValue('filled'),
setField(
'filled',
BeizeNativeFunctionValue.sync(
(final BeizeCallableCall call) {
final int length = call.argumentAt<BeizeNumberValue>(0).intValue;
Expand All @@ -37,6 +37,9 @@ class BeizeListClassValue extends BeizeNativeClassValue {
);
}

@override
bool kInstance(final BeizeObjectValue value) => value is BeizeListValue;

@override
BeizeListValue kInstantiate(final BeizeCallableCall call) {
final BeizeListValue value = call.argumentAt(0);
Expand Down
Loading

0 comments on commit d7fd64b

Please sign in to comment.