Skip to content

Commit

Permalink
refactor: callable value
Browse files Browse the repository at this point in the history
  • Loading branch information
zyrouge committed Dec 10, 2024
1 parent 9b502e9 commit 5d045ef
Show file tree
Hide file tree
Showing 24 changed files with 147 additions and 171 deletions.
2 changes: 1 addition & 1 deletion packages/beize_compiler/tests/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Future<List<String>> executeTestScript(
final BeizeVM vm = BeizeVM(program, BeizeVMOptions());
final List<String> output = <String>[];
final BeizeNativeFunctionValue out = BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeStringValue value = call.argumentAt(0).cast();
output.add(value.value);
return BeizeNullValue.value;
Expand Down
4 changes: 2 additions & 2 deletions packages/beize_vm/lib/values/function/call.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import '../../errors/exports.dart';
import '../../vm/exports.dart';
import '../exports.dart';

class BeizeNativeFunctionCall {
BeizeNativeFunctionCall({
class BeizeFunctionCall {
BeizeFunctionCall({
required this.frame,
required this.arguments,
});
Expand Down
5 changes: 4 additions & 1 deletion packages/beize_vm/lib/values/function/callable.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import '../../vm/exports.dart';
import '../exports.dart';

abstract class BeizeCallableValue extends BeizeValue {}
abstract class BeizeCallableValue extends BeizeValue {
BeizeInterpreterResult kCall(final BeizeFunctionCall call);
}
22 changes: 21 additions & 1 deletion packages/beize_vm/lib/values/function/function.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class BeizeFunctionValue extends BeizePrimitiveObjectValue
switch (key.value) {
case 'call':
return BeizeNativeFunctionValue(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeListValue arguments = call.argumentAt(0);
return call.frame.callValue(this, arguments.elements);
},
Expand All @@ -33,6 +33,26 @@ class BeizeFunctionValue extends BeizePrimitiveObjectValue
@override
final BeizeValueKind kind = BeizeValueKind.function;

@override
BeizeInterpreterResult kCall(final BeizeFunctionCall call) {
if (!constant.isAsync) {
final BeizeCallFrame frame =
call.frame.prepareCallFunctionValue(call.arguments, this);
return BeizeInterpreter(frame).run();
}
final BeizeUnawaitedValue value = BeizeUnawaitedValue(
call.arguments,
(final BeizeFunctionCall nCall) async {
final BeizeCallFrame frame =
nCall.frame.prepareCallFunctionValue(nCall.arguments, this);
final BeizeInterpreterResult result =
await BeizeInterpreter(frame).runAsync();
return result;
},
);
return BeizeInterpreterResult.success(value);
}

@override
BeizeFunctionValue kClone() =>
BeizeFunctionValue(constant: constant, namespace: namespace);
Expand Down
20 changes: 9 additions & 11 deletions packages/beize_vm/lib/values/function/native_function.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import '../../vm/exports.dart';
import '../exports.dart';

typedef BeizeNativeExecuteFunction = BeizeInterpreterResult Function(
BeizeNativeFunctionCall call,
BeizeFunctionCall call,
);

typedef BeizeNativeSyncFunction = BeizeValue Function(
BeizeNativeFunctionCall call,
BeizeFunctionCall call,
);

typedef BeizeNativeAsyncFunction = Future<BeizeValue> Function(
BeizeNativeFunctionCall call,
BeizeFunctionCall call,
);

class BeizeNativeFunctionValue extends BeizePrimitiveObjectValue
Expand All @@ -29,14 +29,12 @@ class BeizeNativeFunctionValue extends BeizePrimitiveObjectValue

final BeizeNativeExecuteFunction function;

BeizeInterpreterResult execute(final BeizeNativeFunctionCall call) {
final BeizeInterpreterResult result = function(call);
return result;
}

@override
final BeizeValueKind kind = BeizeValueKind.nativeFunction;

@override
BeizeInterpreterResult kCall(final BeizeFunctionCall call) => function(call);

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

Expand All @@ -52,7 +50,7 @@ class BeizeNativeFunctionValue extends BeizePrimitiveObjectValue
static BeizeNativeExecuteFunction convertSyncFunction(
final BeizeNativeSyncFunction function,
) =>
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
try {
final BeizeValue value = function(call);
return BeizeInterpreterResult.success(value);
Expand All @@ -68,7 +66,7 @@ class BeizeNativeFunctionValue extends BeizePrimitiveObjectValue
static BeizeNativeExecuteFunction convertAsyncFunction(
final BeizeNativeAsyncFunction function,
) =>
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeValue value = BeizeUnawaitedValue(
call.arguments,
wrapAsyncFunction(function),
Expand All @@ -79,7 +77,7 @@ class BeizeNativeFunctionValue extends BeizePrimitiveObjectValue
static BeizeUnawaitedFunction wrapAsyncFunction(
final BeizeNativeAsyncFunction function,
) =>
(final BeizeNativeFunctionCall call) async {
(final BeizeFunctionCall call) async {
try {
final BeizeValue value = await function(call);
return BeizeInterpreterResult.success(value);
Expand Down
4 changes: 2 additions & 2 deletions packages/beize_vm/lib/values/function/unawaited.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import '../../vm/exports.dart';
import '../exports.dart';

typedef BeizeUnawaitedFunction = Future<BeizeInterpreterResult> Function(
BeizeNativeFunctionCall call,
BeizeFunctionCall call,
);

class BeizeUnawaitedValue extends BeizePrimitiveObjectValue {
Expand All @@ -13,7 +13,7 @@ class BeizeUnawaitedValue extends BeizePrimitiveObjectValue {

Future<BeizeInterpreterResult> execute(final BeizeCallFrame frame) async {
try {
final BeizeNativeFunctionCall call = BeizeNativeFunctionCall(
final BeizeFunctionCall call = BeizeFunctionCall(
arguments: arguments,
frame: frame,
);
Expand Down
34 changes: 17 additions & 17 deletions packages/beize_vm/lib/values/list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ class BeizeListValue extends BeizePrimitiveObjectValue {
switch (key.value) {
case 'push':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
push(call.argumentAt(0));
return BeizeNullValue.value;
},
);

case 'pushAll':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
pushAll(call.argumentAt(0));
return BeizeNullValue.value;
},
Expand Down Expand Up @@ -63,7 +63,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'contains':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeValue value = call.argumentAt(0);
return BeizeBooleanValue(
elements.any((final BeizeValue x) => value.kEquals(x)),
Expand All @@ -73,7 +73,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'indexOf':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeValue value = call.argumentAt(0);
return BeizeNumberValue(
elements
Expand All @@ -85,7 +85,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'lastIndexOf':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeValue value = call.argumentAt(0);
return BeizeNumberValue(
elements
Expand All @@ -97,7 +97,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'remove':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeValue value = call.argumentAt(0);
elements.removeWhere((final BeizeValue x) => value.kEquals(x));
return BeizeNullValue.value;
Expand All @@ -106,7 +106,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'sublist':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeNumberValue start = call.argumentAt(0);
final BeizeNumberValue end = call.argumentAt(1);
final int iEnd = end.intValue;
Expand All @@ -120,7 +120,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'find':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
for (final BeizeValue x in elements) {
final BeizeValue result = call.frame
Expand All @@ -133,7 +133,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'findIndex':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
for (int i = 0; i < elements.length; i++) {
final BeizeValue x = elements[i];
Expand All @@ -149,7 +149,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'findLastIndex':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
for (int i = elements.length - 1; i >= 0; i--) {
final BeizeValue x = elements[i];
Expand All @@ -165,7 +165,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'filter':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
final BeizeListValue nValue = BeizeListValue();
for (final BeizeValue x in elements) {
Expand All @@ -181,7 +181,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'map':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
final BeizeListValue nValue = BeizeListValue();
for (final BeizeValue x in elements) {
Expand All @@ -195,7 +195,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'where':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
final BeizeListValue nValue = BeizeListValue();
for (final BeizeValue x in elements) {
Expand All @@ -211,7 +211,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'sort':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
final List<BeizeValue> sorted = elements.toList();
for (int i = 0; i < sorted.length; i++) {
Expand All @@ -237,7 +237,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'flat':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeNumberValue level = call.argumentAt(0);
return BeizeListValue(flat(level.intValue));
},
Expand Down Expand Up @@ -265,7 +265,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'forEach':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeCallableValue predicate = call.argumentAt(0);
for (final BeizeValue x in elements) {
call.frame.callValue(predicate, <BeizeValue>[x]);
Expand All @@ -276,7 +276,7 @@ class BeizeListValue extends BeizePrimitiveObjectValue {

case 'join':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) {
(final BeizeFunctionCall call) {
final BeizeStringValue delimiter = call.argumentAt(0);
final String delimiterValue = delimiter.value;
final StringBuffer buffer = StringBuffer();
Expand Down
4 changes: 2 additions & 2 deletions packages/beize_vm/lib/values/number.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class BeizeNumberValue extends BeizePrimitiveObjectValue {

case 'toPrecisionString':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) => BeizeStringValue(
(final BeizeFunctionCall call) => BeizeStringValue(
value.toStringAsPrecision(
call.argumentAt<BeizeNumberValue>(0).intValue,
),
Expand All @@ -80,7 +80,7 @@ class BeizeNumberValue extends BeizePrimitiveObjectValue {

case 'toRadixString':
return BeizeNativeFunctionValue.sync(
(final BeizeNativeFunctionCall call) => BeizeStringValue(
(final BeizeFunctionCall call) => BeizeStringValue(
intValue.toRadixString(
call.argumentAt<BeizeNumberValue>(0).intValue,
),
Expand Down
Loading

0 comments on commit 5d045ef

Please sign in to comment.